| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // A test that exercises Chrome Frame's DLL Redirctor update code. This test | 5 // A test that exercises Chrome Frame's DLL Redirctor update code. This test |
| 6 // generates a new version of CF from the one already in the build folder and | 6 // generates a new version of CF from the one already in the build folder and |
| 7 // then loads them both into the current process to verify the handoff. | 7 // then loads them both into the current process to verify the handoff. |
| 8 | 8 |
| 9 #include "base/file_path.h" | 9 #include "base/file_path.h" |
| 10 #include "base/file_util.h" | 10 #include "base/file_util.h" |
| (...skipping 20 matching lines...) Expand all Loading... |
| 31 class DllRedirectorLoadingTest : public testing::Test { | 31 class DllRedirectorLoadingTest : public testing::Test { |
| 32 public: | 32 public: |
| 33 // This sets up the following directory structure: | 33 // This sets up the following directory structure: |
| 34 // TEMP\<version X>\npchrome_frame.dll | 34 // TEMP\<version X>\npchrome_frame.dll |
| 35 // \<version X+1>\npchrome_frame.dll | 35 // \<version X+1>\npchrome_frame.dll |
| 36 // | 36 // |
| 37 // This structure emulates enough of the directory structure of a Chrome | 37 // This structure emulates enough of the directory structure of a Chrome |
| 38 // install to test upgrades. | 38 // install to test upgrades. |
| 39 static void SetUpTestCase() { | 39 static void SetUpTestCase() { |
| 40 // First ensure that we can find the built Chrome Frame DLL. | 40 // First ensure that we can find the built Chrome Frame DLL. |
| 41 FilePath build_chrome_frame_dll = GetChromeFrameBuildPath(); | 41 base::FilePath build_chrome_frame_dll = GetChromeFrameBuildPath(); |
| 42 ASSERT_TRUE(file_util::PathExists(build_chrome_frame_dll)); | 42 ASSERT_TRUE(file_util::PathExists(build_chrome_frame_dll)); |
| 43 | 43 |
| 44 // Then grab its version. | 44 // Then grab its version. |
| 45 scoped_ptr<FileVersionInfo> original_version_info( | 45 scoped_ptr<FileVersionInfo> original_version_info( |
| 46 FileVersionInfo::CreateFileVersionInfo(build_chrome_frame_dll)); | 46 FileVersionInfo::CreateFileVersionInfo(build_chrome_frame_dll)); |
| 47 ASSERT_TRUE(original_version_info != NULL); | 47 ASSERT_TRUE(original_version_info != NULL); |
| 48 original_version_.reset( | 48 original_version_.reset( |
| 49 new Version(WideToASCII(original_version_info->file_version()))); | 49 new Version(WideToASCII(original_version_info->file_version()))); |
| 50 ASSERT_TRUE(original_version_->IsValid()); | 50 ASSERT_TRUE(original_version_->IsValid()); |
| 51 | 51 |
| 52 // Make a place for us to run the test from. | 52 // Make a place for us to run the test from. |
| 53 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); | 53 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); |
| 54 | 54 |
| 55 // Make a versioned dir for the original chrome frame dll to run under. | 55 // Make a versioned dir for the original chrome frame dll to run under. |
| 56 FilePath original_version_dir( | 56 base::FilePath original_version_dir( |
| 57 temp_dir_.path().AppendASCII(original_version_->GetString())); | 57 temp_dir_.path().AppendASCII(original_version_->GetString())); |
| 58 ASSERT_TRUE(file_util::CreateDirectory(original_version_dir)); | 58 ASSERT_TRUE(file_util::CreateDirectory(original_version_dir)); |
| 59 | 59 |
| 60 // Now move the original DLL that we will operate on into a named-version | 60 // Now move the original DLL that we will operate on into a named-version |
| 61 // folder. | 61 // folder. |
| 62 original_chrome_frame_dll_ = | 62 original_chrome_frame_dll_ = |
| 63 original_version_dir.Append(build_chrome_frame_dll.BaseName()); | 63 original_version_dir.Append(build_chrome_frame_dll.BaseName()); |
| 64 ASSERT_TRUE(file_util::CopyFile(build_chrome_frame_dll, | 64 ASSERT_TRUE(file_util::CopyFile(build_chrome_frame_dll, |
| 65 original_chrome_frame_dll_)); | 65 original_chrome_frame_dll_)); |
| 66 ASSERT_TRUE(file_util::PathExists(original_chrome_frame_dll_)); | 66 ASSERT_TRUE(file_util::PathExists(original_chrome_frame_dll_)); |
| 67 | 67 |
| 68 // Temporary location for the new Chrome Frame DLL. | 68 // Temporary location for the new Chrome Frame DLL. |
| 69 FilePath temporary_new_chrome_frame_dll( | 69 base::FilePath temporary_new_chrome_frame_dll( |
| 70 temp_dir_.path().Append(build_chrome_frame_dll.BaseName())); | 70 temp_dir_.path().Append(build_chrome_frame_dll.BaseName())); |
| 71 | 71 |
| 72 // Generate the version-bumped Chrome Frame DLL to a temporary path. | 72 // Generate the version-bumped Chrome Frame DLL to a temporary path. |
| 73 ASSERT_TRUE( | 73 ASSERT_TRUE( |
| 74 upgrade_test::GenerateAlternatePEFileVersion( | 74 upgrade_test::GenerateAlternatePEFileVersion( |
| 75 original_chrome_frame_dll_, | 75 original_chrome_frame_dll_, |
| 76 temporary_new_chrome_frame_dll, | 76 temporary_new_chrome_frame_dll, |
| 77 upgrade_test::NEXT_VERSION)); | 77 upgrade_test::NEXT_VERSION)); |
| 78 | 78 |
| 79 // Ensure it got created and grab its version. | 79 // Ensure it got created and grab its version. |
| 80 scoped_ptr<FileVersionInfo> new_version_info( | 80 scoped_ptr<FileVersionInfo> new_version_info( |
| 81 FileVersionInfo::CreateFileVersionInfo(temporary_new_chrome_frame_dll)); | 81 FileVersionInfo::CreateFileVersionInfo(temporary_new_chrome_frame_dll)); |
| 82 ASSERT_TRUE(new_version_info != NULL); | 82 ASSERT_TRUE(new_version_info != NULL); |
| 83 new_version_.reset( | 83 new_version_.reset( |
| 84 new Version(WideToASCII(new_version_info->file_version()))); | 84 new Version(WideToASCII(new_version_info->file_version()))); |
| 85 ASSERT_TRUE(new_version_->IsValid()); | 85 ASSERT_TRUE(new_version_->IsValid()); |
| 86 | 86 |
| 87 // Make sure the new version is larger than the old. | 87 // Make sure the new version is larger than the old. |
| 88 ASSERT_EQ(new_version_->CompareTo(*original_version_.get()), 1); | 88 ASSERT_EQ(new_version_->CompareTo(*original_version_.get()), 1); |
| 89 | 89 |
| 90 // Now move the new Chrome Frame dll to its final resting place: | 90 // Now move the new Chrome Frame dll to its final resting place: |
| 91 FilePath new_version_dir( | 91 base::FilePath new_version_dir( |
| 92 temp_dir_.path().AppendASCII(new_version_->GetString())); | 92 temp_dir_.path().AppendASCII(new_version_->GetString())); |
| 93 ASSERT_TRUE(file_util::CreateDirectory(new_version_dir)); | 93 ASSERT_TRUE(file_util::CreateDirectory(new_version_dir)); |
| 94 new_chrome_frame_dll_ = | 94 new_chrome_frame_dll_ = |
| 95 new_version_dir.Append(build_chrome_frame_dll.BaseName()); | 95 new_version_dir.Append(build_chrome_frame_dll.BaseName()); |
| 96 ASSERT_TRUE(file_util::Move(temporary_new_chrome_frame_dll, | 96 ASSERT_TRUE(file_util::Move(temporary_new_chrome_frame_dll, |
| 97 new_chrome_frame_dll_)); | 97 new_chrome_frame_dll_)); |
| 98 ASSERT_TRUE(file_util::PathExists(new_chrome_frame_dll_)); | 98 ASSERT_TRUE(file_util::PathExists(new_chrome_frame_dll_)); |
| 99 } | 99 } |
| 100 | 100 |
| 101 static void TearDownTestCase() { | 101 static void TearDownTestCase() { |
| 102 if (!temp_dir_.Delete()) { | 102 if (!temp_dir_.Delete()) { |
| 103 // The temp_dir cleanup has been observed to fail in some cases. It looks | 103 // The temp_dir cleanup has been observed to fail in some cases. It looks |
| 104 // like something is holding on to the Chrome Frame DLLs after they have | 104 // like something is holding on to the Chrome Frame DLLs after they have |
| 105 // been explicitly unloaded. At least schedule them for cleanup on reboot. | 105 // been explicitly unloaded. At least schedule them for cleanup on reboot. |
| 106 ScheduleDirectoryForDeletion(temp_dir_.path().value().c_str()); | 106 ScheduleDirectoryForDeletion(temp_dir_.path().value().c_str()); |
| 107 } | 107 } |
| 108 } | 108 } |
| 109 | 109 |
| 110 protected: | 110 protected: |
| 111 static FilePath original_chrome_frame_dll_; | 111 static base::FilePath original_chrome_frame_dll_; |
| 112 static FilePath new_chrome_frame_dll_; | 112 static base::FilePath new_chrome_frame_dll_; |
| 113 static scoped_ptr<Version> original_version_; | 113 static scoped_ptr<Version> original_version_; |
| 114 static scoped_ptr<Version> new_version_; | 114 static scoped_ptr<Version> new_version_; |
| 115 | 115 |
| 116 static base::ScopedTempDir temp_dir_; | 116 static base::ScopedTempDir temp_dir_; |
| 117 }; // class DllRedirectorLoadingTest | 117 }; // class DllRedirectorLoadingTest |
| 118 | 118 |
| 119 FilePath DllRedirectorLoadingTest::original_chrome_frame_dll_; | 119 base::FilePath DllRedirectorLoadingTest::original_chrome_frame_dll_; |
| 120 FilePath DllRedirectorLoadingTest::new_chrome_frame_dll_; | 120 base::FilePath DllRedirectorLoadingTest::new_chrome_frame_dll_; |
| 121 scoped_ptr<Version> DllRedirectorLoadingTest::original_version_; | 121 scoped_ptr<Version> DllRedirectorLoadingTest::original_version_; |
| 122 scoped_ptr<Version> DllRedirectorLoadingTest::new_version_; | 122 scoped_ptr<Version> DllRedirectorLoadingTest::new_version_; |
| 123 base::ScopedTempDir DllRedirectorLoadingTest::temp_dir_; | 123 base::ScopedTempDir DllRedirectorLoadingTest::temp_dir_; |
| 124 | 124 |
| 125 #if defined(COMPONENT_BUILD) | 125 #if defined(COMPONENT_BUILD) |
| 126 // Disabling since npchrome_frame.dll's DllMain can't handle being loaded into | 126 // Disabling since npchrome_frame.dll's DllMain can't handle being loaded into |
| 127 // a process that has already started services in base.dll such as logging; see | 127 // a process that has already started services in base.dll such as logging; see |
| 128 // http://crbug.com/110492. | 128 // http://crbug.com/110492. |
| 129 #define MAYBE_TestDllRedirection DISABLED_TestDllRedirection | 129 #define MAYBE_TestDllRedirection DISABLED_TestDllRedirection |
| 130 #else | 130 #else |
| 131 #define MAYBE_TestDllRedirection TestDllRedirection | 131 #define MAYBE_TestDllRedirection TestDllRedirection |
| 132 #endif | 132 #endif |
| 133 | 133 |
| 134 TEST_F(DllRedirectorLoadingTest, MAYBE_TestDllRedirection) { | 134 TEST_F(DllRedirectorLoadingTest, MAYBE_TestDllRedirection) { |
| 135 struct TestData { | 135 struct TestData { |
| 136 FilePath first_dll; | 136 base::FilePath first_dll; |
| 137 FilePath second_dll; | 137 base::FilePath second_dll; |
| 138 Version* expected_beacon_version; | 138 Version* expected_beacon_version; |
| 139 } test_data[] = { | 139 } test_data[] = { |
| 140 { | 140 { |
| 141 original_chrome_frame_dll_, | 141 original_chrome_frame_dll_, |
| 142 new_chrome_frame_dll_, | 142 new_chrome_frame_dll_, |
| 143 original_version_.get() | 143 original_version_.get() |
| 144 }, | 144 }, |
| 145 { | 145 { |
| 146 new_chrome_frame_dll_, | 146 new_chrome_frame_dll_, |
| 147 original_chrome_frame_dll_, | 147 original_chrome_frame_dll_, |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 208 | 208 |
| 209 char buffer[kSharedMemoryBytes] = {0}; | 209 char buffer[kSharedMemoryBytes] = {0}; |
| 210 memcpy(buffer, beacon.memory(), kSharedMemoryBytes - 1); | 210 memcpy(buffer, beacon.memory(), kSharedMemoryBytes - 1); |
| 211 Version beacon_version(buffer); | 211 Version beacon_version(buffer); |
| 212 ASSERT_TRUE(beacon_version.IsValid()); | 212 ASSERT_TRUE(beacon_version.IsValid()); |
| 213 | 213 |
| 214 EXPECT_EQ(0, | 214 EXPECT_EQ(0, |
| 215 beacon_version.CompareTo(*test_data[i].expected_beacon_version)); | 215 beacon_version.CompareTo(*test_data[i].expected_beacon_version)); |
| 216 } | 216 } |
| 217 } | 217 } |
| OLD | NEW |