15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 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)#ifndef BASE_TEST_TEST_FILE_UTIL_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define BASE_TEST_TEST_FILE_UTIL_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// File utility functions used only by tests. 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(OS_ANDROID) 16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include <jni.h> 17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/basictypes.h" 18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif 19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace base { 21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FilePath; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Clear a specific file from the system cache like EvictFileFromSystemCache, 25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// but on failure it will sleep and retry. On the Windows buildbots, eviction 26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// can fail if the file is marked in use, and this will throw off timings that 27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// rely on uncached files. 28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool EvictFileFromSystemCacheWithRetry(const FilePath& file); 29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace base 31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// TODO(brettw) move all of this to the base namespace. 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace file_util { 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Wrapper over base::Delete. On Windows repeatedly invokes Delete in case 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// of failure to workaround Windows file locking semantics. Returns true on 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// success. 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool DieFileDie(const base::FilePath& file, bool recurse); 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Clear a specific file from the system cache. After this call, trying 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to access this file will result in a cold load from the hard drive. 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool EvictFileFromSystemCache(const base::FilePath& file); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns true if the volume supports Alternate Data Streams. 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool VolumeSupportsADS(const base::FilePath& path); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns true if the ZoneIdentifier is correctly set to "Internet" (3). 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Note that this function must be called from the same process as 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the one that set the zone identifier. I.e. don't use it in UI/automation 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// based tests. 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool HasInternetZoneIdentifier(const base::FilePath& full_path); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(OS_WIN) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// In general it's not reliable to convert a FilePath to a wstring and we use 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// string16 elsewhere for Unicode strings, but in tests it is frequently 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// convenient to be able to compare paths to literals like L"foobar". 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)std::wstring FilePathAsWString(const base::FilePath& path); 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::FilePath WStringAsFilePath(const std::wstring& path); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// For testing, make the file unreadable or unwritable. 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// In POSIX, this does not apply to the root user. 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool MakeFileUnreadable(const base::FilePath& path) WARN_UNUSED_RESULT; 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool MakeFileUnwritable(const base::FilePath& path) WARN_UNUSED_RESULT; 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 66f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(OS_ANDROID) 67f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Register the ContentUriTestUrils JNI bindings. 68f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool RegisterContentUriTestUtils(JNIEnv* env); 69f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 70f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Insert an image file into the MediaStore, and retrieve the content URI for 71f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// testing purpose. 72f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)base::FilePath InsertImageIntoMediaStore(const base::FilePath& path); 73f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif // defined(OS_ANDROID) 74f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Saves the current permissions for a path, and restores it on destruction. 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PermissionRestorer { 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) explicit PermissionRestorer(const base::FilePath& path); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~PermissionRestorer(); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath path_; 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* info_; // The opaque stored permission information. 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t length_; // The length of the stored permission information. 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(PermissionRestorer); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace file_util 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // BASE_TEST_TEST_FILE_UTIL_H_ 92