Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(132)

Side by Side Diff: sql/connection_unittest.cc

Issue 1991503002: [sql] sql::ScopedErrorIgnorer rename to sql::test::ScopedErrorExpecter (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: typo Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « sql/connection.cc ('k') | sql/recovery_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 <stddef.h> 5 #include <stddef.h>
6 #include <stdint.h> 6 #include <stdint.h>
7 7
8 #include "base/bind.h" 8 #include "base/bind.h"
9 #include "base/files/file_util.h" 9 #include "base/files/file_util.h"
10 #include "base/files/scoped_file.h" 10 #include "base/files/scoped_file.h"
11 #include "base/files/scoped_temp_dir.h" 11 #include "base/files/scoped_temp_dir.h"
12 #include "base/logging.h" 12 #include "base/logging.h"
13 #include "base/macros.h" 13 #include "base/macros.h"
14 #include "base/metrics/statistics_recorder.h" 14 #include "base/metrics/statistics_recorder.h"
15 #include "base/test/histogram_tester.h" 15 #include "base/test/histogram_tester.h"
16 #include "base/trace_event/process_memory_dump.h" 16 #include "base/trace_event/process_memory_dump.h"
17 #include "sql/connection.h" 17 #include "sql/connection.h"
18 #include "sql/connection_memory_dump_provider.h" 18 #include "sql/connection_memory_dump_provider.h"
19 #include "sql/correct_sql_test_base.h" 19 #include "sql/correct_sql_test_base.h"
20 #include "sql/meta_table.h" 20 #include "sql/meta_table.h"
21 #include "sql/statement.h" 21 #include "sql/statement.h"
22 #include "sql/test/error_callback_support.h" 22 #include "sql/test/error_callback_support.h"
23 #include "sql/test/scoped_error_ignorer.h" 23 #include "sql/test/scoped_error_expecter.h"
24 #include "sql/test/test_helpers.h" 24 #include "sql/test/test_helpers.h"
25 #include "testing/gtest/include/gtest/gtest.h" 25 #include "testing/gtest/include/gtest/gtest.h"
26 #include "third_party/sqlite/sqlite3.h" 26 #include "third_party/sqlite/sqlite3.h"
27 27
28 namespace sql { 28 namespace sql {
29 namespace test { 29 namespace test {
30 30
31 // Replaces the database time source with an object that steps forward 1ms on 31 // Replaces the database time source with an object that steps forward 1ms on
32 // each check, and which can be jumped forward an arbitrary amount of time 32 // each check, and which can be jumped forward an arbitrary amount of time
33 // programmatically. 33 // programmatically.
(...skipping 317 matching lines...) Expand 10 before | Expand all | Expand 10 after
351 351
352 TEST_F(SQLConnectionTest, Rollback) { 352 TEST_F(SQLConnectionTest, Rollback) {
353 ASSERT_TRUE(db().BeginTransaction()); 353 ASSERT_TRUE(db().BeginTransaction());
354 ASSERT_TRUE(db().BeginTransaction()); 354 ASSERT_TRUE(db().BeginTransaction());
355 EXPECT_EQ(2, db().transaction_nesting()); 355 EXPECT_EQ(2, db().transaction_nesting());
356 db().RollbackTransaction(); 356 db().RollbackTransaction();
357 EXPECT_FALSE(db().CommitTransaction()); 357 EXPECT_FALSE(db().CommitTransaction());
358 EXPECT_TRUE(db().BeginTransaction()); 358 EXPECT_TRUE(db().BeginTransaction());
359 } 359 }
360 360
361 // Test the scoped error ignorer by attempting to insert a duplicate 361 // Test the scoped error expecter by attempting to insert a duplicate
362 // value into an index. 362 // value into an index.
363 TEST_F(SQLConnectionTest, ScopedIgnoreError) { 363 TEST_F(SQLConnectionTest, ScopedErrorExpecter) {
364 const char* kCreateSql = "CREATE TABLE foo (id INTEGER UNIQUE)"; 364 const char* kCreateSql = "CREATE TABLE foo (id INTEGER UNIQUE)";
365 ASSERT_TRUE(db().Execute(kCreateSql)); 365 ASSERT_TRUE(db().Execute(kCreateSql));
366 ASSERT_TRUE(db().Execute("INSERT INTO foo (id) VALUES (12)")); 366 ASSERT_TRUE(db().Execute("INSERT INTO foo (id) VALUES (12)"));
367 367
368 { 368 {
369 sql::ScopedErrorIgnorer ignore_errors; 369 sql::test::ScopedErrorExpecter expecter;
370 ignore_errors.IgnoreError(SQLITE_CONSTRAINT); 370 expecter.ExpectError(SQLITE_CONSTRAINT);
371 ASSERT_FALSE(db().Execute("INSERT INTO foo (id) VALUES (12)")); 371 ASSERT_FALSE(db().Execute("INSERT INTO foo (id) VALUES (12)"));
372 ASSERT_TRUE(ignore_errors.CheckIgnoredErrors()); 372 ASSERT_TRUE(expecter.SawExpectedErrors());
373 } 373 }
374 } 374 }
375 375
376 // Test that clients of GetUntrackedStatement() can test corruption-handling 376 // Test that clients of GetUntrackedStatement() can test corruption-handling
377 // with ScopedErrorIgnorer. 377 // with ScopedErrorExpecter.
378 TEST_F(SQLConnectionTest, ScopedIgnoreUntracked) { 378 TEST_F(SQLConnectionTest, ScopedIgnoreUntracked) {
379 const char* kCreateSql = "CREATE TABLE foo (id INTEGER UNIQUE)"; 379 const char* kCreateSql = "CREATE TABLE foo (id INTEGER UNIQUE)";
380 ASSERT_TRUE(db().Execute(kCreateSql)); 380 ASSERT_TRUE(db().Execute(kCreateSql));
381 ASSERT_FALSE(db().DoesTableExist("bar")); 381 ASSERT_FALSE(db().DoesTableExist("bar"));
382 ASSERT_TRUE(db().DoesTableExist("foo")); 382 ASSERT_TRUE(db().DoesTableExist("foo"));
383 ASSERT_TRUE(db().DoesColumnExist("foo", "id")); 383 ASSERT_TRUE(db().DoesColumnExist("foo", "id"));
384 db().Close(); 384 db().Close();
385 385
386 // Corrupt the database so that nothing works, including PRAGMAs. 386 // Corrupt the database so that nothing works, including PRAGMAs.
387 ASSERT_TRUE(CorruptSizeInHeaderOfDB()); 387 ASSERT_TRUE(CorruptSizeInHeaderOfDB());
388 388
389 { 389 {
390 sql::ScopedErrorIgnorer ignore_errors; 390 sql::test::ScopedErrorExpecter expecter;
391 ignore_errors.IgnoreError(SQLITE_CORRUPT); 391 expecter.ExpectError(SQLITE_CORRUPT);
392 ASSERT_TRUE(db().Open(db_path())); 392 ASSERT_TRUE(db().Open(db_path()));
393 ASSERT_FALSE(db().DoesTableExist("bar")); 393 ASSERT_FALSE(db().DoesTableExist("bar"));
394 ASSERT_FALSE(db().DoesTableExist("foo")); 394 ASSERT_FALSE(db().DoesTableExist("foo"));
395 ASSERT_FALSE(db().DoesColumnExist("foo", "id")); 395 ASSERT_FALSE(db().DoesColumnExist("foo", "id"));
396 ASSERT_TRUE(ignore_errors.CheckIgnoredErrors()); 396 ASSERT_TRUE(expecter.SawExpectedErrors());
397 } 397 }
398 } 398 }
399 399
400 TEST_F(SQLConnectionTest, ErrorCallback) { 400 TEST_F(SQLConnectionTest, ErrorCallback) {
401 const char* kCreateSql = "CREATE TABLE foo (id INTEGER UNIQUE)"; 401 const char* kCreateSql = "CREATE TABLE foo (id INTEGER UNIQUE)";
402 ASSERT_TRUE(db().Execute(kCreateSql)); 402 ASSERT_TRUE(db().Execute(kCreateSql));
403 ASSERT_TRUE(db().Execute("INSERT INTO foo (id) VALUES (12)")); 403 ASSERT_TRUE(db().Execute("INSERT INTO foo (id) VALUES (12)"));
404 404
405 int error = SQLITE_OK; 405 int error = SQLITE_OK;
406 { 406 {
407 sql::ScopedErrorCallback sec( 407 sql::ScopedErrorCallback sec(
408 &db(), base::Bind(&sql::CaptureErrorCallback, &error)); 408 &db(), base::Bind(&sql::CaptureErrorCallback, &error));
409 EXPECT_FALSE(db().Execute("INSERT INTO foo (id) VALUES (12)")); 409 EXPECT_FALSE(db().Execute("INSERT INTO foo (id) VALUES (12)"));
410 410
411 // Later versions of SQLite throw SQLITE_CONSTRAINT_UNIQUE. The specific 411 // Later versions of SQLite throw SQLITE_CONSTRAINT_UNIQUE. The specific
412 // sub-error isn't really important. 412 // sub-error isn't really important.
413 EXPECT_EQ(SQLITE_CONSTRAINT, (error&0xff)); 413 EXPECT_EQ(SQLITE_CONSTRAINT, (error&0xff));
414 } 414 }
415 415
416 // Callback is no longer in force due to reset. 416 // Callback is no longer in force due to reset.
417 { 417 {
418 error = SQLITE_OK; 418 error = SQLITE_OK;
419 sql::ScopedErrorIgnorer ignore_errors; 419 sql::test::ScopedErrorExpecter expecter;
420 ignore_errors.IgnoreError(SQLITE_CONSTRAINT); 420 expecter.ExpectError(SQLITE_CONSTRAINT);
421 ASSERT_FALSE(db().Execute("INSERT INTO foo (id) VALUES (12)")); 421 ASSERT_FALSE(db().Execute("INSERT INTO foo (id) VALUES (12)"));
422 ASSERT_TRUE(ignore_errors.CheckIgnoredErrors()); 422 ASSERT_TRUE(expecter.SawExpectedErrors());
423 EXPECT_EQ(SQLITE_OK, error); 423 EXPECT_EQ(SQLITE_OK, error);
424 } 424 }
425 425
426 // base::Bind() can curry arguments to be passed by const reference 426 // base::Bind() can curry arguments to be passed by const reference
427 // to the callback function. If the callback function calls 427 // to the callback function. If the callback function calls
428 // re/set_error_callback(), the storage for those arguments can be 428 // re/set_error_callback(), the storage for those arguments can be
429 // deleted while the callback function is still executing. 429 // deleted while the callback function is still executing.
430 // 430 //
431 // RefCounter() counts how many objects are live using an external 431 // RefCounter() counts how many objects are live using an external
432 // count. The same counter is passed to the callback, so that it 432 // count. The same counter is passed to the callback, so that it
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after
609 db().Close(); 609 db().Close();
610 sql::Connection::Delete(db_path()); 610 sql::Connection::Delete(db_path());
611 ASSERT_FALSE(GetPathExists(db_path())); 611 ASSERT_FALSE(GetPathExists(db_path()));
612 612
613 WriteJunkToDatabase(SQLTestBase::TYPE_OVERWRITE_AND_TRUNCATE); 613 WriteJunkToDatabase(SQLTestBase::TYPE_OVERWRITE_AND_TRUNCATE);
614 ASSERT_TRUE(GetPathExists(db_path())); 614 ASSERT_TRUE(GetPathExists(db_path()));
615 615
616 // SQLite will successfully open the handle, but fail when running PRAGMA 616 // SQLite will successfully open the handle, but fail when running PRAGMA
617 // statements that access the database. 617 // statements that access the database.
618 { 618 {
619 sql::ScopedErrorIgnorer ignore_errors; 619 sql::test::ScopedErrorExpecter expecter;
620 620
621 // Earlier versions of Chromium compiled against SQLite 3.6.7.3, which 621 // Earlier versions of Chromium compiled against SQLite 3.6.7.3, which
622 // returned SQLITE_IOERR_SHORT_READ in this case. Some platforms may still 622 // returned SQLITE_IOERR_SHORT_READ in this case. Some platforms may still
623 // compile against an earlier SQLite via USE_SYSTEM_SQLITE. 623 // compile against an earlier SQLite via USE_SYSTEM_SQLITE.
624 if (ignore_errors.SQLiteLibVersionNumber() < 3008005) { 624 if (expecter.SQLiteLibVersionNumber() < 3008005) {
625 ignore_errors.IgnoreError(SQLITE_IOERR_SHORT_READ); 625 expecter.ExpectError(SQLITE_IOERR_SHORT_READ);
626 } else { 626 } else {
627 ignore_errors.IgnoreError(SQLITE_NOTADB); 627 expecter.ExpectError(SQLITE_NOTADB);
628 } 628 }
629 629
630 EXPECT_TRUE(db().Open(db_path())); 630 EXPECT_TRUE(db().Open(db_path()));
631 ASSERT_TRUE(ignore_errors.CheckIgnoredErrors()); 631 ASSERT_TRUE(expecter.SawExpectedErrors());
632 } 632 }
633 EXPECT_TRUE(db().Raze()); 633 EXPECT_TRUE(db().Raze());
634 db().Close(); 634 db().Close();
635 635
636 // Now empty, the open should open an empty database. 636 // Now empty, the open should open an empty database.
637 EXPECT_TRUE(db().Open(db_path())); 637 EXPECT_TRUE(db().Open(db_path()));
638 EXPECT_EQ(0, SqliteMasterCount(&db())); 638 EXPECT_EQ(0, SqliteMasterCount(&db()));
639 } 639 }
640 640
641 // Verify that Raze() can handle a database overwritten with garbage. 641 // Verify that Raze() can handle a database overwritten with garbage.
642 TEST_F(SQLConnectionTest, RazeNOTADB2) { 642 TEST_F(SQLConnectionTest, RazeNOTADB2) {
643 const char* kCreateSql = "CREATE TABLE foo (id INTEGER PRIMARY KEY, value)"; 643 const char* kCreateSql = "CREATE TABLE foo (id INTEGER PRIMARY KEY, value)";
644 ASSERT_TRUE(db().Execute(kCreateSql)); 644 ASSERT_TRUE(db().Execute(kCreateSql));
645 ASSERT_EQ(1, SqliteMasterCount(&db())); 645 ASSERT_EQ(1, SqliteMasterCount(&db()));
646 db().Close(); 646 db().Close();
647 647
648 WriteJunkToDatabase(SQLTestBase::TYPE_OVERWRITE); 648 WriteJunkToDatabase(SQLTestBase::TYPE_OVERWRITE);
649 649
650 // SQLite will successfully open the handle, but will fail with 650 // SQLite will successfully open the handle, but will fail with
651 // SQLITE_NOTADB on pragma statemenets which attempt to read the 651 // SQLITE_NOTADB on pragma statemenets which attempt to read the
652 // corrupted header. 652 // corrupted header.
653 { 653 {
654 sql::ScopedErrorIgnorer ignore_errors; 654 sql::test::ScopedErrorExpecter expecter;
655 ignore_errors.IgnoreError(SQLITE_NOTADB); 655 expecter.ExpectError(SQLITE_NOTADB);
656 EXPECT_TRUE(db().Open(db_path())); 656 EXPECT_TRUE(db().Open(db_path()));
657 ASSERT_TRUE(ignore_errors.CheckIgnoredErrors()); 657 ASSERT_TRUE(expecter.SawExpectedErrors());
658 } 658 }
659 EXPECT_TRUE(db().Raze()); 659 EXPECT_TRUE(db().Raze());
660 db().Close(); 660 db().Close();
661 661
662 // Now empty, the open should succeed with an empty database. 662 // Now empty, the open should succeed with an empty database.
663 EXPECT_TRUE(db().Open(db_path())); 663 EXPECT_TRUE(db().Open(db_path()));
664 EXPECT_EQ(0, SqliteMasterCount(&db())); 664 EXPECT_EQ(0, SqliteMasterCount(&db()));
665 } 665 }
666 666
667 // Test that a callback from Open() can raze the database. This is 667 // Test that a callback from Open() can raze the database. This is
668 // essential for cases where the Open() can fail entirely, so the 668 // essential for cases where the Open() can fail entirely, so the
669 // Raze() cannot happen later. Additionally test that when the 669 // Raze() cannot happen later. Additionally test that when the
670 // callback does this during Open(), the open is retried and succeeds. 670 // callback does this during Open(), the open is retried and succeeds.
671 TEST_F(SQLConnectionTest, RazeCallbackReopen) { 671 TEST_F(SQLConnectionTest, RazeCallbackReopen) {
672 const char* kCreateSql = "CREATE TABLE foo (id INTEGER PRIMARY KEY, value)"; 672 const char* kCreateSql = "CREATE TABLE foo (id INTEGER PRIMARY KEY, value)";
673 ASSERT_TRUE(db().Execute(kCreateSql)); 673 ASSERT_TRUE(db().Execute(kCreateSql));
674 ASSERT_EQ(1, SqliteMasterCount(&db())); 674 ASSERT_EQ(1, SqliteMasterCount(&db()));
675 db().Close(); 675 db().Close();
676 676
677 // Corrupt the database so that nothing works, including PRAGMAs. 677 // Corrupt the database so that nothing works, including PRAGMAs.
678 ASSERT_TRUE(CorruptSizeInHeaderOfDB()); 678 ASSERT_TRUE(CorruptSizeInHeaderOfDB());
679 679
680 // Open() will succeed, even though the PRAGMA calls within will 680 // Open() will succeed, even though the PRAGMA calls within will
681 // fail with SQLITE_CORRUPT, as will this PRAGMA. 681 // fail with SQLITE_CORRUPT, as will this PRAGMA.
682 { 682 {
683 sql::ScopedErrorIgnorer ignore_errors; 683 sql::test::ScopedErrorExpecter expecter;
684 ignore_errors.IgnoreError(SQLITE_CORRUPT); 684 expecter.ExpectError(SQLITE_CORRUPT);
685 ASSERT_TRUE(db().Open(db_path())); 685 ASSERT_TRUE(db().Open(db_path()));
686 ASSERT_FALSE(db().Execute("PRAGMA auto_vacuum")); 686 ASSERT_FALSE(db().Execute("PRAGMA auto_vacuum"));
687 db().Close(); 687 db().Close();
688 ASSERT_TRUE(ignore_errors.CheckIgnoredErrors()); 688 ASSERT_TRUE(expecter.SawExpectedErrors());
689 } 689 }
690 690
691 db().set_error_callback(base::Bind(&SQLConnectionTest::RazeErrorCallback, 691 db().set_error_callback(base::Bind(&SQLConnectionTest::RazeErrorCallback,
692 base::Unretained(this), 692 base::Unretained(this),
693 SQLITE_CORRUPT)); 693 SQLITE_CORRUPT));
694 694
695 // When the PRAGMA calls in Open() raise SQLITE_CORRUPT, the error 695 // When the PRAGMA calls in Open() raise SQLITE_CORRUPT, the error
696 // callback will call RazeAndClose(). Open() will then fail and be 696 // callback will call RazeAndClose(). Open() will then fail and be
697 // retried. The second Open() on the empty database will succeed 697 // retried. The second Open() on the empty database will succeed
698 // cleanly. 698 // cleanly.
(...skipping 260 matching lines...) Expand 10 before | Expand all | Expand 10 after
959 EXPECT_TRUE(other_db.Execute("CREATE TABLE bar (a, b)")); 959 EXPECT_TRUE(other_db.Execute("CREATE TABLE bar (a, b)"));
960 EXPECT_TRUE(other_db.Execute("INSERT INTO bar VALUES ('hello', 'world')")); 960 EXPECT_TRUE(other_db.Execute("INSERT INTO bar VALUES ('hello', 'world')"));
961 } 961 }
962 962
963 // Cannot see the attached database, yet. 963 // Cannot see the attached database, yet.
964 EXPECT_FALSE(db().IsSQLValid("SELECT count(*) from other.bar")); 964 EXPECT_FALSE(db().IsSQLValid("SELECT count(*) from other.bar"));
965 965
966 // Attach fails in a transaction. 966 // Attach fails in a transaction.
967 EXPECT_TRUE(db().BeginTransaction()); 967 EXPECT_TRUE(db().BeginTransaction());
968 { 968 {
969 sql::ScopedErrorIgnorer ignore_errors; 969 sql::test::ScopedErrorExpecter expecter;
970 ignore_errors.IgnoreError(SQLITE_ERROR); 970 expecter.ExpectError(SQLITE_ERROR);
971 EXPECT_FALSE(db().AttachDatabase(attach_path, kAttachmentPoint)); 971 EXPECT_FALSE(db().AttachDatabase(attach_path, kAttachmentPoint));
972 ASSERT_TRUE(ignore_errors.CheckIgnoredErrors()); 972 ASSERT_TRUE(expecter.SawExpectedErrors());
973 } 973 }
974 974
975 // Attach succeeds when the transaction is closed. 975 // Attach succeeds when the transaction is closed.
976 db().RollbackTransaction(); 976 db().RollbackTransaction();
977 EXPECT_TRUE(db().AttachDatabase(attach_path, kAttachmentPoint)); 977 EXPECT_TRUE(db().AttachDatabase(attach_path, kAttachmentPoint));
978 EXPECT_TRUE(db().IsSQLValid("SELECT count(*) from other.bar")); 978 EXPECT_TRUE(db().IsSQLValid("SELECT count(*) from other.bar"));
979 979
980 // Queries can touch both databases. 980 // Queries can touch both databases.
981 EXPECT_TRUE(db().Execute("INSERT INTO foo SELECT a, b FROM other.bar")); 981 EXPECT_TRUE(db().Execute("INSERT INTO foo SELECT a, b FROM other.bar"));
982 { 982 {
983 sql::Statement s(db().GetUniqueStatement("SELECT COUNT(*) FROM foo")); 983 sql::Statement s(db().GetUniqueStatement("SELECT COUNT(*) FROM foo"));
984 ASSERT_TRUE(s.Step()); 984 ASSERT_TRUE(s.Step());
985 EXPECT_EQ(1, s.ColumnInt(0)); 985 EXPECT_EQ(1, s.ColumnInt(0));
986 } 986 }
987 987
988 // Detach also fails in a transaction. 988 // Detach also fails in a transaction.
989 EXPECT_TRUE(db().BeginTransaction()); 989 EXPECT_TRUE(db().BeginTransaction());
990 { 990 {
991 sql::ScopedErrorIgnorer ignore_errors; 991 sql::test::ScopedErrorExpecter expecter;
992 ignore_errors.IgnoreError(SQLITE_ERROR); 992 expecter.ExpectError(SQLITE_ERROR);
993 EXPECT_FALSE(db().DetachDatabase(kAttachmentPoint)); 993 EXPECT_FALSE(db().DetachDatabase(kAttachmentPoint));
994 EXPECT_TRUE(db().IsSQLValid("SELECT count(*) from other.bar")); 994 EXPECT_TRUE(db().IsSQLValid("SELECT count(*) from other.bar"));
995 ASSERT_TRUE(ignore_errors.CheckIgnoredErrors()); 995 ASSERT_TRUE(expecter.SawExpectedErrors());
996 } 996 }
997 997
998 // Detach succeeds outside of a transaction. 998 // Detach succeeds outside of a transaction.
999 db().RollbackTransaction(); 999 db().RollbackTransaction();
1000 EXPECT_TRUE(db().DetachDatabase(kAttachmentPoint)); 1000 EXPECT_TRUE(db().DetachDatabase(kAttachmentPoint));
1001 1001
1002 EXPECT_FALSE(db().IsSQLValid("SELECT count(*) from other.bar")); 1002 EXPECT_FALSE(db().IsSQLValid("SELECT count(*) from other.bar"));
1003 } 1003 }
1004 1004
1005 TEST_F(SQLConnectionTest, Basic_QuickIntegrityCheck) { 1005 TEST_F(SQLConnectionTest, Basic_QuickIntegrityCheck) {
1006 const char* kCreateSql = "CREATE TABLE foo (id INTEGER PRIMARY KEY, value)"; 1006 const char* kCreateSql = "CREATE TABLE foo (id INTEGER PRIMARY KEY, value)";
1007 ASSERT_TRUE(db().Execute(kCreateSql)); 1007 ASSERT_TRUE(db().Execute(kCreateSql));
1008 EXPECT_TRUE(db().QuickIntegrityCheck()); 1008 EXPECT_TRUE(db().QuickIntegrityCheck());
1009 db().Close(); 1009 db().Close();
1010 1010
1011 ASSERT_TRUE(CorruptSizeInHeaderOfDB()); 1011 ASSERT_TRUE(CorruptSizeInHeaderOfDB());
1012 1012
1013 { 1013 {
1014 sql::ScopedErrorIgnorer ignore_errors; 1014 sql::test::ScopedErrorExpecter expecter;
1015 ignore_errors.IgnoreError(SQLITE_CORRUPT); 1015 expecter.ExpectError(SQLITE_CORRUPT);
1016 ASSERT_TRUE(db().Open(db_path())); 1016 ASSERT_TRUE(db().Open(db_path()));
1017 EXPECT_FALSE(db().QuickIntegrityCheck()); 1017 EXPECT_FALSE(db().QuickIntegrityCheck());
1018 ASSERT_TRUE(ignore_errors.CheckIgnoredErrors()); 1018 ASSERT_TRUE(expecter.SawExpectedErrors());
1019 } 1019 }
1020 } 1020 }
1021 1021
1022 TEST_F(SQLConnectionTest, Basic_FullIntegrityCheck) { 1022 TEST_F(SQLConnectionTest, Basic_FullIntegrityCheck) {
1023 const std::string kOk("ok"); 1023 const std::string kOk("ok");
1024 std::vector<std::string> messages; 1024 std::vector<std::string> messages;
1025 1025
1026 const char* kCreateSql = "CREATE TABLE foo (id INTEGER PRIMARY KEY, value)"; 1026 const char* kCreateSql = "CREATE TABLE foo (id INTEGER PRIMARY KEY, value)";
1027 ASSERT_TRUE(db().Execute(kCreateSql)); 1027 ASSERT_TRUE(db().Execute(kCreateSql));
1028 EXPECT_TRUE(db().FullIntegrityCheck(&messages)); 1028 EXPECT_TRUE(db().FullIntegrityCheck(&messages));
1029 EXPECT_EQ(1u, messages.size()); 1029 EXPECT_EQ(1u, messages.size());
1030 EXPECT_EQ(kOk, messages[0]); 1030 EXPECT_EQ(kOk, messages[0]);
1031 db().Close(); 1031 db().Close();
1032 1032
1033 ASSERT_TRUE(CorruptSizeInHeaderOfDB()); 1033 ASSERT_TRUE(CorruptSizeInHeaderOfDB());
1034 1034
1035 { 1035 {
1036 sql::ScopedErrorIgnorer ignore_errors; 1036 sql::test::ScopedErrorExpecter expecter;
1037 ignore_errors.IgnoreError(SQLITE_CORRUPT); 1037 expecter.ExpectError(SQLITE_CORRUPT);
1038 ASSERT_TRUE(db().Open(db_path())); 1038 ASSERT_TRUE(db().Open(db_path()));
1039 EXPECT_TRUE(db().FullIntegrityCheck(&messages)); 1039 EXPECT_TRUE(db().FullIntegrityCheck(&messages));
1040 EXPECT_LT(1u, messages.size()); 1040 EXPECT_LT(1u, messages.size());
1041 EXPECT_NE(kOk, messages[0]); 1041 EXPECT_NE(kOk, messages[0]);
1042 ASSERT_TRUE(ignore_errors.CheckIgnoredErrors()); 1042 ASSERT_TRUE(expecter.SawExpectedErrors());
1043 } 1043 }
1044 1044
1045 // TODO(shess): CorruptTableOrIndex could be used to produce a 1045 // TODO(shess): CorruptTableOrIndex could be used to produce a
1046 // file that would pass the quick check and fail the full check. 1046 // file that would pass the quick check and fail the full check.
1047 } 1047 }
1048 1048
1049 // Test Sqlite.Stats histogram for execute-oriented calls. 1049 // Test Sqlite.Stats histogram for execute-oriented calls.
1050 TEST_F(SQLConnectionTest, EventsExecute) { 1050 TEST_F(SQLConnectionTest, EventsExecute) {
1051 // Re-open with histogram tag. 1051 // Re-open with histogram tag.
1052 db().Close(); 1052 db().Close();
(...skipping 435 matching lines...) Expand 10 before | Expand all | Expand 10 after
1488 if (DLOG_IS_ON(FATAL)) { 1488 if (DLOG_IS_ON(FATAL)) {
1489 db().set_error_callback(base::Bind(&IgnoreErrorCallback)); 1489 db().set_error_callback(base::Bind(&IgnoreErrorCallback));
1490 ASSERT_DEATH({ 1490 ASSERT_DEATH({
1491 db().GetUniqueStatement("SELECT x"); 1491 db().GetUniqueStatement("SELECT x");
1492 }, "SQL compile error no such column: x"); 1492 }, "SQL compile error no such column: x");
1493 } 1493 }
1494 #endif 1494 #endif
1495 } 1495 }
1496 1496
1497 } // namespace sql 1497 } // namespace sql
OLDNEW
« no previous file with comments | « sql/connection.cc ('k') | sql/recovery_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698