preg_parser_win_unittest.cc revision a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7
1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved. 2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file. 4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 5a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "components/policy/core/common/preg_parser_win.h" 6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 73551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/base_paths.h" 8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/files/file_path.h" 9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/json/json_writer.h" 10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/logging.h" 11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/path_service.h" 12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/values.h" 13a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "components/policy/core/common/policy_load_status.h" 14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "components/policy/core/common/registry_dict_win.h" 15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace policy { 18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace preg_parser { 19a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)namespace { 20a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 21a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Check whether two RegistryDicts equal each other. 22a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)testing::AssertionResult RegistryDictEquals(const RegistryDict& a, 23a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const RegistryDict& b) { 24a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) RegistryDict::KeyMap::const_iterator iter_key_a(a.keys().begin()); 25a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) RegistryDict::KeyMap::const_iterator iter_key_b(b.keys().begin()); 26a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) for (; iter_key_a != a.keys().end() && iter_key_b != b.keys().end(); 27a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ++iter_key_a, ++iter_key_b) { 28a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (iter_key_a->first != iter_key_b->first) { 29a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return testing::AssertionFailure() 30a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) << "Key mismatch " << iter_key_a->first 31a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) << " vs. " << iter_key_b->first; 32a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 33a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) testing::AssertionResult result = RegistryDictEquals(*iter_key_a->second, 34a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) *iter_key_b->second); 35a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (!result) 36a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return result; 37a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 38a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 39a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) RegistryDict::ValueMap::const_iterator iter_value_a(a.values().begin()); 40a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) RegistryDict::ValueMap::const_iterator iter_value_b(b.values().begin()); 41a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) for (; iter_value_a != a.values().end() && iter_value_b != b.values().end(); 42a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ++iter_value_a, ++iter_value_b) { 43a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (iter_value_a->first != iter_value_b->first || 44a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) !base::Value::Equals(iter_value_a->second, iter_value_b->second)) { 45a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return testing::AssertionFailure() 46d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) << "Value mismatch " 47d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) << iter_value_a->first << "=" << *iter_value_a->second 48d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) << " vs. " << iter_value_b->first << "=" << *iter_value_b->second; 49a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 50a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 51a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 52a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return testing::AssertionSuccess(); 53a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 54a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 55a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void SetInteger(RegistryDict* dict, 56a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const std::string& name, 57a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) int value) { 58a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) dict->SetValue( 59a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) name, 60a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) make_scoped_ptr<base::Value>(new base::FundamentalValue(value))); 61a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 62a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 63a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void SetString(RegistryDict* dict, 64a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const std::string& name, 65a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const std::string& value) { 66a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) dict->SetValue( 67a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) name, 68a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) make_scoped_ptr<base::Value>(new base::StringValue(value))); 69a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(PRegParserWinTest, TestParseFile) { 72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath test_data_dir; 733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(PathService::Get(base::DIR_SOURCE_ROOT, &test_data_dir)); 74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Prepare the test dictionary with some data so the test can check that the 76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // PReg action triggers work, i.e. remove these items. 77a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) RegistryDict dict; 78a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) SetInteger(&dict, "DeleteValuesTest1", 1); 79a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) SetString(&dict, "DeleteValuesTest2", "2"); 80a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) dict.SetKey("DeleteKeysTest1", make_scoped_ptr(new RegistryDict())); 81a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_ptr<RegistryDict> delete_keys_test(new RegistryDict()); 82a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) SetInteger(delete_keys_test.get(), "DeleteKeysTest2Entry", 1); 83a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) dict.SetKey("DeleteKeysTest2", delete_keys_test.Pass()); 84a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) SetInteger(&dict, "DelTest", 1); 85a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_ptr<RegistryDict> subdict(new RegistryDict()); 86a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) SetInteger(subdict.get(), "DelValsTest1", 1); 87a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) SetString(subdict.get(), "DelValsTest2", "2"); 88a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) subdict->SetKey("DelValsTest3", make_scoped_ptr(new RegistryDict())); 89a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) dict.SetKey("DelValsTest", subdict.Pass()); 90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Run the parser. 923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) base::FilePath test_file( 933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) test_data_dir.AppendASCII("chrome/test/data/policy/registry.pol")); 94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PolicyLoadStatusSample status; 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(preg_parser::ReadFile( 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) test_file, L"SOFTWARE\\Policies\\Chromium", &dict, &status)); 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Build the expected output dictionary. 99a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) RegistryDict expected; 100a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_ptr<RegistryDict> del_vals_dict(new RegistryDict()); 101a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) del_vals_dict->SetKey("DelValsTest3", make_scoped_ptr(new RegistryDict())); 102a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) expected.SetKey("DelValsTest", del_vals_dict.Pass()); 103a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) SetInteger(&expected, "HomepageIsNewTabPage", 1); 104a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) SetString(&expected, "HomepageLocation", "http://www.example.com"); 105a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) SetInteger(&expected, "RestoreOnStartup", 4); 106a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_ptr<RegistryDict> startup_urls(new RegistryDict()); 107a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) SetString(startup_urls.get(), "1", "http://www.chromium.org"); 108a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) SetString(startup_urls.get(), "2", "http://www.example.com"); 109a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) expected.SetKey("RestoreOnStartupURLs", startup_urls.Pass()); 110a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) SetInteger(&expected, "ShowHomeButton", 1); 111a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) SetString(&expected, "Snowman", "\xE2\x98\x83"); 112d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) SetString(&expected, "Empty", ""); 113a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 114a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(RegistryDictEquals(dict, expected)); 115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 117a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} // namespace 118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace preg_parser 119a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} // namespace policy 120