1a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "components/keyed_service/content/browser_context_dependency_manager.h" 6a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "components/keyed_service/content/browser_context_keyed_service_factory.h" 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class BrowserContextDependencyManagerUnittests : public ::testing::Test { 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // To get around class access: 1290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) void DependOn(BrowserContextKeyedServiceFactory* child, 1390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) BrowserContextKeyedServiceFactory* parent) { 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child->DependsOn(parent); 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) BrowserContextDependencyManager* manager() { return &dependency_manager_; } 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<std::string>* shutdown_order() { return &shutdown_order_; } 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) BrowserContextDependencyManager dependency_manager_; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<std::string> shutdown_order_; 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class TestService : public BrowserContextKeyedServiceFactory { 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestService(const std::string& name, 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<std::string>* fill_on_shutdown, 3190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) BrowserContextDependencyManager* manager) 3290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) : BrowserContextKeyedServiceFactory("TestService", manager), 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) name_(name), 34a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) fill_on_shutdown_(fill_on_shutdown) {} 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual KeyedService* BuildServiceInstanceFor( 3790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) content::BrowserContext* context) const OVERRIDE { 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ADD_FAILURE() << "This isn't part of the tests!"; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void BrowserContextShutdown(content::BrowserContext* context) 43a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) OVERRIDE { 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fill_on_shutdown_->push_back(name_); 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string name_; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<std::string>* fill_on_shutdown_; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that we can deal with a single component. 5390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TEST_F(BrowserContextDependencyManagerUnittests, SingleCase) { 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestService service("service", shutdown_order(), manager()); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) manager()->DestroyBrowserContextServices(NULL); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1U, shutdown_order()->size()); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STREQ("service", (*shutdown_order())[0].c_str()); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that we get a simple one component depends on the other case. 6390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TEST_F(BrowserContextDependencyManagerUnittests, SimpleDependency) { 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestService parent("parent", shutdown_order(), manager()); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestService child("child", shutdown_order(), manager()); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DependOn(&child, &parent); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) manager()->DestroyBrowserContextServices(NULL); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2U, shutdown_order()->size()); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STREQ("child", (*shutdown_order())[0].c_str()); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STREQ("parent", (*shutdown_order())[1].c_str()); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests two children, one parent 7690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TEST_F(BrowserContextDependencyManagerUnittests, TwoChildrenOneParent) { 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestService parent("parent", shutdown_order(), manager()); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestService child1("child1", shutdown_order(), manager()); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestService child2("child2", shutdown_order(), manager()); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DependOn(&child1, &parent); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DependOn(&child2, &parent); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) manager()->DestroyBrowserContextServices(NULL); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(3U, shutdown_order()->size()); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STREQ("child2", (*shutdown_order())[0].c_str()); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STREQ("child1", (*shutdown_order())[1].c_str()); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STREQ("parent", (*shutdown_order())[2].c_str()); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests an M configuration 9290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TEST_F(BrowserContextDependencyManagerUnittests, MConfiguration) { 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestService parent1("parent1", shutdown_order(), manager()); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestService parent2("parent2", shutdown_order(), manager()); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestService child_of_1("child_of_1", shutdown_order(), manager()); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DependOn(&child_of_1, &parent1); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestService child_of_12("child_of_12", shutdown_order(), manager()); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DependOn(&child_of_12, &parent1); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DependOn(&child_of_12, &parent2); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestService child_of_2("child_of_2", shutdown_order(), manager()); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DependOn(&child_of_2, &parent2); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) manager()->DestroyBrowserContextServices(NULL); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(5U, shutdown_order()->size()); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STREQ("child_of_2", (*shutdown_order())[0].c_str()); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STREQ("child_of_12", (*shutdown_order())[1].c_str()); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STREQ("child_of_1", (*shutdown_order())[2].c_str()); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STREQ("parent2", (*shutdown_order())[3].c_str()); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STREQ("parent1", (*shutdown_order())[4].c_str()); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that it can deal with a simple diamond. 11790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TEST_F(BrowserContextDependencyManagerUnittests, DiamondConfiguration) { 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestService parent("parent", shutdown_order(), manager()); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestService middle_row_1("middle_row_1", shutdown_order(), manager()); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DependOn(&middle_row_1, &parent); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestService middle_row_2("middle_row_2", shutdown_order(), manager()); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DependOn(&middle_row_2, &parent); 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestService bottom("bottom", shutdown_order(), manager()); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DependOn(&bottom, &middle_row_1); 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DependOn(&bottom, &middle_row_2); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) manager()->DestroyBrowserContextServices(NULL); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(4U, shutdown_order()->size()); 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STREQ("bottom", (*shutdown_order())[0].c_str()); 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STREQ("middle_row_2", (*shutdown_order())[1].c_str()); 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STREQ("middle_row_1", (*shutdown_order())[2].c_str()); 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STREQ("parent", (*shutdown_order())[3].c_str()); 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A final test that works with a more complex graph. 14090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TEST_F(BrowserContextDependencyManagerUnittests, ComplexGraph) { 141a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) TestService everything_depends_on_me( 142a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) "everything_depends_on_me", shutdown_order(), manager()); 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 144a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) TestService intermediary_service( 145a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) "intermediary_service", shutdown_order(), manager()); 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DependOn(&intermediary_service, &everything_depends_on_me); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 148a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) TestService specialized_service( 149a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) "specialized_service", shutdown_order(), manager()); 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DependOn(&specialized_service, &everything_depends_on_me); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DependOn(&specialized_service, &intermediary_service); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestService other_root("other_root", shutdown_order(), manager()); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) TestService other_intermediary( 156a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) "other_intermediary", shutdown_order(), manager()); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DependOn(&other_intermediary, &other_root); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestService bottom("bottom", shutdown_order(), manager()); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DependOn(&bottom, &specialized_service); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DependOn(&bottom, &other_intermediary); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) manager()->DestroyBrowserContextServices(NULL); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(6U, shutdown_order()->size()); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STREQ("bottom", (*shutdown_order())[0].c_str()); 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STREQ("specialized_service", (*shutdown_order())[1].c_str()); 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STREQ("other_intermediary", (*shutdown_order())[2].c_str()); 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STREQ("intermediary_service", (*shutdown_order())[3].c_str()); 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STREQ("other_root", (*shutdown_order())[4].c_str()); 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STREQ("everything_depends_on_me", (*shutdown_order())[5].c_str()); 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 173