signed_in_devices_api_unittest.cc revision f2477e01787aa58f445919b809d89e252beef54f
1a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved. 2a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// found in the LICENSE file. 4a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 5a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include <string> 6a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 7a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include <vector> 8a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 9a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/guid.h" 10a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/message_loop/message_loop.h" 113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/prefs/pref_service.h" 123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/values.h" 1358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/extensions/api/signed_in_devices/signed_in_devices_api.h" 143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chrome/browser/extensions/extension_function_test_utils.h" 15a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/extensions/test_extension_prefs.h" 163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 17a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/sync/glue/device_info.h" 183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chrome/browser/sync/profile_sync_service_factory.h" 19a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/sync/profile_sync_service_mock.h" 203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chrome/common/pref_names.h" 213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chrome/test/base/browser_with_test_window_test.h" 22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/extension.h" 23a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 24a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 25a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 26a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)using browser_sync::DeviceInfo; 27a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)using testing::Return; 28a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 29a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)namespace extensions { 30a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)namespace utils = extension_function_test_utils; 323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 3358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST(SignedInDevicesAPITest, GetSignedInDevices) { 34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) TestingProfile profile; 35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ProfileSyncServiceMock pss_mock(&profile); 36a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::MessageLoop message_loop_; 37a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) TestExtensionPrefs extension_prefs( 38a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) message_loop_.message_loop_proxy().get()); 39a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 40a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Add a couple of devices and make sure we get back public ids for them. 41a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) std::string extension_name = "test"; 42a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_refptr<Extension> extension_test = 43a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) extension_prefs.AddExtension(extension_name); 44a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 45a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) DeviceInfo device_info1( 46a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::GenerateGUID(), 47a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) "abc Device", "XYZ v1", "XYZ SyncAgent v1", 48a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) sync_pb::SyncEnums_DeviceType_TYPE_LINUX); 49a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 50a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) DeviceInfo device_info2( 51a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::GenerateGUID(), 52a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) "def Device", "XYZ v2", "XYZ SyncAgent v2", 53a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) sync_pb::SyncEnums_DeviceType_TYPE_LINUX); 54a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 55a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) std::vector<DeviceInfo*> devices; 56a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) devices.push_back(&device_info1); 57a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) devices.push_back(&device_info2); 58a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 5958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_CALL(pss_mock, GetAllSignedInDevicesMock()). 60a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) WillOnce(Return(&devices)); 61a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 6258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ScopedVector<DeviceInfo> output1 = GetAllSignedInDevices( 63a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) extension_test.get()->id(), 64a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) &pss_mock, 65a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) extension_prefs.prefs()); 66a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 67a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) std::string public_id1 = device_info1.public_id(); 68a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) std::string public_id2 = device_info2.public_id(); 69a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 70a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_FALSE(public_id1.empty()); 71a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_FALSE(public_id2.empty()); 72a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_NE(public_id1, public_id2); 73a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 74a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Now clear output1 so its destructor will not destroy the pointers for 75a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // |device_info1| and |device_info2|. 76a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) output1.weak_clear(); 77a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 78a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Add a third device and make sure the first 2 ids are retained and a new 79a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // id is generated for the third device. 80a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) DeviceInfo device_info3( 81a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::GenerateGUID(), 82a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) "def Device", "jkl v2", "XYZ SyncAgent v2", 83a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) sync_pb::SyncEnums_DeviceType_TYPE_LINUX); 84a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 85a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) devices.push_back(&device_info3); 86a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 8758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_CALL(pss_mock, GetAllSignedInDevicesMock()). 88a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) WillOnce(Return(&devices)); 89a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 9058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ScopedVector<DeviceInfo> output2 = GetAllSignedInDevices( 91a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) extension_test.get()->id(), 92a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) &pss_mock, 93a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) extension_prefs.prefs()); 94a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 95a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(device_info1.public_id(), public_id1); 96a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(device_info2.public_id(), public_id2); 97a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 98a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) std::string public_id3 = device_info3.public_id(); 99a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_FALSE(public_id3.empty()); 100a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_NE(public_id3, public_id1); 101a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_NE(public_id3, public_id2); 102a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 103a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Now clear output2 so that its destructor does not destroy the 104a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // |DeviceInfo| pointers. 105a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) output2.weak_clear(); 106a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 107a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 1083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class ProfileSyncServiceMockForExtensionTests: 1093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) public ProfileSyncServiceMock { 1103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) public: 111f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) explicit ProfileSyncServiceMockForExtensionTests(Profile* p) 112f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) : ProfileSyncServiceMock(p) {} 1133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ~ProfileSyncServiceMockForExtensionTests() {} 114f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) MOCK_METHOD0(Shutdown, void()); 1163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}; 1173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)BrowserContextKeyedService* CreateProfileSyncServiceMock( 1193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) content::BrowserContext* profile) { 120f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return new ProfileSyncServiceMockForExtensionTests( 121f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Profile::FromBrowserContext(profile)); 1223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 1233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 12458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class ExtensionSignedInDevicesTest : public BrowserWithTestWindowTest { 1253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) public: 1263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) virtual void SetUp() { 1273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) BrowserWithTestWindowTest::SetUp(); 1283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ProfileSyncServiceFactory::GetInstance()->SetTestingFactory( 1303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) profile(), CreateProfileSyncServiceMock); 1313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 132d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) extension_ = utils::CreateEmptyExtensionWithLocation(Manifest::UNPACKED); 1333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 1353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) base::Value* RunFunctionWithExtension( 1373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) UIThreadExtensionFunction* function, 1383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::string& args) { 1393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) scoped_refptr<UIThreadExtensionFunction> delete_function(function); 1403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) function->set_extension(extension_.get()); 1413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return utils::RunFunctionAndReturnSingleResult(function, args, browser()); 1423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 1433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) base::ListValue* RunFunctionAndReturnList( 1453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) UIThreadExtensionFunction* function, 1463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::string& args) { 1473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) base::Value* result = RunFunctionWithExtension(function, args); 1483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return result ? utils::ToList(result) : NULL; 1493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 1503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) protected: 152d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) scoped_refptr<Extension> extension_; 1533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}; 1543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)DeviceInfo* CreateDeviceInfo(const DeviceInfo& device_info) { 1563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return new DeviceInfo(device_info.guid(), 1573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) device_info.client_name(), 1583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) device_info.chrome_version(), 1593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) device_info.sync_user_agent(), 1603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) device_info.device_type()); 1613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 1623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)std::string GetPublicId(const base::DictionaryValue* dictionary) { 1643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) std::string public_id; 1653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (!dictionary->GetString("id", &public_id)) { 1663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ADD_FAILURE() << "Not able to find public id in the dictionary"; 1673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 1683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return public_id; 1703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 1713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void VerifyDictionaryWithDeviceInfo(const base::DictionaryValue* actual_value, 1733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) DeviceInfo* device_info) { 1743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) std::string public_id = GetPublicId(actual_value); 1753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) device_info->set_public_id(public_id); 1763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) scoped_ptr<base::DictionaryValue> expected_value(device_info->ToValue()); 1783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_TRUE(expected_value->Equals(actual_value)); 1793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 1803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)base::DictionaryValue* GetDictionaryFromList(int index, 1823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) base::ListValue* value) { 1833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) base::DictionaryValue* dictionary; 1843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (!value->GetDictionary(index, &dictionary)) { 1853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ADD_FAILURE() << "Expected a list of dictionaries"; 1863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return NULL; 1873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 1883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return dictionary; 1893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 1903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 19158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST_F(ExtensionSignedInDevicesTest, GetAll) { 1923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ProfileSyncServiceMockForExtensionTests* pss_mock = 1933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) static_cast<ProfileSyncServiceMockForExtensionTests*>( 1943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ProfileSyncServiceFactory::GetForProfile(profile())); 1953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) DeviceInfo device_info1( 1973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) base::GenerateGUID(), 1983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) "abc Device", "XYZ v1", "XYZ SyncAgent v1", 1993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) sync_pb::SyncEnums_DeviceType_TYPE_LINUX); 2003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) DeviceInfo device_info2( 2023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) base::GenerateGUID(), 2033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) "def Device", "XYZ v2", "XYZ SyncAgent v2", 2043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) sync_pb::SyncEnums_DeviceType_TYPE_LINUX); 2053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) std::vector<DeviceInfo*> devices; 2073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) devices.push_back(CreateDeviceInfo(device_info1)); 2083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) devices.push_back(CreateDeviceInfo(device_info2)); 2093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 21058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_CALL(*pss_mock, GetAllSignedInDevicesMock()). 2113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) WillOnce(Return(&devices)); 2123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_CALL(*pss_mock, Shutdown()); 2143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) scoped_ptr<base::ListValue> result(RunFunctionAndReturnList( 21658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) new SignedInDevicesGetFunction(), "[null]")); 2173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Ensure dictionary matches device info. 2193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) VerifyDictionaryWithDeviceInfo(GetDictionaryFromList(0, result.get()), 2203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) &device_info1); 2213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) VerifyDictionaryWithDeviceInfo(GetDictionaryFromList(1, result.get()), 2223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) &device_info2); 2233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Ensure public ids are set and unique. 2253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) std::string public_id1 = GetPublicId(GetDictionaryFromList(0, result.get())); 2263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) std::string public_id2 = GetPublicId(GetDictionaryFromList(1, result.get())); 2273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_FALSE(public_id1.empty()); 2293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_FALSE(public_id2.empty()); 2303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_NE(public_id1, public_id2); 2313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 2323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 233a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} // namespace extensions 234