| Index: chrome/browser/file_associations_win_unittest.cc
|
| diff --git a/chrome/browser/file_associations_win_unittest.cc b/chrome/browser/file_associations_win_unittest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..57485f4c833ce2350f1a69103656811248054cab
|
| --- /dev/null
|
| +++ b/chrome/browser/file_associations_win_unittest.cc
|
| @@ -0,0 +1,157 @@
|
| +// Copyright 2014 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "chrome/browser/file_associations_win.h"
|
| +
|
| +#include "base/command_line.h"
|
| +#include "base/files/file_path.h"
|
| +#include "base/macros.h"
|
| +#include "base/strings/utf_string_conversions.h"
|
| +#include "base/win/registry.h"
|
| +#include "testing/gtest/include/gtest/gtest.h"
|
| +
|
| +namespace {
|
| +
|
| +// These will be written directly into the registry, so clearly mark them as
|
| +// 'Chrome' and avoid clobbering common extensions. Note: By running this test,
|
| +// these classes and extensions will be deleted from the real registry!
|
| +const char kTestProgid[] = "Chrome.TestApp";
|
| +const wchar_t kTestOpenCommand[] = L"C:\\test.exe";
|
| +const char kTestFileTypeName[] = "Chrome Test File Type";
|
| +const wchar_t kTestIconPath[] = L"D:\\test.ico";
|
| +const char* kTestFileExtensions[] = {
|
| + "chrometest1", "chrometest2",
|
| +};
|
| +
|
| +class FileAssociationsTest : public testing::Test {
|
| + public:
|
| + FileAssociationsTest() {}
|
| +
|
| + virtual void SetUp() OVERRIDE {
|
| + // .chrometest2 files already have a default application.
|
| + base::win::RegKey key;
|
| + ASSERT_EQ(ERROR_SUCCESS,
|
| + key.Create(HKEY_CURRENT_USER,
|
| + L"Software\\Classes\\.chrometest2",
|
| + KEY_ALL_ACCESS));
|
| + EXPECT_EQ(ERROR_SUCCESS, key.WriteValue(L"", L"SomeOtherApp"));
|
| + }
|
| +
|
| + virtual void TearDown() OVERRIDE {
|
| + // Clean up all keys that might have been created by this test.
|
| + base::win::RegKey classes_key;
|
| + ASSERT_EQ(ERROR_SUCCESS,
|
| + classes_key.Open(
|
| + HKEY_CURRENT_USER, L"Software\\Classes", KEY_ALL_ACCESS));
|
| +
|
| + // Delete the class key in the registry.
|
| + classes_key.DeleteKey(base::ASCIIToUTF16(kTestProgid).c_str());
|
| +
|
| + // Delete the extension keys for our test extensions.
|
| + for (size_t i = 0; i < arraysize(kTestFileExtensions); ++i) {
|
| + base::string16 ext(L"." + base::ASCIIToUTF16(kTestFileExtensions[i]));
|
| + classes_key.DeleteKey(ext.c_str());
|
| + }
|
| + }
|
| +
|
| + protected:
|
| + static base::CommandLine OpenCommand() {
|
| + base::FilePath open_command_path(kTestOpenCommand);
|
| + return base::CommandLine(open_command_path);
|
| + }
|
| +
|
| + static std::set<std::string> FileExtensions() {
|
| + std::set<std::string> file_extensions;
|
| + for (size_t i = 0; i < arraysize(kTestFileExtensions); ++i)
|
| + file_extensions.insert(kTestFileExtensions[i]);
|
| + return file_extensions;
|
| + }
|
| +
|
| + private:
|
| + DISALLOW_COPY_AND_ASSIGN(FileAssociationsTest);
|
| +};
|
| +
|
| +TEST_F(FileAssociationsTest, AddWindowsFileAssociations) {
|
| + // Create file associations.
|
| + EXPECT_TRUE(AddWindowsFileAssociations(kTestProgid,
|
| + OpenCommand(),
|
| + kTestFileTypeName,
|
| + base::FilePath(kTestIconPath),
|
| + FileExtensions()));
|
| +
|
| + // Ensure that the registry keys have been correctly set. We'll read from
|
| + // HKEY_CLASSES_ROOT (not HKEY_CURRENT_USER) to ensure that when we write to
|
| + // HKEY_CURRENT_USER\Software\Classes, it is correctly being mirrored to
|
| + // HKEY_CLASSES_ROOT.
|
| + base::win::RegKey key;
|
| + std::wstring value;
|
| + ASSERT_EQ(ERROR_SUCCESS,
|
| + key.Open(HKEY_CLASSES_ROOT, L"Chrome.TestApp", KEY_READ));
|
| + EXPECT_EQ(ERROR_SUCCESS, key.ReadValue(L"", &value));
|
| + EXPECT_EQ(L"Chrome Test File Type", value);
|
| + ASSERT_EQ(
|
| + ERROR_SUCCESS,
|
| + key.Open(HKEY_CLASSES_ROOT, L"Chrome.TestApp\\DefaultIcon", KEY_READ));
|
| + EXPECT_EQ(ERROR_SUCCESS, key.ReadValue(L"", &value));
|
| + EXPECT_EQ(L"D:\\test.ico,0", value);
|
| + ASSERT_EQ(ERROR_SUCCESS,
|
| + key.Open(HKEY_CLASSES_ROOT,
|
| + L"Chrome.TestApp\\shell\\open\\command",
|
| + KEY_READ));
|
| + EXPECT_EQ(ERROR_SUCCESS, key.ReadValue(L"", &value));
|
| + EXPECT_EQ(L"\"C:\\test.exe\"", value);
|
| +
|
| + // .chrometest1 should be default-associated with our test app.
|
| + ASSERT_EQ(ERROR_SUCCESS,
|
| + key.Open(HKEY_CLASSES_ROOT, L".chrometest1", KEY_READ));
|
| + EXPECT_EQ(ERROR_SUCCESS, key.ReadValue(L"", &value));
|
| + EXPECT_EQ(L"Chrome.TestApp", value);
|
| + ASSERT_EQ(
|
| + ERROR_SUCCESS,
|
| + key.Open(HKEY_CLASSES_ROOT, L".chrometest1\\OpenWithProgids", KEY_READ));
|
| + EXPECT_TRUE(key.HasValue(L"Chrome.TestApp"));
|
| + EXPECT_EQ(ERROR_SUCCESS, key.ReadValue(L"Chrome.TestApp", &value));
|
| + EXPECT_EQ(L"", value);
|
| +
|
| + // .chrometest2 should still be associated with the other app (should not have
|
| + // been overridden). But it should have our app in its Open With list.
|
| + ASSERT_EQ(ERROR_SUCCESS,
|
| + key.Open(HKEY_CLASSES_ROOT, L".chrometest2", KEY_READ));
|
| + EXPECT_EQ(ERROR_SUCCESS, key.ReadValue(L"", &value));
|
| + EXPECT_EQ(L"SomeOtherApp", value);
|
| + ASSERT_EQ(
|
| + ERROR_SUCCESS,
|
| + key.Open(HKEY_CLASSES_ROOT, L".chrometest2\\OpenWithProgids", KEY_READ));
|
| + EXPECT_TRUE(key.HasValue(L"Chrome.TestApp"));
|
| + EXPECT_EQ(ERROR_SUCCESS, key.ReadValue(L"Chrome.TestApp", &value));
|
| + EXPECT_EQ(L"", value);
|
| +}
|
| +
|
| +TEST_F(FileAssociationsTest, DeleteWindowsFileAssociations) {
|
| + // Create file associations.
|
| + EXPECT_TRUE(AddWindowsFileAssociations(kTestProgid,
|
| + OpenCommand(),
|
| + kTestFileTypeName,
|
| + base::FilePath(kTestIconPath),
|
| + FileExtensions()));
|
| +
|
| + // Delete them again.
|
| + EXPECT_TRUE(DeleteWindowsFileAssociations(kTestProgid));
|
| +
|
| + // The class key should have been completely deleted.
|
| + base::win::RegKey key;
|
| + std::wstring value;
|
| + ASSERT_NE(ERROR_SUCCESS,
|
| + key.Open(HKEY_CLASSES_ROOT, L"Chrome.TestApp", KEY_READ));
|
| +
|
| + // We don't need to delete the associations with the particular extensions
|
| + // (Windows will ignore those). However, we must ensure that .chrometest2 is
|
| + // still associated with the other app.
|
| + ASSERT_EQ(ERROR_SUCCESS,
|
| + key.Open(HKEY_CLASSES_ROOT, L".chrometest2", KEY_READ));
|
| + EXPECT_EQ(ERROR_SUCCESS, key.ReadValue(L"", &value));
|
| + EXPECT_EQ(L"SomeOtherApp", value);
|
| +}
|
| +
|
| +} // namespace
|
|
|