| Index: mojo/common/service_set_unittest.cc
|
| diff --git a/mojo/common/service_set_unittest.cc b/mojo/common/service_set_unittest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..7831eed89be57b81a49eaac01c0c8792f61aa2fb
|
| --- /dev/null
|
| +++ b/mojo/common/service_set_unittest.cc
|
| @@ -0,0 +1,180 @@
|
| +// Copyright 2015 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "mojo/common/service_set.h"
|
| +
|
| +#include <vector>
|
| +
|
| +#include "base/message_loop/message_loop.h"
|
| +#include "base/run_loop.h"
|
| +#include "testing/gtest/include/gtest/gtest.h"
|
| +#include "third_party/mojo/src/mojo/public/interfaces/bindings/tests/sample_service.mojom.h"
|
| +
|
| +namespace mojo {
|
| +namespace {
|
| +
|
| +class SampleServiceImpl : public sample::Service {
|
| + public:
|
| + explicit SampleServiceImpl(size_t* num_instances)
|
| + : num_instances_(num_instances) {
|
| + (*num_instances_)++;
|
| + }
|
| + ~SampleServiceImpl() override { (*num_instances_)--; }
|
| +
|
| + // sample::Service overrides:
|
| + void Frobinate(sample::FooPtr foo,
|
| + BazOptions,
|
| + sample::PortPtr port,
|
| + const FrobinateCallback& callback) override {
|
| + callback.Run(0);
|
| + }
|
| + void GetPort(mojo::InterfaceRequest<sample::Port> port) override {}
|
| +
|
| + private:
|
| + size_t* num_instances_;
|
| +};
|
| +
|
| +} // namespace
|
| +
|
| +class ServiceSetTest : public testing::Test {
|
| + protected:
|
| + SampleServiceImpl* AddService(
|
| + mojo::InterfaceRequest<sample::Service> request) {
|
| + return services_.AddService(request.Pass(), &num_instances_);
|
| + }
|
| +
|
| + SampleServiceImpl* WaitForServiceError() {
|
| + SampleServiceImpl* service = nullptr;
|
| + base::RunLoop run_loop;
|
| + services_.set_connection_error_handler(base::Bind(
|
| + &ServiceSetTest::OnConnectionError, run_loop.QuitClosure(), &service));
|
| + run_loop.Run();
|
| + services_.set_connection_error_handler(
|
| + mojo::Callback<void(SampleServiceImpl*)>());
|
| + return service;
|
| + }
|
| +
|
| + size_t num_instances() { return num_instances_; }
|
| +
|
| + const ServiceSet<sample::Service, SampleServiceImpl>& services() const {
|
| + return services_;
|
| + }
|
| +
|
| + ServiceSet<sample::Service, SampleServiceImpl>& mutable_services() {
|
| + return services_;
|
| + }
|
| +
|
| + private:
|
| + static void OnConnectionError(const base::Closure& quit_closure,
|
| + SampleServiceImpl** service_out,
|
| + SampleServiceImpl* service) {
|
| + quit_closure.Run();
|
| + *service_out = service;
|
| + }
|
| +
|
| + base::MessageLoop message_loop_;
|
| + size_t num_instances_ = 0;
|
| + ServiceSet<sample::Service, SampleServiceImpl> services_;
|
| +};
|
| +
|
| +TEST_F(ServiceSetTest, Basic) {
|
| + EXPECT_EQ(0u, services().size());
|
| + EXPECT_TRUE(services().empty());
|
| +
|
| + std::vector<SampleServiceImpl*> services_copy(services().begin(),
|
| + services().end());
|
| + EXPECT_TRUE(services_copy.empty());
|
| +
|
| + sample::ServicePtr service_ptr;
|
| + SampleServiceImpl* service = AddService(mojo::GetProxy(&service_ptr));
|
| + sample::ServicePtr other_service_ptr;
|
| + SampleServiceImpl* other_service =
|
| + AddService(mojo::GetProxy(&other_service_ptr));
|
| + EXPECT_EQ(2u, num_instances());
|
| + EXPECT_EQ(2u, services().size());
|
| + EXPECT_FALSE(services().empty());
|
| +
|
| + services_copy =
|
| + std::vector<SampleServiceImpl*>(services().begin(), services().end());
|
| + EXPECT_EQ(2u, services_copy.size());
|
| + service_ptr.reset();
|
| +
|
| + EXPECT_EQ(service, WaitForServiceError());
|
| + EXPECT_EQ(1u, num_instances());
|
| +
|
| + EXPECT_EQ(1u, services().size());
|
| + EXPECT_FALSE(services().empty());
|
| +
|
| + services_copy =
|
| + std::vector<SampleServiceImpl*>(services().begin(), services().end());
|
| + EXPECT_EQ(1u, services_copy.size());
|
| + EXPECT_EQ(other_service, services_copy[0]);
|
| +}
|
| +
|
| +TEST_F(ServiceSetTest, Erase) {
|
| + EXPECT_EQ(0u, services().size());
|
| + EXPECT_TRUE(services().empty());
|
| +
|
| + std::vector<SampleServiceImpl*> services_copy(services().begin(),
|
| + services().end());
|
| + EXPECT_TRUE(services_copy.empty());
|
| +
|
| + base::RunLoop run_loop;
|
| + sample::ServicePtr service_ptr;
|
| + SampleServiceImpl* service = AddService(mojo::GetProxy(&service_ptr));
|
| + sample::ServicePtr other_service_ptr;
|
| + AddService(mojo::GetProxy(&other_service_ptr));
|
| + EXPECT_EQ(2u, num_instances());
|
| + EXPECT_EQ(2u, services().size());
|
| + EXPECT_FALSE(services().empty());
|
| +
|
| + services_copy =
|
| + std::vector<SampleServiceImpl*>(services().begin(), services().end());
|
| + EXPECT_EQ(2u, services_copy.size());
|
| + mutable_services().EraseService(service);
|
| + EXPECT_EQ(1u, num_instances());
|
| + EXPECT_EQ(1u, services().size());
|
| + EXPECT_FALSE(services().empty());
|
| +
|
| + services_copy =
|
| + std::vector<SampleServiceImpl*>(services().begin(), services().end());
|
| + EXPECT_EQ(1u, services_copy.size());
|
| +
|
| + service_ptr.set_connection_error_handler(run_loop.QuitClosure());
|
| + other_service_ptr.set_connection_error_handler(run_loop.QuitClosure());
|
| + run_loop.Run();
|
| +}
|
| +
|
| +TEST_F(ServiceSetTest, EraseAll) {
|
| + EXPECT_EQ(0u, services().size());
|
| + EXPECT_TRUE(services().empty());
|
| +
|
| + std::vector<SampleServiceImpl*> services_copy(services().begin(),
|
| + services().end());
|
| + EXPECT_TRUE(services_copy.empty());
|
| +
|
| + sample::ServicePtr service_ptr;
|
| + AddService(mojo::GetProxy(&service_ptr));
|
| + EXPECT_EQ(1u, num_instances());
|
| + EXPECT_EQ(1u, services().size());
|
| + EXPECT_FALSE(services().empty());
|
| +
|
| + services_copy =
|
| + std::vector<SampleServiceImpl*>(services().begin(), services().end());
|
| + EXPECT_EQ(1u, services_copy.size());
|
| + mutable_services().EraseAllServices();
|
| + EXPECT_EQ(0u, num_instances());
|
| + EXPECT_EQ(0u, services().size());
|
| + EXPECT_TRUE(services().empty());
|
| +
|
| + services_copy =
|
| + std::vector<SampleServiceImpl*>(services().begin(), services().end());
|
| + EXPECT_TRUE(services_copy.empty());
|
| +
|
| + base::RunLoop run_loop;
|
| + service_ptr.set_connection_error_handler(run_loop.QuitClosure());
|
| + run_loop.Run();
|
| +}
|
| +
|
| +} // namespace mojo
|
|
|