/src/mozilla-central/netwerk/test/gtest/TestMIMEInputStream.cpp
Line | Count | Source (jump to first uncovered line) |
1 | | #include "gtest/gtest.h" |
2 | | |
3 | | #include "Helpers.h" |
4 | | #include "nsCOMPtr.h" |
5 | | #include "nsIPipe.h" |
6 | | #include "nsStreamUtils.h" |
7 | | #include "nsString.h" |
8 | | #include "nsStringStream.h" |
9 | | #include "nsIMIMEInputStream.h" |
10 | | |
11 | | using mozilla::GetCurrentThreadSerialEventTarget; |
12 | | using mozilla::SpinEventLoopUntil; |
13 | | |
14 | | namespace { |
15 | | |
16 | | class SeekableLengthInputStream final : public testing::LengthInputStream |
17 | | , public nsISeekableStream |
18 | | { |
19 | | public: |
20 | | SeekableLengthInputStream(const nsACString& aBuffer, |
21 | | bool aIsInputStreamLength, |
22 | | bool aIsAsyncInputStreamLength, |
23 | | nsresult aLengthRv = NS_OK, |
24 | | bool aNegativeValue = false) |
25 | | : testing::LengthInputStream(aBuffer, aIsInputStreamLength, |
26 | | aIsAsyncInputStreamLength, aLengthRv, |
27 | | aNegativeValue) |
28 | 0 | {} |
29 | | |
30 | | NS_DECL_ISUPPORTS_INHERITED |
31 | | |
32 | | NS_IMETHOD |
33 | | Seek(int32_t aWhence, int64_t aOffset) override |
34 | 0 | { |
35 | 0 | MOZ_CRASH("This method should not be called."); |
36 | 0 | return NS_ERROR_FAILURE; |
37 | 0 | } |
38 | | |
39 | | NS_IMETHOD |
40 | | Tell(int64_t* aResult) override |
41 | 0 | { |
42 | 0 | MOZ_CRASH("This method should not be called."); |
43 | 0 | return NS_ERROR_FAILURE; |
44 | 0 | } |
45 | | |
46 | | NS_IMETHOD |
47 | | SetEOF() override |
48 | 0 | { |
49 | 0 | MOZ_CRASH("This method should not be called."); |
50 | 0 | return NS_ERROR_FAILURE; |
51 | 0 | } |
52 | | |
53 | | private: |
54 | | ~SeekableLengthInputStream() = default; |
55 | | }; |
56 | | |
57 | | NS_IMPL_ISUPPORTS_INHERITED(SeekableLengthInputStream, |
58 | | testing::LengthInputStream, |
59 | | nsISeekableStream) |
60 | | |
61 | | } // anonymous |
62 | | |
63 | | // nsIInputStreamLength && nsIAsyncInputStreamLength |
64 | | |
65 | 0 | TEST(TestNsMIMEInputStream, QIInputStreamLength) { |
66 | 0 | nsCString buf; |
67 | 0 | buf.AssignLiteral("Hello world"); |
68 | 0 |
|
69 | 0 | for (int i = 0; i < 4; i++) { |
70 | 0 | nsCOMPtr<nsIInputStream> mis; |
71 | 0 | { |
72 | 0 | RefPtr<SeekableLengthInputStream> stream = |
73 | 0 | new SeekableLengthInputStream(buf, i % 2, i > 1); |
74 | 0 |
|
75 | 0 | nsresult rv; |
76 | 0 | nsCOMPtr<nsIMIMEInputStream> m( |
77 | 0 | do_CreateInstance("@mozilla.org/network/mime-input-stream;1", &rv)); |
78 | 0 | ASSERT_EQ(NS_OK, rv); |
79 | 0 |
|
80 | 0 | rv = m->SetData(stream); |
81 | 0 | ASSERT_EQ(NS_OK, rv); |
82 | 0 |
|
83 | 0 | mis = do_QueryInterface(m); |
84 | 0 | ASSERT_TRUE(!!mis); |
85 | 0 | } |
86 | 0 |
|
87 | 0 | { |
88 | 0 | nsCOMPtr<nsIInputStreamLength> qi = do_QueryInterface(mis); |
89 | 0 | ASSERT_EQ(!!(i % 2), !!qi); |
90 | 0 | } |
91 | 0 |
|
92 | 0 | { |
93 | 0 | nsCOMPtr<nsIAsyncInputStreamLength> qi = do_QueryInterface(mis); |
94 | 0 | ASSERT_EQ(i > 1, !!qi); |
95 | 0 | } |
96 | 0 | } |
97 | 0 | } |
98 | | |
99 | 0 | TEST(TestNsMIMEInputStream, InputStreamLength) { |
100 | 0 | nsCString buf; |
101 | 0 | buf.AssignLiteral("Hello world"); |
102 | 0 |
|
103 | 0 | nsCOMPtr<nsIInputStream> mis; |
104 | 0 | { |
105 | 0 | RefPtr<SeekableLengthInputStream> stream = |
106 | 0 | new SeekableLengthInputStream(buf, true, false); |
107 | 0 |
|
108 | 0 | nsresult rv; |
109 | 0 | nsCOMPtr<nsIMIMEInputStream> m( |
110 | 0 | do_CreateInstance("@mozilla.org/network/mime-input-stream;1", &rv)); |
111 | 0 | ASSERT_EQ(NS_OK, rv); |
112 | 0 |
|
113 | 0 | rv = m->SetData(stream); |
114 | 0 | ASSERT_EQ(NS_OK, rv); |
115 | 0 |
|
116 | 0 | mis = do_QueryInterface(m); |
117 | 0 | ASSERT_TRUE(!!mis); |
118 | 0 | } |
119 | 0 |
|
120 | 0 | nsCOMPtr<nsIInputStreamLength> qi = do_QueryInterface(mis); |
121 | 0 | ASSERT_TRUE(!!qi); |
122 | 0 |
|
123 | 0 | int64_t size; |
124 | 0 | nsresult rv = qi->Length(&size); |
125 | 0 | ASSERT_EQ(NS_OK, rv); |
126 | 0 | ASSERT_EQ(buf.Length(), size); |
127 | 0 | } |
128 | | |
129 | 0 | TEST(TestNsMIMEInputStream, NegativeInputStreamLength) { |
130 | 0 | nsCString buf; |
131 | 0 | buf.AssignLiteral("Hello world"); |
132 | 0 |
|
133 | 0 | nsCOMPtr<nsIInputStream> mis; |
134 | 0 | { |
135 | 0 | RefPtr<SeekableLengthInputStream> stream = |
136 | 0 | new SeekableLengthInputStream(buf, true, false, NS_OK, true); |
137 | 0 |
|
138 | 0 | nsresult rv; |
139 | 0 | nsCOMPtr<nsIMIMEInputStream> m( |
140 | 0 | do_CreateInstance("@mozilla.org/network/mime-input-stream;1", &rv)); |
141 | 0 | ASSERT_EQ(NS_OK, rv); |
142 | 0 |
|
143 | 0 | rv = m->SetData(stream); |
144 | 0 | ASSERT_EQ(NS_OK, rv); |
145 | 0 |
|
146 | 0 | mis = do_QueryInterface(m); |
147 | 0 | ASSERT_TRUE(!!mis); |
148 | 0 | } |
149 | 0 |
|
150 | 0 | nsCOMPtr<nsIInputStreamLength> qi = do_QueryInterface(mis); |
151 | 0 | ASSERT_TRUE(!!qi); |
152 | 0 |
|
153 | 0 | int64_t size; |
154 | 0 | nsresult rv = qi->Length(&size); |
155 | 0 | ASSERT_EQ(NS_OK, rv); |
156 | 0 | ASSERT_EQ(-1, size); |
157 | 0 | } |
158 | | |
159 | 0 | TEST(TestNsMIMEInputStream, AsyncInputStreamLength) { |
160 | 0 | nsCString buf; |
161 | 0 | buf.AssignLiteral("Hello world"); |
162 | 0 |
|
163 | 0 | nsCOMPtr<nsIInputStream> mis; |
164 | 0 | { |
165 | 0 | RefPtr<SeekableLengthInputStream> stream = |
166 | 0 | new SeekableLengthInputStream(buf, false, true); |
167 | 0 |
|
168 | 0 | nsresult rv; |
169 | 0 | nsCOMPtr<nsIMIMEInputStream> m( |
170 | 0 | do_CreateInstance("@mozilla.org/network/mime-input-stream;1", &rv)); |
171 | 0 | ASSERT_EQ(NS_OK, rv); |
172 | 0 |
|
173 | 0 | rv = m->SetData(stream); |
174 | 0 | ASSERT_EQ(NS_OK, rv); |
175 | 0 |
|
176 | 0 | mis = do_QueryInterface(m); |
177 | 0 | ASSERT_TRUE(!!mis); |
178 | 0 | } |
179 | 0 |
|
180 | 0 | nsCOMPtr<nsIAsyncInputStreamLength> qi = do_QueryInterface(mis); |
181 | 0 | ASSERT_TRUE(!!qi); |
182 | 0 |
|
183 | 0 | RefPtr<testing::LengthCallback> callback = new testing::LengthCallback(); |
184 | 0 |
|
185 | 0 | nsresult rv = qi->AsyncLengthWait(callback, GetCurrentThreadSerialEventTarget()); |
186 | 0 | ASSERT_EQ(NS_OK, rv); |
187 | 0 |
|
188 | 0 | MOZ_ALWAYS_TRUE(SpinEventLoopUntil([&]() { return callback->Called(); })); |
189 | 0 | ASSERT_EQ(buf.Length(), callback->Size()); |
190 | 0 | } |
191 | | |
192 | 0 | TEST(TestNsMIMEInputStream, NegativeAsyncInputStreamLength) { |
193 | 0 | nsCString buf; |
194 | 0 | buf.AssignLiteral("Hello world"); |
195 | 0 |
|
196 | 0 | nsCOMPtr<nsIInputStream> mis; |
197 | 0 | { |
198 | 0 | RefPtr<SeekableLengthInputStream> stream = |
199 | 0 | new SeekableLengthInputStream(buf, false, true, NS_OK, true); |
200 | 0 |
|
201 | 0 | nsresult rv; |
202 | 0 | nsCOMPtr<nsIMIMEInputStream> m( |
203 | 0 | do_CreateInstance("@mozilla.org/network/mime-input-stream;1", &rv)); |
204 | 0 | ASSERT_EQ(NS_OK, rv); |
205 | 0 |
|
206 | 0 | rv = m->SetData(stream); |
207 | 0 | ASSERT_EQ(NS_OK, rv); |
208 | 0 |
|
209 | 0 | mis = do_QueryInterface(m); |
210 | 0 | ASSERT_TRUE(!!mis); |
211 | 0 | } |
212 | 0 |
|
213 | 0 | nsCOMPtr<nsIAsyncInputStreamLength> qi = do_QueryInterface(mis); |
214 | 0 | ASSERT_TRUE(!!qi); |
215 | 0 |
|
216 | 0 | RefPtr<testing::LengthCallback> callback = new testing::LengthCallback(); |
217 | 0 |
|
218 | 0 | nsresult rv = qi->AsyncLengthWait(callback, GetCurrentThreadSerialEventTarget()); |
219 | 0 | ASSERT_EQ(NS_OK, rv); |
220 | 0 |
|
221 | 0 | MOZ_ALWAYS_TRUE(SpinEventLoopUntil([&]() { return callback->Called(); })); |
222 | 0 | ASSERT_EQ(-1, callback->Size()); |
223 | 0 | } |
224 | | |
225 | 0 | TEST(TestNsMIMEInputStream, AbortLengthCallback) { |
226 | 0 | nsCString buf; |
227 | 0 | buf.AssignLiteral("Hello world"); |
228 | 0 |
|
229 | 0 | nsCOMPtr<nsIInputStream> mis; |
230 | 0 | { |
231 | 0 | RefPtr<SeekableLengthInputStream> stream = |
232 | 0 | new SeekableLengthInputStream(buf, false, true, NS_OK, true); |
233 | 0 |
|
234 | 0 | nsresult rv; |
235 | 0 | nsCOMPtr<nsIMIMEInputStream> m( |
236 | 0 | do_CreateInstance("@mozilla.org/network/mime-input-stream;1", &rv)); |
237 | 0 | ASSERT_EQ(NS_OK, rv); |
238 | 0 |
|
239 | 0 | rv = m->SetData(stream); |
240 | 0 | ASSERT_EQ(NS_OK, rv); |
241 | 0 |
|
242 | 0 | mis = do_QueryInterface(m); |
243 | 0 | ASSERT_TRUE(!!mis); |
244 | 0 | } |
245 | 0 |
|
246 | 0 | nsCOMPtr<nsIAsyncInputStreamLength> qi = do_QueryInterface(mis); |
247 | 0 | ASSERT_TRUE(!!qi); |
248 | 0 |
|
249 | 0 | RefPtr<testing::LengthCallback> callback1 = new testing::LengthCallback(); |
250 | 0 | nsresult rv = qi->AsyncLengthWait(callback1, GetCurrentThreadSerialEventTarget()); |
251 | 0 | ASSERT_EQ(NS_OK, rv); |
252 | 0 |
|
253 | 0 | RefPtr<testing::LengthCallback> callback2 = new testing::LengthCallback(); |
254 | 0 | rv = qi->AsyncLengthWait(callback2, GetCurrentThreadSerialEventTarget()); |
255 | 0 | ASSERT_EQ(NS_OK, rv); |
256 | 0 |
|
257 | 0 | MOZ_ALWAYS_TRUE(SpinEventLoopUntil([&]() { return callback2->Called(); })); |
258 | 0 | ASSERT_TRUE(!callback1->Called()); |
259 | 0 | ASSERT_EQ(-1, callback2->Size()); |
260 | 0 | } |