| Index: media/midi/midi_manager_unittest.cc
|
| diff --git a/media/midi/midi_manager_unittest.cc b/media/midi/midi_manager_unittest.cc
|
| index 456c2b0988ebcadf5931dcd11cc9b23231eb887e..f967332d2bb8c1a45b79d95cd92fe5e44d463809 100644
|
| --- a/media/midi/midi_manager_unittest.cc
|
| +++ b/media/midi/midi_manager_unittest.cc
|
| @@ -4,8 +4,11 @@
|
|
|
| #include "media/midi/midi_manager.h"
|
|
|
| +#include <vector>
|
| +
|
| #include "base/logging.h"
|
| #include "base/memory/scoped_ptr.h"
|
| +#include "base/memory/scoped_vector.h"
|
| #include "base/run_loop.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
|
|
| @@ -57,6 +60,7 @@ class FakeMidiManagerClient : public MidiManagerClient {
|
|
|
| // MidiManagerClient implementation.
|
| virtual void CompleteStartSession(int client_id, MidiResult result) OVERRIDE {
|
| + EXPECT_TRUE(wait_for_result_);
|
| CHECK_EQ(client_id_, client_id);
|
| result_ = result;
|
| wait_for_result_ = false;
|
| @@ -89,7 +93,8 @@ class FakeMidiManagerClient : public MidiManagerClient {
|
| class MidiManagerTest : public ::testing::Test {
|
| public:
|
| MidiManagerTest()
|
| - : message_loop_(new base::MessageLoop), manager_(new FakeMidiManager) {}
|
| + : manager_(new FakeMidiManager),
|
| + message_loop_(new base::MessageLoop) {}
|
| virtual ~MidiManagerTest() {}
|
|
|
| protected:
|
| @@ -106,15 +111,17 @@ class MidiManagerTest : public ::testing::Test {
|
| EXPECT_TRUE(manager_->start_initialization_is_called_);
|
| }
|
|
|
| - void StartTheSecondSession(FakeMidiManagerClient* client) {
|
| - EXPECT_TRUE(manager_->start_initialization_is_called_);
|
| + void StartTheNthSession(FakeMidiManagerClient* client, size_t nth) {
|
| + EXPECT_EQ(nth != 1, manager_->start_initialization_is_called_);
|
| EXPECT_EQ(0U, manager_->GetClientCount());
|
| - EXPECT_EQ(1U, manager_->GetPendingClientCount());
|
| + EXPECT_EQ(nth - 1, manager_->GetPendingClientCount());
|
|
|
| - // StartInitialization() should not be called for the second session.
|
| + // StartInitialization() should not be called for the second and later
|
| + // sessions.
|
| manager_->start_initialization_is_called_ = false;
|
| manager_->StartSession(client, client->get_client_id());
|
| - EXPECT_FALSE(manager_->start_initialization_is_called_);
|
| + EXPECT_EQ(nth == 1, manager_->start_initialization_is_called_);
|
| + manager_->start_initialization_is_called_ = true;
|
| }
|
|
|
| void EndSession(FakeMidiManagerClient* client, size_t before, size_t after) {
|
| @@ -127,9 +134,16 @@ class MidiManagerTest : public ::testing::Test {
|
| manager_->CallCompleteInitialization(result);
|
| }
|
|
|
| + void RunLoopUntilIdle() {
|
| + base::RunLoop run_loop;
|
| + run_loop.RunUntilIdle();
|
| + }
|
| +
|
| + protected:
|
| + scoped_ptr<FakeMidiManager> manager_;
|
| +
|
| private:
|
| scoped_ptr<base::MessageLoop> message_loop_;
|
| - scoped_ptr<FakeMidiManager> manager_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(MidiManagerTest);
|
| };
|
| @@ -161,7 +175,7 @@ TEST_F(MidiManagerTest, StartMultipleSessions) {
|
| client2.reset(new FakeMidiManagerClient(1));
|
|
|
| StartTheFirstSession(client1.get());
|
| - StartTheSecondSession(client2.get());
|
| + StartTheNthSession(client2.get(), 2);
|
| CompleteInitialization(MIDI_OK);
|
| EXPECT_EQ(MIDI_OK, client1->WaitForResult());
|
| EXPECT_EQ(MIDI_OK, client2->WaitForResult());
|
| @@ -169,6 +183,40 @@ TEST_F(MidiManagerTest, StartMultipleSessions) {
|
| EndSession(client2.get(), 1U, 0U);
|
| }
|
|
|
| +TEST_F(MidiManagerTest, TooManyPendingSessions) {
|
| + // Push as many client requests for starting session as possible.
|
| + ScopedVector<FakeMidiManagerClient> many_existing_clients;
|
| + many_existing_clients.resize(MidiManager::kMaxPendingClientCount);
|
| + for (size_t i = 0; i < MidiManager::kMaxPendingClientCount; ++i) {
|
| + many_existing_clients[i] = new FakeMidiManagerClient(i);
|
| + StartTheNthSession(many_existing_clients[i], i + 1);
|
| + }
|
| +
|
| + // Push the last client that should be rejected for too many pending requests.
|
| + scoped_ptr<FakeMidiManagerClient> additional_client(
|
| + new FakeMidiManagerClient(MidiManager::kMaxPendingClientCount));
|
| + manager_->start_initialization_is_called_ = false;
|
| + manager_->StartSession(additional_client.get(),
|
| + additional_client->get_client_id());
|
| + EXPECT_FALSE(manager_->start_initialization_is_called_);
|
| + EXPECT_EQ(MIDI_INITIALIZATION_ERROR, additional_client->get_result());
|
| +
|
| + // Other clients still should not receive a result.
|
| + RunLoopUntilIdle();
|
| + for (size_t i = 0; i < many_existing_clients.size(); ++i)
|
| + EXPECT_EQ(MIDI_NOT_SUPPORTED, many_existing_clients[i]->get_result());
|
| +
|
| + // The result MIDI_OK should be distributed to other clients.
|
| + CompleteInitialization(MIDI_OK);
|
| + for (size_t i = 0; i < many_existing_clients.size(); ++i)
|
| + EXPECT_EQ(MIDI_OK, many_existing_clients[i]->WaitForResult());
|
| +
|
| + // Close all successful sessions in FIFO order.
|
| + size_t sessions = many_existing_clients.size();
|
| + for (size_t i = 0; i < many_existing_clients.size(); ++i, --sessions)
|
| + EndSession(many_existing_clients[i], sessions, sessions - 1);
|
| +}
|
| +
|
| TEST_F(MidiManagerTest, CreateMidiManager) {
|
| scoped_ptr<FakeMidiManagerClient> client;
|
| client.reset(new FakeMidiManagerClient(0));
|
|
|