12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/base64.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/base_paths.h"
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/command_line.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h"
91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h"
10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/files/scoped_temp_dir.h"
11a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "base/json/json_reader.h"
12a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "base/memory/scoped_ptr.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/path_service.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_split.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/values.h"
165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/common/chrome_constants.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/test/chromedriver/chrome/status.h"
18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/test/chromedriver/chrome_launcher.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(ProcessExtensions, NoExtension) {
2258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Switches switches;
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::vector<std::string> extensions;
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath extension_dir;
25424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  std::vector<std::string> bg_pages;
26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Status status = internal::ProcessExtensions(extensions, extension_dir,
2758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                              false, &switches, &bg_pages);
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(status.IsOk());
2958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_FALSE(switches.HasSwitch("load-extension"));
30424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  ASSERT_EQ(0u, bg_pages.size());
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
33424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)bool AddExtensionForInstall(const std::string& relative_path,
34424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                            std::vector<std::string>* extensions) {
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath source_root;
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PathService::Get(base::DIR_SOURCE_ROOT, &source_root);
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath crx_file_path = source_root.AppendASCII(
38424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      "chrome/test/data/chromedriver/" + relative_path);
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string crx_contents;
4058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (!base::ReadFileToString(crx_file_path, &crx_contents))
41424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    return false;
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string crx_encoded;
44a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::Base64Encode(crx_contents, &crx_encoded);
45424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  extensions->push_back(crx_encoded);
46424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  return true;
47a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
48a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
49a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST(ProcessExtensions, GenerateIds) {
50a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  std::vector<std::string> extensions;
51a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::ScopedTempDir extension_dir;
52a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  Switches switches;
53a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  std::vector<std::string> bg_pages;
54a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
55a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_TRUE(AddExtensionForInstall("no_key_in_manifest.crx", &extensions));
56a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_TRUE(AddExtensionForInstall("same_key_as_header.crx", &extensions));
57a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_TRUE(AddExtensionForInstall("diff_key_from_header.crx", &extensions));
58a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
59a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_TRUE(extension_dir.CreateUniqueTempDir());
60a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
61a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  Status status = internal::ProcessExtensions(extensions, extension_dir.path(),
62a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                              false, &switches, &bg_pages);
63a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
64a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_EQ(kOk, status.code()) << status.message();
65a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_EQ(3u, bg_pages.size());
66a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_EQ("chrome-extension://llphabdmknikmpmkioimgdfbohinlekl/"
67a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            "_generated_background_page.html", bg_pages[0]);
68a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_EQ("chrome-extension://dfdeoklpcichfcnoaomfpagfiibhomnh/"
69a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            "_generated_background_page.html", bg_pages[1]);
70a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_EQ("chrome-extension://ioccpomhcpklobebcbeohnmffkmcokbm/"
71a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            "_generated_background_page.html", bg_pages[2]);
72424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
73424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
74424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)TEST(ProcessExtensions, SingleExtensionWithBgPage) {
75424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  std::vector<std::string> extensions;
76424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  ASSERT_TRUE(AddExtensionForInstall("ext_slow_loader.crx", &extensions));
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::ScopedTempDir extension_dir;
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(extension_dir.CreateUniqueTempDir());
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Switches switches;
82424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  std::vector<std::string> bg_pages;
83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Status status = internal::ProcessExtensions(extensions, extension_dir.path(),
8458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                              false, &switches, &bg_pages);
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(status.IsOk());
8658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_TRUE(switches.HasSwitch("load-extension"));
8758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  base::FilePath temp_ext_path(switches.GetSwitchValueNative("load-extension"));
887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_TRUE(base::PathExists(temp_ext_path));
89424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  std::string manifest_txt;
9058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_TRUE(base::ReadFileToString(
91424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      temp_ext_path.AppendASCII("manifest.json"), &manifest_txt));
92424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  scoped_ptr<base::Value> manifest(base::JSONReader::Read(manifest_txt));
93424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  ASSERT_TRUE(manifest);
94424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  base::DictionaryValue* manifest_dict = NULL;
95424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  ASSERT_TRUE(manifest->GetAsDictionary(&manifest_dict));
96424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  std::string key;
97424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  ASSERT_TRUE(manifest_dict->GetString("key", &key));
98424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  ASSERT_EQ(
99424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC8qhZthEHjTIA3IYMzi79s2KFepVziY0du"
100424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      "JzHcqRUB/YHSGseIUqcYXGazJhDz/"
101424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      "4FbRg8ef9fQazL1UbMMGBIf4za1kJ2os2MsRrNXzHslkbtcLVj2VfofhuHJmu+"
102424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      "CnKJ77UWamJiNAaQSiclu4duwnEWrkx+g/8ChQfhZzC4jvQIDAQAB",
103424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      key);
104424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  ASSERT_EQ(1u, bg_pages.size());
105424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  ASSERT_EQ(
106424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      "chrome-extension://jijhlkpcmmeckhlgdipjhnchhoabdjae/"
107424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      "_generated_background_page.html",
108424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      bg_pages[0]);
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
111424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)TEST(ProcessExtensions, MultipleExtensionsNoBgPages) {
112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::vector<std::string> extensions;
113424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  ASSERT_TRUE(AddExtensionForInstall("ext_test_1.crx", &extensions));
114424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  ASSERT_TRUE(AddExtensionForInstall("ext_test_2.crx", &extensions));
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::ScopedTempDir extension_dir;
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(extension_dir.CreateUniqueTempDir());
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Switches switches;
120424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  std::vector<std::string> bg_pages;
121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Status status = internal::ProcessExtensions(extensions, extension_dir.path(),
12258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                              false, &switches, &bg_pages);
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(status.IsOk());
12458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_TRUE(switches.HasSwitch("load-extension"));
12558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  CommandLine::StringType ext_paths = switches.GetSwitchValueNative(
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "load-extension");
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<CommandLine::StringType> ext_path_list;
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::SplitString(ext_paths, FILE_PATH_LITERAL(','), &ext_path_list);
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(2u, ext_path_list.size());
1307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_TRUE(base::PathExists(base::FilePath(ext_path_list[0])));
1317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_TRUE(base::PathExists(base::FilePath(ext_path_list[1])));
132424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  ASSERT_EQ(0u, bg_pages.size());
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST(ProcessExtensions, CommandLineExtensions) {
13658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  std::vector<std::string> extensions;
13758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_TRUE(AddExtensionForInstall("ext_test_1.crx", &extensions));
13858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  base::ScopedTempDir extension_dir;
13958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_TRUE(extension_dir.CreateUniqueTempDir());
14058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
14158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Switches switches;
14258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  switches.SetSwitch("load-extension", "/a");
14358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  std::vector<std::string> bg_pages;
14458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Status status = internal::ProcessExtensions(extensions, extension_dir.path(),
14558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                              false, &switches, &bg_pages);
14658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ(kOk, status.code());
14758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  base::FilePath::StringType load = switches.GetSwitchValueNative(
14858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "load-extension");
14958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ(FILE_PATH_LITERAL("/a,"), load.substr(0, 3));
15058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_TRUE(base::PathExists(base::FilePath(load.substr(3))));
15158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
15258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
153a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)namespace {
154a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
155a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)void AssertEQ(const base::DictionaryValue& dict, const std::string& key,
156a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)              const char* expected_value) {
157a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  std::string value;
158a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  ASSERT_TRUE(dict.GetString(key, &value));
159a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  ASSERT_STREQ(value.c_str(), expected_value);
160a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}
161a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
162a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}  // namespace
163a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(PrepareUserDataDir, CustomPrefs) {
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::ScopedTempDir temp_dir;
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::DictionaryValue prefs;
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  prefs.SetString("myPrefsKey", "ok");
170a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  prefs.SetStringWithoutPathExpansion("pref.sub", "1");
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::DictionaryValue local_state;
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  local_state.SetString("myLocalKey", "ok");
173a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  local_state.SetStringWithoutPathExpansion("local.state.sub", "2");
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Status status = internal::PrepareUserDataDir(
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      temp_dir.path(), &prefs, &local_state);
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(kOk, status.code());
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath prefs_file =
1795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      temp_dir.path().AppendASCII(chrome::kInitialProfile).Append(
1805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          chrome::kPreferencesFilename);
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string prefs_str;
18258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_TRUE(base::ReadFileToString(prefs_file, &prefs_str));
183a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  scoped_ptr<base::Value> prefs_value(base::JSONReader::Read(prefs_str));
184a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  const base::DictionaryValue* prefs_dict = NULL;
185a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  ASSERT_TRUE(prefs_value->GetAsDictionary(&prefs_dict));
186a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  AssertEQ(*prefs_dict, "myPrefsKey", "ok");
187a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  AssertEQ(*prefs_dict, "pref.sub", "1");
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::FilePath local_state_file =
1905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      temp_dir.path().Append(chrome::kLocalStateFilename);
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string local_state_str;
19258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_TRUE(base::ReadFileToString(local_state_file, &local_state_str));
193a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  scoped_ptr<base::Value> local_state_value(
194a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      base::JSONReader::Read(local_state_str));
195a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  const base::DictionaryValue* local_state_dict = NULL;
196a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  ASSERT_TRUE(local_state_value->GetAsDictionary(&local_state_dict));
197a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  AssertEQ(*local_state_dict, "myLocalKey", "ok");
198a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  AssertEQ(*local_state_dict, "local.state.sub", "2");
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
200