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)#include "base/path_service.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h"
96e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "base/files/file_util.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/scoped_temp_dir.h"
11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "build/build_config.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest-spi.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/platform_test.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/windows_version.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns true if PathService::Get returns true and sets the path parameter
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to non-empty for the given PathService::DirType enumeration value.
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ReturnsValidPath(int dir_type) {
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath path;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool result = PathService::Get(dir_type, &path);
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Some paths might not exist on some platforms in which case confirming
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |result| is true and !path.empty() is the best we can do.
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool check_path_exists = true;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_POSIX)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If chromium has never been started on this account, the cache path may not
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // exist.
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (dir_type == base::DIR_CACHE)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    check_path_exists = false;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_LINUX)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // On the linux try-bots: a path is returned (e.g. /home/chrome-bot/Desktop),
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // but it doesn't exist.
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (dir_type == base::DIR_USER_DESKTOP)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    check_path_exists = false;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (dir_type == base::DIR_TASKBAR_PINS) {
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // There is no pinned-to-taskbar shortcuts prior to Win7.
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (base::win::GetVersion() < base::win::VERSION_WIN7)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      check_path_exists = false;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_MACOSX)
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (dir_type != base::DIR_EXE && dir_type != base::DIR_MODULE &&
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      dir_type != base::FILE_EXE && dir_type != base::FILE_MODULE) {
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (path.ReferencesParent())
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return false;
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (path.ReferencesParent())
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return result && !path.empty() && (!check_path_exists ||
627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                     base::PathExists(path));
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Function to test any directory keys that are not supported on some versions
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// of Windows. Checks that the function fails and that the returned path is
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// empty.
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ReturnsInvalidPath(int dir_type) {
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath path;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool result = PathService::Get(dir_type, &path);
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return !result && path.empty();
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// On the Mac this winds up using some autoreleased objects, so we need to
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// be a PlatformTest.
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef PlatformTest PathServiceTest;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that all PathService::Get calls return a value and a true result
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// in the development environment.  (This test was created because a few
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// later changes to Get broke the semantics of the function and yielded the
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// correct value while returning false.)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PathServiceTest, Get) {
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int key = base::PATH_START + 1; key < base::PATH_END; ++key) {
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID)
89a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    if (key == base::FILE_MODULE || key == base::DIR_USER_DESKTOP ||
90a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        key == base::DIR_HOME)
91a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      continue;  // Android doesn't implement these.
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_IOS)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (key == base::DIR_USER_DESKTOP)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      continue;  // iOS doesn't implement DIR_USER_DESKTOP;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_PRED1(ReturnsValidPath, key);
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int key = base::PATH_WIN_START + 1; key < base::PATH_WIN_END; ++key) {
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool valid = true;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch(key) {
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case base::DIR_LOCAL_APP_DATA_LOW:
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // DIR_LOCAL_APP_DATA_LOW is not supported prior Vista and is expected
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // to fail.
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        valid = base::win::GetVersion() >= base::win::VERSION_VISTA;
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case base::DIR_APP_SHORTCUTS:
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // DIR_APP_SHORTCUTS is not supported prior Windows 8 and is expected to
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // fail.
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        valid = base::win::GetVersion() >= base::win::VERSION_WIN8;
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (valid)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_TRUE(ReturnsValidPath(key)) << key;
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_TRUE(ReturnsInvalidPath(key)) << key;
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_MACOSX)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int key = base::PATH_MAC_START + 1; key < base::PATH_MAC_END; ++key) {
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_PRED1(ReturnsValidPath, key);
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_ANDROID)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int key = base::PATH_ANDROID_START + 1; key < base::PATH_ANDROID_END;
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       ++key) {
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_PRED1(ReturnsValidPath, key);
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_POSIX)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int key = base::PATH_POSIX_START + 1; key < base::PATH_POSIX_END;
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       ++key) {
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_PRED1(ReturnsValidPath, key);
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
136010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Test that all versions of the Override function of PathService do what they
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// are supposed to do.
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PathServiceTest, Override) {
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int my_special_key = 666;
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::ScopedTempDir temp_dir;
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath fake_cache_dir(temp_dir.path().AppendASCII("cache"));
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // PathService::Override should always create the path provided if it doesn't
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // exist.
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(PathService::Override(my_special_key, fake_cache_dir));
1467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(base::PathExists(fake_cache_dir));
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath fake_cache_dir2(temp_dir.path().AppendASCII("cache2"));
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // PathService::OverrideAndCreateIfNeeded should obey the |create| parameter.
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PathService::OverrideAndCreateIfNeeded(my_special_key,
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         fake_cache_dir2,
152010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                         false,
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         false);
1547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_FALSE(base::PathExists(fake_cache_dir2));
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(PathService::OverrideAndCreateIfNeeded(my_special_key,
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                     fake_cache_dir2,
157010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                                     false,
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                     true));
1597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(base::PathExists(fake_cache_dir2));
160010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
161010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#if defined(OS_POSIX)
162010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  base::FilePath non_existent(
163010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      base::MakeAbsoluteFilePath(temp_dir.path()).AppendASCII("non_existent"));
164010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(non_existent.IsAbsolute());
165010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_FALSE(base::PathExists(non_existent));
166010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#if !defined(OS_ANDROID)
167010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // This fails because MakeAbsoluteFilePath fails for non-existent files.
168010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Earlier versions of Bionic libc don't fail for non-existent files, so
169010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // skip this check on Android.
170010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_FALSE(PathService::OverrideAndCreateIfNeeded(my_special_key,
171010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                                      non_existent,
172010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                                      false,
173010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                                      false));
174010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif
175010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // This works because indicating that |non_existent| is absolute skips the
176010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // internal MakeAbsoluteFilePath call.
177010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(PathService::OverrideAndCreateIfNeeded(my_special_key,
178010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                                     non_existent,
179010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                                     true,
180010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                                     false));
181010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Check that the path has been overridden and no directory was created.
182010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_FALSE(base::PathExists(non_existent));
183010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  base::FilePath path;
184010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(PathService::Get(my_special_key, &path));
185010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(non_existent, path);
186010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check if multiple overrides can co-exist.
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PathServiceTest, OverrideMultiple) {
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int my_special_key = 666;
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::ScopedTempDir temp_dir;
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath fake_cache_dir1(temp_dir.path().AppendASCII("1"));
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(PathService::Override(my_special_key, fake_cache_dir1));
1967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(base::PathExists(fake_cache_dir1));
197a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ASSERT_EQ(1, base::WriteFile(fake_cache_dir1.AppendASCII("t1"), ".", 1));
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath fake_cache_dir2(temp_dir.path().AppendASCII("2"));
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(PathService::Override(my_special_key + 1, fake_cache_dir2));
2017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(base::PathExists(fake_cache_dir2));
202a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ASSERT_EQ(1, base::WriteFile(fake_cache_dir2.AppendASCII("t2"), ".", 1));
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath result;
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(PathService::Get(my_special_key, &result));
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Override might have changed the path representation but our test file
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // should be still there.
2087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(base::PathExists(result.AppendASCII("t1")));
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(PathService::Get(my_special_key + 1, &result));
2107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(base::PathExists(result.AppendASCII("t2")));
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PathServiceTest, RemoveOverride) {
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Before we start the test we have to call RemoveOverride at least once to
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // clear any overrides that might have been left from other tests.
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PathService::RemoveOverride(base::DIR_TEMP);
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath original_user_data_dir;
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(PathService::Get(base::DIR_TEMP, &original_user_data_dir));
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(PathService::RemoveOverride(base::DIR_TEMP));
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::ScopedTempDir temp_dir;
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(PathService::Override(base::DIR_TEMP, temp_dir.path()));
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath new_user_data_dir;
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(PathService::Get(base::DIR_TEMP, &new_user_data_dir));
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(original_user_data_dir, new_user_data_dir);
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(PathService::RemoveOverride(base::DIR_TEMP));
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(PathService::Get(base::DIR_TEMP, &new_user_data_dir));
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(original_user_data_dir, new_user_data_dir);
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
233