| Index: sql/sqlite_features_unittest.cc
|
| diff --git a/sql/sqlite_features_unittest.cc b/sql/sqlite_features_unittest.cc
|
| index 199d9446c73b14ba452297f1c9b317ddcd1565c1..2e1ea33bf9a5fec49df198b7a69618eba985253d 100644
|
| --- a/sql/sqlite_features_unittest.cc
|
| +++ b/sql/sqlite_features_unittest.cc
|
| @@ -22,6 +22,14 @@
|
| #include "base/ios/ios_util.h"
|
| #endif
|
|
|
| +#if defined(OS_MACOSX) && !defined(OS_IOS)
|
| +#include <CoreFoundation/CoreFoundation.h>
|
| +#include <CoreServices/CoreServices.h>
|
| +
|
| +#include "base/mac/mac_util.h"
|
| +#include "base/mac/scoped_cftyperef.h"
|
| +#endif
|
| +
|
| // Test that certain features are/are-not enabled in our SQLite.
|
|
|
| namespace {
|
| @@ -303,4 +311,90 @@ TEST_F(SQLiteFeaturesTest, CachedRegexp) {
|
| EXPECT_EQ(7, s.ColumnInt(0));
|
| }
|
|
|
| +#if defined(OS_MACOSX) && !defined(OS_IOS)
|
| +CFURLRef CFURLRefForPath(const base::FilePath& path){
|
| + base::ScopedCFTypeRef<CFStringRef> urlString(
|
| + CFStringCreateWithFileSystemRepresentation(
|
| + kCFAllocatorDefault, path.value().c_str()));
|
| + return CFURLCreateWithFileSystemPath(kCFAllocatorDefault, urlString,
|
| + kCFURLPOSIXPathStyle, FALSE);
|
| +}
|
| +
|
| +void gross() {
|
| + CFPreferencesSetAppValue(CFSTR("CSBackupDebugLogging"),
|
| + kCFBooleanTrue,
|
| + kCFPreferencesCurrentApplication);
|
| +}
|
| +
|
| +// If a database file is marked to be excluded from Time Machine, verify that
|
| +// journal files are also excluded.
|
| +TEST_F(SQLiteFeaturesTest, TimeMachine) {
|
| + gross();
|
| + LOG(ERROR) << __FUNCTION__ << " geteuid() " << geteuid();
|
| + ASSERT_TRUE(db().Execute("CREATE TABLE t (id INTEGER PRIMARY KEY)"));
|
| + db().Close();
|
| +
|
| + {
|
| + LOG(ERROR) << "Mount output:";
|
| + FILE* m = popen("mount", "r");
|
| + if (!m) {
|
| + PLOG(ERROR) << "Failed to open mount";
|
| + } else {
|
| + char buf[1024];
|
| + while (fgets(buf, sizeof(buf), m)) {
|
| + size_t l = strlen(buf);
|
| + if (buf[l - 1] == '\n')
|
| + buf[l - 1] = '\0';
|
| + LOG(ERROR) << buf;
|
| + }
|
| + pclose(m);
|
| + }
|
| + }
|
| + {
|
| + LOG(ERROR) << "Ps output:";
|
| + FILE* m = popen("ps ax", "r");
|
| + if (!m) {
|
| + PLOG(ERROR) << "Failed to open ps";
|
| + } else {
|
| + char buf[1024];
|
| + while (fgets(buf, sizeof(buf), m)) {
|
| + size_t l = strlen(buf);
|
| + if (buf[l - 1] == '\n')
|
| + buf[l - 1] = '\0';
|
| + LOG(ERROR) << buf;
|
| + }
|
| + pclose(m);
|
| + }
|
| + }
|
| + base::FilePath journal(db_path().value() + FILE_PATH_LITERAL("-journal"));
|
| + ASSERT_TRUE(GetPathExists(db_path()));
|
| + ASSERT_TRUE(GetPathExists(journal));
|
| +
|
| + base::ScopedCFTypeRef<CFURLRef> dbURL(CFURLRefForPath(db_path()));
|
| + base::ScopedCFTypeRef<CFURLRef> journalURL(CFURLRefForPath(journal));
|
| +
|
| + // Not excluded to start.
|
| + EXPECT_FALSE(CSBackupIsItemExcluded(dbURL, NULL));
|
| + EXPECT_FALSE(CSBackupIsItemExcluded(journalURL, NULL));
|
| +
|
| + // Exclude the main database file.
|
| + EXPECT_TRUE(base::mac::SetFileBackupExclusion(db_path()));
|
| +
|
| + Boolean excluded_by_path = FALSE;
|
| + EXPECT_TRUE(CSBackupIsItemExcluded(dbURL, &excluded_by_path));
|
| + EXPECT_FALSE(excluded_by_path);
|
| + EXPECT_FALSE(CSBackupIsItemExcluded(journalURL, NULL));
|
| +
|
| + EXPECT_TRUE(db().Open(db_path()));
|
| + ASSERT_TRUE(db().Execute("INSERT INTO t VALUES (1)"));
|
| + EXPECT_TRUE(CSBackupIsItemExcluded(dbURL, &excluded_by_path));
|
| + EXPECT_FALSE(excluded_by_path);
|
| + EXPECT_TRUE(CSBackupIsItemExcluded(journalURL, &excluded_by_path));
|
| + EXPECT_FALSE(excluded_by_path);
|
| +
|
| + // TODO(shess): In WAL mode this will touch -wal and -shm files. -shm files
|
| + // could be always excluded.
|
| +}
|
| +#endif
|
| +
|
| } // namespace
|
|
|