Chromium Code Reviews| Index: extensions/browser/mojo/stash_backend_unittest.cc |
| diff --git a/extensions/browser/mojo/stash_backend_unittest.cc b/extensions/browser/mojo/stash_backend_unittest.cc |
| index 9d7f0947e649136444b0ad2410b16eb08db6066b..b17a7acbbfb702a084094eab1243a5e74a5f47b5 100644 |
| --- a/extensions/browser/mojo/stash_backend_unittest.cc |
| +++ b/extensions/browser/mojo/stash_backend_unittest.cc |
| @@ -9,12 +9,35 @@ |
| #include "testing/gtest/include/gtest/gtest.h" |
| namespace extensions { |
| +namespace { |
| + |
| +// Create a data pipe, write some data to the proucer handle and return the |
|
Anand Mistry (off Chromium)
2015/02/05 11:10:33
proucer
Sam McNally
2015/02/05 23:35:31
Done.
|
| +// consumer handle. |
| +mojo::ScopedHandle CreateReadableHandle() { |
| + mojo::ScopedDataPipeConsumerHandle consumer_handle; |
| + mojo::ScopedDataPipeProducerHandle producer_handle; |
| + MojoCreateDataPipeOptions options = { |
| + sizeof(options), MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE, 1, 1, |
| + }; |
| + MojoResult result = |
| + mojo::CreateDataPipe(&options, &producer_handle, &consumer_handle); |
| + EXPECT_EQ(MOJO_RESULT_OK, result); |
| + uint32_t num_bytes = 1; |
| + result = mojo::WriteDataRaw(producer_handle.get(), "a", &num_bytes, |
| + MOJO_WRITE_DATA_FLAG_NONE); |
| + EXPECT_EQ(MOJO_RESULT_OK, result); |
| + EXPECT_EQ(1u, num_bytes); |
| + return mojo::ScopedHandle::From(consumer_handle.Pass()); |
| +} |
| + |
| +} // namespace |
| class StashServiceTest : public testing::Test, public mojo::ErrorHandler { |
| public: |
| enum Event { |
| EVENT_NONE, |
| EVENT_STASH_RETRIEVED, |
| + EVENT_HANDLE_READY, |
| }; |
| StashServiceTest() {} |
| @@ -22,9 +45,11 @@ class StashServiceTest : public testing::Test, public mojo::ErrorHandler { |
| void SetUp() override { |
| expecting_error_ = false; |
| expected_event_ = EVENT_NONE; |
| - stash_backend_.reset(new StashBackend); |
| + stash_backend_.reset(new StashBackend(base::Bind( |
| + &StashServiceTest::OnHandleReadyToRead, base::Unretained(this)))); |
| stash_backend_->BindToRequest(mojo::GetProxy(&stash_service_)); |
| stash_service_.set_error_handler(this); |
| + handles_ready_ = 0; |
| } |
| void OnConnectionError() override { FAIL() << "Unexpected connection error"; } |
| @@ -55,6 +80,11 @@ class StashServiceTest : public testing::Test, public mojo::ErrorHandler { |
| stop_run_loop_.Run(); |
| } |
| + void OnHandleReadyToRead() { |
| + handles_ready_++; |
| + EventReceived(EVENT_HANDLE_READY); |
| + } |
| + |
| protected: |
| base::MessageLoop message_loop_; |
| base::Closure stop_run_loop_; |
| @@ -62,6 +92,7 @@ class StashServiceTest : public testing::Test, public mojo::ErrorHandler { |
| Event expected_event_; |
| bool expecting_error_; |
| mojo::InterfacePtr<StashService> stash_service_; |
| + int handles_ready_; |
| private: |
| DISALLOW_COPY_AND_ASSIGN(StashServiceTest); |
| @@ -147,6 +178,90 @@ TEST_F(StashServiceTest, RetrieveWithoutStashing) { |
| EXPECT_EQ(0u, stashed_objects.size()); |
| } |
| +TEST_F(StashServiceTest, NotifyOnReadableHandle) { |
| + mojo::Array<StashedObjectPtr> stash_entries; |
| + StashedObjectPtr stashed_object(StashedObject::New()); |
| + stashed_object->id = "test type"; |
| + stashed_object->data.push_back(0); |
| + stashed_object->monitor_handles = true; |
| + mojo::InterfacePtr<StashService> stash_service; |
|
Anand Mistry (off Chromium)
2015/02/05 11:10:33
stash_service and stash_service_ is confusing. I h
Sam McNally
2015/02/05 23:35:31
Done.
|
| + |
| + stashed_object->stashed_handles.push_back(mojo::ScopedHandle::From( |
| + mojo::GetProxy(&stash_service).PassMessagePipe())); |
| + |
| + stash_entries.push_back(stashed_object.Pass()); |
| + stash_service_->AddToStash(stash_entries.Pass()); |
| + stash_entries.resize(0); |
| + stash_service->AddToStash(stash_entries.Pass()); |
| + WaitForEvent(EVENT_HANDLE_READY); |
| + EXPECT_EQ(1, handles_ready_); |
| +} |
| + |
| +TEST_F(StashServiceTest, NotifyOnReadableDataPipeHandle) { |
| + mojo::Array<StashedObjectPtr> stash_entries; |
| + StashedObjectPtr stashed_object(StashedObject::New()); |
| + stashed_object->id = "test type"; |
| + stashed_object->monitor_handles = true; |
| + |
| + MojoCreateDataPipeOptions options = { |
| + sizeof(options), MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE, 1, 1, |
| + }; |
| + mojo::ScopedDataPipeConsumerHandle consumer_handle; |
| + mojo::ScopedDataPipeProducerHandle producer_handle; |
| + uint32_t num_bytes = 1; |
| + MojoResult result = |
| + mojo::CreateDataPipe(&options, &producer_handle, &consumer_handle); |
| + ASSERT_EQ(MOJO_RESULT_OK, result); |
| + result = mojo::WriteDataRaw(producer_handle.get(), "a", &num_bytes, |
| + MOJO_WRITE_DATA_FLAG_NONE); |
| + ASSERT_EQ(MOJO_RESULT_OK, result); |
| + ASSERT_EQ(1u, num_bytes); |
| + stashed_object->stashed_handles.push_back( |
| + mojo::ScopedHandle::From(producer_handle.Pass())); |
| + stashed_object->stashed_handles.push_back( |
| + mojo::ScopedHandle::From(consumer_handle.Pass())); |
| + stashed_object->data.push_back(1); |
| + |
| + stash_entries.push_back(stashed_object.Pass()); |
| + stash_service_->AddToStash(stash_entries.Pass()); |
| + WaitForEvent(EVENT_HANDLE_READY); |
| + EXPECT_EQ(1, handles_ready_); |
| +} |
| + |
| +TEST_F(StashServiceTest, NotifyOncePerStashOnReadableHandles) { |
| + mojo::Array<StashedObjectPtr> stash_entries; |
| + StashedObjectPtr stashed_object(StashedObject::New()); |
| + stashed_object->id = "test type"; |
| + stashed_object->data.push_back(1); |
| + stashed_object->monitor_handles = true; |
| + stashed_object->stashed_handles.push_back(CreateReadableHandle()); |
| + stashed_object->stashed_handles.push_back(CreateReadableHandle()); |
| + stash_entries.push_back(stashed_object.Pass()); |
| + stashed_object = StashedObject::New(); |
| + stashed_object->id = "another test type"; |
| + stashed_object->data.push_back(2); |
| + stashed_object->monitor_handles = true; |
| + stashed_object->stashed_handles.push_back(CreateReadableHandle()); |
| + stashed_object->stashed_handles.push_back(CreateReadableHandle()); |
| + stash_entries.push_back(stashed_object.Pass()); |
| + stash_service_->AddToStash(stash_entries.Pass()); |
| + WaitForEvent(EVENT_HANDLE_READY); |
| + EXPECT_EQ(1, handles_ready_); |
| + |
| + stashed_object = StashedObject::New(); |
| + stashed_object->id = "yet another test type"; |
| + stashed_object->data.push_back(3); |
| + stashed_object->monitor_handles = true; |
| + stashed_object->stashed_handles.push_back(CreateReadableHandle()); |
| + stashed_object->stashed_handles.push_back(CreateReadableHandle()); |
| + stash_entries.push_back(stashed_object.Pass()); |
| + stash_service_->AddToStash(stash_entries.Pass()); |
| + |
| + stash_service_->AddToStash(RetrieveStash()); |
| + WaitForEvent(EVENT_HANDLE_READY); |
| + EXPECT_EQ(2, handles_ready_); |
| +} |
| + |
| // Test that a stash service discards stashed objects when the backend no longer |
| // exists. |
| TEST_F(StashServiceTest, ServiceWithDeletedBackend) { |