| Index: webrtc/api/dtmfsender_unittest.cc
|
| diff --git a/webrtc/api/dtmfsender_unittest.cc b/webrtc/api/dtmfsender_unittest.cc
|
| index e5fe26171b504701692fe6296930caa5a77acead..54f3a7b96d6f6a3ec4355bd86b0eb77eb4ddd136 100644
|
| --- a/webrtc/api/dtmfsender_unittest.cc
|
| +++ b/webrtc/api/dtmfsender_unittest.cc
|
| @@ -16,6 +16,7 @@
|
| #include <vector>
|
|
|
| #include "webrtc/api/audiotrack.h"
|
| +#include "webrtc/base/fakeclock.h"
|
| #include "webrtc/base/gunit.h"
|
| #include "webrtc/base/logging.h"
|
| #include "webrtc/base/timeutils.h"
|
| @@ -27,6 +28,9 @@ using webrtc::DtmfSender;
|
| using webrtc::DtmfSenderObserverInterface;
|
|
|
| static const char kTestAudioLabel[] = "test_audio_track";
|
| +// TODO(deadbeef): Even though this test now uses a fake clock, it has a
|
| +// generous 3-second timeout for every test case. The timeout could be tuned
|
| +// to each test based on the tones sent, instead.
|
| static const int kMaxWaitMs = 3000;
|
|
|
| class FakeDtmfObserver : public DtmfSenderObserverInterface {
|
| @@ -191,9 +195,9 @@ class DtmfSenderTest : public testing::Test {
|
| while (it_ref != dtmf_queue_ref.end() && it != dtmf_queue.end()) {
|
| EXPECT_EQ(it_ref->code, it->code);
|
| EXPECT_EQ(it_ref->duration, it->duration);
|
| - // Allow ~100ms error.
|
| - EXPECT_GE(it_ref->gap, it->gap - 100);
|
| - EXPECT_LE(it_ref->gap, it->gap + 100);
|
| + // Allow ~10ms error (can be small since we're using a fake clock).
|
| + EXPECT_GE(it_ref->gap, it->gap - 10);
|
| + EXPECT_LE(it_ref->gap, it->gap + 10);
|
| ++it_ref;
|
| ++it;
|
| }
|
| @@ -218,6 +222,7 @@ class DtmfSenderTest : public testing::Test {
|
| std::unique_ptr<FakeDtmfObserver> observer_;
|
| std::unique_ptr<FakeDtmfProvider> provider_;
|
| rtc::scoped_refptr<DtmfSender> dtmf_;
|
| + rtc::ScopedFakeClock fake_clock_;
|
| };
|
|
|
| TEST_F(DtmfSenderTest, CanInsertDtmf) {
|
| @@ -231,7 +236,7 @@ TEST_F(DtmfSenderTest, InsertDtmf) {
|
| int duration = 100;
|
| int inter_tone_gap = 50;
|
| EXPECT_TRUE(dtmf_->InsertDtmf(tones, duration, inter_tone_gap));
|
| - EXPECT_TRUE_WAIT(observer_->completed(), kMaxWaitMs);
|
| + EXPECT_TRUE_SIMULATED_WAIT(observer_->completed(), kMaxWaitMs, fake_clock_);
|
|
|
| // The unrecognized characters should be ignored.
|
| std::string known_tones = "1a*";
|
| @@ -247,13 +252,14 @@ TEST_F(DtmfSenderTest, InsertDtmfTwice) {
|
| EXPECT_TRUE(dtmf_->InsertDtmf(tones1, duration, inter_tone_gap));
|
| VerifyExpectedState(track_, tones1, duration, inter_tone_gap);
|
| // Wait until the first tone got sent.
|
| - EXPECT_TRUE_WAIT(observer_->tones().size() == 1, kMaxWaitMs);
|
| + EXPECT_TRUE_SIMULATED_WAIT(observer_->tones().size() == 1, kMaxWaitMs,
|
| + fake_clock_);
|
| VerifyExpectedState(track_, "2", duration, inter_tone_gap);
|
| // Insert with another tone buffer.
|
| EXPECT_TRUE(dtmf_->InsertDtmf(tones2, duration, inter_tone_gap));
|
| VerifyExpectedState(track_, tones2, duration, inter_tone_gap);
|
| // Wait until it's completed.
|
| - EXPECT_TRUE_WAIT(observer_->completed(), kMaxWaitMs);
|
| + EXPECT_TRUE_SIMULATED_WAIT(observer_->completed(), kMaxWaitMs, fake_clock_);
|
|
|
| std::vector<FakeDtmfProvider::DtmfInfo> dtmf_queue_ref;
|
| GetDtmfInfoFromString("1", duration, inter_tone_gap, &dtmf_queue_ref);
|
| @@ -268,11 +274,12 @@ TEST_F(DtmfSenderTest, InsertDtmfWhileProviderIsDeleted) {
|
| int inter_tone_gap = 50;
|
| EXPECT_TRUE(dtmf_->InsertDtmf(tones, duration, inter_tone_gap));
|
| // Wait until the first tone got sent.
|
| - EXPECT_TRUE_WAIT(observer_->tones().size() == 1, kMaxWaitMs);
|
| + EXPECT_TRUE_SIMULATED_WAIT(observer_->tones().size() == 1, kMaxWaitMs,
|
| + fake_clock_);
|
| // Delete provider.
|
| provider_.reset();
|
| // The queue should be discontinued so no more tone callbacks.
|
| - WAIT(false, 200);
|
| + SIMULATED_WAIT(false, 200, fake_clock_);
|
| EXPECT_EQ(1U, observer_->tones().size());
|
| }
|
|
|
| @@ -282,11 +289,12 @@ TEST_F(DtmfSenderTest, InsertDtmfWhileSenderIsDeleted) {
|
| int inter_tone_gap = 50;
|
| EXPECT_TRUE(dtmf_->InsertDtmf(tones, duration, inter_tone_gap));
|
| // Wait until the first tone got sent.
|
| - EXPECT_TRUE_WAIT(observer_->tones().size() == 1, kMaxWaitMs);
|
| + EXPECT_TRUE_SIMULATED_WAIT(observer_->tones().size() == 1, kMaxWaitMs,
|
| + fake_clock_);
|
| // Delete the sender.
|
| dtmf_ = NULL;
|
| // The queue should be discontinued so no more tone callbacks.
|
| - WAIT(false, 200);
|
| + SIMULATED_WAIT(false, 200, fake_clock_);
|
| EXPECT_EQ(1U, observer_->tones().size());
|
| }
|
|
|
| @@ -297,11 +305,12 @@ TEST_F(DtmfSenderTest, InsertEmptyTonesToCancelPreviousTask) {
|
| int inter_tone_gap = 50;
|
| EXPECT_TRUE(dtmf_->InsertDtmf(tones1, duration, inter_tone_gap));
|
| // Wait until the first tone got sent.
|
| - EXPECT_TRUE_WAIT(observer_->tones().size() == 1, kMaxWaitMs);
|
| + EXPECT_TRUE_SIMULATED_WAIT(observer_->tones().size() == 1, kMaxWaitMs,
|
| + fake_clock_);
|
| // Insert with another tone buffer.
|
| EXPECT_TRUE(dtmf_->InsertDtmf(tones2, duration, inter_tone_gap));
|
| // Wait until it's completed.
|
| - EXPECT_TRUE_WAIT(observer_->completed(), kMaxWaitMs);
|
| + EXPECT_TRUE_SIMULATED_WAIT(observer_->completed(), kMaxWaitMs, fake_clock_);
|
|
|
| std::vector<FakeDtmfProvider::DtmfInfo> dtmf_queue_ref;
|
| GetDtmfInfoFromString("1", duration, inter_tone_gap, &dtmf_queue_ref);
|
| @@ -309,14 +318,12 @@ TEST_F(DtmfSenderTest, InsertEmptyTonesToCancelPreviousTask) {
|
| VerifyOnObserver("1");
|
| }
|
|
|
| -// Flaky when run in parallel.
|
| -// See https://code.google.com/p/webrtc/issues/detail?id=4219.
|
| -TEST_F(DtmfSenderTest, DISABLED_InsertDtmfWithCommaAsDelay) {
|
| +TEST_F(DtmfSenderTest, InsertDtmfWithCommaAsDelay) {
|
| std::string tones = "3,4";
|
| int duration = 100;
|
| int inter_tone_gap = 50;
|
| EXPECT_TRUE(dtmf_->InsertDtmf(tones, duration, inter_tone_gap));
|
| - EXPECT_TRUE_WAIT(observer_->completed(), kMaxWaitMs);
|
| + EXPECT_TRUE_SIMULATED_WAIT(observer_->completed(), kMaxWaitMs, fake_clock_);
|
|
|
| VerifyOnProvider(tones, duration, inter_tone_gap);
|
| VerifyOnObserver(tones);
|
|
|