blob: 982983217c16a21d366672620c3d66f0bd3b81f6 [file] [log] [blame]
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001/*
2 * libjingle
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are met:
6 *
7 * 1. Redistributions of source code must retain the above copyright notice,
8 * this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright notice,
10 * this list of conditions and the following disclaimer in the documentation
11 * and/or other materials provided with the distribution.
12 * 3. The name of the author may not be used to endorse or promote products
13 * derived from this software without specific prior written permission.
14 *
15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
16 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
17 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
18 * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
19 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
21 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
22 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
23 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
24 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25 */
26
27#include <stdio.h>
28
29#include "talk/app/webrtc/statscollector.h"
30
31#include "talk/app/webrtc/mediastream.h"
32#include "talk/app/webrtc/videotrack.h"
wu@webrtc.org4551b792013-10-09 15:37:36 +000033#include "talk/base/base64.h"
34#include "talk/base/fakesslidentity.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000035#include "talk/base/gunit.h"
36#include "talk/media/base/fakemediaengine.h"
37#include "talk/media/devices/fakedevicemanager.h"
38#include "talk/p2p/base/fakesession.h"
39#include "talk/session/media/channelmanager.h"
40#include "testing/base/public/gmock.h"
41
42using testing::_;
43using testing::DoAll;
44using testing::Return;
45using testing::ReturnNull;
46using testing::SetArgPointee;
47
48namespace cricket {
49
50class ChannelManager;
51class FakeDeviceManager;
52
53} // namespace cricket
54
55namespace {
56
57// Error return values
58const char kNotFound[] = "NOT FOUND";
59const char kNoReports[] = "NO REPORTS";
60
61class MockWebRtcSession : public webrtc::WebRtcSession {
62 public:
63 explicit MockWebRtcSession(cricket::ChannelManager* channel_manager)
64 : WebRtcSession(channel_manager, talk_base::Thread::Current(),
wu@webrtc.org4551b792013-10-09 15:37:36 +000065 talk_base::Thread::Current(), NULL, NULL) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +000066 }
67 MOCK_METHOD0(video_channel, cricket::VideoChannel*());
68 MOCK_METHOD2(GetTrackIdBySsrc, bool(uint32, std::string*));
69 MOCK_METHOD1(GetStats, bool(cricket::SessionStats*));
wu@webrtc.org4551b792013-10-09 15:37:36 +000070 MOCK_METHOD1(GetTransport, cricket::Transport*(const std::string&));
henrike@webrtc.org28e20752013-07-10 00:45:36 +000071};
72
73class MockVideoMediaChannel : public cricket::FakeVideoMediaChannel {
74 public:
75 MockVideoMediaChannel()
76 : cricket::FakeVideoMediaChannel(NULL) {
77 }
78 // MOCK_METHOD0(transport_channel, cricket::TransportChannel*());
79 MOCK_METHOD1(GetStats, bool(cricket::VideoMediaInfo*));
80};
81
wu@webrtc.org4551b792013-10-09 15:37:36 +000082bool GetValue(const webrtc::StatsReport* report,
83 const std::string& name,
84 std::string* value) {
85 webrtc::StatsReport::Values::const_iterator it = report->values.begin();
86 for (; it != report->values.end(); ++it) {
87 if (it->name == name) {
88 *value = it->value;
89 return true;
90 }
91 }
92 return false;
93}
94
henrike@webrtc.org28e20752013-07-10 00:45:36 +000095std::string ExtractStatsValue(const std::string& type,
wu@webrtc.org4551b792013-10-09 15:37:36 +000096 const webrtc::StatsReports& reports,
henrike@webrtc.org28e20752013-07-10 00:45:36 +000097 const std::string name) {
98 if (reports.empty()) {
99 return kNoReports;
100 }
101 for (size_t i = 0; i < reports.size(); ++i) {
102 if (reports[i].type != type)
103 continue;
wu@webrtc.org4551b792013-10-09 15:37:36 +0000104 std::string ret;
105 if (GetValue(&reports[i], name, &ret)) {
106 return ret;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000107 }
108 }
109
110 return kNotFound;
111}
112
113// Finds the |n|-th report of type |type| in |reports|.
114// |n| starts from 1 for finding the first report.
wu@webrtc.org4551b792013-10-09 15:37:36 +0000115const webrtc::StatsReport* FindNthReportByType(
116 const webrtc::StatsReports& reports, const std::string& type, int n) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000117 for (size_t i = 0; i < reports.size(); ++i) {
118 if (reports[i].type == type) {
119 n--;
120 if (n == 0)
121 return &reports[i];
122 }
123 }
124 return NULL;
125}
126
wu@webrtc.org4551b792013-10-09 15:37:36 +0000127const webrtc::StatsReport* FindReportById(const webrtc::StatsReports& reports,
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000128 const std::string& id) {
129 for (size_t i = 0; i < reports.size(); ++i) {
130 if (reports[i].id == id) {
131 return &reports[i];
132 }
133 }
134 return NULL;
135}
136
137std::string ExtractSsrcStatsValue(webrtc::StatsReports reports,
138 const std::string& name) {
139 return ExtractStatsValue(
140 webrtc::StatsReport::kStatsReportTypeSsrc, reports, name);
141}
142
143std::string ExtractBweStatsValue(webrtc::StatsReports reports,
144 const std::string& name) {
145 return ExtractStatsValue(
146 webrtc::StatsReport::kStatsReportTypeBwe, reports, name);
147}
148
wu@webrtc.org4551b792013-10-09 15:37:36 +0000149std::string DerToPem(const std::string& der) {
150 return talk_base::SSLIdentity::DerToPem(
151 talk_base::kPemTypeCertificate,
152 reinterpret_cast<const unsigned char*>(der.c_str()),
153 der.length());
154}
155
156std::vector<std::string> DersToPems(
157 const std::vector<std::string>& ders) {
158 std::vector<std::string> pems(ders.size());
159 std::transform(ders.begin(), ders.end(), pems.begin(), DerToPem);
160 return pems;
161}
162
163void CheckCertChainReports(const webrtc::StatsReports& reports,
164 const std::vector<std::string>& ders,
165 const std::string& start_id) {
166 std::string certificate_id = start_id;
167 size_t i = 0;
168 while (true) {
169 const webrtc::StatsReport* report = FindReportById(reports, certificate_id);
170 ASSERT_TRUE(report != NULL);
171 std::string der_base64;
172 EXPECT_TRUE(GetValue(
173 report, webrtc::StatsReport::kStatsValueNameDer, &der_base64));
174 std::string der = talk_base::Base64::Decode(der_base64,
175 talk_base::Base64::DO_STRICT);
176 EXPECT_EQ(ders[i], der);
177 ++i;
178 if (!GetValue(
179 report, webrtc::StatsReport::kStatsValueNameIssuerId, &certificate_id))
180 break;
181 }
182 EXPECT_EQ(ders.size(), i);
183}
184
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000185class StatsCollectorTest : public testing::Test {
186 protected:
187 StatsCollectorTest()
188 : media_engine_(new cricket::FakeMediaEngine),
189 channel_manager_(
190 new cricket::ChannelManager(media_engine_,
191 new cricket::FakeDeviceManager(),
192 talk_base::Thread::Current())),
193 session_(channel_manager_.get()) {
194 // By default, we ignore session GetStats calls.
195 EXPECT_CALL(session_, GetStats(_)).WillRepeatedly(Return(false));
196 }
197
wu@webrtc.org4551b792013-10-09 15:37:36 +0000198 void TestCertificateReports(const talk_base::FakeSSLCertificate& local_cert,
199 const std::vector<std::string>& local_ders,
200 const talk_base::FakeSSLCertificate& remote_cert,
201 const std::vector<std::string>& remote_ders) {
202 webrtc::StatsCollector stats; // Implementation under test.
203 webrtc::StatsReports reports; // returned values.
204 stats.set_session(&session_);
205
206 // Fake stats to process.
207 cricket::TransportChannelStats channel_stats;
208 channel_stats.component = 1;
209
210 cricket::TransportStats transport_stats;
211 transport_stats.content_name = "audio";
212 transport_stats.channel_stats.push_back(channel_stats);
213
214 cricket::SessionStats session_stats;
215 session_stats.transport_stats[transport_stats.content_name] =
216 transport_stats;
217
218 // Fake certificates to report.
219 talk_base::FakeSSLIdentity local_identity(local_cert);
220 talk_base::scoped_ptr<talk_base::FakeSSLCertificate> remote_cert_copy(
221 remote_cert.GetReference());
222
223 // Fake transport object.
224 talk_base::scoped_ptr<cricket::FakeTransport> transport(
225 new cricket::FakeTransport(
226 session_.signaling_thread(),
227 session_.worker_thread(),
228 transport_stats.content_name));
229 transport->SetIdentity(&local_identity);
230 cricket::FakeTransportChannel* channel =
231 static_cast<cricket::FakeTransportChannel*>(
232 transport->CreateChannel(channel_stats.component));
233 EXPECT_FALSE(channel == NULL);
234 channel->SetRemoteCertificate(remote_cert_copy.get());
235
236 // Configure MockWebRtcSession
237 EXPECT_CALL(session_, GetTransport(transport_stats.content_name))
238 .WillOnce(Return(transport.get()));
239 EXPECT_CALL(session_, GetStats(_))
240 .WillOnce(DoAll(SetArgPointee<0>(session_stats),
241 Return(true)));
242 EXPECT_CALL(session_, video_channel())
243 .WillRepeatedly(ReturnNull());
244
245 stats.UpdateStats();
246
247 stats.GetStats(NULL, &reports);
248
249 const webrtc::StatsReport* channel_report = FindNthReportByType(
250 reports, webrtc::StatsReport::kStatsReportTypeComponent, 1);
251 EXPECT_TRUE(channel_report != NULL);
252
253 // Check local certificate chain.
254 std::string local_certificate_id = ExtractStatsValue(
255 webrtc::StatsReport::kStatsReportTypeComponent,
256 reports,
257 webrtc::StatsReport::kStatsValueNameLocalCertificateId);
258 EXPECT_NE(kNotFound, local_certificate_id);
259 CheckCertChainReports(reports, local_ders, local_certificate_id);
260
261 // Check remote certificate chain.
262 std::string remote_certificate_id = ExtractStatsValue(
263 webrtc::StatsReport::kStatsReportTypeComponent,
264 reports,
265 webrtc::StatsReport::kStatsValueNameRemoteCertificateId);
266 EXPECT_NE(kNotFound, remote_certificate_id);
267 CheckCertChainReports(reports, remote_ders, remote_certificate_id);
268 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000269 cricket::FakeMediaEngine* media_engine_;
270 talk_base::scoped_ptr<cricket::ChannelManager> channel_manager_;
271 MockWebRtcSession session_;
272};
273
274// This test verifies that 64-bit counters are passed successfully.
275TEST_F(StatsCollectorTest, BytesCounterHandles64Bits) {
276 webrtc::StatsCollector stats; // Implementation under test.
277 MockVideoMediaChannel* media_channel = new MockVideoMediaChannel;
278 cricket::VideoChannel video_channel(talk_base::Thread::Current(),
279 media_engine_, media_channel, &session_, "", false, NULL);
280 webrtc::StatsReports reports; // returned values.
281 cricket::VideoSenderInfo video_sender_info;
282 cricket::VideoMediaInfo stats_read;
283 const uint32 kSsrcOfTrack = 1234;
284 const std::string kNameOfTrack("somename");
285 // The number of bytes must be larger than 0xFFFFFFFF for this test.
286 const int64 kBytesSent = 12345678901234LL;
287 const std::string kBytesSentString("12345678901234");
288
289 stats.set_session(&session_);
290 talk_base::scoped_refptr<webrtc::MediaStream> stream(
291 webrtc::MediaStream::Create("streamlabel"));
292 stream->AddTrack(webrtc::VideoTrack::Create(kNameOfTrack, NULL));
293 stats.AddStream(stream);
294
295 // Construct a stats value to read.
296 video_sender_info.ssrcs.push_back(1234);
297 video_sender_info.bytes_sent = kBytesSent;
298 stats_read.senders.push_back(video_sender_info);
299
300 EXPECT_CALL(session_, video_channel())
301 .WillRepeatedly(Return(&video_channel));
302 EXPECT_CALL(*media_channel, GetStats(_))
303 .WillOnce(DoAll(SetArgPointee<0>(stats_read),
304 Return(true)));
305 EXPECT_CALL(session_, GetTrackIdBySsrc(kSsrcOfTrack, _))
306 .WillOnce(DoAll(SetArgPointee<1>(kNameOfTrack),
307 Return(true)));
308 stats.UpdateStats();
309 stats.GetStats(NULL, &reports);
310 std::string result = ExtractSsrcStatsValue(reports, "bytesSent");
311 EXPECT_EQ(kBytesSentString, result);
312}
313
314// Test that BWE information is reported via stats.
315TEST_F(StatsCollectorTest, BandwidthEstimationInfoIsReported) {
316 webrtc::StatsCollector stats; // Implementation under test.
317 MockVideoMediaChannel* media_channel = new MockVideoMediaChannel;
318 cricket::VideoChannel video_channel(talk_base::Thread::Current(),
319 media_engine_, media_channel, &session_, "", false, NULL);
320 webrtc::StatsReports reports; // returned values.
321 cricket::VideoSenderInfo video_sender_info;
322 cricket::VideoMediaInfo stats_read;
323 // Set up an SSRC just to test that we get both kinds of stats back: SSRC and
324 // BWE.
325 const uint32 kSsrcOfTrack = 1234;
326 const std::string kNameOfTrack("somename");
327 const int64 kBytesSent = 12345678901234LL;
328 const std::string kBytesSentString("12345678901234");
329
330 stats.set_session(&session_);
331 talk_base::scoped_refptr<webrtc::MediaStream> stream(
332 webrtc::MediaStream::Create("streamlabel"));
333 stream->AddTrack(webrtc::VideoTrack::Create(kNameOfTrack, NULL));
334 stats.AddStream(stream);
335
336 // Construct a stats value to read.
337 video_sender_info.ssrcs.push_back(1234);
338 video_sender_info.bytes_sent = kBytesSent;
339 stats_read.senders.push_back(video_sender_info);
340 cricket::BandwidthEstimationInfo bwe;
341 const int kTargetEncBitrate = 123456;
342 const std::string kTargetEncBitrateString("123456");
343 bwe.target_enc_bitrate = kTargetEncBitrate;
344 stats_read.bw_estimations.push_back(bwe);
345
346 EXPECT_CALL(session_, video_channel())
347 .WillRepeatedly(Return(&video_channel));
348 EXPECT_CALL(*media_channel, GetStats(_))
349 .WillOnce(DoAll(SetArgPointee<0>(stats_read),
350 Return(true)));
351 EXPECT_CALL(session_, GetTrackIdBySsrc(kSsrcOfTrack, _))
352 .WillOnce(DoAll(SetArgPointee<1>(kNameOfTrack),
353 Return(true)));
354 stats.UpdateStats();
355 stats.GetStats(NULL, &reports);
356 std::string result = ExtractSsrcStatsValue(reports, "bytesSent");
357 EXPECT_EQ(kBytesSentString, result);
358 result = ExtractBweStatsValue(reports, "googTargetEncBitrate");
359 EXPECT_EQ(kTargetEncBitrateString, result);
360}
361
362// This test verifies that an object of type "googSession" always
363// exists in the returned stats.
364TEST_F(StatsCollectorTest, SessionObjectExists) {
365 webrtc::StatsCollector stats; // Implementation under test.
366 webrtc::StatsReports reports; // returned values.
367 stats.set_session(&session_);
368 EXPECT_CALL(session_, video_channel())
369 .WillRepeatedly(ReturnNull());
370 stats.UpdateStats();
371 stats.GetStats(NULL, &reports);
372 const webrtc::StatsReport* session_report = FindNthReportByType(
373 reports, webrtc::StatsReport::kStatsReportTypeSession, 1);
374 EXPECT_FALSE(session_report == NULL);
375}
376
377// This test verifies that only one object of type "googSession" exists
378// in the returned stats.
379TEST_F(StatsCollectorTest, OnlyOneSessionObjectExists) {
380 webrtc::StatsCollector stats; // Implementation under test.
381 webrtc::StatsReports reports; // returned values.
382 stats.set_session(&session_);
383 EXPECT_CALL(session_, video_channel())
384 .WillRepeatedly(ReturnNull());
385 stats.UpdateStats();
386 stats.UpdateStats();
387 stats.GetStats(NULL, &reports);
388 const webrtc::StatsReport* session_report = FindNthReportByType(
389 reports, webrtc::StatsReport::kStatsReportTypeSession, 1);
390 EXPECT_FALSE(session_report == NULL);
391 session_report = FindNthReportByType(
392 reports, webrtc::StatsReport::kStatsReportTypeSession, 2);
393 EXPECT_EQ(NULL, session_report);
394}
395
396// This test verifies that the empty track report exists in the returned stats
397// without calling StatsCollector::UpdateStats.
398TEST_F(StatsCollectorTest, TrackObjectExistsWithoutUpdateStats) {
399 webrtc::StatsCollector stats; // Implementation under test.
400 MockVideoMediaChannel* media_channel = new MockVideoMediaChannel;
401 cricket::VideoChannel video_channel(talk_base::Thread::Current(),
402 media_engine_, media_channel, &session_, "", false, NULL);
403 const std::string kTrackId("somename");
404 talk_base::scoped_refptr<webrtc::MediaStream> stream(
405 webrtc::MediaStream::Create("streamlabel"));
406 talk_base::scoped_refptr<webrtc::VideoTrack> track =
407 webrtc::VideoTrack::Create(kTrackId, NULL);
408 stream->AddTrack(track);
409 stats.AddStream(stream);
410
411 stats.set_session(&session_);
412
413 webrtc::StatsReports reports;
414
415 // Verfies the existence of the track report.
416 stats.GetStats(NULL, &reports);
417 EXPECT_EQ((size_t)1, reports.size());
418 EXPECT_EQ(std::string(webrtc::StatsReport::kStatsReportTypeTrack),
419 reports[0].type);
420
421 std::string trackValue =
422 ExtractStatsValue(webrtc::StatsReport::kStatsReportTypeTrack,
423 reports,
424 webrtc::StatsReport::kStatsValueNameTrackId);
425 EXPECT_EQ(kTrackId, trackValue);
426}
427
428// This test verifies that the empty track report exists in the returned stats
429// when StatsCollector::UpdateStats is called with ssrc stats.
430TEST_F(StatsCollectorTest, TrackAndSsrcObjectExistAfterUpdateSsrcStats) {
431 webrtc::StatsCollector stats; // Implementation under test.
432 MockVideoMediaChannel* media_channel = new MockVideoMediaChannel;
433 cricket::VideoChannel video_channel(talk_base::Thread::Current(),
434 media_engine_, media_channel, &session_, "", false, NULL);
435 const std::string kTrackId("somename");
436 talk_base::scoped_refptr<webrtc::MediaStream> stream(
437 webrtc::MediaStream::Create("streamlabel"));
438 talk_base::scoped_refptr<webrtc::VideoTrack> track =
439 webrtc::VideoTrack::Create(kTrackId, NULL);
440 stream->AddTrack(track);
441 stats.AddStream(stream);
442
443 stats.set_session(&session_);
444
445 webrtc::StatsReports reports;
446
447 // Constructs an ssrc stats update.
448 cricket::VideoSenderInfo video_sender_info;
449 cricket::VideoMediaInfo stats_read;
450 const uint32 kSsrcOfTrack = 1234;
451 const int64 kBytesSent = 12345678901234LL;
452
453 // Construct a stats value to read.
454 video_sender_info.ssrcs.push_back(1234);
455 video_sender_info.bytes_sent = kBytesSent;
456 stats_read.senders.push_back(video_sender_info);
457
458 EXPECT_CALL(session_, video_channel())
459 .WillRepeatedly(Return(&video_channel));
460 EXPECT_CALL(*media_channel, GetStats(_))
461 .WillOnce(DoAll(SetArgPointee<0>(stats_read),
462 Return(true)));
463 EXPECT_CALL(session_, GetTrackIdBySsrc(kSsrcOfTrack, _))
464 .WillOnce(DoAll(SetArgPointee<1>(kTrackId),
465 Return(true)));
466
467 stats.UpdateStats();
468 stats.GetStats(NULL, &reports);
469 // |reports| should contain one session report, one track report, and one ssrc
470 // report.
471 EXPECT_EQ((size_t)3, reports.size());
472 const webrtc::StatsReport* track_report = FindNthReportByType(
473 reports, webrtc::StatsReport::kStatsReportTypeTrack, 1);
474 EXPECT_FALSE(track_report == NULL);
475
476 stats.GetStats(track, &reports);
477 // |reports| should contain one session report, one track report, and one ssrc
478 // report.
479 EXPECT_EQ((size_t)3, reports.size());
480 track_report = FindNthReportByType(
481 reports, webrtc::StatsReport::kStatsReportTypeTrack, 1);
482 EXPECT_FALSE(track_report == NULL);
483
484 std::string ssrc_id = ExtractSsrcStatsValue(
485 reports, webrtc::StatsReport::kStatsValueNameSsrc);
486 EXPECT_EQ(talk_base::ToString<uint32>(kSsrcOfTrack), ssrc_id);
487
488 std::string track_id = ExtractSsrcStatsValue(
489 reports, webrtc::StatsReport::kStatsValueNameTrackId);
490 EXPECT_EQ(kTrackId, track_id);
491}
492
493// This test verifies that an SSRC object has the identifier of a Transport
494// stats object, and that this transport stats object exists in stats.
495TEST_F(StatsCollectorTest, TransportObjectLinkedFromSsrcObject) {
496 webrtc::StatsCollector stats; // Implementation under test.
497 MockVideoMediaChannel* media_channel = new MockVideoMediaChannel;
498 // The content_name known by the video channel.
499 const std::string kVcName("vcname");
500 cricket::VideoChannel video_channel(talk_base::Thread::Current(),
501 media_engine_, media_channel, &session_, kVcName, false, NULL);
502 const std::string kTrackId("somename");
503 talk_base::scoped_refptr<webrtc::MediaStream> stream(
504 webrtc::MediaStream::Create("streamlabel"));
505 talk_base::scoped_refptr<webrtc::VideoTrack> track =
506 webrtc::VideoTrack::Create(kTrackId, NULL);
507 stream->AddTrack(track);
508 stats.AddStream(stream);
509
510 stats.set_session(&session_);
511
512 webrtc::StatsReports reports;
513
514 // Constructs an ssrc stats update.
515 cricket::VideoSenderInfo video_sender_info;
516 cricket::VideoMediaInfo stats_read;
517 const uint32 kSsrcOfTrack = 1234;
518 const int64 kBytesSent = 12345678901234LL;
519
520 // Construct a stats value to read.
521 video_sender_info.ssrcs.push_back(1234);
522 video_sender_info.bytes_sent = kBytesSent;
523 stats_read.senders.push_back(video_sender_info);
524
525 EXPECT_CALL(session_, video_channel())
526 .WillRepeatedly(Return(&video_channel));
527 EXPECT_CALL(*media_channel, GetStats(_))
528 .WillRepeatedly(DoAll(SetArgPointee<0>(stats_read),
529 Return(true)));
530 EXPECT_CALL(session_, GetTrackIdBySsrc(kSsrcOfTrack, _))
531 .WillOnce(DoAll(SetArgPointee<1>(kTrackId),
532 Return(true)));
533
534 // Instruct the session to return stats containing the transport channel.
535 const std::string kTransportName("trspname");
536 cricket::SessionStats session_stats;
537 cricket::TransportStats transport_stats;
538 cricket::TransportChannelStats channel_stats;
539 channel_stats.component = 1;
540 transport_stats.content_name = kTransportName;
541 transport_stats.channel_stats.push_back(channel_stats);
542
543 session_stats.transport_stats[kTransportName] = transport_stats;
544 session_stats.proxy_to_transport[kVcName] = kTransportName;
545 EXPECT_CALL(session_, GetStats(_))
546 .WillRepeatedly(DoAll(SetArgPointee<0>(session_stats),
547 Return(true)));
548
549 stats.UpdateStats();
550 stats.GetStats(NULL, &reports);
551 std::string transport_id = ExtractStatsValue(
552 webrtc::StatsReport::kStatsReportTypeSsrc,
553 reports,
554 webrtc::StatsReport::kStatsValueNameTransportId);
555 ASSERT_NE(kNotFound, transport_id);
556 const webrtc::StatsReport* transport_report = FindReportById(reports,
557 transport_id);
558 ASSERT_FALSE(transport_report == NULL);
559}
560
wu@webrtc.org4551b792013-10-09 15:37:36 +0000561// This test verifies that all chained certificates are correctly
562// reported
563TEST_F(StatsCollectorTest, DISABLED_ChainedCertificateReportsCreated) {
564 // Build local certificate chain.
565 std::vector<std::string> local_ders(5);
566 local_ders[0] = "These";
567 local_ders[1] = "are";
568 local_ders[2] = "some";
569 local_ders[3] = "der";
570 local_ders[4] = "values";
571 talk_base::FakeSSLCertificate local_cert(DersToPems(local_ders));
572
573 // Build remote certificate chain
574 std::vector<std::string> remote_ders(4);
575 remote_ders[0] = "A";
576 remote_ders[1] = "non-";
577 remote_ders[2] = "intersecting";
578 remote_ders[3] = "set";
579 talk_base::FakeSSLCertificate remote_cert(DersToPems(remote_ders));
580
581 TestCertificateReports(local_cert, local_ders, remote_cert, remote_ders);
582}
583
584// This test verifies that all certificates without chains are correctly
585// reported.
586TEST_F(StatsCollectorTest, DISABLED_ChainlessCertificateReportsCreated) {
587 // Build local certificate.
588 std::string local_der = "This is the local der.";
589 talk_base::FakeSSLCertificate local_cert(DerToPem(local_der));
590
591 // Build remote certificate.
592 std::string remote_der = "This is somebody else's der.";
593 talk_base::FakeSSLCertificate remote_cert(DerToPem(remote_der));
594
595 TestCertificateReports(local_cert, std::vector<std::string>(1, local_der),
596 remote_cert, std::vector<std::string>(1, remote_der));
597}
598
599// This test verifies that the stats are generated correctly when no
600// transport is present.
601TEST_F(StatsCollectorTest, DISABLED_NoTransport) {
602 webrtc::StatsCollector stats; // Implementation under test.
603 webrtc::StatsReports reports; // returned values.
604 stats.set_session(&session_);
605
606 // Fake stats to process.
607 cricket::TransportChannelStats channel_stats;
608 channel_stats.component = 1;
609
610 cricket::TransportStats transport_stats;
611 transport_stats.content_name = "audio";
612 transport_stats.channel_stats.push_back(channel_stats);
613
614 cricket::SessionStats session_stats;
615 session_stats.transport_stats[transport_stats.content_name] =
616 transport_stats;
617
618 // Configure MockWebRtcSession
619 EXPECT_CALL(session_, GetTransport(transport_stats.content_name))
620 .WillOnce(ReturnNull());
621 EXPECT_CALL(session_, GetStats(_))
622 .WillOnce(DoAll(SetArgPointee<0>(session_stats),
623 Return(true)));
624 EXPECT_CALL(session_, video_channel())
625 .WillRepeatedly(ReturnNull());
626
627 stats.UpdateStats();
628 stats.GetStats(NULL, &reports);
629
630 // Check that the local certificate is absent.
631 std::string local_certificate_id = ExtractStatsValue(
632 webrtc::StatsReport::kStatsReportTypeComponent,
633 reports,
634 webrtc::StatsReport::kStatsValueNameLocalCertificateId);
635 ASSERT_EQ(kNotFound, local_certificate_id);
636
637 // Check that the remote certificate is absent.
638 std::string remote_certificate_id = ExtractStatsValue(
639 webrtc::StatsReport::kStatsReportTypeComponent,
640 reports,
641 webrtc::StatsReport::kStatsValueNameRemoteCertificateId);
642 ASSERT_EQ(kNotFound, remote_certificate_id);
643}
644
645// This test verifies that the stats are generated correctly when the transport
646// does not have any certificates.
647TEST_F(StatsCollectorTest, DISABLED_NoCertificates) {
648 webrtc::StatsCollector stats; // Implementation under test.
649 webrtc::StatsReports reports; // returned values.
650 stats.set_session(&session_);
651
652 // Fake stats to process.
653 cricket::TransportChannelStats channel_stats;
654 channel_stats.component = 1;
655
656 cricket::TransportStats transport_stats;
657 transport_stats.content_name = "audio";
658 transport_stats.channel_stats.push_back(channel_stats);
659
660 cricket::SessionStats session_stats;
661 session_stats.transport_stats[transport_stats.content_name] =
662 transport_stats;
663
664 // Fake transport object.
665 talk_base::scoped_ptr<cricket::FakeTransport> transport(
666 new cricket::FakeTransport(
667 session_.signaling_thread(),
668 session_.worker_thread(),
669 transport_stats.content_name));
670
671 // Configure MockWebRtcSession
672 EXPECT_CALL(session_, GetTransport(transport_stats.content_name))
673 .WillOnce(Return(transport.get()));
674 EXPECT_CALL(session_, GetStats(_))
675 .WillOnce(DoAll(SetArgPointee<0>(session_stats),
676 Return(true)));
677 EXPECT_CALL(session_, video_channel())
678 .WillRepeatedly(ReturnNull());
679
680 stats.UpdateStats();
681 stats.GetStats(NULL, &reports);
682
683 // Check that the local certificate is absent.
684 std::string local_certificate_id = ExtractStatsValue(
685 webrtc::StatsReport::kStatsReportTypeComponent,
686 reports,
687 webrtc::StatsReport::kStatsValueNameLocalCertificateId);
688 ASSERT_EQ(kNotFound, local_certificate_id);
689
690 // Check that the remote certificate is absent.
691 std::string remote_certificate_id = ExtractStatsValue(
692 webrtc::StatsReport::kStatsReportTypeComponent,
693 reports,
694 webrtc::StatsReport::kStatsValueNameRemoteCertificateId);
695 ASSERT_EQ(kNotFound, remote_certificate_id);
696}
697
698
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000699} // namespace