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