| OLD | NEW | 
|---|
| 1 /* | 1 /* | 
| 2  *  Copyright 2012 The WebRTC project authors. All Rights Reserved. | 2  *  Copyright 2012 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 | 
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 71     int gap; | 71     int gap; | 
| 72   }; | 72   }; | 
| 73 | 73 | 
| 74   FakeDtmfProvider() : last_insert_dtmf_call_(0) {} | 74   FakeDtmfProvider() : last_insert_dtmf_call_(0) {} | 
| 75 | 75 | 
| 76   ~FakeDtmfProvider() { | 76   ~FakeDtmfProvider() { | 
| 77     SignalDestroyed(); | 77     SignalDestroyed(); | 
| 78   } | 78   } | 
| 79 | 79 | 
| 80   // Implements DtmfProviderInterface. | 80   // Implements DtmfProviderInterface. | 
| 81   bool CanInsertDtmf(const std::string& track_label) override { | 81   bool CanInsertDtmf() override { return can_insert_; } | 
| 82     return (can_insert_dtmf_tracks_.count(track_label) != 0); |  | 
| 83   } |  | 
| 84 | 82 | 
| 85   bool InsertDtmf(const std::string& track_label, | 83   bool InsertDtmf(int code, int duration) override { | 
| 86                   int code, |  | 
| 87                   int duration) override { |  | 
| 88     int gap = 0; | 84     int gap = 0; | 
| 89     // TODO(ronghuawu): Make the timer (basically the rtc::TimeNanos) | 85     // TODO(ronghuawu): Make the timer (basically the rtc::TimeNanos) | 
| 90     // mockable and use a fake timer in the unit tests. | 86     // mockable and use a fake timer in the unit tests. | 
| 91     if (last_insert_dtmf_call_ > 0) { | 87     if (last_insert_dtmf_call_ > 0) { | 
| 92       gap = static_cast<int>(rtc::TimeMillis() - last_insert_dtmf_call_); | 88       gap = static_cast<int>(rtc::TimeMillis() - last_insert_dtmf_call_); | 
| 93     } | 89     } | 
| 94     last_insert_dtmf_call_ = rtc::TimeMillis(); | 90     last_insert_dtmf_call_ = rtc::TimeMillis(); | 
| 95 | 91 | 
| 96     LOG(LS_VERBOSE) << "FakeDtmfProvider::InsertDtmf code=" << code | 92     LOG(LS_VERBOSE) << "FakeDtmfProvider::InsertDtmf code=" << code | 
| 97                     << " duration=" << duration | 93                     << " duration=" << duration | 
| 98                     << " gap=" << gap << "."; | 94                     << " gap=" << gap << "."; | 
| 99     dtmf_info_queue_.push_back(DtmfInfo(code, duration, gap)); | 95     dtmf_info_queue_.push_back(DtmfInfo(code, duration, gap)); | 
| 100     return true; | 96     return true; | 
| 101   } | 97   } | 
| 102 | 98 | 
| 103   sigslot::signal0<>* GetOnDestroyedSignal() override { | 99   sigslot::signal0<>* GetOnDestroyedSignal() override { | 
| 104     return &SignalDestroyed; | 100     return &SignalDestroyed; | 
| 105   } | 101   } | 
| 106 | 102 | 
| 107   // getter and setter | 103   // getter and setter | 
| 108   const std::vector<DtmfInfo>& dtmf_info_queue() const { | 104   const std::vector<DtmfInfo>& dtmf_info_queue() const { | 
| 109     return dtmf_info_queue_; | 105     return dtmf_info_queue_; | 
| 110   } | 106   } | 
| 111 | 107 | 
| 112   // helper functions | 108   // helper functions | 
| 113   void AddCanInsertDtmfTrack(const std::string& label) { | 109   void SetCanInsertDtmf(bool can_insert) { can_insert_ = can_insert; } | 
| 114     can_insert_dtmf_tracks_.insert(label); |  | 
| 115   } |  | 
| 116   void RemoveCanInsertDtmfTrack(const std::string& label) { |  | 
| 117     can_insert_dtmf_tracks_.erase(label); |  | 
| 118   } |  | 
| 119 | 110 | 
| 120  private: | 111  private: | 
| 121   std::set<std::string> can_insert_dtmf_tracks_; | 112   bool can_insert_ = false; | 
| 122   std::vector<DtmfInfo> dtmf_info_queue_; | 113   std::vector<DtmfInfo> dtmf_info_queue_; | 
| 123   int64_t last_insert_dtmf_call_; | 114   int64_t last_insert_dtmf_call_; | 
| 124   sigslot::signal0<> SignalDestroyed; | 115   sigslot::signal0<> SignalDestroyed; | 
| 125 }; | 116 }; | 
| 126 | 117 | 
| 127 class DtmfSenderTest : public testing::Test { | 118 class DtmfSenderTest : public testing::Test { | 
| 128  protected: | 119  protected: | 
| 129   DtmfSenderTest() | 120   DtmfSenderTest() | 
| 130       : track_(AudioTrack::Create(kTestAudioLabel, NULL)), | 121       : track_(AudioTrack::Create(kTestAudioLabel, NULL)), | 
| 131         observer_(new rtc::RefCountedObject<FakeDtmfObserver>()), | 122         observer_(new rtc::RefCountedObject<FakeDtmfObserver>()), | 
| 132         provider_(new FakeDtmfProvider()) { | 123         provider_(new FakeDtmfProvider()) { | 
| 133     provider_->AddCanInsertDtmfTrack(kTestAudioLabel); | 124     provider_->SetCanInsertDtmf(true); | 
| 134     dtmf_ = DtmfSender::Create(track_, rtc::Thread::Current(), | 125     dtmf_ = DtmfSender::Create(track_, rtc::Thread::Current(), | 
| 135                                provider_.get()); | 126                                provider_.get()); | 
| 136     dtmf_->RegisterObserver(observer_.get()); | 127     dtmf_->RegisterObserver(observer_.get()); | 
| 137   } | 128   } | 
| 138 | 129 | 
| 139   ~DtmfSenderTest() { | 130   ~DtmfSenderTest() { | 
| 140     if (dtmf_.get()) { | 131     if (dtmf_.get()) { | 
| 141       dtmf_->UnregisterObserver(); | 132       dtmf_->UnregisterObserver(); | 
| 142     } | 133     } | 
| 143   } | 134   } | 
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 220 | 211 | 
| 221   rtc::scoped_refptr<AudioTrackInterface> track_; | 212   rtc::scoped_refptr<AudioTrackInterface> track_; | 
| 222   std::unique_ptr<FakeDtmfObserver> observer_; | 213   std::unique_ptr<FakeDtmfObserver> observer_; | 
| 223   std::unique_ptr<FakeDtmfProvider> provider_; | 214   std::unique_ptr<FakeDtmfProvider> provider_; | 
| 224   rtc::scoped_refptr<DtmfSender> dtmf_; | 215   rtc::scoped_refptr<DtmfSender> dtmf_; | 
| 225   rtc::ScopedFakeClock fake_clock_; | 216   rtc::ScopedFakeClock fake_clock_; | 
| 226 }; | 217 }; | 
| 227 | 218 | 
| 228 TEST_F(DtmfSenderTest, CanInsertDtmf) { | 219 TEST_F(DtmfSenderTest, CanInsertDtmf) { | 
| 229   EXPECT_TRUE(dtmf_->CanInsertDtmf()); | 220   EXPECT_TRUE(dtmf_->CanInsertDtmf()); | 
| 230   provider_->RemoveCanInsertDtmfTrack(kTestAudioLabel); | 221   provider_->SetCanInsertDtmf(false); | 
| 231   EXPECT_FALSE(dtmf_->CanInsertDtmf()); | 222   EXPECT_FALSE(dtmf_->CanInsertDtmf()); | 
| 232 } | 223 } | 
| 233 | 224 | 
| 234 TEST_F(DtmfSenderTest, InsertDtmf) { | 225 TEST_F(DtmfSenderTest, InsertDtmf) { | 
| 235   std::string tones = "@1%a&*$"; | 226   std::string tones = "@1%a&*$"; | 
| 236   int duration = 100; | 227   int duration = 100; | 
| 237   int inter_tone_gap = 50; | 228   int inter_tone_gap = 50; | 
| 238   EXPECT_TRUE(dtmf_->InsertDtmf(tones, duration, inter_tone_gap)); | 229   EXPECT_TRUE(dtmf_->InsertDtmf(tones, duration, inter_tone_gap)); | 
| 239   EXPECT_TRUE_SIMULATED_WAIT(observer_->completed(), kMaxWaitMs, fake_clock_); | 230   EXPECT_TRUE_SIMULATED_WAIT(observer_->completed(), kMaxWaitMs, fake_clock_); | 
| 240 | 231 | 
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 326   EXPECT_TRUE_SIMULATED_WAIT(observer_->completed(), kMaxWaitMs, fake_clock_); | 317   EXPECT_TRUE_SIMULATED_WAIT(observer_->completed(), kMaxWaitMs, fake_clock_); | 
| 327 | 318 | 
| 328   VerifyOnProvider(tones, duration, inter_tone_gap); | 319   VerifyOnProvider(tones, duration, inter_tone_gap); | 
| 329   VerifyOnObserver(tones); | 320   VerifyOnObserver(tones); | 
| 330 } | 321 } | 
| 331 | 322 | 
| 332 TEST_F(DtmfSenderTest, TryInsertDtmfWhenItDoesNotWork) { | 323 TEST_F(DtmfSenderTest, TryInsertDtmfWhenItDoesNotWork) { | 
| 333   std::string tones = "3,4"; | 324   std::string tones = "3,4"; | 
| 334   int duration = 100; | 325   int duration = 100; | 
| 335   int inter_tone_gap = 50; | 326   int inter_tone_gap = 50; | 
| 336   provider_->RemoveCanInsertDtmfTrack(kTestAudioLabel); | 327   provider_->SetCanInsertDtmf(false); | 
| 337   EXPECT_FALSE(dtmf_->InsertDtmf(tones, duration, inter_tone_gap)); | 328   EXPECT_FALSE(dtmf_->InsertDtmf(tones, duration, inter_tone_gap)); | 
| 338 } | 329 } | 
| 339 | 330 | 
| 340 TEST_F(DtmfSenderTest, InsertDtmfWithInvalidDurationOrGap) { | 331 TEST_F(DtmfSenderTest, InsertDtmfWithInvalidDurationOrGap) { | 
| 341   std::string tones = "3,4"; | 332   std::string tones = "3,4"; | 
| 342   int duration = 100; | 333   int duration = 100; | 
| 343   int inter_tone_gap = 50; | 334   int inter_tone_gap = 50; | 
| 344 | 335 | 
| 345   EXPECT_FALSE(dtmf_->InsertDtmf(tones, 6001, inter_tone_gap)); | 336   EXPECT_FALSE(dtmf_->InsertDtmf(tones, 6001, inter_tone_gap)); | 
| 346   EXPECT_FALSE(dtmf_->InsertDtmf(tones, 69, inter_tone_gap)); | 337   EXPECT_FALSE(dtmf_->InsertDtmf(tones, 69, inter_tone_gap)); | 
| 347   EXPECT_FALSE(dtmf_->InsertDtmf(tones, duration, 49)); | 338   EXPECT_FALSE(dtmf_->InsertDtmf(tones, duration, 49)); | 
| 348 | 339 | 
| 349   EXPECT_TRUE(dtmf_->InsertDtmf(tones, duration, inter_tone_gap)); | 340   EXPECT_TRUE(dtmf_->InsertDtmf(tones, duration, inter_tone_gap)); | 
| 350 } | 341 } | 
| OLD | NEW | 
|---|