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

Side by Side Diff: chrome/browser/sync/syncable/directory_backing_store_unittest.cc

Issue 2830027: Remove extended attributes. The lame broken codepath in the DBS was causing (Closed)
Patch Set: Synced with TOT, resolved conflicts. Created 10 years, 5 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
OLDNEW
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 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 "testing/gtest/include/gtest/gtest.h" 5 #include "testing/gtest/include/gtest/gtest.h"
6 6
7 #include <string> 7 #include <string>
8 8
9 #include "app/sql/connection.h" 9 #include "app/sql/connection.h"
10 #include "app/sql/statement.h" 10 #include "app/sql/statement.h"
(...skipping 28 matching lines...) Expand all
39 } 39 }
40 40
41 FilePath GetDatabasePath() { 41 FilePath GetDatabasePath() {
42 return temp_dir_.path().Append( 42 return temp_dir_.path().Append(
43 DirectoryManager::GetSyncDataDatabaseFilename()); 43 DirectoryManager::GetSyncDataDatabaseFilename());
44 } 44 }
45 void SetUpVersion67Database(); 45 void SetUpVersion67Database();
46 void SetUpVersion68Database(); 46 void SetUpVersion68Database();
47 void SetUpVersion69Database(); 47 void SetUpVersion69Database();
48 void SetUpVersion70Database(); 48 void SetUpVersion70Database();
49 void SetUpVersion71Database();
49 50
50 void SetUpCurrentDatabaseAndCheckVersion() { 51 void SetUpCurrentDatabaseAndCheckVersion() {
51 SetUpVersion70Database(); // Prepopulates data. 52 SetUpVersion70Database(); // Prepopulates data.
52 scoped_ptr<DirectoryBackingStore> dbs( 53 scoped_ptr<DirectoryBackingStore> dbs(
53 new DirectoryBackingStore(GetUsername(), GetDatabasePath())); 54 new DirectoryBackingStore(GetUsername(), GetDatabasePath()));
54 55
55 dbs->BeginLoad(); 56 dbs->BeginLoad();
56 ASSERT_EQ(OPENED, dbs->InitializeTables()); 57 ASSERT_EQ(OPENED, dbs->InitializeTables());
57 ASSERT_FALSE(dbs->needs_column_refresh_); 58 ASSERT_FALSE(dbs->needs_column_refresh_);
58 ASSERT_EQ(kCurrentDBVersion, dbs->GetVersion()); 59 ASSERT_EQ(kCurrentDBVersion, dbs->GetVersion());
59 dbs->EndLoad(); 60 dbs->EndLoad();
60 } 61 }
61 62
62 private: 63 private:
63 ScopedTempDir temp_dir_; 64 ScopedTempDir temp_dir_;
64 }; 65 };
65 66
66 class DirectoryBackingStoreTest : public MigrationTest {}; 67 class DirectoryBackingStoreTest : public MigrationTest {};
67 68
68 void MigrationTest::SetUpVersion67Database() { 69 void MigrationTest::SetUpVersion67Database() {
69 // This is a version 67 database dump whose contents were backformed from 70 // This is a version 67 database dump whose contents were backformed from
70 // the contents of the version 68 database dump (the v68 migration was 71 // the contents of the version 68 database dump (the v68 migration was
71 // actually written first). 72 // actually written first).
72 sql::Connection connection; 73 sql::Connection connection;
73 ASSERT_TRUE(connection.Open(GetDatabasePath())); 74 ASSERT_TRUE(connection.Open(GetDatabasePath()));
74 ASSERT_TRUE(connection.BeginTransaction()); 75 ASSERT_TRUE(connection.BeginTransaction());
75 ASSERT_TRUE(connection.Execute( 76 ASSERT_TRUE(connection.Execute(
76 "CREATE TABLE extended_attributes(metahandle bigint, key varchar(127), " 77 "CREATE TABLE extended_attributes(metahandle bigint, key varchar(127), "
77 "value blob, PRIMARY KEY(metahandle, key) ON CONFLICT REPLACE);" 78 "value blob, PRIMARY KEY(metahandle, key) ON CONFLICT REPLACE);"
78 "CREATE TABLE metas (metahandle bigint primary key ON CONFLICT FAIL," 79 "CREATE TABLE metas (metahandle bigint primary key ON CONFLICT FAIL,"
79 "base_version bigint default -1,server_version bigint default 0," 80 "base_version bigint default -1,server_version bigint default 0,"
80 "mtime bigint default 0,server_mtime bigint default 0," 81 "mtime bigint default 0,server_mtime bigint default 0,"
81 "ctime bigint default 0,server_ctime bigint default 0," 82 "ctime bigint default 0,server_ctime bigint default 0,"
82 "server_position_in_parent bigint default 0," 83 "server_position_in_parent bigint default 0,"
83 "local_external_id bigint default 0,id varchar(255) default 'r'," 84 "local_external_id bigint default 0,id varchar(255) default 'r',"
84 "parent_id varchar(255) default 'r'," 85 "parent_id varchar(255) default 'r',"
85 "server_parent_id varchar(255) default 'r'," 86 "server_parent_id varchar(255) default 'r',"
86 "prev_id varchar(255) default 'r',next_id varchar(255) default 'r'," 87 "prev_id varchar(255) default 'r',next_id varchar(255) default 'r',"
87 "is_unsynced bit default 0,is_unapplied_update bit default 0," 88 "is_unsynced bit default 0,is_unapplied_update bit default 0,"
88 "is_del bit default 0,is_dir bit default 0," 89 "is_del bit default 0,is_dir bit default 0,"
(...skipping 433 matching lines...) Expand 10 before | Expand all | Expand 10 after
522 "129079958383000000,129079958383000000,129079958383000000,1048576," 523 "129079958383000000,129079958383000000,129079958383000000,1048576,"
523 "11,'s_ID_14','s_ID_6','s_ID_6','s_ID_12','r',0,0,0,0,0,0," 524 "11,'s_ID_14','s_ID_6','s_ID_6','s_ID_12','r',0,0,0,0,0,0,"
524 "'The WebKit Open Source Project','The WebKit Open Source Project'," 525 "'The WebKit Open Source Project','The WebKit Open Source Project',"
525 "NULL,NULL,X'C288101A0A12687474703A2F2F7765626B69742E6F72672F120450" 526 "NULL,NULL,X'C288101A0A12687474703A2F2F7765626B69742E6F72672F120450"
526 "4E4758',X'C288101C0A13687474703A2F2F7765626B69742E6F72672F78120550" 527 "4E4758',X'C288101C0A13687474703A2F2F7765626B69742E6F72672F78120550"
527 "4E473259');" 528 "4E473259');"
528 )); 529 ));
529 ASSERT_TRUE(connection.CommitTransaction()); 530 ASSERT_TRUE(connection.CommitTransaction());
530 } 531 }
531 532
533 void MigrationTest::SetUpVersion71Database() {
534 sql::Connection connection;
535 ASSERT_TRUE(connection.Open(GetDatabasePath()));
536 ASSERT_TRUE(connection.BeginTransaction());
537 ASSERT_TRUE(connection.Execute(
538 "CREATE TABLE extended_attributes(metahandle bigint, key varchar(127), "
539 "value blob, PRIMARY KEY(metahandle, key) ON CONFLICT REPLACE);"
540 "CREATE TABLE share_version (id VARCHAR(128) primary key, data INT);"
541 "INSERT INTO 'share_version' VALUES('nick@chromium.org',71);"
542 "CREATE TABLE metas(metahandle bigint primary key ON CONFLICT FAIL,"
543 "base_version bigint default -1,server_version bigint default 0,"
544 "mtime bigint default 0,server_mtime bigint default 0,ctime bigint "
545 "default 0,server_ctime bigint default 0,server_position_in_parent "
546 "bigint default 0,local_external_id bigint default 0,id varchar(255) "
547 "default 'r',parent_id varchar(255) default 'r',server_parent_id "
548 "varchar(255) default 'r',prev_id varchar(255) default 'r',next_id "
549 "varchar(255) default 'r',is_unsynced bit default 0,"
550 "is_unapplied_update bit default 0,is_del bit default 0,is_dir bit "
551 "default 0,server_is_dir bit default 0,server_is_del bit default 0,"
552 "non_unique_name varchar,server_non_unique_name varchar(255),"
553 "unique_server_tag varchar,unique_client_tag varchar,specifics blob,"
554 "server_specifics blob);"
555 "INSERT INTO 'metas' VALUES(1,-1,0,129079956640320000,0,"
556 "129079956640320000,0,0,0,'r','r','r','r','r',0,0,0,1,0,0,NULL,NULL,"
557 "NULL,NULL,X'',X'');"
558 "INSERT INTO 'metas' VALUES(2,669,669,128976886618480000,"
559 "128976886618480000,128976886618480000,128976886618480000,-2097152,4,"
560 "'s_ID_2','s_ID_9','s_ID_9','s_ID_2','s_ID_2',0,0,1,0,0,1,"
561 "'Deleted Item','Deleted Item',NULL,NULL,X'C28810220A16687474703A2F2F"
562 "7777772E676F6F676C652E636F6D2F12084141534741534741',X'C28810260A1768"
563 "7474703A2F2F7777772E676F6F676C652E636F6D2F32120B41534144474144474144"
564 "47');"
565 "INSERT INTO 'metas' VALUES(4,681,681,129002163642690000,"
566 "129002163642690000,129002163642690000,129002163642690000,-3145728,3,"
567 "'s_ID_4','s_ID_9','s_ID_9','s_ID_4','s_ID_4',0,0,1,0,0,1,"
568 "'Welcome to Chromium','Welcome to Chromium',NULL,NULL,X'C28810350A31"
569 "687474703A2F2F7777772E676F6F676C652E636F6D2F6368726F6D652F696E746C2F"
570 "656E2F77656C636F6D652E68746D6C1200',X'C28810350A31687474703A2F2F7777"
571 "772E676F6F676C652E636F6D2F6368726F6D652F696E746C2F656E2F77656C636F6D"
572 "652E68746D6C1200');"
573 "INSERT INTO 'metas' VALUES(5,677,677,129001555500000000,"
574 "129001555500000000,129001555500000000,129001555500000000,1048576,7,"
575 "'s_ID_5','s_ID_9','s_ID_9','s_ID_5','s_ID_5',0,0,1,0,0,1,'Google',"
576 "'Google',NULL,NULL,X'C28810220A16687474703A2F2F7777772E676F6F676C652"
577 "E636F6D2F12084147415347415347',X'C28810220A16687474703A2F2F7777772E6"
578 "76F6F676C652E636F6D2F12084147464447415347');"
579 "INSERT INTO 'metas' VALUES(6,694,694,129053976170000000,"
580 "129053976170000000,129053976170000000,129053976170000000,-4194304,6,"
581 "'s_ID_6','s_ID_9','s_ID_9','r','r',0,0,0,1,1,0,'The Internet',"
582 "'The Internet',NULL,NULL,X'C2881000',X'C2881000');"
583 "INSERT INTO 'metas' VALUES(7,663,663,128976864758480000,"
584 "128976864758480000,128976864758480000,128976864758480000,1048576,0,"
585 "'s_ID_7','r','r','r','r',0,0,0,1,1,0,'Google Chrome','Google Chrome'"
586 ",'google_chrome',NULL,NULL,NULL);"
587 "INSERT INTO 'metas' VALUES(8,664,664,128976864758480000,"
588 "128976864758480000,128976864758480000,128976864758480000,1048576,0,"
589 "'s_ID_8','s_ID_7','s_ID_7','r','r',0,0,0,1,1,0,'Bookmarks',"
590 "'Bookmarks','google_chrome_bookmarks',NULL,X'C2881000',X'C2881000');"
591 "INSERT INTO 'metas' VALUES(9,665,665,128976864758480000,"
592 "128976864758480000,128976864758480000,128976864758480000,1048576,1,"
593 "'s_ID_9','s_ID_8','s_ID_8','r','s_ID_10',0,0,0,1,1,0,'Bookmark Bar',"
594 "'Bookmark Bar','bookmark_bar',NULL,X'C2881000',X'C2881000');"
595 "INSERT INTO 'metas' VALUES(10,666,666,128976864758480000,"
596 "128976864758480000,128976864758480000,128976864758480000,2097152,2,"
597 "'s_ID_10','s_ID_8','s_ID_8','s_ID_9','r',0,0,0,1,1,0,"
598 "'Other Bookmarks','Other Bookmarks','other_bookmarks',NULL,"
599 "X'C2881000',X'C2881000');"
600 "INSERT INTO 'metas' VALUES(11,683,683,129079956948440000,"
601 "129079956948440000,129079956948440000,129079956948440000,-1048576,8,"
602 "'s_ID_11','s_ID_6','s_ID_6','r','s_ID_13',0,0,0,0,0,0,"
603 "'Home (The Chromium Projects)','Home (The Chromium Projects)',NULL,"
604 "NULL,X'C28810220A18687474703A2F2F6465762E6368726F6D69756D2E6F72672F1"
605 "206414741545741',X'C28810290A1D687474703A2F2F6465762E6368726F6D69756"
606 "D2E6F72672F6F7468657212084146414756415346');"
607 "INSERT INTO 'metas' VALUES(12,685,685,129079957513650000,"
608 "129079957513650000,129079957513650000,129079957513650000,0,9,"
609 "'s_ID_12','s_ID_6','s_ID_6','s_ID_13','s_ID_14',0,0,0,1,1,0,"
610 "'Extra Bookmarks','Extra Bookmarks',NULL,NULL,X'C2881000',"
611 "X'C2881000');"
612 "INSERT INTO 'metas' VALUES(13,687,687,129079957985300000,"
613 "129079957985300000,129079957985300000,129079957985300000,-917504,10,"
614 "'s_ID_13','s_ID_6','s_ID_6','s_ID_11','s_ID_12',0,0,0,0,0,0,"
615 "'ICANN | Internet Corporation for Assigned Names and Numbers',"
616 "'ICANN | Internet Corporation for Assigned Names and Numbers',NULL,"
617 "NULL,X'C28810240A15687474703A2F2F7777772E6963616E6E2E636F6D2F120B504"
618 "E474158463041414646',X'C28810200A15687474703A2F2F7777772E6963616E6E2"
619 "E636F6D2F120744414146415346');"
620 "INSERT INTO 'metas' VALUES(14,692,692,129079958383000000,"
621 "129079958383000000,129079958383000000,129079958383000000,1048576,11,"
622 "'s_ID_14','s_ID_6','s_ID_6','s_ID_12','r',0,0,0,0,0,0,"
623 "'The WebKit Open Source Project','The WebKit Open Source Project',"
624 "NULL,NULL,""X'C288101A0A12687474703A2F2F7765626B69742E6F72672F120450"
625 "4E4758',X'C288101C0A13687474703A2F2F7765626B69742E6F72672F781205504E"
626 "473259');"
627 "CREATE TABLE models (model_id BLOB primary key, "
628 "last_download_timestamp INT, initial_sync_ended BOOLEAN default 0);"
629 "INSERT INTO 'models' VALUES(X'C2881000',694,1);"
630 "CREATE TABLE 'share_info' (id TEXT primary key, name TEXT, "
631 "store_birthday TEXT, db_create_version TEXT, db_create_time INT, "
632 "next_id INT default -2, cache_guid TEXT);"
633 "INSERT INTO 'share_info' VALUES('nick@chromium.org','nick@chromium.org',"
634 "'c27e9f59-08ca-46f8-b0cc-f16a2ed778bb','Unknown',1263522064,-65542,"
635 "'9010788312004066376x-6609234393368420856x');"));
636 ASSERT_TRUE(connection.CommitTransaction());
637 }
532 TEST_F(DirectoryBackingStoreTest, MigrateVersion67To68) { 638 TEST_F(DirectoryBackingStoreTest, MigrateVersion67To68) {
533 SetUpVersion67Database(); 639 SetUpVersion67Database();
534 640
535 { 641 {
536 sql::Connection connection; 642 sql::Connection connection;
537 ASSERT_TRUE(connection.Open(GetDatabasePath())); 643 ASSERT_TRUE(connection.Open(GetDatabasePath()));
538 644
539 // Columns existing before version 67. 645 // Columns existing before version 67.
540 ASSERT_TRUE(connection.DoesColumnExist("metas", "name")); 646 ASSERT_TRUE(connection.DoesColumnExist("metas", "name"));
541 ASSERT_TRUE(connection.DoesColumnExist("metas", "unsanitized_name")); 647 ASSERT_TRUE(connection.DoesColumnExist("metas", "unsanitized_name"));
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after
667 "initial_sync_ended, last_download_timestamp FROM models")); 773 "initial_sync_ended, last_download_timestamp FROM models"));
668 ASSERT_TRUE(s.Step()); 774 ASSERT_TRUE(s.Step());
669 std::string model_id = s.ColumnString(0); 775 std::string model_id = s.ColumnString(0);
670 EXPECT_EQ("C2881000", HexEncode(model_id.data(), model_id.size())) 776 EXPECT_EQ("C2881000", HexEncode(model_id.data(), model_id.size()))
671 << "Model ID is expected to be the empty BookmarkSpecifics proto."; 777 << "Model ID is expected to be the empty BookmarkSpecifics proto.";
672 EXPECT_EQ(true, s.ColumnBool(1)); 778 EXPECT_EQ(true, s.ColumnBool(1));
673 EXPECT_EQ(694, s.ColumnInt64(2)); 779 EXPECT_EQ(694, s.ColumnInt64(2));
674 ASSERT_FALSE(s.Step()); 780 ASSERT_FALSE(s.Step());
675 } 781 }
676 782
783
784 TEST_F(DirectoryBackingStoreTest, MigrateVersion71To72) {
785 SetUpVersion71Database();
786
787 {
788 sql::Connection connection;
789 ASSERT_TRUE(connection.Open(GetDatabasePath()));
790 ASSERT_TRUE(connection.DoesTableExist("extended_attributes"));
791 }
792
793 scoped_ptr<DirectoryBackingStore> dbs(
794 new DirectoryBackingStore(GetUsername(), GetDatabasePath()));
795
796 dbs->BeginLoad();
797 ASSERT_FALSE(dbs->needs_column_refresh_);
798 ASSERT_TRUE(dbs->MigrateVersion71To72());
799 ASSERT_EQ(72, dbs->GetVersion());
800 dbs->EndLoad();
801 ASSERT_FALSE(dbs->needs_column_refresh_);
802
803 sql::Connection connection;
804 ASSERT_TRUE(connection.Open(GetDatabasePath()));
805 ASSERT_FALSE(connection.DoesTableExist("extended_attributes"));
806 }
807
677 TEST_P(MigrationTest, ToCurrentVersion) { 808 TEST_P(MigrationTest, ToCurrentVersion) {
678 switch (GetParam()) { 809 switch (GetParam()) {
679 case 67: 810 case 67:
680 SetUpVersion67Database(); 811 SetUpVersion67Database();
681 break; 812 break;
682 case 68: 813 case 68:
683 SetUpVersion68Database(); 814 SetUpVersion68Database();
684 break; 815 break;
685 case 69: 816 case 69:
686 SetUpVersion69Database(); 817 SetUpVersion69Database();
687 break; 818 break;
688 case 70: 819 case 70:
689 SetUpVersion70Database(); 820 SetUpVersion70Database();
690 break; 821 break;
822 case 71:
823 SetUpVersion71Database();
824 break;
691 default: 825 default:
692 // If you see this error, it may mean that you've increased the 826 // If you see this error, it may mean that you've increased the
693 // database version number but you haven't finished adding unit tests 827 // database version number but you haven't finished adding unit tests
694 // for the database migration code. You need to need to supply a 828 // for the database migration code. You need to need to supply a
695 // SetUpVersionXXDatabase function with a dump of the test database 829 // SetUpVersionXXDatabase function with a dump of the test database
696 // at the old schema. Here's one way to do that: 830 // at the old schema. Here's one way to do that:
697 // 1. Start on a clean tree (with none of your pending schema changes). 831 // 1. Start on a clean tree (with none of your pending schema changes).
698 // 2. Set a breakpoint in this function and run the unit test. 832 // 2. Set a breakpoint in this function and run the unit test.
699 // 3. Allow this test to run to completion (step out of the call), 833 // 3. Allow this test to run to completion (step out of the call),
700 // without allowing ~MigrationTest to execute. 834 // without allowing ~MigrationTest to execute.
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
732 ASSERT_FALSE(connection.DoesColumnExist("metas", 866 ASSERT_FALSE(connection.DoesColumnExist("metas",
733 "server_is_bookmark_object")); 867 "server_is_bookmark_object"));
734 ASSERT_FALSE(connection.DoesColumnExist("metas", "bookmark_favicon")); 868 ASSERT_FALSE(connection.DoesColumnExist("metas", "bookmark_favicon"));
735 ASSERT_FALSE(connection.DoesColumnExist("metas", "bookmark_url")); 869 ASSERT_FALSE(connection.DoesColumnExist("metas", "bookmark_url"));
736 ASSERT_FALSE(connection.DoesColumnExist("metas", "server_bookmark_url")); 870 ASSERT_FALSE(connection.DoesColumnExist("metas", "server_bookmark_url"));
737 871
738 // Renamed a column in Version 70 872 // Renamed a column in Version 70
739 ASSERT_FALSE(connection.DoesColumnExist("metas", "singleton_tag")); 873 ASSERT_FALSE(connection.DoesColumnExist("metas", "singleton_tag"));
740 ASSERT_TRUE(connection.DoesColumnExist("metas", "unique_server_tag")); 874 ASSERT_TRUE(connection.DoesColumnExist("metas", "unique_server_tag"));
741 ASSERT_TRUE(connection.DoesColumnExist("metas", "unique_client_tag")); 875 ASSERT_TRUE(connection.DoesColumnExist("metas", "unique_client_tag"));
876
877 // Removed extended attributes in Version 72.
878 ASSERT_FALSE(connection.DoesTableExist("extended_attributes"));
742 } 879 }
743 880
744 MetahandlesIndex index; 881 MetahandlesIndex index;
745 dbs->LoadEntries(&index); 882 dbs->LoadEntries(&index);
746 dbs->EndLoad(); 883 dbs->EndLoad();
747 884
748 MetahandlesIndex::iterator it = index.begin(); 885 MetahandlesIndex::iterator it = index.begin();
749 ASSERT_TRUE(it != index.end()); 886 ASSERT_TRUE(it != index.end());
750 ASSERT_EQ(1, (*it)->ref(META_HANDLE)); 887 ASSERT_EQ(1, (*it)->ref(META_HANDLE));
751 EXPECT_TRUE((*it)->ref(ID).IsRoot()); 888 EXPECT_TRUE((*it)->ref(ID).IsRoot());
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after
900 // over if it detects invalid/corrupted data. 1037 // over if it detects invalid/corrupted data.
901 #if defined(NDEBUG) 1038 #if defined(NDEBUG)
902 EXPECT_TRUE(dbs->BeginLoad()); 1039 EXPECT_TRUE(dbs->BeginLoad());
903 #else 1040 #else
904 EXPECT_DEATH(dbs->BeginLoad(), "sqlite error"); 1041 EXPECT_DEATH(dbs->BeginLoad(), "sqlite error");
905 #endif 1042 #endif
906 } 1043 }
907 } 1044 }
908 1045
909 } // namespace syncable 1046 } // namespace syncable
OLDNEW
« no previous file with comments | « chrome/browser/sync/syncable/directory_backing_store.cc ('k') | chrome/browser/sync/syncable/syncable.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698