Non-path Time Machine Exclusions

Enable setting of file exclusion for non-admin/non-root users. We no longer support setting exclusion-by-path.
Enhanced error reporting in SetFileBackupExclusion.
Change exclusion calls for History and Thumbnail databases.
Made MacUtilTest.TestExcludeFileFromBackups more robust.

BUG=74053
TEST=Updated base_unittests's MacUtilTest.TestExcludeFileFromBackups.
Review URL: http://codereview.chromium.org/7069021

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@86778 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/base/mac/mac_util_unittest.mm b/base/mac/mac_util_unittest.mm
index b4f9268e..92a6001 100644
--- a/base/mac/mac_util_unittest.mm
+++ b/base/mac/mac_util_unittest.mm
@@ -8,8 +8,10 @@
 
 #include "base/file_path.h"
 #include "base/file_util.h"
+#include "base/mac/foundation_util.h"
 #include "base/mac/scoped_cftyperef.h"
 #include "base/memory/scoped_nsobject.h"
+#include "base/scoped_temp_dir.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "testing/platform_test.h"
 
@@ -95,26 +97,27 @@
 }
 
 TEST_F(MacUtilTest, TestExcludeFileFromBackups) {
-  NSString* homeDirectory = NSHomeDirectory();
-  NSString* dummyFilePath =
-      [homeDirectory stringByAppendingPathComponent:@"DummyFile"];
-  const char* dummy_file_path = [dummyFilePath fileSystemRepresentation];
-  ASSERT_TRUE(dummy_file_path);
-  FilePath file_path(dummy_file_path);
-  // It is not actually necessary to have a physical file in order to
-  // set its exclusion property.
-  NSURL* fileURL = [NSURL URLWithString:dummyFilePath];
-  // Reset the exclusion in case it was set previously.
-  SetFileBackupExclusion(file_path, false);
-  Boolean excludeByPath;
+  // The file must already exist in order to set its exclusion property.
+  ScopedTempDir temp_dir_;
+  ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
+  FilePath dummy_file_path = temp_dir_.path().Append("DummyFile");
+  const char dummy_data[] = "All your base are belong to us!";
+  // Dump something real into the file.
+  ASSERT_EQ(static_cast<int>(arraysize(dummy_data)),
+      file_util::WriteFile(dummy_file_path, dummy_data, arraysize(dummy_data)));
+  NSString* fileURLString =
+      [NSString stringWithUTF8String:dummy_file_path.value().c_str()];
+  NSURL* fileURL = [NSURL URLWithString:fileURLString];
   // Initial state should be non-excluded.
-  EXPECT_FALSE(CSBackupIsItemExcluded((CFURLRef)fileURL, &excludeByPath));
+  EXPECT_FALSE(CSBackupIsItemExcluded(base::mac::NSToCFCast(fileURL), NULL));
   // Exclude the file.
-  EXPECT_TRUE(SetFileBackupExclusion(file_path, true));
-  EXPECT_TRUE(CSBackupIsItemExcluded((CFURLRef)fileURL, &excludeByPath));
-  // Un-exclude the file.
-  EXPECT_TRUE(SetFileBackupExclusion(file_path, false));
-  EXPECT_FALSE(CSBackupIsItemExcluded((CFURLRef)fileURL, &excludeByPath));
+  EXPECT_TRUE(SetFileBackupExclusion(dummy_file_path));
+  // SetFileBackupExclusion never excludes by path.
+  Boolean excluded_by_path = FALSE;
+  Boolean excluded =
+      CSBackupIsItemExcluded(base::mac::NSToCFCast(fileURL), &excluded_by_path);
+  EXPECT_TRUE(excluded);
+  EXPECT_FALSE(excluded_by_path);
 }
 
 TEST_F(MacUtilTest, TestGetValueFromDictionary) {