15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <windows.h>
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/scoped_handle.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sandbox/win/src/win_utils.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sandbox/win/tests/common/test_utils.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(WinUtils, IsReparsePoint) {
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  using sandbox::IsReparsePoint;
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a temp file because we need write access to it.
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  wchar_t temp_directory[MAX_PATH];
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  wchar_t my_folder[MAX_PATH];
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(::GetTempPath(MAX_PATH, temp_directory), 0u);
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(::GetTempFileName(temp_directory, L"test", 0, my_folder), 0u);
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Delete the file and create a directory instead.
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(::DeleteFile(my_folder));
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(::CreateDirectory(my_folder, NULL));
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool result = true;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ERROR_SUCCESS, IsReparsePoint(my_folder, &result));
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(result);
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We have to fix Bug 32224 to pass this test.
30d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)  base::string16 not_found = base::string16(my_folder) + L"\\foo\\bar";
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // EXPECT_EQ(ERROR_PATH_NOT_FOUND, IsReparsePoint(not_found, &result));
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)  base::string16 new_file = base::string16(my_folder) + L"\\foo";
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ERROR_SUCCESS, IsReparsePoint(new_file, &result));
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(result);
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Replace the directory with a reparse point to %temp%.
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HANDLE dir = ::CreateFile(my_folder, FILE_ALL_ACCESS,
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(INVALID_HANDLE_VALUE, dir);
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)  base::string16 temp_dir_nt = base::string16(L"\\??\\") + temp_directory;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(SetReparsePoint(dir, temp_dir_nt.c_str()));
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ERROR_SUCCESS, IsReparsePoint(new_file, &result));
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(result);
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(DeleteReparsePoint(dir));
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(::CloseHandle(dir));
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(::RemoveDirectory(my_folder));
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(WinUtils, SameObject) {
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  using sandbox::SameObject;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a temp file because we need write access to it.
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  wchar_t temp_directory[MAX_PATH];
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  wchar_t my_folder[MAX_PATH];
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(::GetTempPath(MAX_PATH, temp_directory), 0u);
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(::GetTempFileName(temp_directory, L"test", 0, my_folder), 0u);
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Delete the file and create a directory instead.
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(::DeleteFile(my_folder));
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(::CreateDirectory(my_folder, NULL));
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
67d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)  base::string16 folder(my_folder);
68d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)  base::string16 file_name = folder + L"\\foo.txt";
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const ULONG kSharing = FILE_SHARE_WRITE | FILE_SHARE_READ | FILE_SHARE_DELETE;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::win::ScopedHandle file(CreateFile(
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file_name.c_str(), GENERIC_WRITE, kSharing, NULL, CREATE_ALWAYS,
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FILE_FLAG_DELETE_ON_CLOSE, NULL));
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(file.IsValid());
75d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)  base::string16 file_name_nt1 = base::string16(L"\\??\\") + file_name;
76d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)  base::string16 file_name_nt2 =
77d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)      base::string16(L"\\??\\") + folder + L"\\FOO.txT";
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(SameObject(file.Get(), file_name_nt1.c_str()));
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(SameObject(file.Get(), file_name_nt2.c_str()));
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  file.Close();
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(::RemoveDirectory(my_folder));
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
84