| OLD | NEW |
| 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/sync/syncable/syncable.h" | 5 #include "chrome/browser/sync/syncable/syncable.h" |
| 6 | 6 |
| 7 #include "build/build_config.h" |
| 8 |
| 7 #include <sys/types.h> | 9 #include <sys/types.h> |
| 8 | 10 |
| 9 #include <iostream> | 11 #include <iostream> |
| 10 #include <limits> | 12 #include <limits> |
| 11 #include <string> | 13 #include <string> |
| 12 | 14 |
| 13 // TODO(ncarter): Winnow down the OS-specific includes from the test | 15 // TODO(ncarter): Winnow down the OS-specific includes from the test |
| 14 // file. | 16 // file. |
| 15 #if defined(OS_WINDOWS) | 17 #if defined(OS_WIN) |
| 16 #include <tchar.h> | 18 #include <tchar.h> |
| 17 #include <atlbase.h> | 19 #include <atlbase.h> |
| 18 #include <process.h> | 20 #include <process.h> |
| 19 #endif // defined(OS_WINDOWS) | 21 #endif // defined(OS_WIN) |
| 20 | 22 |
| 21 #if !defined(OS_WINDOWS) | 23 #if !defined(OS_WIN) |
| 22 #define MAX_PATH PATH_MAX | 24 #define MAX_PATH PATH_MAX |
| 23 #include <strstream> | 25 #include <strstream> |
| 24 #include <ostream> | 26 #include <ostream> |
| 25 #include <stdio.h> | 27 #include <stdio.h> |
| 26 #include <sys/ipc.h> | 28 #include <sys/ipc.h> |
| 27 #include <sys/sem.h> | 29 #include <sys/sem.h> |
| 28 #include <sys/times.h> | 30 #include <sys/times.h> |
| 29 #endif // !defined(OS_WINDOWS) | 31 #endif // !defined(OS_WIN) |
| 30 | 32 |
| 31 #include "base/at_exit.h" | 33 #include "base/at_exit.h" |
| 32 #include "base/logging.h" | 34 #include "base/logging.h" |
| 33 #include "base/scoped_ptr.h" | 35 #include "base/scoped_ptr.h" |
| 34 #include "chrome/browser/sync/syncable/directory_backing_store.h" | 36 #include "chrome/browser/sync/syncable/directory_backing_store.h" |
| 35 #include "chrome/browser/sync/syncable/directory_manager.h" | 37 #include "chrome/browser/sync/syncable/directory_manager.h" |
| 36 #include "chrome/browser/sync/util/character_set_converters.h" | 38 #include "chrome/browser/sync/util/character_set_converters.h" |
| 37 #include "chrome/browser/sync/util/closure.h" | 39 #include "chrome/browser/sync/util/closure.h" |
| 38 #include "chrome/browser/sync/util/compat-file.h" | 40 #include "chrome/browser/sync/util/compat_file.h" |
| 39 #include "chrome/browser/sync/util/event_sys-inl.h" | 41 #include "chrome/browser/sync/util/event_sys-inl.h" |
| 40 #include "chrome/browser/sync/util/path_helpers.h" | 42 #include "chrome/browser/sync/util/path_helpers.h" |
| 41 #include "chrome/browser/sync/util/pthread_helpers.h" | 43 #include "chrome/browser/sync/util/pthread_helpers.h" |
| 42 #include "chrome/browser/sync/util/query_helpers.h" | 44 #include "chrome/browser/sync/util/query_helpers.h" |
| 43 #include "chrome/test/sync/engine/test_id_factory.h" | 45 #include "chrome/test/sync/engine/test_id_factory.h" |
| 44 #include "testing/gtest/include/gtest/gtest.h" | 46 #include "testing/gtest/include/gtest/gtest.h" |
| 45 #include "third_party/sqlite/preprocessed/sqlite3.h" | 47 #include "third_party/sqlite/preprocessed/sqlite3.h" |
| 46 | 48 |
| 47 using browser_sync::TestIdFactory; | 49 using browser_sync::TestIdFactory; |
| 48 using std::cout; | 50 using std::cout; |
| (...skipping 925 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 974 | 976 |
| 975 timespec operator + (const timespec& a, const timespec& b) { | 977 timespec operator + (const timespec& a, const timespec& b) { |
| 976 const long nanos = a.tv_nsec + b.tv_nsec; | 978 const long nanos = a.tv_nsec + b.tv_nsec; |
| 977 static const long nanos_per_second = 1000000000; | 979 static const long nanos_per_second = 1000000000; |
| 978 timespec r = { a.tv_sec + b.tv_sec + (nanos / nanos_per_second), | 980 timespec r = { a.tv_sec + b.tv_sec + (nanos / nanos_per_second), |
| 979 nanos % nanos_per_second }; | 981 nanos % nanos_per_second }; |
| 980 return r; | 982 return r; |
| 981 } | 983 } |
| 982 | 984 |
| 983 void SleepMs(int milliseconds) { | 985 void SleepMs(int milliseconds) { |
| 984 #ifdef OS_WINDOWS | 986 #ifdef OS_WIN |
| 985 Sleep(milliseconds); | 987 Sleep(milliseconds); |
| 986 #else | 988 #else |
| 987 usleep(milliseconds * 1000); | 989 usleep(milliseconds * 1000); |
| 988 #endif | 990 #endif |
| 989 } | 991 } |
| 990 | 992 |
| 991 namespace StressTransaction { | 993 namespace StressTransaction { |
| 992 struct Globals { | 994 struct Globals { |
| 993 DirectoryManager* dirman; | 995 DirectoryManager* dirman; |
| 994 PathString dirname; | 996 PathString dirname; |
| (...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1127 PathString a(1, tests[i].a); | 1129 PathString a(1, tests[i].a); |
| 1128 PathString b(1, tests[i].b); | 1130 PathString b(1, tests[i].b); |
| 1129 const int result = ComparePathNames(a, b); | 1131 const int result = ComparePathNames(a, b); |
| 1130 if (result != tests[i].expected_result) { | 1132 if (result != tests[i].expected_result) { |
| 1131 ADD_FAILURE() << "ComparePathNames(" << tests[i].a << ", " << tests[i].b | 1133 ADD_FAILURE() << "ComparePathNames(" << tests[i].a << ", " << tests[i].b |
| 1132 << ") returned " << result << "; expected " | 1134 << ") returned " << result << "; expected " |
| 1133 << tests[i].expected_result; | 1135 << tests[i].expected_result; |
| 1134 } | 1136 } |
| 1135 } | 1137 } |
| 1136 | 1138 |
| 1137 #ifndef OS_WINDOWS | 1139 #ifndef OS_WIN |
| 1138 // This table lists (to the best of my knowledge) every pair of characters | 1140 // This table lists (to the best of my knowledge) every pair of characters |
| 1139 // in unicode such that: | 1141 // in unicode such that: |
| 1140 // for all i: tolower(kUpperToLowerMap[i].upper) = kUpperToLowerMap[i].lower | 1142 // for all i: tolower(kUpperToLowerMap[i].upper) = kUpperToLowerMap[i].lower |
| 1141 // This is then used to test that case-insensitive comparison of each pair | 1143 // This is then used to test that case-insensitive comparison of each pair |
| 1142 // returns 0 (that, that they are equal). After running the test on Mac OS X | 1144 // returns 0 (that, that they are equal). After running the test on Mac OS X |
| 1143 // with the CFString API for comparision, the failing cases were commented | 1145 // with the CFString API for comparision, the failing cases were commented |
| 1144 // out. | 1146 // out. |
| 1145 // | 1147 // |
| 1146 // Map of upper to lower case characters taken from | 1148 // Map of upper to lower case characters taken from |
| 1147 // ftp://ftp.unicode.org/Public/UNIDATA/UnicodeData.txt | 1149 // ftp://ftp.unicode.org/Public/UNIDATA/UnicodeData.txt |
| (...skipping 319 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1467 if (0 != result) { | 1469 if (0 != result) { |
| 1468 // This ugly strstream works around an issue where using << hex on the | 1470 // This ugly strstream works around an issue where using << hex on the |
| 1469 // stream for ADD_FAILURE produces "true" and "false" in the output. | 1471 // stream for ADD_FAILURE produces "true" and "false" in the output. |
| 1470 strstream msg; | 1472 strstream msg; |
| 1471 msg << "ComparePathNames(0x" << hex << kUpperToLowerMap[i].upper | 1473 msg << "ComparePathNames(0x" << hex << kUpperToLowerMap[i].upper |
| 1472 << ", 0x" << hex << kUpperToLowerMap[i].lower | 1474 << ", 0x" << hex << kUpperToLowerMap[i].lower |
| 1473 << ") returned " << dec << result << "; expected 0" << '\0'; | 1475 << ") returned " << dec << result << "; expected 0" << '\0'; |
| 1474 ADD_FAILURE() << msg.str(); | 1476 ADD_FAILURE() << msg.str(); |
| 1475 } | 1477 } |
| 1476 } | 1478 } |
| 1477 #endif // not defined OS_WINDOWS | 1479 #endif // not defined OS_WIN |
| 1478 } | 1480 } |
| 1479 | 1481 |
| 1480 #ifdef OS_WINDOWS | 1482 #ifdef OS_WIN |
| 1481 TEST(Syncable, PathNameMatch) { | 1483 TEST(Syncable, PathNameMatch) { |
| 1482 // basic stuff, not too many otherwise we're testing the os. | 1484 // basic stuff, not too many otherwise we're testing the os. |
| 1483 EXPECT_TRUE(PathNameMatch(PSTR("bob"), PSTR("bob"))); | 1485 EXPECT_TRUE(PathNameMatch(PSTR("bob"), PSTR("bob"))); |
| 1484 EXPECT_FALSE(PathNameMatch(PSTR("bob"), PSTR("fred"))); | 1486 EXPECT_FALSE(PathNameMatch(PSTR("bob"), PSTR("fred"))); |
| 1485 // Test our ; extension. | 1487 // Test our ; extension. |
| 1486 EXPECT_TRUE(PathNameMatch(PSTR("bo;b"), PSTR("bo;b"))); | 1488 EXPECT_TRUE(PathNameMatch(PSTR("bo;b"), PSTR("bo;b"))); |
| 1487 EXPECT_TRUE(PathNameMatch(PSTR("bo;b"), PSTR("bo*"))); | 1489 EXPECT_TRUE(PathNameMatch(PSTR("bo;b"), PSTR("bo*"))); |
| 1488 EXPECT_FALSE(PathNameMatch(PSTR("bo;b"), PSTR("co;b"))); | 1490 EXPECT_FALSE(PathNameMatch(PSTR("bo;b"), PSTR("co;b"))); |
| 1489 EXPECT_FALSE(PathNameMatch(PSTR("bo;b"), PSTR("co*"))); | 1491 EXPECT_FALSE(PathNameMatch(PSTR("bo;b"), PSTR("co*"))); |
| 1490 // Test our fixes for prepended spaces. | 1492 // Test our fixes for prepended spaces. |
| 1491 EXPECT_TRUE(PathNameMatch(PSTR(" bob"), PSTR(" bo*"))); | 1493 EXPECT_TRUE(PathNameMatch(PSTR(" bob"), PSTR(" bo*"))); |
| 1492 EXPECT_TRUE(PathNameMatch(PSTR(" bob"), PSTR(" bob"))); | 1494 EXPECT_TRUE(PathNameMatch(PSTR(" bob"), PSTR(" bob"))); |
| 1493 EXPECT_FALSE(PathNameMatch(PSTR("bob"), PSTR(" bob"))); | 1495 EXPECT_FALSE(PathNameMatch(PSTR("bob"), PSTR(" bob"))); |
| 1494 EXPECT_FALSE(PathNameMatch(PSTR(" bob"), PSTR("bob"))); | 1496 EXPECT_FALSE(PathNameMatch(PSTR(" bob"), PSTR("bob"))); |
| 1495 // Combo test. | 1497 // Combo test. |
| 1496 EXPECT_TRUE(PathNameMatch(PSTR(" b;ob"), PSTR(" b;o*"))); | 1498 EXPECT_TRUE(PathNameMatch(PSTR(" b;ob"), PSTR(" b;o*"))); |
| 1497 EXPECT_TRUE(PathNameMatch(PSTR(" b;ob"), PSTR(" b;ob"))); | 1499 EXPECT_TRUE(PathNameMatch(PSTR(" b;ob"), PSTR(" b;ob"))); |
| 1498 EXPECT_FALSE(PathNameMatch(PSTR("b;ob"), PSTR(" b;ob"))); | 1500 EXPECT_FALSE(PathNameMatch(PSTR("b;ob"), PSTR(" b;ob"))); |
| 1499 EXPECT_FALSE(PathNameMatch(PSTR(" b;ob"), PSTR("b;ob"))); | 1501 EXPECT_FALSE(PathNameMatch(PSTR(" b;ob"), PSTR("b;ob"))); |
| 1500 // other whitespace should give no matches. | 1502 // other whitespace should give no matches. |
| 1501 EXPECT_FALSE(PathNameMatch(PSTR("bob"), PSTR("\tbob"))); | 1503 EXPECT_FALSE(PathNameMatch(PSTR("bob"), PSTR("\tbob"))); |
| 1502 } | 1504 } |
| 1503 #endif // OS_WINDOWS | 1505 #endif // OS_WIN |
| 1504 | 1506 |
| 1505 } // namespace | 1507 } // namespace |
| 1506 | 1508 |
| 1507 void FakeSync(MutableEntry* e, const char* fake_id) { | 1509 void FakeSync(MutableEntry* e, const char* fake_id) { |
| 1508 e->Put(IS_UNSYNCED, false); | 1510 e->Put(IS_UNSYNCED, false); |
| 1509 e->Put(BASE_VERSION, 2); | 1511 e->Put(BASE_VERSION, 2); |
| 1510 e->Put(ID, Id::CreateFromServerId(fake_id)); | 1512 e->Put(ID, Id::CreateFromServerId(fake_id)); |
| 1511 } | 1513 } |
| 1512 | 1514 |
| 1513 TEST_F(SyncableDirectoryTest, Bug1509232) { | 1515 TEST_F(SyncableDirectoryTest, Bug1509232) { |
| (...skipping 11 matching lines...) Expand all Loading... |
| 1525 Blob value_blob(value, value + ARRAYSIZE(value)); | 1527 Blob value_blob(value, value + ARRAYSIZE(value)); |
| 1526 ext.mutable_value()->swap(value_blob); | 1528 ext.mutable_value()->swap(value_blob); |
| 1527 ext.delete_attribute(); | 1529 ext.delete_attribute(); |
| 1528 } | 1530 } |
| 1529 // This call to SaveChanges used to CHECK fail. | 1531 // This call to SaveChanges used to CHECK fail. |
| 1530 dir_.get()->SaveChanges(); | 1532 dir_.get()->SaveChanges(); |
| 1531 } | 1533 } |
| 1532 | 1534 |
| 1533 } // namespace syncable | 1535 } // namespace syncable |
| 1534 | 1536 |
| 1535 #ifdef OS_WINDOWS | 1537 #ifdef OS_WIN |
| 1536 class LocalModule : public CAtlExeModuleT<LocalModule> { }; | 1538 class LocalModule : public CAtlExeModuleT<LocalModule> { }; |
| 1537 LocalModule module_; | 1539 LocalModule module_; |
| 1538 | 1540 |
| 1539 int main(int argc, char* argv[]) { | 1541 int main(int argc, char* argv[]) { |
| 1540 testing::InitGoogleTest(&argc, argv); | 1542 testing::InitGoogleTest(&argc, argv); |
| 1541 | 1543 |
| 1542 // TODO(chron) Add method to change random seed. | 1544 // TODO(chron) Add method to change random seed. |
| 1543 const int32 test_random_seed = time(NULL); | 1545 const int32 test_random_seed = time(NULL); |
| 1544 cout << "Random seed: " << test_random_seed << endl; | 1546 cout << "Random seed: " << test_random_seed << endl; |
| 1545 LOG(INFO) << "Random seed: " << test_random_seed << endl; | 1547 LOG(INFO) << "Random seed: " << test_random_seed << endl; |
| 1546 srand(test_random_seed); | 1548 srand(test_random_seed); |
| 1547 | 1549 |
| 1548 // Necessary for NewCallback, scoped to main | 1550 // Necessary for NewCallback, scoped to main |
| 1549 base::AtExitManager at_exit_manager; | 1551 base::AtExitManager at_exit_manager; |
| 1550 | 1552 |
| 1551 int result = RUN_ALL_TESTS(); | 1553 int result = RUN_ALL_TESTS(); |
| 1552 return result; | 1554 return result; |
| 1553 } | 1555 } |
| 1554 #endif | 1556 #endif |
| OLD | NEW |