signed_in_devices_api_unittest.cc revision 5f1c94371a64b3196d4be9466099bb892df9b88e
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" 145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/extensions/extension_api_unittest.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" 21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/extension.h" 22a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 23a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 24a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 25a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)using browser_sync::DeviceInfo; 26a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)using testing::Return; 27a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 28a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)namespace extensions { 29a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 3058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST(SignedInDevicesAPITest, GetSignedInDevices) { 31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) TestingProfile profile; 32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ProfileSyncServiceMock pss_mock(&profile); 33a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::MessageLoop message_loop_; 34a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) TestExtensionPrefs extension_prefs( 35a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) message_loop_.message_loop_proxy().get()); 36a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 37a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Add a couple of devices and make sure we get back public ids for them. 38a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) std::string extension_name = "test"; 39a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_refptr<Extension> extension_test = 40a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) extension_prefs.AddExtension(extension_name); 41a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DeviceInfo device_info1(base::GenerateGUID(), 435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) "abc Device", 445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) "XYZ v1", 455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) "XYZ SyncAgent v1", 465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) sync_pb::SyncEnums_DeviceType_TYPE_LINUX, 475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) "device_id"); 485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DeviceInfo device_info2(base::GenerateGUID(), 505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) "def Device", 515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) "XYZ v2", 525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) "XYZ SyncAgent v2", 535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) sync_pb::SyncEnums_DeviceType_TYPE_LINUX, 545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) "device_id"); 55a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 56a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) std::vector<DeviceInfo*> devices; 57a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) devices.push_back(&device_info1); 58a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) devices.push_back(&device_info2); 59a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 6058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_CALL(pss_mock, GetAllSignedInDevicesMock()). 61a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) WillOnce(Return(&devices)); 62a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 6358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ScopedVector<DeviceInfo> output1 = GetAllSignedInDevices( 64a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) extension_test.get()->id(), 65a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) &pss_mock, 66a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) extension_prefs.prefs()); 67a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 68a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) std::string public_id1 = device_info1.public_id(); 69a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) std::string public_id2 = device_info2.public_id(); 70a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 71a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_FALSE(public_id1.empty()); 72a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_FALSE(public_id2.empty()); 73a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_NE(public_id1, public_id2); 74a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 75a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Now clear output1 so its destructor will not destroy the pointers for 76a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // |device_info1| and |device_info2|. 77a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) output1.weak_clear(); 78a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 79a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Add a third device and make sure the first 2 ids are retained and a new 80a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // id is generated for the third device. 815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DeviceInfo device_info3(base::GenerateGUID(), 825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) "def Device", 835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) "jkl v2", 845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) "XYZ SyncAgent v2", 855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) sync_pb::SyncEnums_DeviceType_TYPE_LINUX, 865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) "device_id"); 87a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 88a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) devices.push_back(&device_info3); 89a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 9058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_CALL(pss_mock, GetAllSignedInDevicesMock()). 91a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) WillOnce(Return(&devices)); 92a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 9358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ScopedVector<DeviceInfo> output2 = GetAllSignedInDevices( 94a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) extension_test.get()->id(), 95a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) &pss_mock, 96a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) extension_prefs.prefs()); 97a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 98a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(device_info1.public_id(), public_id1); 99a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(device_info2.public_id(), public_id2); 100a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 101a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) std::string public_id3 = device_info3.public_id(); 102a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_FALSE(public_id3.empty()); 103a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_NE(public_id3, public_id1); 104a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_NE(public_id3, public_id2); 105a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 106a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Now clear output2 so that its destructor does not destroy the 107a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // |DeviceInfo| pointers. 108a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) output2.weak_clear(); 109a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 110a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 1113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class ProfileSyncServiceMockForExtensionTests: 1123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) public ProfileSyncServiceMock { 1133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) public: 114f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) explicit ProfileSyncServiceMockForExtensionTests(Profile* p) 115f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) : ProfileSyncServiceMock(p) {} 1163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ~ProfileSyncServiceMockForExtensionTests() {} 117f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) MOCK_METHOD0(Shutdown, void()); 1193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}; 1203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 121a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)KeyedService* CreateProfileSyncServiceMock(content::BrowserContext* profile) { 122f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return new ProfileSyncServiceMockForExtensionTests( 123f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Profile::FromBrowserContext(profile)); 1243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 1253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class ExtensionSignedInDevicesTest : public ExtensionApiUnittest { 1273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) public: 1283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) virtual void SetUp() { 1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ExtensionApiUnittest::SetUp(); 1303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ProfileSyncServiceFactory::GetInstance()->SetTestingFactory( 1323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) profile(), CreateProfileSyncServiceMock); 1333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 1343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}; 1353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)DeviceInfo* CreateDeviceInfo(const DeviceInfo& device_info) { 1373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return new DeviceInfo(device_info.guid(), 1383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) device_info.client_name(), 1393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) device_info.chrome_version(), 1403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) device_info.sync_user_agent(), 1415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) device_info.device_type(), 1425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) device_info.signin_scoped_device_id()); 1433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 1443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)std::string GetPublicId(const base::DictionaryValue* dictionary) { 1463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) std::string public_id; 1473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (!dictionary->GetString("id", &public_id)) { 1483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ADD_FAILURE() << "Not able to find public id in the dictionary"; 1493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 1503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return public_id; 1523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 1533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void VerifyDictionaryWithDeviceInfo(const base::DictionaryValue* actual_value, 1553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) DeviceInfo* device_info) { 1563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) std::string public_id = GetPublicId(actual_value); 1573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) device_info->set_public_id(public_id); 1583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) scoped_ptr<base::DictionaryValue> expected_value(device_info->ToValue()); 1603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_TRUE(expected_value->Equals(actual_value)); 1613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 1623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)base::DictionaryValue* GetDictionaryFromList(int index, 1643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) base::ListValue* value) { 1653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) base::DictionaryValue* dictionary; 1663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (!value->GetDictionary(index, &dictionary)) { 1673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ADD_FAILURE() << "Expected a list of dictionaries"; 1683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return NULL; 1693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 1703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return dictionary; 1713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 1723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 17358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST_F(ExtensionSignedInDevicesTest, GetAll) { 1743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ProfileSyncServiceMockForExtensionTests* pss_mock = 1753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) static_cast<ProfileSyncServiceMockForExtensionTests*>( 1763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ProfileSyncServiceFactory::GetForProfile(profile())); 1773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DeviceInfo device_info1(base::GenerateGUID(), 1795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) "abc Device", 1805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) "XYZ v1", 1815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) "XYZ SyncAgent v1", 1825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) sync_pb::SyncEnums_DeviceType_TYPE_LINUX, 1835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) "device_id"); 1845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DeviceInfo device_info2(base::GenerateGUID(), 1865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) "def Device", 1875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) "XYZ v2", 1885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) "XYZ SyncAgent v2", 1895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) sync_pb::SyncEnums_DeviceType_TYPE_LINUX, 1905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) "device_id"); 1913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) std::vector<DeviceInfo*> devices; 1933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) devices.push_back(CreateDeviceInfo(device_info1)); 1943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) devices.push_back(CreateDeviceInfo(device_info2)); 1953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 19658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_CALL(*pss_mock, GetAllSignedInDevicesMock()). 1973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) WillOnce(Return(&devices)); 1983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_CALL(*pss_mock, Shutdown()); 2003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) scoped_ptr<base::ListValue> result(RunFunctionAndReturnList( 20258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) new SignedInDevicesGetFunction(), "[null]")); 2033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Ensure dictionary matches device info. 2053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) VerifyDictionaryWithDeviceInfo(GetDictionaryFromList(0, result.get()), 2063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) &device_info1); 2073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) VerifyDictionaryWithDeviceInfo(GetDictionaryFromList(1, result.get()), 2083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) &device_info2); 2093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Ensure public ids are set and unique. 2113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) std::string public_id1 = GetPublicId(GetDictionaryFromList(0, result.get())); 2123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) std::string public_id2 = GetPublicId(GetDictionaryFromList(1, result.get())); 2133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_FALSE(public_id1.empty()); 2153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_FALSE(public_id2.empty()); 2163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_NE(public_id1, public_id2); 2173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 2183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 219a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} // namespace extensions 220