OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright 2011 The WebRTC Project Authors. All rights reserved. | 2 * Copyright 2011 The WebRTC Project Authors. All rights reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
11 | 11 |
12 #include <algorithm> | 12 #include <algorithm> |
13 #include <set> | 13 #include <set> |
14 #include <string> | 14 #include <string> |
15 | 15 |
16 #include "webrtc/base/bufferqueue.h" | |
16 #include "webrtc/base/gunit.h" | 17 #include "webrtc/base/gunit.h" |
17 #include "webrtc/base/helpers.h" | 18 #include "webrtc/base/helpers.h" |
18 #include "webrtc/base/scoped_ptr.h" | 19 #include "webrtc/base/scoped_ptr.h" |
19 #include "webrtc/base/ssladapter.h" | 20 #include "webrtc/base/ssladapter.h" |
20 #include "webrtc/base/sslconfig.h" | 21 #include "webrtc/base/sslconfig.h" |
21 #include "webrtc/base/sslidentity.h" | 22 #include "webrtc/base/sslidentity.h" |
22 #include "webrtc/base/sslstreamadapter.h" | 23 #include "webrtc/base/sslstreamadapter.h" |
23 #include "webrtc/base/stream.h" | 24 #include "webrtc/base/stream.h" |
24 #include "webrtc/test/testsupport/gtest_disable.h" | 25 #include "webrtc/test/testsupport/gtest_disable.h" |
25 | 26 |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
67 "-----END CERTIFICATE-----\n"; | 68 "-----END CERTIFICATE-----\n"; |
68 | 69 |
69 #define MAYBE_SKIP_TEST(feature) \ | 70 #define MAYBE_SKIP_TEST(feature) \ |
70 if (!(rtc::SSLStreamAdapter::feature())) { \ | 71 if (!(rtc::SSLStreamAdapter::feature())) { \ |
71 LOG(LS_INFO) << "Feature disabled... skipping"; \ | 72 LOG(LS_INFO) << "Feature disabled... skipping"; \ |
72 return; \ | 73 return; \ |
73 } | 74 } |
74 | 75 |
75 class SSLStreamAdapterTestBase; | 76 class SSLStreamAdapterTestBase; |
76 | 77 |
77 class SSLDummyStream : public rtc::StreamInterface, | 78 class SSLDummyStreamBase : public rtc::StreamInterface, |
78 public sigslot::has_slots<> { | 79 public sigslot::has_slots<> { |
79 public: | 80 public: |
80 explicit SSLDummyStream(SSLStreamAdapterTestBase *test, | 81 explicit SSLDummyStreamBase(SSLStreamAdapterTestBase *test, |
tommi
2015/11/13 08:38:13
no need for explicit.
can you change it so that th
joachim
2015/11/13 09:08:28
Done.
| |
81 const std::string &side, | 82 const std::string &side) : |
82 rtc::FifoBuffer *in, | |
83 rtc::FifoBuffer *out) : | |
84 test_(test), | 83 test_(test), |
85 side_(side), | 84 side_(side), |
86 in_(in), | |
87 out_(out), | |
88 first_packet_(true) { | 85 first_packet_(true) { |
89 in_->SignalEvent.connect(this, &SSLDummyStream::OnEventIn); | |
90 out_->SignalEvent.connect(this, &SSLDummyStream::OnEventOut); | |
91 } | 86 } |
92 | 87 |
93 virtual rtc::StreamState GetState() const { return rtc::SS_OPEN; } | 88 virtual rtc::StreamState GetState() const { return rtc::SS_OPEN; } |
94 | 89 |
90 // Defined later | |
tommi
2015/11/13 08:38:13
nit: Can you expand on this comment a bit? Is the
joachim
2015/11/13 09:08:28
This comment was there before, I don't think it ma
| |
91 virtual rtc::StreamResult Write(const void* data, size_t data_len, | |
92 size_t* written, int* error); | |
93 | |
94 virtual rtc::StreamResult WriteData(const void* data, size_t data_len, | |
95 size_t* written, int* error) = 0; | |
96 | |
97 protected: | |
98 SSLStreamAdapterTestBase *test_; | |
tommi
2015/11/13 08:38:12
SSLStreamAdapterTestBase* test_;
you could also n
joachim
2015/11/13 09:08:28
Done.
| |
99 const std::string side_; | |
100 bool first_packet_; | |
101 }; | |
102 | |
103 class SSLDummyStreamTLS : public SSLDummyStreamBase { | |
104 public: | |
105 explicit SSLDummyStreamTLS(SSLStreamAdapterTestBase *test, | |
106 const std::string &side, | |
107 rtc::FifoBuffer *in, | |
108 rtc::FifoBuffer *out) : | |
109 SSLDummyStreamBase(test, side), | |
110 in_(in), | |
111 out_(out) { | |
112 in_->SignalEvent.connect(this, &SSLDummyStreamTLS::OnEventIn); | |
113 out_->SignalEvent.connect(this, &SSLDummyStreamTLS::OnEventOut); | |
114 } | |
115 | |
95 virtual rtc::StreamResult Read(void* buffer, size_t buffer_len, | 116 virtual rtc::StreamResult Read(void* buffer, size_t buffer_len, |
96 size_t* read, int* error) { | 117 size_t* read, int* error) { |
97 rtc::StreamResult r; | 118 rtc::StreamResult r; |
98 | 119 |
99 r = in_->Read(buffer, buffer_len, read, error); | 120 r = in_->Read(buffer, buffer_len, read, error); |
100 if (r == rtc::SR_BLOCK) | 121 if (r == rtc::SR_BLOCK) |
101 return rtc::SR_BLOCK; | 122 return rtc::SR_BLOCK; |
102 if (r == rtc::SR_EOS) | 123 if (r == rtc::SR_EOS) |
103 return rtc::SR_EOS; | 124 return rtc::SR_EOS; |
104 | 125 |
105 if (r != rtc::SR_SUCCESS) { | 126 if (r != rtc::SR_SUCCESS) { |
106 ADD_FAILURE(); | 127 ADD_FAILURE(); |
107 return rtc::SR_ERROR; | 128 return rtc::SR_ERROR; |
108 } | 129 } |
109 | 130 |
110 return rtc::SR_SUCCESS; | 131 return rtc::SR_SUCCESS; |
111 } | 132 } |
112 | 133 |
113 // Catch readability events on in and pass them up. | 134 // Catch readability events on in and pass them up. |
114 virtual void OnEventIn(rtc::StreamInterface *stream, int sig, | 135 virtual void OnEventIn(rtc::StreamInterface *stream, int sig, |
115 int err) { | 136 int err) { |
116 int mask = (rtc::SE_READ | rtc::SE_CLOSE); | 137 int mask = (rtc::SE_READ | rtc::SE_CLOSE); |
117 | 138 |
118 if (sig & mask) { | 139 if (sig & mask) { |
119 LOG(LS_INFO) << "SSLDummyStream::OnEvent side=" << side_ << " sig=" | 140 LOG(LS_INFO) << "SSLDummyStreamTLS::OnEvent side=" << side_ << " sig=" |
120 << sig << " forwarding upward"; | 141 << sig << " forwarding upward"; |
121 PostEvent(sig & mask, 0); | 142 PostEvent(sig & mask, 0); |
122 } | 143 } |
123 } | 144 } |
124 | 145 |
125 // Catch writeability events on out and pass them up. | 146 // Catch writeability events on out and pass them up. |
126 virtual void OnEventOut(rtc::StreamInterface *stream, int sig, | 147 virtual void OnEventOut(rtc::StreamInterface *stream, int sig, |
127 int err) { | 148 int err) { |
128 if (sig & rtc::SE_WRITE) { | 149 if (sig & rtc::SE_WRITE) { |
129 LOG(LS_INFO) << "SSLDummyStream::OnEvent side=" << side_ << " sig=" | 150 LOG(LS_INFO) << "SSLDummyStreamTLS::OnEvent side=" << side_ << " sig=" |
130 << sig << " forwarding upward"; | 151 << sig << " forwarding upward"; |
131 | 152 |
132 PostEvent(sig & rtc::SE_WRITE, 0); | 153 PostEvent(sig & rtc::SE_WRITE, 0); |
133 } | 154 } |
134 } | 155 } |
135 | 156 |
136 // Write to the outgoing FifoBuffer | 157 // Write to the outgoing FifoBuffer |
137 rtc::StreamResult WriteData(const void* data, size_t data_len, | 158 virtual rtc::StreamResult WriteData(const void* data, size_t data_len, |
138 size_t* written, int* error) { | 159 size_t* written, int* error) override { |
139 return out_->Write(data, data_len, written, error); | 160 return out_->Write(data, data_len, written, error); |
140 } | 161 } |
141 | 162 |
142 // Defined later | |
143 virtual rtc::StreamResult Write(const void* data, size_t data_len, | |
144 size_t* written, int* error); | |
145 | |
146 virtual void Close() { | 163 virtual void Close() { |
147 LOG(LS_INFO) << "Closing outbound stream"; | 164 LOG(LS_INFO) << "Closing outbound stream"; |
148 out_->Close(); | 165 out_->Close(); |
149 } | 166 } |
150 | 167 |
151 private: | 168 private: |
152 SSLStreamAdapterTestBase *test_; | |
153 const std::string side_; | |
154 rtc::FifoBuffer *in_; | 169 rtc::FifoBuffer *in_; |
155 rtc::FifoBuffer *out_; | 170 rtc::FifoBuffer *out_; |
156 bool first_packet_; | 171 }; |
172 | |
173 class SSLDummyStreamDTLS : public SSLDummyStreamBase { | |
174 public: | |
175 explicit SSLDummyStreamDTLS(SSLStreamAdapterTestBase *test, | |
176 const std::string &side, | |
177 rtc::BufferQueue *in, | |
178 rtc::BufferQueue *out) : | |
179 SSLDummyStreamBase(test, side), | |
180 in_(in), | |
181 out_(out), | |
182 closed_(false) { | |
183 in_->SignalEvent.connect(this, &SSLDummyStreamDTLS::OnEventIn); | |
184 out_->SignalEvent.connect(this, &SSLDummyStreamDTLS::OnEventOut); | |
185 } | |
186 | |
187 virtual rtc::StreamResult Read(void* buffer, size_t buffer_len, | |
188 size_t* read, int* error) { | |
189 if (closed_) { | |
190 return rtc::SR_ERROR; | |
191 } | |
192 if (!in_->ReadFront(buffer, buffer_len, read)) { | |
193 return rtc::SR_BLOCK; | |
194 } | |
195 return rtc::SR_SUCCESS; | |
196 } | |
197 | |
198 // Catch readability events on in and pass them up. | |
199 virtual void OnEventIn(rtc::BufferQueue *queue, int events) { | |
200 if (events & rtc::BQ_READ) { | |
201 LOG(LS_INFO) << "SSLDummyStreamDTLS::OnEvent side=" << side_ | |
202 << " events=" << events << " forwarding upward"; | |
tommi
2015/11/13 08:38:13
fix indent (4 spaces or preferably align the <<)
joachim
2015/11/13 09:08:28
Done.
| |
203 PostEvent(rtc::SE_READ, 0); | |
204 } | |
205 } | |
206 | |
207 // Catch writeability events on out and pass them up. | |
208 virtual void OnEventOut(rtc::BufferQueue *queue, int events) { | |
209 if (events & rtc::BQ_WRITE) { | |
210 LOG(LS_INFO) << "SSLDummyStreamDTLS::OnEvent side=" << side_ | |
211 << " events=" << events << " forwarding upward"; | |
tommi
2015/11/13 08:38:13
and here
joachim
2015/11/13 09:08:28
Done.
| |
212 PostEvent(rtc::SE_WRITE, 0); | |
213 } | |
214 } | |
215 | |
216 // Write to the outgoing BufferQueue | |
217 virtual rtc::StreamResult WriteData(const void* data, size_t data_len, | |
218 size_t* written, int* error) override { | |
219 if (closed_) { | |
220 return rtc::SR_ERROR; | |
221 } | |
222 if (!out_->WriteBack(data, data_len, written)) { | |
223 return rtc::SR_BLOCK; | |
224 } | |
225 return rtc::SR_SUCCESS; | |
226 } | |
227 | |
228 virtual void Close() { | |
229 LOG(LS_INFO) << "Closing outbound stream"; | |
230 closed_ = true; | |
231 } | |
232 | |
233 private: | |
234 rtc::BufferQueue *in_; | |
235 rtc::BufferQueue *out_; | |
236 bool closed_; | |
157 }; | 237 }; |
158 | 238 |
159 static const int kFifoBufferSize = 4096; | 239 static const int kFifoBufferSize = 4096; |
240 static const int kBufferCapacity = 1; | |
241 static const size_t kDefaultBufferSize = 2048; | |
160 | 242 |
161 class SSLStreamAdapterTestBase : public testing::Test, | 243 class SSLStreamAdapterTestBase : public testing::Test, |
162 public sigslot::has_slots<> { | 244 public sigslot::has_slots<> { |
163 public: | 245 public: |
164 SSLStreamAdapterTestBase( | 246 SSLStreamAdapterTestBase( |
165 const std::string& client_cert_pem, | 247 const std::string& client_cert_pem, |
166 const std::string& client_private_key_pem, | 248 const std::string& client_private_key_pem, |
167 bool dtls, | 249 bool dtls, |
168 rtc::KeyParams client_key_type = rtc::KeyParams(rtc::KT_DEFAULT), | 250 rtc::KeyParams client_key_type = rtc::KeyParams(rtc::KT_DEFAULT), |
169 rtc::KeyParams server_key_type = rtc::KeyParams(rtc::KT_DEFAULT)) | 251 rtc::KeyParams server_key_type = rtc::KeyParams(rtc::KT_DEFAULT)) |
170 : client_buffer_(kFifoBufferSize), | 252 : client_cert_pem_(client_cert_pem), |
171 server_buffer_(kFifoBufferSize), | 253 client_private_key_pem_(client_private_key_pem), |
172 client_stream_( | 254 client_key_type_(client_key_type), |
173 new SSLDummyStream(this, "c2s", &client_buffer_, &server_buffer_)), | 255 server_key_type_(server_key_type), |
174 server_stream_( | 256 client_stream_(NULL), |
175 new SSLDummyStream(this, "s2c", &server_buffer_, &client_buffer_)), | 257 server_stream_(NULL), |
176 client_ssl_(rtc::SSLStreamAdapter::Create(client_stream_)), | |
177 server_ssl_(rtc::SSLStreamAdapter::Create(server_stream_)), | |
178 client_identity_(NULL), | 258 client_identity_(NULL), |
179 server_identity_(NULL), | 259 server_identity_(NULL), |
180 delay_(0), | 260 delay_(0), |
181 mtu_(1460), | 261 mtu_(1460), |
182 loss_(0), | 262 loss_(0), |
183 lose_first_packet_(false), | 263 lose_first_packet_(false), |
184 damage_(false), | 264 damage_(false), |
185 dtls_(dtls), | 265 dtls_(dtls), |
186 handshake_wait_(5000), | 266 handshake_wait_(5000), |
187 identities_set_(false) { | 267 identities_set_(false) { |
188 // Set use of the test RNG to get predictable loss patterns. | 268 // Set use of the test RNG to get predictable loss patterns. |
189 rtc::SetRandomTestMode(true); | 269 rtc::SetRandomTestMode(true); |
190 | |
191 // Set up the slots | |
192 client_ssl_->SignalEvent.connect(this, &SSLStreamAdapterTestBase::OnEvent); | |
193 server_ssl_->SignalEvent.connect(this, &SSLStreamAdapterTestBase::OnEvent); | |
194 | |
195 if (!client_cert_pem.empty() && !client_private_key_pem.empty()) { | |
196 client_identity_ = rtc::SSLIdentity::FromPEMStrings( | |
197 client_private_key_pem, client_cert_pem); | |
198 } else { | |
199 client_identity_ = rtc::SSLIdentity::Generate("client", client_key_type); | |
200 } | |
201 server_identity_ = rtc::SSLIdentity::Generate("server", server_key_type); | |
202 | |
203 client_ssl_->SetIdentity(client_identity_); | |
204 server_ssl_->SetIdentity(server_identity_); | |
205 } | 270 } |
206 | 271 |
207 ~SSLStreamAdapterTestBase() { | 272 ~SSLStreamAdapterTestBase() { |
208 // Put it back for the next test. | 273 // Put it back for the next test. |
209 rtc::SetRandomTestMode(false); | 274 rtc::SetRandomTestMode(false); |
210 } | 275 } |
211 | 276 |
277 virtual void SetUp() override { | |
278 CreateStreams(); | |
279 | |
280 client_ssl_.reset(rtc::SSLStreamAdapter::Create(client_stream_)); | |
281 server_ssl_.reset(rtc::SSLStreamAdapter::Create(server_stream_)); | |
282 | |
283 // Set up the slots | |
284 client_ssl_->SignalEvent.connect(this, &SSLStreamAdapterTestBase::OnEvent); | |
285 server_ssl_->SignalEvent.connect(this, &SSLStreamAdapterTestBase::OnEvent); | |
286 | |
287 if (!client_cert_pem_.empty() && !client_private_key_pem_.empty()) { | |
288 client_identity_ = rtc::SSLIdentity::FromPEMStrings( | |
289 client_private_key_pem_, client_cert_pem_); | |
290 } else { | |
291 client_identity_ = rtc::SSLIdentity::Generate("client", client_key_type_); | |
292 } | |
293 server_identity_ = rtc::SSLIdentity::Generate("server", server_key_type_); | |
294 | |
295 client_ssl_->SetIdentity(client_identity_); | |
296 server_ssl_->SetIdentity(server_identity_); | |
297 } | |
298 | |
299 virtual void TearDown() override { | |
300 client_ssl_.reset(NULL); | |
tommi
2015/11/13 08:38:13
nit: use nullptr. Is this necessary though? Won'
joachim
2015/11/13 09:08:28
Changed to nullptr. This is necessary because othe
| |
301 server_ssl_.reset(NULL); | |
302 } | |
303 | |
304 virtual void CreateStreams() = 0; | |
305 | |
212 // Recreate the client/server identities with the specified validity period. | 306 // Recreate the client/server identities with the specified validity period. |
213 // |not_before| and |not_after| are offsets from the current time in number | 307 // |not_before| and |not_after| are offsets from the current time in number |
214 // of seconds. | 308 // of seconds. |
215 void ResetIdentitiesWithValidity(int not_before, int not_after) { | 309 void ResetIdentitiesWithValidity(int not_before, int not_after) { |
216 client_stream_ = | 310 CreateStreams(); |
217 new SSLDummyStream(this, "c2s", &client_buffer_, &server_buffer_); | |
218 server_stream_ = | |
219 new SSLDummyStream(this, "s2c", &server_buffer_, &client_buffer_); | |
220 | 311 |
221 client_ssl_.reset(rtc::SSLStreamAdapter::Create(client_stream_)); | 312 client_ssl_.reset(rtc::SSLStreamAdapter::Create(client_stream_)); |
222 server_ssl_.reset(rtc::SSLStreamAdapter::Create(server_stream_)); | 313 server_ssl_.reset(rtc::SSLStreamAdapter::Create(server_stream_)); |
223 | 314 |
224 client_ssl_->SignalEvent.connect(this, &SSLStreamAdapterTestBase::OnEvent); | 315 client_ssl_->SignalEvent.connect(this, &SSLStreamAdapterTestBase::OnEvent); |
225 server_ssl_->SignalEvent.connect(this, &SSLStreamAdapterTestBase::OnEvent); | 316 server_ssl_->SignalEvent.connect(this, &SSLStreamAdapterTestBase::OnEvent); |
226 | 317 |
227 rtc::SSLIdentityParams client_params; | 318 rtc::SSLIdentityParams client_params; |
228 client_params.key_params = rtc::KeyParams(rtc::KT_DEFAULT); | 319 client_params.key_params = rtc::KeyParams(rtc::KT_DEFAULT); |
229 client_params.common_name = "client"; | 320 client_params.common_name = "client"; |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
324 if (expect_success) { | 415 if (expect_success) { |
325 EXPECT_TRUE_WAIT((client_ssl_->GetState() == rtc::SS_OPEN) | 416 EXPECT_TRUE_WAIT((client_ssl_->GetState() == rtc::SS_OPEN) |
326 && (server_ssl_->GetState() == rtc::SS_OPEN), | 417 && (server_ssl_->GetState() == rtc::SS_OPEN), |
327 handshake_wait_); | 418 handshake_wait_); |
328 } else { | 419 } else { |
329 EXPECT_TRUE_WAIT(client_ssl_->GetState() == rtc::SS_CLOSED, | 420 EXPECT_TRUE_WAIT(client_ssl_->GetState() == rtc::SS_CLOSED, |
330 handshake_wait_); | 421 handshake_wait_); |
331 } | 422 } |
332 } | 423 } |
333 | 424 |
334 rtc::StreamResult DataWritten(SSLDummyStream *from, const void *data, | 425 rtc::StreamResult DataWritten(SSLDummyStreamBase *from, const void *data, |
335 size_t data_len, size_t *written, | 426 size_t data_len, size_t *written, |
tommi
2015/11/13 08:38:13
can you fix the indentation since you're here?
joachim
2015/11/13 09:08:28
Done here and in some other places.
| |
336 int *error) { | 427 int *error) { |
337 // Randomly drop loss_ percent of packets | 428 // Randomly drop loss_ percent of packets |
338 if (rtc::CreateRandomId() % 100 < static_cast<uint32_t>(loss_)) { | 429 if (rtc::CreateRandomId() % 100 < static_cast<uint32_t>(loss_)) { |
339 LOG(LS_INFO) << "Randomly dropping packet, size=" << data_len; | 430 LOG(LS_INFO) << "Randomly dropping packet, size=" << data_len; |
340 *written = data_len; | 431 *written = data_len; |
341 return rtc::SR_SUCCESS; | 432 return rtc::SR_SUCCESS; |
342 } | 433 } |
343 if (dtls_ && (data_len > mtu_)) { | 434 if (dtls_ && (data_len > mtu_)) { |
344 LOG(LS_INFO) << "Dropping packet > mtu, size=" << data_len; | 435 LOG(LS_INFO) << "Dropping packet > mtu, size=" << data_len; |
345 *written = data_len; | 436 *written = data_len; |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
436 use_context, | 527 use_context, |
437 result, result_len); | 528 result, result_len); |
438 } | 529 } |
439 | 530 |
440 // To be implemented by subclasses. | 531 // To be implemented by subclasses. |
441 virtual void WriteData() = 0; | 532 virtual void WriteData() = 0; |
442 virtual void ReadData(rtc::StreamInterface *stream) = 0; | 533 virtual void ReadData(rtc::StreamInterface *stream) = 0; |
443 virtual void TestTransfer(int size) = 0; | 534 virtual void TestTransfer(int size) = 0; |
444 | 535 |
445 protected: | 536 protected: |
446 rtc::FifoBuffer client_buffer_; | 537 std::string client_cert_pem_; |
447 rtc::FifoBuffer server_buffer_; | 538 std::string client_private_key_pem_; |
448 SSLDummyStream *client_stream_; // freed by client_ssl_ destructor | 539 rtc::KeyParams client_key_type_; |
449 SSLDummyStream *server_stream_; // freed by server_ssl_ destructor | 540 rtc::KeyParams server_key_type_; |
541 SSLDummyStreamBase *client_stream_; // freed by client_ssl_ destructor | |
542 SSLDummyStreamBase *server_stream_; // freed by server_ssl_ destructor | |
450 rtc::scoped_ptr<rtc::SSLStreamAdapter> client_ssl_; | 543 rtc::scoped_ptr<rtc::SSLStreamAdapter> client_ssl_; |
451 rtc::scoped_ptr<rtc::SSLStreamAdapter> server_ssl_; | 544 rtc::scoped_ptr<rtc::SSLStreamAdapter> server_ssl_; |
452 rtc::SSLIdentity *client_identity_; // freed by client_ssl_ destructor | 545 rtc::SSLIdentity *client_identity_; // freed by client_ssl_ destructor |
453 rtc::SSLIdentity *server_identity_; // freed by server_ssl_ destructor | 546 rtc::SSLIdentity *server_identity_; // freed by server_ssl_ destructor |
454 int delay_; | 547 int delay_; |
455 size_t mtu_; | 548 size_t mtu_; |
456 int loss_; | 549 int loss_; |
457 bool lose_first_packet_; | 550 bool lose_first_packet_; |
458 bool damage_; | 551 bool damage_; |
459 bool dtls_; | 552 bool dtls_; |
460 int handshake_wait_; | 553 int handshake_wait_; |
461 bool identities_set_; | 554 bool identities_set_; |
462 }; | 555 }; |
463 | 556 |
464 class SSLStreamAdapterTestTLS | 557 class SSLStreamAdapterTestTLS |
465 : public SSLStreamAdapterTestBase, | 558 : public SSLStreamAdapterTestBase, |
466 public WithParamInterface<tuple<rtc::KeyParams, rtc::KeyParams>> { | 559 public WithParamInterface<tuple<rtc::KeyParams, rtc::KeyParams>> { |
467 public: | 560 public: |
468 SSLStreamAdapterTestTLS() | 561 SSLStreamAdapterTestTLS() |
469 : SSLStreamAdapterTestBase("", | 562 : SSLStreamAdapterTestBase("", |
470 "", | 563 "", |
471 false, | 564 false, |
472 ::testing::get<0>(GetParam()), | 565 ::testing::get<0>(GetParam()), |
473 ::testing::get<1>(GetParam())){}; | 566 ::testing::get<1>(GetParam())), |
567 client_buffer_(kFifoBufferSize), | |
568 server_buffer_(kFifoBufferSize) { | |
569 } | |
570 | |
571 virtual void CreateStreams() override { | |
572 client_stream_ = | |
573 new SSLDummyStreamTLS(this, "c2s", &client_buffer_, &server_buffer_); | |
574 server_stream_ = | |
575 new SSLDummyStreamTLS(this, "s2c", &server_buffer_, &client_buffer_); | |
576 } | |
474 | 577 |
475 // Test data transfer for TLS | 578 // Test data transfer for TLS |
476 virtual void TestTransfer(int size) { | 579 virtual void TestTransfer(int size) { |
477 LOG(LS_INFO) << "Starting transfer test with " << size << " bytes"; | 580 LOG(LS_INFO) << "Starting transfer test with " << size << " bytes"; |
478 // Create some dummy data to send. | 581 // Create some dummy data to send. |
479 size_t received; | 582 size_t received; |
480 | 583 |
481 send_stream_.ReserveSize(size); | 584 send_stream_.ReserveSize(size); |
482 for (int i = 0; i < size; ++i) { | 585 for (int i = 0; i < size; ++i) { |
483 char ch = static_cast<char>(i); | 586 char ch = static_cast<char>(i); |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
558 break; | 661 break; |
559 | 662 |
560 ASSERT_EQ(rtc::SR_SUCCESS, r); | 663 ASSERT_EQ(rtc::SR_SUCCESS, r); |
561 LOG(LS_INFO) << "Read " << bread; | 664 LOG(LS_INFO) << "Read " << bread; |
562 | 665 |
563 recv_stream_.Write(buffer, bread, NULL, NULL); | 666 recv_stream_.Write(buffer, bread, NULL, NULL); |
564 } | 667 } |
565 } | 668 } |
566 | 669 |
567 private: | 670 private: |
671 rtc::FifoBuffer client_buffer_; | |
672 rtc::FifoBuffer server_buffer_; | |
568 rtc::MemoryStream send_stream_; | 673 rtc::MemoryStream send_stream_; |
569 rtc::MemoryStream recv_stream_; | 674 rtc::MemoryStream recv_stream_; |
570 }; | 675 }; |
571 | 676 |
572 class SSLStreamAdapterTestDTLS | 677 class SSLStreamAdapterTestDTLS |
573 : public SSLStreamAdapterTestBase, | 678 : public SSLStreamAdapterTestBase, |
574 public WithParamInterface<tuple<rtc::KeyParams, rtc::KeyParams>> { | 679 public WithParamInterface<tuple<rtc::KeyParams, rtc::KeyParams>> { |
575 public: | 680 public: |
576 SSLStreamAdapterTestDTLS() | 681 SSLStreamAdapterTestDTLS() |
577 : SSLStreamAdapterTestBase("", | 682 : SSLStreamAdapterTestBase("", |
578 "", | 683 "", |
579 true, | 684 true, |
580 ::testing::get<0>(GetParam()), | 685 ::testing::get<0>(GetParam()), |
581 ::testing::get<1>(GetParam())), | 686 ::testing::get<1>(GetParam())), |
687 client_buffer_(kBufferCapacity, kDefaultBufferSize), | |
688 server_buffer_(kBufferCapacity, kDefaultBufferSize), | |
582 packet_size_(1000), | 689 packet_size_(1000), |
583 count_(0), | 690 count_(0), |
584 sent_(0) {} | 691 sent_(0) {} |
585 | 692 |
586 SSLStreamAdapterTestDTLS(const std::string& cert_pem, | 693 SSLStreamAdapterTestDTLS(const std::string& cert_pem, |
587 const std::string& private_key_pem) : | 694 const std::string& private_key_pem) : |
588 SSLStreamAdapterTestBase(cert_pem, private_key_pem, true), | 695 SSLStreamAdapterTestBase(cert_pem, private_key_pem, true), |
696 client_buffer_(kBufferCapacity, kDefaultBufferSize), | |
697 server_buffer_(kBufferCapacity, kDefaultBufferSize), | |
589 packet_size_(1000), count_(0), sent_(0) { | 698 packet_size_(1000), count_(0), sent_(0) { |
590 } | 699 } |
591 | 700 |
701 virtual void CreateStreams() override { | |
702 client_stream_ = | |
703 new SSLDummyStreamDTLS(this, "c2s", &client_buffer_, &server_buffer_); | |
704 server_stream_ = | |
705 new SSLDummyStreamDTLS(this, "s2c", &server_buffer_, &client_buffer_); | |
706 } | |
707 | |
592 virtual void WriteData() { | 708 virtual void WriteData() { |
593 unsigned char *packet = new unsigned char[1600]; | 709 unsigned char *packet = new unsigned char[1600]; |
594 | 710 |
595 do { | 711 while (sent_ < count_) { |
596 memset(packet, sent_ & 0xff, packet_size_); | 712 memset(packet, sent_ & 0xff, packet_size_); |
597 *(reinterpret_cast<uint32_t *>(packet)) = sent_; | 713 *(reinterpret_cast<uint32_t *>(packet)) = sent_; |
598 | 714 |
599 size_t sent; | 715 size_t sent; |
600 int rv = client_ssl_->Write(packet, packet_size_, &sent, 0); | 716 int rv = client_ssl_->Write(packet, packet_size_, &sent, 0); |
601 if (rv == rtc::SR_SUCCESS) { | 717 if (rv == rtc::SR_SUCCESS) { |
602 LOG(LS_VERBOSE) << "Sent: " << sent_; | 718 LOG(LS_VERBOSE) << "Sent: " << sent_; |
603 sent_++; | 719 sent_++; |
604 } else if (rv == rtc::SR_BLOCK) { | 720 } else if (rv == rtc::SR_BLOCK) { |
605 LOG(LS_VERBOSE) << "Blocked..."; | 721 LOG(LS_VERBOSE) << "Blocked..."; |
606 break; | 722 break; |
607 } else { | 723 } else { |
608 ADD_FAILURE(); | 724 ADD_FAILURE(); |
609 break; | 725 break; |
610 } | 726 } |
611 } while (sent_ < count_); | 727 }; |
tommi
2015/11/13 08:38:13
remove semicolon
joachim
2015/11/13 09:08:28
Done.
| |
612 | 728 |
613 delete [] packet; | 729 delete [] packet; |
614 } | 730 } |
615 | 731 |
616 virtual void ReadData(rtc::StreamInterface *stream) { | 732 virtual void ReadData(rtc::StreamInterface *stream) { |
617 unsigned char buffer[2000]; | 733 unsigned char buffer[2000]; |
618 size_t bread; | 734 size_t bread; |
619 int err2; | 735 int err2; |
620 rtc::StreamResult r; | 736 rtc::StreamResult r; |
621 | 737 |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
660 EXPECT_EQ(0U, received_.size()); | 776 EXPECT_EQ(0U, received_.size()); |
661 } else if (loss_ == 0) { | 777 } else if (loss_ == 0) { |
662 EXPECT_EQ_WAIT(static_cast<size_t>(sent_), received_.size(), 1000); | 778 EXPECT_EQ_WAIT(static_cast<size_t>(sent_), received_.size(), 1000); |
663 } else { | 779 } else { |
664 LOG(LS_INFO) << "Sent " << sent_ << " packets; received " << | 780 LOG(LS_INFO) << "Sent " << sent_ << " packets; received " << |
665 received_.size(); | 781 received_.size(); |
666 } | 782 } |
667 }; | 783 }; |
668 | 784 |
669 private: | 785 private: |
786 rtc::BufferQueue client_buffer_; | |
787 rtc::BufferQueue server_buffer_; | |
670 size_t packet_size_; | 788 size_t packet_size_; |
671 int count_; | 789 int count_; |
672 int sent_; | 790 int sent_; |
673 std::set<int> received_; | 791 std::set<int> received_; |
674 }; | 792 }; |
675 | 793 |
676 | 794 |
677 rtc::StreamResult SSLDummyStream::Write(const void* data, size_t data_len, | 795 rtc::StreamResult SSLDummyStreamBase::Write(const void* data, size_t data_len, |
678 size_t* written, int* error) { | 796 size_t* written, int* error) { |
679 *written = data_len; | 797 *written = data_len; |
680 | 798 |
681 LOG(LS_INFO) << "Writing to loopback " << data_len; | 799 LOG(LS_INFO) << "Writing to loopback " << data_len; |
682 | 800 |
683 if (first_packet_) { | 801 if (first_packet_) { |
684 first_packet_ = false; | 802 first_packet_ = false; |
685 if (test_->GetLoseFirstPacket()) { | 803 if (test_->GetLoseFirstPacket()) { |
686 LOG(LS_INFO) << "Losing initial packet of length " << data_len; | 804 LOG(LS_INFO) << "Losing initial packet of length " << data_len; |
687 return rtc::SR_SUCCESS; | 805 return rtc::SR_SUCCESS; |
688 } | 806 } |
689 } | 807 } |
690 | 808 |
691 return test_->DataWritten(this, data, data_len, written, error); | 809 return test_->DataWritten(this, data, data_len, written, error); |
692 | |
693 return rtc::SR_SUCCESS; | |
694 }; | 810 }; |
695 | 811 |
696 class SSLStreamAdapterTestDTLSFromPEMStrings : public SSLStreamAdapterTestDTLS { | 812 class SSLStreamAdapterTestDTLSFromPEMStrings : public SSLStreamAdapterTestDTLS { |
697 public: | 813 public: |
698 SSLStreamAdapterTestDTLSFromPEMStrings() : | 814 SSLStreamAdapterTestDTLSFromPEMStrings() : |
699 SSLStreamAdapterTestDTLS(kCERT_PEM, kRSA_PRIVATE_KEY_PEM) { | 815 SSLStreamAdapterTestDTLS(kCERT_PEM, kRSA_PRIVATE_KEY_PEM) { |
700 } | 816 } |
701 }; | 817 }; |
702 | 818 |
703 // Basic tests: TLS | 819 // Basic tests: TLS |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
775 // Test a handshake with small MTU | 891 // Test a handshake with small MTU |
776 // Disabled due to https://code.google.com/p/webrtc/issues/detail?id=3910 | 892 // Disabled due to https://code.google.com/p/webrtc/issues/detail?id=3910 |
777 TEST_P(SSLStreamAdapterTestDTLS, DISABLED_TestDTLSConnectWithSmallMtu) { | 893 TEST_P(SSLStreamAdapterTestDTLS, DISABLED_TestDTLSConnectWithSmallMtu) { |
778 MAYBE_SKIP_TEST(HaveDtls); | 894 MAYBE_SKIP_TEST(HaveDtls); |
779 SetMtu(700); | 895 SetMtu(700); |
780 SetHandshakeWait(20000); | 896 SetHandshakeWait(20000); |
781 TestHandshake(); | 897 TestHandshake(); |
782 }; | 898 }; |
783 | 899 |
784 // Test transfer -- trivial | 900 // Test transfer -- trivial |
785 // Disabled due to https://code.google.com/p/webrtc/issues/detail?id=5005 | 901 TEST_P(SSLStreamAdapterTestDTLS, TestDTLSTransfer) { |
786 TEST_P(SSLStreamAdapterTestDTLS, DISABLED_TestDTLSTransfer) { | |
787 MAYBE_SKIP_TEST(HaveDtls); | 902 MAYBE_SKIP_TEST(HaveDtls); |
788 TestHandshake(); | 903 TestHandshake(); |
789 TestTransfer(100); | 904 TestTransfer(100); |
790 }; | 905 }; |
791 | 906 |
792 // Disabled due to https://code.google.com/p/webrtc/issues/detail?id=5005 | 907 TEST_P(SSLStreamAdapterTestDTLS, TestDTLSTransferWithLoss) { |
793 TEST_P(SSLStreamAdapterTestDTLS, DISABLED_TestDTLSTransferWithLoss) { | |
794 MAYBE_SKIP_TEST(HaveDtls); | 908 MAYBE_SKIP_TEST(HaveDtls); |
795 TestHandshake(); | 909 TestHandshake(); |
796 SetLoss(10); | 910 SetLoss(10); |
797 TestTransfer(100); | 911 TestTransfer(100); |
798 }; | 912 }; |
799 | 913 |
800 // Disabled due to https://code.google.com/p/webrtc/issues/detail?id=5005 | 914 TEST_P(SSLStreamAdapterTestDTLS, TestDTLSTransferWithDamage) { |
801 TEST_P(SSLStreamAdapterTestDTLS, DISABLED_TestDTLSTransferWithDamage) { | |
802 MAYBE_SKIP_TEST(HaveDtls); | 915 MAYBE_SKIP_TEST(HaveDtls); |
803 SetDamage(); // Must be called first because first packet | 916 SetDamage(); // Must be called first because first packet |
804 // write happens at end of handshake. | 917 // write happens at end of handshake. |
805 TestHandshake(); | 918 TestHandshake(); |
806 TestTransfer(100); | 919 TestTransfer(100); |
807 }; | 920 }; |
808 | 921 |
809 // Test DTLS-SRTP with all high ciphers | 922 // Test DTLS-SRTP with all high ciphers |
810 TEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpHigh) { | 923 TEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpHigh) { |
811 MAYBE_SKIP_TEST(HaveDtlsSrtp); | 924 MAYBE_SKIP_TEST(HaveDtlsSrtp); |
(...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1054 rtc::KeyParams::ECDSA(rtc::EC_NIST_P256)))); | 1167 rtc::KeyParams::ECDSA(rtc::EC_NIST_P256)))); |
1055 INSTANTIATE_TEST_CASE_P( | 1168 INSTANTIATE_TEST_CASE_P( |
1056 SSLStreamAdapterTestsDTLS, | 1169 SSLStreamAdapterTestsDTLS, |
1057 SSLStreamAdapterTestDTLS, | 1170 SSLStreamAdapterTestDTLS, |
1058 Combine(Values(rtc::KeyParams::RSA(1024, 65537), | 1171 Combine(Values(rtc::KeyParams::RSA(1024, 65537), |
1059 rtc::KeyParams::RSA(1152, 65537), | 1172 rtc::KeyParams::RSA(1152, 65537), |
1060 rtc::KeyParams::ECDSA(rtc::EC_NIST_P256)), | 1173 rtc::KeyParams::ECDSA(rtc::EC_NIST_P256)), |
1061 Values(rtc::KeyParams::RSA(1024, 65537), | 1174 Values(rtc::KeyParams::RSA(1024, 65537), |
1062 rtc::KeyParams::RSA(1152, 65537), | 1175 rtc::KeyParams::RSA(1152, 65537), |
1063 rtc::KeyParams::ECDSA(rtc::EC_NIST_P256)))); | 1176 rtc::KeyParams::ECDSA(rtc::EC_NIST_P256)))); |
OLD | NEW |