Coverage Report

Created: 2018-09-25 14:53

/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
}