| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "base/bind.h" | 5 #include "base/bind.h" |
| 6 #include "base/files/file_util.h" | 6 #include "base/files/file_util.h" |
| 7 #include "base/files/memory_mapped_file.h" | 7 #include "base/files/memory_mapped_file.h" |
| 8 #include "base/files/scoped_file.h" | 8 #include "base/files/scoped_file.h" |
| 9 #include "base/files/scoped_temp_dir.h" | 9 #include "base/files/scoped_temp_dir.h" |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| (...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 129 return t->cb_.Run(); | 129 return t->cb_.Run(); |
| 130 } | 130 } |
| 131 | 131 |
| 132 sqlite3* db_; | 132 sqlite3* db_; |
| 133 base::Callback<int(void)> cb_; | 133 base::Callback<int(void)> cb_; |
| 134 | 134 |
| 135 DISALLOW_COPY_AND_ASSIGN(ScopedCommitHook); | 135 DISALLOW_COPY_AND_ASSIGN(ScopedCommitHook); |
| 136 }; | 136 }; |
| 137 | 137 |
| 138 } // namespace test | 138 } // namespace test |
| 139 } // namespace sql | |
| 140 | 139 |
| 141 namespace { | 140 namespace { |
| 142 | 141 |
| 143 // Helper to return the count of items in sqlite_master. Return -1 in | 142 // Helper to return the count of items in sqlite_master. Return -1 in |
| 144 // case of error. | 143 // case of error. |
| 145 int SqliteMasterCount(sql::Connection* db) { | 144 int SqliteMasterCount(sql::Connection* db) { |
| 146 const char* kMasterCount = "SELECT COUNT(*) FROM sqlite_master"; | 145 const char* kMasterCount = "SELECT COUNT(*) FROM sqlite_master"; |
| 147 sql::Statement s(db->GetUniqueStatement(kMasterCount)); | 146 sql::Statement s(db->GetUniqueStatement(kMasterCount)); |
| 148 return s.Step() ? s.ColumnInt(0) : -1; | 147 return s.Step() ? s.ColumnInt(0) : -1; |
| 149 } | 148 } |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 203 explicit ScopedUmaskSetter(mode_t target_mask) { | 202 explicit ScopedUmaskSetter(mode_t target_mask) { |
| 204 old_umask_ = umask(target_mask); | 203 old_umask_ = umask(target_mask); |
| 205 } | 204 } |
| 206 ~ScopedUmaskSetter() { umask(old_umask_); } | 205 ~ScopedUmaskSetter() { umask(old_umask_); } |
| 207 private: | 206 private: |
| 208 mode_t old_umask_; | 207 mode_t old_umask_; |
| 209 DISALLOW_IMPLICIT_CONSTRUCTORS(ScopedUmaskSetter); | 208 DISALLOW_IMPLICIT_CONSTRUCTORS(ScopedUmaskSetter); |
| 210 }; | 209 }; |
| 211 #endif | 210 #endif |
| 212 | 211 |
| 212 // SQLite function to adjust mock time by |argv[0]| milliseconds. |
| 213 void sqlite_adjust_millis(sql::test::ScopedMockTimeSource* time_mock, |
| 214 sqlite3_context* context, |
| 215 int argc, sqlite3_value** argv) { |
| 216 int64 milliseconds = argc > 0 ? sqlite3_value_int64(argv[0]) : 1000; |
| 217 time_mock->adjust(base::TimeDelta::FromMilliseconds(milliseconds)); |
| 218 sqlite3_result_int64(context, milliseconds); |
| 219 } |
| 220 |
| 221 // Adjust mock time by |milliseconds| on commit. |
| 222 int adjust_commit_hook(sql::test::ScopedMockTimeSource* time_mock, |
| 223 int64 milliseconds) { |
| 224 time_mock->adjust(base::TimeDelta::FromMilliseconds(milliseconds)); |
| 225 return SQLITE_OK; |
| 226 } |
| 227 |
| 228 const char kCommitTime[] = "Sqlite.CommitTime.Test"; |
| 229 const char kAutoCommitTime[] = "Sqlite.AutoCommitTime.Test"; |
| 230 const char kUpdateTime[] = "Sqlite.UpdateTime.Test"; |
| 231 const char kQueryTime[] = "Sqlite.QueryTime.Test"; |
| 232 |
| 233 } // namespace |
| 234 |
| 213 class SQLConnectionTest : public sql::SQLTestBase { | 235 class SQLConnectionTest : public sql::SQLTestBase { |
| 214 public: | 236 public: |
| 215 void SetUp() override { | 237 void SetUp() override { |
| 216 // Any macro histograms which fire before the recorder is initialized cannot | 238 // Any macro histograms which fire before the recorder is initialized cannot |
| 217 // be tested. So this needs to be ahead of Open(). | 239 // be tested. So this needs to be ahead of Open(). |
| 218 base::StatisticsRecorder::Initialize(); | 240 base::StatisticsRecorder::Initialize(); |
| 219 | 241 |
| 220 SQLTestBase::SetUp(); | 242 SQLTestBase::SetUp(); |
| 221 } | 243 } |
| 222 | 244 |
| (...skipping 917 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1140 sql::Connection::EVENT_STATEMENT_ROWS, 2); | 1162 sql::Connection::EVENT_STATEMENT_ROWS, 2); |
| 1141 tester.ExpectBucketCount(kGlobalHistogramName, | 1163 tester.ExpectBucketCount(kGlobalHistogramName, |
| 1142 sql::Connection::EVENT_STATEMENT_ROWS, 2); | 1164 sql::Connection::EVENT_STATEMENT_ROWS, 2); |
| 1143 tester.ExpectBucketCount(kHistogramName, | 1165 tester.ExpectBucketCount(kHistogramName, |
| 1144 sql::Connection::EVENT_STATEMENT_SUCCESS, 1); | 1166 sql::Connection::EVENT_STATEMENT_SUCCESS, 1); |
| 1145 tester.ExpectBucketCount(kGlobalHistogramName, | 1167 tester.ExpectBucketCount(kGlobalHistogramName, |
| 1146 sql::Connection::EVENT_STATEMENT_SUCCESS, 1); | 1168 sql::Connection::EVENT_STATEMENT_SUCCESS, 1); |
| 1147 } | 1169 } |
| 1148 } | 1170 } |
| 1149 | 1171 |
| 1150 // SQLite function to adjust mock time by |argv[0]| milliseconds. | |
| 1151 void sqlite_adjust_millis(sql::test::ScopedMockTimeSource* time_mock, | |
| 1152 sqlite3_context* context, | |
| 1153 int argc, sqlite3_value** argv) { | |
| 1154 int64 milliseconds = argc > 0 ? sqlite3_value_int64(argv[0]) : 1000; | |
| 1155 time_mock->adjust(base::TimeDelta::FromMilliseconds(milliseconds)); | |
| 1156 sqlite3_result_int64(context, milliseconds); | |
| 1157 } | |
| 1158 | |
| 1159 // Adjust mock time by |milliseconds| on commit. | |
| 1160 int adjust_commit_hook(sql::test::ScopedMockTimeSource* time_mock, | |
| 1161 int64 milliseconds) { | |
| 1162 time_mock->adjust(base::TimeDelta::FromMilliseconds(milliseconds)); | |
| 1163 return SQLITE_OK; | |
| 1164 } | |
| 1165 | |
| 1166 const char kCommitTime[] = "Sqlite.CommitTime.Test"; | |
| 1167 const char kAutoCommitTime[] = "Sqlite.AutoCommitTime.Test"; | |
| 1168 const char kUpdateTime[] = "Sqlite.UpdateTime.Test"; | |
| 1169 const char kQueryTime[] = "Sqlite.QueryTime.Test"; | |
| 1170 | |
| 1171 // Read-only query allocates time to QueryTime, but not others. | 1172 // Read-only query allocates time to QueryTime, but not others. |
| 1172 TEST_F(SQLConnectionTest, TimeQuery) { | 1173 TEST_F(SQLConnectionTest, TimeQuery) { |
| 1173 // Re-open with histogram tag. Use an in-memory database to minimize variance | 1174 // Re-open with histogram tag. Use an in-memory database to minimize variance |
| 1174 // due to filesystem. | 1175 // due to filesystem. |
| 1175 db().Close(); | 1176 db().Close(); |
| 1176 db().set_histogram_tag("Test"); | 1177 db().set_histogram_tag("Test"); |
| 1177 ASSERT_TRUE(db().OpenInMemory()); | 1178 ASSERT_TRUE(db().OpenInMemory()); |
| 1178 | 1179 |
| 1179 sql::test::ScopedMockTimeSource time_mock(db()); | 1180 sql::test::ScopedMockTimeSource time_mock(db()); |
| 1180 | 1181 |
| (...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1380 #endif | 1381 #endif |
| 1381 | 1382 |
| 1382 TEST_F(SQLConnectionTest, OnMemoryDump) { | 1383 TEST_F(SQLConnectionTest, OnMemoryDump) { |
| 1383 base::trace_event::ProcessMemoryDump pmd(nullptr); | 1384 base::trace_event::ProcessMemoryDump pmd(nullptr); |
| 1384 base::trace_event::MemoryDumpArgs args = { | 1385 base::trace_event::MemoryDumpArgs args = { |
| 1385 base::trace_event::MemoryDumpLevelOfDetail::DETAILED}; | 1386 base::trace_event::MemoryDumpLevelOfDetail::DETAILED}; |
| 1386 ASSERT_TRUE(db().OnMemoryDump(args, &pmd)); | 1387 ASSERT_TRUE(db().OnMemoryDump(args, &pmd)); |
| 1387 EXPECT_GE(pmd.allocator_dumps().size(), 1u); | 1388 EXPECT_GE(pmd.allocator_dumps().size(), 1u); |
| 1388 } | 1389 } |
| 1389 | 1390 |
| 1390 } // namespace | 1391 // Test that the functions to collect diagnostic data run to completion, without |
| 1392 // worrying too much about what they generate (since that will change). |
| 1393 TEST_F(SQLConnectionTest, CollectDiagnosticInfo) { |
| 1394 // NOTE(shess): Mojo doesn't support everything CollectCorruptionInfo() uses, |
| 1395 // but it's not really clear if adding support would be useful. |
| 1396 #if !defined(MOJO_APPTEST_IMPL) |
| 1397 const std::string corruption_info = db().CollectCorruptionInfo(); |
| 1398 EXPECT_NE(std::string::npos, corruption_info.find("SQLITE_CORRUPT")); |
| 1399 EXPECT_NE(std::string::npos, corruption_info.find("integrity_check")); |
| 1400 #endif |
| 1401 |
| 1402 // A statement to see in the results. |
| 1403 const char* kSimpleSql = "SELECT 'mountain'"; |
| 1404 Statement s(db().GetCachedStatement(SQL_FROM_HERE, kSimpleSql)); |
| 1405 |
| 1406 // Error includes the statement. |
| 1407 const std::string readonly_info = db().CollectErrorInfo(SQLITE_READONLY, &s); |
| 1408 EXPECT_NE(std::string::npos, readonly_info.find(kSimpleSql)); |
| 1409 |
| 1410 // Some other error doesn't include the statment. |
| 1411 // TODO(shess): This is weak. |
| 1412 const std::string full_info = db().CollectErrorInfo(SQLITE_FULL, NULL); |
| 1413 EXPECT_EQ(std::string::npos, full_info.find(kSimpleSql)); |
| 1414 |
| 1415 // A table to see in the SQLITE_ERROR results. |
| 1416 EXPECT_TRUE(db().Execute("CREATE TABLE volcano (x)")); |
| 1417 |
| 1418 // Version info to see in the SQLITE_ERROR results. |
| 1419 sql::MetaTable meta_table; |
| 1420 ASSERT_TRUE(meta_table.Init(&db(), 4, 4)); |
| 1421 |
| 1422 const std::string error_info = db().CollectErrorInfo(SQLITE_ERROR, &s); |
| 1423 EXPECT_NE(std::string::npos, error_info.find(kSimpleSql)); |
| 1424 EXPECT_NE(std::string::npos, error_info.find("volcano")); |
| 1425 EXPECT_NE(std::string::npos, error_info.find("version: 4")); |
| 1426 } |
| 1427 |
| 1428 #if !defined(MOJO_APPTEST_IMPL) |
| 1429 TEST_F(SQLConnectionTest, RegisterIntentToUpload) { |
| 1430 base::FilePath breadcrumb_path( |
| 1431 db_path().DirName().Append(FILE_PATH_LITERAL("sqlite-diag"))); |
| 1432 |
| 1433 // No stale diagnostic store. |
| 1434 ASSERT_TRUE(!base::PathExists(breadcrumb_path)); |
| 1435 |
| 1436 // The histogram tag is required to enable diagnostic features. |
| 1437 EXPECT_FALSE(db().RegisterIntentToUpload()); |
| 1438 EXPECT_TRUE(!base::PathExists(breadcrumb_path)); |
| 1439 |
| 1440 db().Close(); |
| 1441 db().set_histogram_tag("Test"); |
| 1442 ASSERT_TRUE(db().Open(db_path())); |
| 1443 |
| 1444 // Should signal upload only once. |
| 1445 EXPECT_TRUE(db().RegisterIntentToUpload()); |
| 1446 EXPECT_TRUE(base::PathExists(breadcrumb_path)); |
| 1447 EXPECT_FALSE(db().RegisterIntentToUpload()); |
| 1448 |
| 1449 // Changing the histogram tag should allow new upload to succeed. |
| 1450 db().Close(); |
| 1451 db().set_histogram_tag("NewTest"); |
| 1452 ASSERT_TRUE(db().Open(db_path())); |
| 1453 EXPECT_TRUE(db().RegisterIntentToUpload()); |
| 1454 EXPECT_FALSE(db().RegisterIntentToUpload()); |
| 1455 |
| 1456 // Old tag is still prevented. |
| 1457 db().Close(); |
| 1458 db().set_histogram_tag("Test"); |
| 1459 ASSERT_TRUE(db().Open(db_path())); |
| 1460 EXPECT_FALSE(db().RegisterIntentToUpload()); |
| 1461 } |
| 1462 #endif // !defined(MOJO_APPTEST_IMPL) |
| 1463 |
| 1464 } // namespace sql |
| OLD | NEW |