blob: f825a295b36b710755a113c08094cfee138c598a [file] [log] [blame]
// Copyright 2017 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 "services/service_manager/embedder/embedded_instance_manager.h"
#include <memory>
#include "base/bind.h"
#include "base/bind_helpers.h"
#include "base/single_thread_task_runner.h"
#include "base/test/scoped_task_environment.h"
#include "base/threading/thread.h"
#include "services/service_manager/embedder/embedded_service_info.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace service_manager {
namespace {
void OnQuit(bool* quit_called) {
*quit_called = true;
}
std::unique_ptr<Service> CreateTestService() {
return std::make_unique<Service>();
}
} // namespace
class EmbeddedInstanceManagerTestApi {
public:
EmbeddedInstanceManagerTestApi(EmbeddedInstanceManager* instance)
: instance_(instance) {}
base::Thread* GetThread() { return instance_->thread_.get(); }
private:
EmbeddedInstanceManager* instance_;
DISALLOW_COPY_AND_ASSIGN(EmbeddedInstanceManagerTestApi);
};
TEST(EmbeddedInstanceManager, ShutdownWaitsForThreadToQuit) {
base::test::ScopedTaskEnvironment scoped_task_environment;
EmbeddedServiceInfo embedded_service_info;
embedded_service_info.use_own_thread = true;
embedded_service_info.factory = base::Bind(&CreateTestService);
bool quit_called = false;
scoped_refptr<EmbeddedInstanceManager> instance_manager =
new EmbeddedInstanceManager("test", embedded_service_info,
base::Bind(&OnQuit, &quit_called));
instance_manager->BindServiceRequest(nullptr);
EmbeddedInstanceManagerTestApi test_api(instance_manager.get());
ASSERT_TRUE(test_api.GetThread());
scoped_refptr<base::SingleThreadTaskRunner> thread_task_runner =
test_api.GetThread()->task_runner();
instance_manager->ShutDown();
EXPECT_FALSE(test_api.GetThread());
// Further verification the thread was shutdown.
EXPECT_FALSE(thread_task_runner->PostTask(FROM_HERE, base::DoNothing()));
// Because Shutdown() was explicitly called with the thread running the
// quit closure should not have run.
EXPECT_FALSE(quit_called);
}
} // namespace service_manager