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