preg_parser_win_unittest.cc revision a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7
15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved. 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// found in the LICENSE file. 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "components/policy/core/common/preg_parser_win.h" 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "base/base_paths.h" 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "base/files/file_path.h" 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "base/json/json_writer.h" 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "base/logging.h" 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "base/path_service.h" 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "base/values.h" 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "components/policy/core/common/policy_load_status.h" 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "components/policy/core/common/registry_dict_win.h" 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace policy { 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace preg_parser { 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace { 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Check whether two RegistryDicts equal each other. 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)testing::AssertionResult RegistryDictEquals(const RegistryDict& a, 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const RegistryDict& b) { 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RegistryDict::KeyMap::const_iterator iter_key_a(a.keys().begin()); 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RegistryDict::KeyMap::const_iterator iter_key_b(b.keys().begin()); 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (; iter_key_a != a.keys().end() && iter_key_b != b.keys().end(); 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ++iter_key_a, ++iter_key_b) { 285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (iter_key_a->first != iter_key_b->first) { 295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return testing::AssertionFailure() 30591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch << "Key mismatch " << iter_key_a->first 315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) << " vs. " << iter_key_b->first; 3281a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) } 335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) testing::AssertionResult result = RegistryDictEquals(*iter_key_a->second, 345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *iter_key_b->second); 355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!result) 365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return result; 375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RegistryDict::ValueMap::const_iterator iter_value_a(a.values().begin()); 4002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch RegistryDict::ValueMap::const_iterator iter_value_b(b.values().begin()); 415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (; iter_value_a != a.values().end() && iter_value_b != b.values().end(); 425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ++iter_value_a, ++iter_value_b) { 435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (iter_value_a->first != iter_value_b->first || 445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) !base::Value::Equals(iter_value_a->second, iter_value_b->second)) { 455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return testing::AssertionFailure() 465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) << "Value mismatch " 475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) << iter_value_a->first << "=" << *iter_value_a->second 485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) << " vs. " << iter_value_b->first << "=" << *iter_value_b->second; 495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return testing::AssertionSuccess(); 535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void SetInteger(RegistryDict* dict, 565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const std::string& name, 575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int value) { 585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dict->SetValue( 595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) name, 605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) make_scoped_ptr<base::Value>(new base::FundamentalValue(value))); 615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void SetString(RegistryDict* dict, 645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const std::string& name, 655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const std::string& value) { 665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dict->SetValue( 675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) name, 685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) make_scoped_ptr<base::Value>(new base::StringValue(value))); 695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TEST(PRegParserWinTest, TestParseFile) { 725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) base::FilePath test_data_dir; 735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT_TRUE(PathService::Get(base::DIR_SOURCE_ROOT, &test_data_dir)); 745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Prepare the test dictionary with some data so the test can check that the 765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // PReg action triggers work, i.e. remove these items. 775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RegistryDict dict; 7881a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) SetInteger(&dict, "DeleteValuesTest1", 1); 795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) SetString(&dict, "DeleteValuesTest2", "2"); 805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dict.SetKey("DeleteKeysTest1", make_scoped_ptr(new RegistryDict())); 81 scoped_ptr<RegistryDict> delete_keys_test(new RegistryDict()); 82 SetInteger(delete_keys_test.get(), "DeleteKeysTest2Entry", 1); 83 dict.SetKey("DeleteKeysTest2", delete_keys_test.Pass()); 84 SetInteger(&dict, "DelTest", 1); 85 scoped_ptr<RegistryDict> subdict(new RegistryDict()); 86 SetInteger(subdict.get(), "DelValsTest1", 1); 87 SetString(subdict.get(), "DelValsTest2", "2"); 88 subdict->SetKey("DelValsTest3", make_scoped_ptr(new RegistryDict())); 89 dict.SetKey("DelValsTest", subdict.Pass()); 90 91 // Run the parser. 92 base::FilePath test_file( 93 test_data_dir.AppendASCII("chrome/test/data/policy/registry.pol")); 94 PolicyLoadStatusSample status; 95 ASSERT_TRUE(preg_parser::ReadFile( 96 test_file, L"SOFTWARE\\Policies\\Chromium", &dict, &status)); 97 98 // Build the expected output dictionary. 99 RegistryDict expected; 100 scoped_ptr<RegistryDict> del_vals_dict(new RegistryDict()); 101 del_vals_dict->SetKey("DelValsTest3", make_scoped_ptr(new RegistryDict())); 102 expected.SetKey("DelValsTest", del_vals_dict.Pass()); 103 SetInteger(&expected, "HomepageIsNewTabPage", 1); 104 SetString(&expected, "HomepageLocation", "http://www.example.com"); 105 SetInteger(&expected, "RestoreOnStartup", 4); 106 scoped_ptr<RegistryDict> startup_urls(new RegistryDict()); 107 SetString(startup_urls.get(), "1", "http://www.chromium.org"); 108 SetString(startup_urls.get(), "2", "http://www.example.com"); 109 expected.SetKey("RestoreOnStartupURLs", startup_urls.Pass()); 110 SetInteger(&expected, "ShowHomeButton", 1); 111 SetString(&expected, "Snowman", "\xE2\x98\x83"); 112 SetString(&expected, "Empty", ""); 113 114 EXPECT_TRUE(RegistryDictEquals(dict, expected)); 115} 116 117} // namespace 118} // namespace preg_parser 119} // namespace policy 120