| OLD | NEW |
| 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 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 #include <windows.h> | 5 #include <windows.h> |
| 6 | 6 |
| 7 #include <fstream> | 7 #include <fstream> |
| 8 #include <iostream> | 8 #include <iostream> |
| 9 | 9 |
| 10 #include "base/base_paths.h" | 10 #include "base/base_paths.h" |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 53 file.close(); | 53 file.close(); |
| 54 } | 54 } |
| 55 | 55 |
| 56 wchar_t text_content_1[] = L"delete me"; | 56 wchar_t text_content_1[] = L"delete me"; |
| 57 wchar_t text_content_2[] = L"delete me as well"; | 57 wchar_t text_content_2[] = L"delete me as well"; |
| 58 }; | 58 }; |
| 59 | 59 |
| 60 // Delete a tree without key path. Everything should be deleted. | 60 // Delete a tree without key path. Everything should be deleted. |
| 61 TEST_F(DeleteTreeWorkItemTest, DeleteTreeNoKeyPath) { | 61 TEST_F(DeleteTreeWorkItemTest, DeleteTreeNoKeyPath) { |
| 62 // Create tree to be deleted | 62 // Create tree to be deleted |
| 63 std::wstring dir_name_delete(test_dir_.ToWStringHack()); | 63 FilePath dir_name_delete(test_dir_); |
| 64 file_util::AppendToPath(&dir_name_delete, L"to_be_delete"); | 64 dir_name_delete = dir_name_delete.AppendASCII("to_be_delete"); |
| 65 CreateDirectory(dir_name_delete.c_str(), NULL); | 65 CreateDirectory(dir_name_delete.value().c_str(), NULL); |
| 66 ASSERT_TRUE(file_util::PathExists(dir_name_delete)); | 66 ASSERT_TRUE(file_util::PathExists(dir_name_delete)); |
| 67 | 67 |
| 68 std::wstring dir_name_delete_1(dir_name_delete); | 68 FilePath dir_name_delete_1(dir_name_delete); |
| 69 file_util::AppendToPath(&dir_name_delete_1, L"1"); | 69 dir_name_delete_1 = dir_name_delete_1.AppendASCII("1"); |
| 70 CreateDirectory(dir_name_delete_1.c_str(), NULL); | 70 CreateDirectory(dir_name_delete_1.value().c_str(), NULL); |
| 71 ASSERT_TRUE(file_util::PathExists(dir_name_delete_1)); | 71 ASSERT_TRUE(file_util::PathExists(dir_name_delete_1)); |
| 72 | 72 |
| 73 std::wstring dir_name_delete_2(dir_name_delete); | 73 FilePath dir_name_delete_2(dir_name_delete); |
| 74 file_util::AppendToPath(&dir_name_delete_2, L"2"); | 74 dir_name_delete_2 = dir_name_delete_2.AppendASCII("2"); |
| 75 CreateDirectory(dir_name_delete_2.c_str(), NULL); | 75 CreateDirectory(dir_name_delete_2.value().c_str(), NULL); |
| 76 ASSERT_TRUE(file_util::PathExists(dir_name_delete_2)); | 76 ASSERT_TRUE(file_util::PathExists(dir_name_delete_2)); |
| 77 | 77 |
| 78 std::wstring file_name_delete_1(dir_name_delete_1); | 78 FilePath file_name_delete_1(dir_name_delete_1); |
| 79 file_util::AppendToPath(&file_name_delete_1, L"File_1.txt"); | 79 file_name_delete_1 = file_name_delete_1.AppendASCII("File_1.txt"); |
| 80 CreateTextFile(file_name_delete_1, text_content_1); | 80 CreateTextFile(file_name_delete_1.value(), text_content_1); |
| 81 ASSERT_TRUE(file_util::PathExists(file_name_delete_1)); | 81 ASSERT_TRUE(file_util::PathExists(file_name_delete_1)); |
| 82 | 82 |
| 83 std::wstring file_name_delete_2(dir_name_delete_2); | 83 FilePath file_name_delete_2(dir_name_delete_2); |
| 84 file_util::AppendToPath(&file_name_delete_2, L"File_2.txt"); | 84 file_name_delete_2 = file_name_delete_2.AppendASCII("File_2.txt"); |
| 85 CreateTextFile(file_name_delete_2, text_content_1); | 85 CreateTextFile(file_name_delete_2.value(), text_content_1); |
| 86 ASSERT_TRUE(file_util::PathExists(file_name_delete_2)); | 86 ASSERT_TRUE(file_util::PathExists(file_name_delete_2)); |
| 87 | 87 |
| 88 // test Do() | 88 // test Do() |
| 89 scoped_ptr<DeleteTreeWorkItem> work_item( | 89 scoped_ptr<DeleteTreeWorkItem> work_item( |
| 90 WorkItem::CreateDeleteTreeWorkItem(dir_name_delete, std::wstring())); | 90 WorkItem::CreateDeleteTreeWorkItem(dir_name_delete.ToWStringHack(), |
| 91 std::wstring())); |
| 91 EXPECT_TRUE(work_item->Do()); | 92 EXPECT_TRUE(work_item->Do()); |
| 92 | 93 |
| 93 // everything should be gone | 94 // everything should be gone |
| 94 EXPECT_FALSE(file_util::PathExists(file_name_delete_1)); | 95 EXPECT_FALSE(file_util::PathExists(file_name_delete_1)); |
| 95 EXPECT_FALSE(file_util::PathExists(file_name_delete_2)); | 96 EXPECT_FALSE(file_util::PathExists(file_name_delete_2)); |
| 96 EXPECT_FALSE(file_util::PathExists(dir_name_delete)); | 97 EXPECT_FALSE(file_util::PathExists(dir_name_delete)); |
| 97 | 98 |
| 98 work_item->Rollback(); | 99 work_item->Rollback(); |
| 99 // everything should come back | 100 // everything should come back |
| 100 EXPECT_TRUE(file_util::PathExists(file_name_delete_1)); | 101 EXPECT_TRUE(file_util::PathExists(file_name_delete_1)); |
| 101 EXPECT_TRUE(file_util::PathExists(file_name_delete_2)); | 102 EXPECT_TRUE(file_util::PathExists(file_name_delete_2)); |
| 102 EXPECT_TRUE(file_util::PathExists(dir_name_delete)); | 103 EXPECT_TRUE(file_util::PathExists(dir_name_delete)); |
| 103 } | 104 } |
| 104 | 105 |
| 105 | 106 |
| 106 // Delete a tree with keypath but not in use. Everything should be gone. | 107 // Delete a tree with keypath but not in use. Everything should be gone. |
| 107 // Rollback should bring back everything | 108 // Rollback should bring back everything |
| 108 TEST_F(DeleteTreeWorkItemTest, DeleteTree) { | 109 TEST_F(DeleteTreeWorkItemTest, DeleteTree) { |
| 109 // Create tree to be deleted | 110 // Create tree to be deleted |
| 110 std::wstring dir_name_delete(test_dir_.ToWStringHack()); | 111 FilePath dir_name_delete(test_dir_); |
| 111 file_util::AppendToPath(&dir_name_delete, L"to_be_delete"); | 112 dir_name_delete = dir_name_delete.AppendASCII("to_be_delete"); |
| 112 CreateDirectory(dir_name_delete.c_str(), NULL); | 113 CreateDirectory(dir_name_delete.value().c_str(), NULL); |
| 113 ASSERT_TRUE(file_util::PathExists(dir_name_delete)); | 114 ASSERT_TRUE(file_util::PathExists(dir_name_delete)); |
| 114 | 115 |
| 115 std::wstring dir_name_delete_1(dir_name_delete); | 116 FilePath dir_name_delete_1(dir_name_delete); |
| 116 file_util::AppendToPath(&dir_name_delete_1, L"1"); | 117 dir_name_delete_1 = dir_name_delete_1.AppendASCII("1"); |
| 117 CreateDirectory(dir_name_delete_1.c_str(), NULL); | 118 CreateDirectory(dir_name_delete_1.value().c_str(), NULL); |
| 118 ASSERT_TRUE(file_util::PathExists(dir_name_delete_1)); | 119 ASSERT_TRUE(file_util::PathExists(dir_name_delete_1)); |
| 119 | 120 |
| 120 std::wstring dir_name_delete_2(dir_name_delete); | 121 FilePath dir_name_delete_2(dir_name_delete); |
| 121 file_util::AppendToPath(&dir_name_delete_2, L"2"); | 122 dir_name_delete_2 = dir_name_delete_2.AppendASCII("2"); |
| 122 CreateDirectory(dir_name_delete_2.c_str(), NULL); | 123 CreateDirectory(dir_name_delete_2.value().c_str(), NULL); |
| 123 ASSERT_TRUE(file_util::PathExists(dir_name_delete_2)); | 124 ASSERT_TRUE(file_util::PathExists(dir_name_delete_2)); |
| 124 | 125 |
| 125 std::wstring file_name_delete_1(dir_name_delete_1); | 126 FilePath file_name_delete_1(dir_name_delete_1); |
| 126 file_util::AppendToPath(&file_name_delete_1, L"File_1.txt"); | 127 file_name_delete_1 = file_name_delete_1.AppendASCII("File_1.txt"); |
| 127 CreateTextFile(file_name_delete_1, text_content_1); | 128 CreateTextFile(file_name_delete_1.value(), text_content_1); |
| 128 ASSERT_TRUE(file_util::PathExists(file_name_delete_1)); | 129 ASSERT_TRUE(file_util::PathExists(file_name_delete_1)); |
| 129 | 130 |
| 130 std::wstring file_name_delete_2(dir_name_delete_2); | 131 FilePath file_name_delete_2(dir_name_delete_2); |
| 131 file_util::AppendToPath(&file_name_delete_2, L"File_2.txt"); | 132 file_name_delete_2 = file_name_delete_2.AppendASCII("File_2.txt"); |
| 132 CreateTextFile(file_name_delete_2, text_content_1); | 133 CreateTextFile(file_name_delete_2.value(), text_content_1); |
| 133 ASSERT_TRUE(file_util::PathExists(file_name_delete_2)); | 134 ASSERT_TRUE(file_util::PathExists(file_name_delete_2)); |
| 134 | 135 |
| 135 // test Do() | 136 // test Do() |
| 136 scoped_ptr<DeleteTreeWorkItem> work_item( | 137 scoped_ptr<DeleteTreeWorkItem> work_item( |
| 137 WorkItem::CreateDeleteTreeWorkItem(dir_name_delete, file_name_delete_1)); | 138 WorkItem::CreateDeleteTreeWorkItem(dir_name_delete.ToWStringHack(), |
| 139 file_name_delete_1.ToWStringHack())); |
| 138 EXPECT_TRUE(work_item->Do()); | 140 EXPECT_TRUE(work_item->Do()); |
| 139 | 141 |
| 140 // everything should be gone | 142 // everything should be gone |
| 141 EXPECT_FALSE(file_util::PathExists(file_name_delete_1)); | 143 EXPECT_FALSE(file_util::PathExists(file_name_delete_1)); |
| 142 EXPECT_FALSE(file_util::PathExists(file_name_delete_2)); | 144 EXPECT_FALSE(file_util::PathExists(file_name_delete_2)); |
| 143 EXPECT_FALSE(file_util::PathExists(dir_name_delete)); | 145 EXPECT_FALSE(file_util::PathExists(dir_name_delete)); |
| 144 | 146 |
| 145 work_item->Rollback(); | 147 work_item->Rollback(); |
| 146 // everything should come back | 148 // everything should come back |
| 147 EXPECT_TRUE(file_util::PathExists(file_name_delete_1)); | 149 EXPECT_TRUE(file_util::PathExists(file_name_delete_1)); |
| 148 EXPECT_TRUE(file_util::PathExists(file_name_delete_2)); | 150 EXPECT_TRUE(file_util::PathExists(file_name_delete_2)); |
| 149 EXPECT_TRUE(file_util::PathExists(dir_name_delete)); | 151 EXPECT_TRUE(file_util::PathExists(dir_name_delete)); |
| 150 } | 152 } |
| 151 | 153 |
| 152 // Delete a tree with key_path in use. Everything should still be there. | 154 // Delete a tree with key_path in use. Everything should still be there. |
| 153 TEST_F(DeleteTreeWorkItemTest, DeleteTreeInUse) { | 155 TEST_F(DeleteTreeWorkItemTest, DeleteTreeInUse) { |
| 154 // Create tree to be deleted | 156 // Create tree to be deleted |
| 155 std::wstring dir_name_delete(test_dir_.ToWStringHack()); | 157 FilePath dir_name_delete(test_dir_); |
| 156 file_util::AppendToPath(&dir_name_delete, L"to_be_delete"); | 158 dir_name_delete = dir_name_delete.AppendASCII("to_be_delete"); |
| 157 CreateDirectory(dir_name_delete.c_str(), NULL); | 159 CreateDirectory(dir_name_delete.value().c_str(), NULL); |
| 158 ASSERT_TRUE(file_util::PathExists(dir_name_delete)); | 160 ASSERT_TRUE(file_util::PathExists(dir_name_delete)); |
| 159 | 161 |
| 160 std::wstring dir_name_delete_1(dir_name_delete); | 162 FilePath dir_name_delete_1(dir_name_delete); |
| 161 file_util::AppendToPath(&dir_name_delete_1, L"1"); | 163 dir_name_delete_1 = dir_name_delete_1.AppendASCII("1"); |
| 162 CreateDirectory(dir_name_delete_1.c_str(), NULL); | 164 CreateDirectory(dir_name_delete_1.value().c_str(), NULL); |
| 163 ASSERT_TRUE(file_util::PathExists(dir_name_delete_1)); | 165 ASSERT_TRUE(file_util::PathExists(dir_name_delete_1)); |
| 164 | 166 |
| 165 std::wstring dir_name_delete_2(dir_name_delete); | 167 FilePath dir_name_delete_2(dir_name_delete); |
| 166 file_util::AppendToPath(&dir_name_delete_2, L"2"); | 168 dir_name_delete_2 = dir_name_delete_2.AppendASCII("2"); |
| 167 CreateDirectory(dir_name_delete_2.c_str(), NULL); | 169 CreateDirectory(dir_name_delete_2.value().c_str(), NULL); |
| 168 ASSERT_TRUE(file_util::PathExists(dir_name_delete_2)); | 170 ASSERT_TRUE(file_util::PathExists(dir_name_delete_2)); |
| 169 | 171 |
| 170 std::wstring file_name_delete_1(dir_name_delete_1); | 172 FilePath file_name_delete_1(dir_name_delete_1); |
| 171 file_util::AppendToPath(&file_name_delete_1, L"File_1.txt"); | 173 file_name_delete_1 = file_name_delete_1.AppendASCII("File_1.txt"); |
| 172 CreateTextFile(file_name_delete_1, text_content_1); | 174 CreateTextFile(file_name_delete_1.value(), text_content_1); |
| 173 ASSERT_TRUE(file_util::PathExists(file_name_delete_1)); | 175 ASSERT_TRUE(file_util::PathExists(file_name_delete_1)); |
| 174 | 176 |
| 175 std::wstring file_name_delete_2(dir_name_delete_2); | 177 FilePath file_name_delete_2(dir_name_delete_2); |
| 176 file_util::AppendToPath(&file_name_delete_2, L"File_2.txt"); | 178 file_name_delete_2 = file_name_delete_2.AppendASCII("File_2.txt"); |
| 177 CreateTextFile(file_name_delete_2, text_content_1); | 179 CreateTextFile(file_name_delete_2.value(), text_content_1); |
| 178 ASSERT_TRUE(file_util::PathExists(file_name_delete_2)); | 180 ASSERT_TRUE(file_util::PathExists(file_name_delete_2)); |
| 179 | 181 |
| 180 // Create a key path file. | 182 // Create a key path file. |
| 181 std::wstring key_path(dir_name_delete); | 183 FilePath key_path(dir_name_delete); |
| 182 file_util::AppendToPath(&key_path, L"key_file.exe"); | 184 key_path = key_path.AppendASCII("key_file.exe"); |
| 183 | 185 |
| 184 wchar_t exe_full_path_str[MAX_PATH]; | 186 wchar_t exe_full_path_str[MAX_PATH]; |
| 185 ::GetModuleFileNameW(NULL, exe_full_path_str, MAX_PATH); | 187 ::GetModuleFileNameW(NULL, exe_full_path_str, MAX_PATH); |
| 186 std::wstring exe_full_path(exe_full_path_str); | 188 FilePath exe_full_path(exe_full_path_str); |
| 187 | 189 |
| 188 file_util::CopyFile(exe_full_path, key_path); | 190 file_util::CopyFile(exe_full_path, key_path); |
| 189 ASSERT_TRUE(file_util::PathExists(key_path)); | 191 ASSERT_TRUE(file_util::PathExists(key_path)); |
| 190 | 192 |
| 191 LOG(INFO) << "copy ourself from " << exe_full_path << " to " << key_path; | 193 LOG(INFO) << "copy ourself from " |
| 194 << exe_full_path.value() << " to " << key_path.value(); |
| 192 | 195 |
| 193 // Run the key path file to keep it in use. | 196 // Run the key path file to keep it in use. |
| 194 STARTUPINFOW si = {sizeof(si)}; | 197 STARTUPINFOW si = {sizeof(si)}; |
| 195 PROCESS_INFORMATION pi = {0}; | 198 PROCESS_INFORMATION pi = {0}; |
| 196 ASSERT_TRUE( | 199 ASSERT_TRUE( |
| 197 ::CreateProcessW(NULL, const_cast<wchar_t*>(key_path.c_str()), | 200 ::CreateProcessW(NULL, const_cast<wchar_t*>(key_path.value().c_str()), |
| 198 NULL, NULL, FALSE, CREATE_NO_WINDOW | CREATE_SUSPENDED, | 201 NULL, NULL, FALSE, CREATE_NO_WINDOW | CREATE_SUSPENDED, |
| 199 NULL, NULL, &si, &pi)); | 202 NULL, NULL, &si, &pi)); |
| 200 | 203 |
| 201 // test Do(). | 204 // test Do(). |
| 202 { | 205 { |
| 203 scoped_ptr<DeleteTreeWorkItem> work_item( | 206 scoped_ptr<DeleteTreeWorkItem> work_item( |
| 204 WorkItem::CreateDeleteTreeWorkItem(dir_name_delete, key_path)); | 207 WorkItem::CreateDeleteTreeWorkItem(dir_name_delete.ToWStringHack(), |
| 208 key_path.ToWStringHack())); |
| 205 | 209 |
| 206 // delete should fail as file in use. | 210 // delete should fail as file in use. |
| 207 EXPECT_FALSE(work_item->Do()); | 211 EXPECT_FALSE(work_item->Do()); |
| 208 } | 212 } |
| 209 | 213 |
| 210 // verify everything is still there. | 214 // verify everything is still there. |
| 211 EXPECT_TRUE(file_util::PathExists(key_path)); | 215 EXPECT_TRUE(file_util::PathExists(key_path)); |
| 212 EXPECT_TRUE(file_util::PathExists(file_name_delete_1)); | 216 EXPECT_TRUE(file_util::PathExists(file_name_delete_1)); |
| 213 EXPECT_TRUE(file_util::PathExists(file_name_delete_2)); | 217 EXPECT_TRUE(file_util::PathExists(file_name_delete_2)); |
| 214 | 218 |
| 215 TerminateProcess(pi.hProcess, 0); | 219 TerminateProcess(pi.hProcess, 0); |
| 216 // make sure the handle is closed. | 220 // make sure the handle is closed. |
| 217 WaitForSingleObject(pi.hProcess, INFINITE); | 221 WaitForSingleObject(pi.hProcess, INFINITE); |
| 218 } | 222 } |
| OLD | NEW |