OLD | NEW |
---|---|
(Empty) | |
1 /* | |
2 * Copyright (c) 2017 The WebRTC project authors. All Rights Reserved. | |
3 * | |
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 | |
6 * tree. An additional intellectual property rights grant can be found | |
7 * in the file PATENTS. All contributing project authors may | |
8 * be found in the AUTHORS file in the root of the source tree. | |
9 */ | |
10 | |
11 #include "webrtc/test/call_test.h" | |
12 #include "webrtc/test/gtest.h" | |
13 #include "webrtc/test/rtcp_packet_parser.h" | |
14 | |
15 namespace webrtc { | |
16 namespace test { | |
17 namespace { | |
18 | |
19 class AudioSendTest : public SendTest { | |
20 public: | |
21 AudioSendTest() : SendTest(CallTest::kDefaultTimeoutMs) {} | |
22 | |
23 size_t GetNumVideoStreams() const override { | |
24 return 0; | |
25 } | |
26 size_t GetNumAudioStreams() const override { | |
27 return 1; | |
28 } | |
29 size_t GetNumFlexfecStreams() const override { | |
30 return 0; | |
31 } | |
32 }; | |
33 } // namespace | |
34 | |
35 using AudioSendStreamCallTest = CallTest; | |
36 | |
37 TEST_F(AudioSendStreamCallTest, SupportsCName) { | |
38 static std::string kCName = "PjqatC14dGfbVwGPUOA9IH7RlsFDbWl4AhXEiDsBizo="; | |
39 class CNameObserver : public AudioSendTest { | |
40 public: | |
41 CNameObserver() : AudioSendTest() {} | |
ossu
2017/09/14 11:51:58
Will CNameObserver() = default; do?
the sun
2017/09/14 12:36:39
Done.
| |
42 | |
43 private: | |
44 Action OnSendRtcp(const uint8_t* packet, size_t length) override { | |
45 RtcpPacketParser parser; | |
46 EXPECT_TRUE(parser.Parse(packet, length)); | |
47 if (parser.sdes()->num_packets() > 0) { | |
48 EXPECT_EQ(1u, parser.sdes()->chunks().size()); | |
49 EXPECT_EQ(kCName, parser.sdes()->chunks()[0].cname); | |
50 | |
51 observation_complete_.Set(); | |
52 } | |
53 | |
54 return SEND_PACKET; | |
55 } | |
56 | |
57 void ModifyAudioConfigs( | |
58 AudioSendStream::Config* send_config, | |
59 std::vector<AudioReceiveStream::Config>* receive_configs) override { | |
60 send_config->rtp.c_name = kCName; | |
61 } | |
62 | |
63 void PerformTest() override { | |
64 EXPECT_TRUE(Wait()) << "Timed out while waiting for RTCP with CNAME."; | |
65 } | |
66 } test; | |
67 | |
68 RunBaseTest(&test); | |
69 } | |
70 | |
71 TEST_F(AudioSendStreamCallTest, SupportsAudioLevel) { | |
72 class AudioLevelObserver : public AudioSendTest { | |
73 public: | |
74 AudioLevelObserver() : AudioSendTest() { | |
75 EXPECT_TRUE(parser_->RegisterRtpHeaderExtension( | |
76 kRtpExtensionAudioLevel, test::kAudioLevelExtensionId)); | |
77 } | |
78 | |
79 Action OnSendRtp(const uint8_t* packet, size_t length) override { | |
80 RTPHeader header; | |
81 EXPECT_TRUE(parser_->Parse(packet, length, &header)); | |
82 | |
83 EXPECT_TRUE(header.extension.hasAudioLevel); | |
ossu
2017/09/14 11:51:58
The old tests included one that checked that no au
the sun
2017/09/14 12:36:40
Done.
| |
84 if (header.extension.audioLevel != 0) { | |
85 // Wait for at least one packet with a non-zero level. | |
86 observation_complete_.Set(); | |
87 } else { | |
88 LOG(LS_WARNING) << "Got a packet with zero audioLevel - waiting" | |
ossu
2017/09/14 11:51:58
When can this happen? Where does the audio come fr
the sun
2017/09/14 12:36:39
The test signal is a periodic noise burst.
ossu
2017/09/14 12:51:32
Alright. I was thinking if this would often get lo
the sun
2017/09/14 20:05:05
It is benign as long as the test eventually comple
| |
89 " for another packet..."; | |
90 } | |
91 | |
92 return SEND_PACKET; | |
93 } | |
94 | |
95 void ModifyAudioConfigs( | |
96 AudioSendStream::Config* send_config, | |
97 std::vector<AudioReceiveStream::Config>* receive_configs) override { | |
98 send_config->rtp.extensions.clear(); | |
99 send_config->rtp.extensions.push_back(RtpExtension( | |
100 RtpExtension::kAudioLevelUri, test::kAudioLevelExtensionId)); | |
101 } | |
102 | |
103 void PerformTest() override { | |
104 EXPECT_TRUE(Wait()) << "Timed out while waiting for single RTP packet."; | |
105 } | |
106 } test; | |
107 | |
108 RunBaseTest(&test); | |
109 } | |
110 | |
111 TEST_F(AudioSendStreamCallTest, SupportsTransportWideSequenceNumbers) { | |
ossu
2017/09/14 11:51:58
Is this test new? It looks like there are some see
the sun
2017/09/14 12:36:39
AbsoluteSendTime is no longer used. There was a le
ossu
2017/09/14 12:51:32
Acknowledged.
| |
112 static const uint8_t kExtensionId = test::kTransportSequenceNumberExtensionId; | |
113 class TransportWideSequenceNumberObserver : public AudioSendTest { | |
114 public: | |
115 TransportWideSequenceNumberObserver() : AudioSendTest() { | |
116 EXPECT_TRUE(parser_->RegisterRtpHeaderExtension( | |
117 kRtpExtensionTransportSequenceNumber, kExtensionId)); | |
118 } | |
119 | |
120 private: | |
121 Action OnSendRtp(const uint8_t* packet, size_t length) override { | |
122 RTPHeader header; | |
123 EXPECT_TRUE(parser_->Parse(packet, length, &header)); | |
124 | |
125 EXPECT_TRUE(header.extension.hasTransportSequenceNumber); | |
126 EXPECT_FALSE(header.extension.hasTransmissionTimeOffset); | |
127 EXPECT_FALSE(header.extension.hasAbsoluteSendTime); | |
128 | |
129 observation_complete_.Set(); | |
130 | |
131 return SEND_PACKET; | |
132 } | |
133 | |
134 void ModifyAudioConfigs( | |
135 AudioSendStream::Config* send_config, | |
136 std::vector<AudioReceiveStream::Config>* receive_configs) override { | |
137 send_config->rtp.extensions.clear(); | |
138 send_config->rtp.extensions.push_back(RtpExtension( | |
139 RtpExtension::kTransportSequenceNumberUri, kExtensionId)); | |
140 } | |
141 | |
142 void PerformTest() override { | |
143 EXPECT_TRUE(Wait()) << "Timed out while waiting for a single RTP packet."; | |
144 } | |
145 } test; | |
146 | |
147 RunBaseTest(&test); | |
148 } | |
149 | |
150 TEST_F(AudioSendStreamCallTest, SendDtmf) { | |
151 static const uint8_t kDtmfPayloadType = 120; | |
152 static const int kDtmfPayloadFrequency = 8000; | |
153 static const int kDtmfEventFirst = 12; | |
ossu
2017/09/14 11:51:58
It looks like this differs from the ranges tested
the sun
2017/09/14 12:36:39
It doesn't matter. The point is to test that event
ossu
2017/09/14 12:51:32
Acknowledged.
| |
154 static const int kDtmfEventLast = 25; | |
155 static const int kDtmfDuration = 10; | |
156 class DtmfObserver : public AudioSendTest { | |
157 public: | |
158 DtmfObserver() : AudioSendTest() {} | |
ossu
2017/09/14 11:51:57
= default here as well?
the sun
2017/09/14 12:36:40
Done.
| |
159 | |
160 private: | |
161 Action OnSendRtp(const uint8_t* packet, size_t length) override { | |
162 RTPHeader header; | |
163 EXPECT_TRUE(parser_->Parse(packet, length, &header)); | |
164 | |
165 if (header.payloadType == kDtmfPayloadType) { | |
166 EXPECT_EQ(12u, header.headerLength); | |
167 const uint8_t event = packet[12]; | |
168 if (expected_dtmf_event_ == event) { | |
ossu
2017/09/14 11:51:58
Will you want to ensure no other DTMF events are b
the sun
2017/09/14 12:36:40
In part, we're already testing this since for each
ossu
2017/09/14 12:51:32
Why not EXPECT_EQ(expected_dtmf_event_, event)? Ri
the sun
2017/09/14 20:05:06
Well, AFAIU (RFC 4733) extra events are perfectly
| |
169 if (expected_dtmf_event_ == kDtmfEventLast) { | |
170 observation_complete_.Set(); | |
171 } else { | |
172 ++expected_dtmf_event_; | |
173 } | |
174 } | |
175 } | |
176 | |
177 return SEND_PACKET; | |
178 } | |
179 | |
180 void OnAudioStreamsCreated( | |
181 AudioSendStream* send_stream, | |
182 const std::vector<AudioReceiveStream*>& receive_streams) override { | |
183 // Need to start stream here, else DTMF events are dropped. | |
184 send_stream->Start(); | |
185 for (int event = kDtmfEventFirst; event <= kDtmfEventLast; ++event) { | |
186 send_stream->SendTelephoneEvent(kDtmfPayloadType, kDtmfPayloadFrequency, | |
187 event, kDtmfDuration); | |
188 } | |
189 } | |
190 | |
191 void PerformTest() override { | |
192 EXPECT_TRUE(Wait()) << "Timed out while waiting for DTMF stream."; | |
193 } | |
194 | |
195 int expected_dtmf_event_ = kDtmfEventFirst; | |
196 } test; | |
197 | |
198 RunBaseTest(&test); | |
199 } | |
200 | |
201 } // namespace test | |
202 } // namespace webrtc | |
OLD | NEW |