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