| Index: media/midi/midi_manager_mac_unittest.cc
|
| diff --git a/media/midi/midi_manager_mac_unittest.cc b/media/midi/midi_manager_mac_unittest.cc
|
| index e608d7c6ede7a517bda627c9b1cdea0e37be27ed..a74ccad7a7b3341c1a299205350121c33ee6f6da 100644
|
| --- a/media/midi/midi_manager_mac_unittest.cc
|
| +++ b/media/midi/midi_manager_mac_unittest.cc
|
| @@ -10,6 +10,7 @@
|
| #include "base/memory/scoped_ptr.h"
|
| #include "base/message_loop/message_loop.h"
|
| #include "base/run_loop.h"
|
| +#include "base/synchronization/lock.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
|
|
| namespace media {
|
| @@ -23,12 +24,24 @@ class FakeMidiManagerClient : public MidiManagerClient {
|
| FakeMidiManagerClient()
|
| : result_(MIDI_NOT_SUPPORTED),
|
| wait_for_result_(true),
|
| - wait_for_port_(true) {}
|
| + wait_for_port_(true),
|
| + unexpected_callback_(false) {}
|
|
|
| // MidiManagerClient implementation.
|
| void AddInputPort(const MidiPortInfo& info) override {}
|
| void AddOutputPort(const MidiPortInfo& info) override {
|
| - CHECK(!wait_for_result_);
|
| + base::AutoLock lock(lock_);
|
| + // AddOutputPort may be called before CompleteStartSession() is invoked
|
| + // if one or more MIDI devices including virtual ports are connected.
|
| + // Just ignore in such cases.
|
| + if (wait_for_result_)
|
| + return;
|
| +
|
| + // Check if this is the first call after CompleteStartSession(), and
|
| + // the case should not happen twice.
|
| + if (!wait_for_port_)
|
| + unexpected_callback_ = true;
|
| +
|
| info_ = info;
|
| wait_for_port_ = false;
|
| }
|
| @@ -36,7 +49,10 @@ class FakeMidiManagerClient : public MidiManagerClient {
|
| void SetOutputPortState(uint32 port_index, MidiPortState state) override {}
|
|
|
| void CompleteStartSession(MidiResult result) override {
|
| - EXPECT_TRUE(wait_for_result_);
|
| + base::AutoLock lock(lock_);
|
| + if (!wait_for_result_)
|
| + unexpected_callback_ = true;
|
| +
|
| result_ = result;
|
| wait_for_result_ = false;
|
| }
|
| @@ -45,26 +61,40 @@ class FakeMidiManagerClient : public MidiManagerClient {
|
| double timestamp) override {}
|
| void AccumulateMidiBytesSent(size_t size) override {}
|
|
|
| + bool GetWaitForResult() {
|
| + base::AutoLock lock(lock_);
|
| + return wait_for_result_;
|
| + }
|
| +
|
| + bool GetWaitForPort() {
|
| + base::AutoLock lock(lock_);
|
| + return wait_for_port_;
|
| + }
|
| +
|
| MidiResult WaitForResult() {
|
| - while (wait_for_result_) {
|
| + while (GetWaitForResult()) {
|
| base::RunLoop run_loop;
|
| run_loop.RunUntilIdle();
|
| }
|
| + EXPECT_FALSE(unexpected_callback_);
|
| return result_;
|
| }
|
| MidiPortInfo WaitForPort() {
|
| - while (wait_for_port_) {
|
| + while (GetWaitForPort()) {
|
| base::RunLoop run_loop;
|
| run_loop.RunUntilIdle();
|
| }
|
| + EXPECT_FALSE(unexpected_callback_);
|
| return info_;
|
| }
|
|
|
| private:
|
| + base::Lock lock_;
|
| MidiResult result_;
|
| bool wait_for_result_;
|
| MidiPortInfo info_;
|
| bool wait_for_port_;
|
| + bool unexpected_callback_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(FakeMidiManagerClient);
|
| };
|
|
|