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 "components/bookmarks/core/browser/bookmark_model.h" | 5 #include "components/bookmarks/core/browser/bookmark_model.h" |
6 | 6 |
7 #include <set> | 7 #include <set> |
8 #include <string> | 8 #include <string> |
9 | 9 |
10 #include "base/base_paths.h" | 10 #include "base/base_paths.h" |
11 #include "base/basictypes.h" | 11 #include "base/basictypes.h" |
12 #include "base/command_line.h" | 12 #include "base/command_line.h" |
13 #include "base/compiler_specific.h" | 13 #include "base/compiler_specific.h" |
14 #include "base/containers/hash_tables.h" | 14 #include "base/containers/hash_tables.h" |
15 #include "base/path_service.h" | 15 #include "base/path_service.h" |
16 #include "base/strings/string16.h" | 16 #include "base/strings/string16.h" |
17 #include "base/strings/string_number_conversions.h" | 17 #include "base/strings/string_number_conversions.h" |
18 #include "base/strings/string_split.h" | 18 #include "base/strings/string_split.h" |
19 #include "base/strings/string_util.h" | 19 #include "base/strings/string_util.h" |
20 #include "base/strings/utf_string_conversions.h" | 20 #include "base/strings/utf_string_conversions.h" |
21 #include "base/time/time.h" | 21 #include "base/time/time.h" |
22 #include "chrome/browser/bookmarks/bookmark_model_factory.h" | |
23 #include "chrome/test/base/testing_profile.h" | |
24 #include "components/bookmarks/core/browser/bookmark_model_observer.h" | 22 #include "components/bookmarks/core/browser/bookmark_model_observer.h" |
25 #include "components/bookmarks/core/browser/bookmark_utils.h" | 23 #include "components/bookmarks/core/browser/bookmark_utils.h" |
26 #include "components/bookmarks/core/test/bookmark_test_helpers.h" | 24 #include "components/bookmarks/core/test/bookmark_test_helpers.h" |
27 #include "components/bookmarks/core/test/test_bookmark_client.h" | 25 #include "components/bookmarks/core/test/test_bookmark_client.h" |
28 #include "content/public/test/test_browser_thread_bundle.h" | |
29 #include "testing/gtest/include/gtest/gtest.h" | 26 #include "testing/gtest/include/gtest/gtest.h" |
30 #include "ui/base/models/tree_node_iterator.h" | 27 #include "ui/base/models/tree_node_iterator.h" |
31 #include "ui/base/models/tree_node_model.h" | 28 #include "ui/base/models/tree_node_model.h" |
32 #include "url/gurl.h" | 29 #include "url/gurl.h" |
33 | 30 |
34 using base::ASCIIToUTF16; | 31 using base::ASCIIToUTF16; |
35 using base::Time; | 32 using base::Time; |
36 using base::TimeDelta; | 33 using base::TimeDelta; |
37 | 34 |
38 namespace { | 35 namespace { |
(...skipping 853 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
892 } else { | 889 } else { |
893 model->AddURL(bb_node, i, child->GetTitle(), | 890 model->AddURL(bb_node, i, child->GetTitle(), |
894 GURL("http://" + base::UTF16ToASCII(child->GetTitle()))); | 891 GURL("http://" + base::UTF16ToASCII(child->GetTitle()))); |
895 } | 892 } |
896 } | 893 } |
897 } | 894 } |
898 | 895 |
899 // Test class that creates a BookmarkModel with a real history backend. | 896 // Test class that creates a BookmarkModel with a real history backend. |
900 class BookmarkModelTestWithProfile : public testing::Test { | 897 class BookmarkModelTestWithProfile : public testing::Test { |
901 public: | 898 public: |
902 BookmarkModelTestWithProfile() | 899 BookmarkModelTestWithProfile() {} |
903 : bb_model_(NULL) {} | |
904 | |
905 // testing::Test: | |
906 virtual void TearDown() OVERRIDE { | |
907 profile_.reset(NULL); | |
908 } | |
909 | 900 |
910 protected: | 901 protected: |
911 // Verifies the contents of the bookmark bar node match the contents of the | 902 // Verifies the contents of the bookmark bar node match the contents of the |
912 // TestNode. | 903 // TestNode. |
913 void VerifyModelMatchesNode(TestNode* expected, const BookmarkNode* actual) { | 904 void VerifyModelMatchesNode(TestNode* expected, const BookmarkNode* actual) { |
914 ASSERT_EQ(expected->child_count(), actual->child_count()); | 905 ASSERT_EQ(expected->child_count(), actual->child_count()); |
915 for (int i = 0; i < expected->child_count(); ++i) { | 906 for (int i = 0; i < expected->child_count(); ++i) { |
916 TestNode* expected_child = expected->GetChild(i); | 907 TestNode* expected_child = expected->GetChild(i); |
917 const BookmarkNode* actual_child = actual->GetChild(i); | 908 const BookmarkNode* actual_child = actual->GetChild(i); |
918 ASSERT_EQ(expected_child->GetTitle(), actual_child->GetTitle()); | 909 ASSERT_EQ(expected_child->GetTitle(), actual_child->GetTitle()); |
(...skipping 10 matching lines...) Expand all Loading... |
929 } | 920 } |
930 } | 921 } |
931 | 922 |
932 void VerifyNoDuplicateIDs(BookmarkModel* model) { | 923 void VerifyNoDuplicateIDs(BookmarkModel* model) { |
933 ui::TreeNodeIterator<const BookmarkNode> it(model->root_node()); | 924 ui::TreeNodeIterator<const BookmarkNode> it(model->root_node()); |
934 base::hash_set<int64> ids; | 925 base::hash_set<int64> ids; |
935 while (it.has_next()) | 926 while (it.has_next()) |
936 ASSERT_TRUE(ids.insert(it.Next()->id()).second); | 927 ASSERT_TRUE(ids.insert(it.Next()->id()).second); |
937 } | 928 } |
938 | 929 |
939 void BlockTillBookmarkModelLoaded() { | 930 test::TestBookmarkClient client_; |
940 bb_model_ = BookmarkModelFactory::GetForProfile(profile_.get()); | 931 scoped_ptr<BookmarkModel> model_; |
941 test::WaitForBookmarkModelToLoad(bb_model_); | |
942 } | |
943 | |
944 // The profile. | |
945 scoped_ptr<TestingProfile> profile_; | |
946 BookmarkModel* bb_model_; | |
947 | |
948 private: | |
949 content::TestBrowserThreadBundle thread_bundle_; | |
950 }; | 932 }; |
951 | 933 |
952 // Creates a set of nodes in the bookmark bar model, then recreates the | 934 // Creates a set of nodes in the bookmark bar model, then recreates the |
953 // bookmark bar model which triggers loading from the db and checks the loaded | 935 // bookmark bar model which triggers loading from the db and checks the loaded |
954 // structure to make sure it is what we first created. | 936 // structure to make sure it is what we first created. |
955 TEST_F(BookmarkModelTestWithProfile, CreateAndRestore) { | 937 TEST_F(BookmarkModelTestWithProfile, CreateAndRestore) { |
956 struct TestData { | 938 struct TestData { |
957 // Structure of the children of the bookmark bar model node. | 939 // Structure of the children of the bookmark bar model node. |
958 const std::string bbn_contents; | 940 const std::string bbn_contents; |
959 // Structure of the children of the other node. | 941 // Structure of the children of the other node. |
960 const std::string other_contents; | 942 const std::string other_contents; |
961 // Structure of the children of the synced node. | 943 // Structure of the children of the synced node. |
962 const std::string mobile_contents; | 944 const std::string mobile_contents; |
963 } data[] = { | 945 } data[] = { |
964 // See PopulateNodeFromString for a description of these strings. | 946 // See PopulateNodeFromString for a description of these strings. |
965 { "", "" }, | 947 { "", "" }, |
966 { "a", "b" }, | 948 { "a", "b" }, |
967 { "a [ b ]", "" }, | 949 { "a [ b ]", "" }, |
968 { "", "[ b ] a [ c [ d e [ f ] ] ]" }, | 950 { "", "[ b ] a [ c [ d e [ f ] ] ]" }, |
969 { "a [ b ]", "" }, | 951 { "a [ b ]", "" }, |
970 { "a b c [ d e [ f ] ]", "g h i [ j k [ l ] ]"}, | 952 { "a b c [ d e [ f ] ]", "g h i [ j k [ l ] ]"}, |
971 }; | 953 }; |
972 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(data); ++i) { | 954 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(data); ++i) { |
973 // Recreate the profile. We need to reset with NULL first so that the last | 955 model_ = client_.CreateModel(false); |
974 // HistoryService releases the locks on the files it creates and we can | |
975 // delete them. | |
976 profile_.reset(NULL); | |
977 profile_.reset(new TestingProfile()); | |
978 profile_->CreateBookmarkModel(true); | |
979 ASSERT_TRUE(profile_->CreateHistoryService(true, false)); | |
980 BlockTillBookmarkModelLoaded(); | |
981 | 956 |
982 TestNode bbn; | 957 TestNode bbn; |
983 PopulateNodeFromString(data[i].bbn_contents, &bbn); | 958 PopulateNodeFromString(data[i].bbn_contents, &bbn); |
984 PopulateBookmarkNode(&bbn, bb_model_, bb_model_->bookmark_bar_node()); | 959 PopulateBookmarkNode(&bbn, model_.get(), model_->bookmark_bar_node()); |
985 | 960 |
986 TestNode other; | 961 TestNode other; |
987 PopulateNodeFromString(data[i].other_contents, &other); | 962 PopulateNodeFromString(data[i].other_contents, &other); |
988 PopulateBookmarkNode(&other, bb_model_, bb_model_->other_node()); | 963 PopulateBookmarkNode(&other, model_.get(), model_->other_node()); |
989 | 964 |
990 TestNode mobile; | 965 TestNode mobile; |
991 PopulateNodeFromString(data[i].mobile_contents, &mobile); | 966 PopulateNodeFromString(data[i].mobile_contents, &mobile); |
992 PopulateBookmarkNode(&mobile, bb_model_, bb_model_->mobile_node()); | 967 PopulateBookmarkNode(&mobile, model_.get(), model_->mobile_node()); |
993 | 968 |
994 profile_->CreateBookmarkModel(false); | 969 VerifyModelMatchesNode(&bbn, model_->bookmark_bar_node()); |
995 BlockTillBookmarkModelLoaded(); | 970 VerifyModelMatchesNode(&other, model_->other_node()); |
996 | 971 VerifyModelMatchesNode(&mobile, model_->mobile_node()); |
997 VerifyModelMatchesNode(&bbn, bb_model_->bookmark_bar_node()); | 972 VerifyNoDuplicateIDs(model_.get()); |
998 VerifyModelMatchesNode(&other, bb_model_->other_node()); | |
999 VerifyModelMatchesNode(&mobile, bb_model_->mobile_node()); | |
1000 VerifyNoDuplicateIDs(bb_model_); | |
1001 } | 973 } |
1002 } | 974 } |
1003 | 975 |
1004 TEST_F(BookmarkModelTest, Sort) { | 976 TEST_F(BookmarkModelTest, Sort) { |
1005 // Populate the bookmark bar node with nodes for 'B', 'a', 'd' and 'C'. | 977 // Populate the bookmark bar node with nodes for 'B', 'a', 'd' and 'C'. |
1006 // 'C' and 'a' are folders. | 978 // 'C' and 'a' are folders. |
1007 TestNode bbn; | 979 TestNode bbn; |
1008 PopulateNodeFromString("B [ a ] d [ a ]", &bbn); | 980 PopulateNodeFromString("B [ a ] d [ a ]", &bbn); |
1009 const BookmarkNode* parent = model_->bookmark_bar_node(); | 981 const BookmarkNode* parent = model_->bookmark_bar_node(); |
1010 PopulateBookmarkNode(&bbn, model_.get(), parent); | 982 PopulateBookmarkNode(&bbn, model_.get(), parent); |
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1151 EXPECT_TRUE(node.DeleteMetaInfo("key2.subkey2.leaf")); | 1123 EXPECT_TRUE(node.DeleteMetaInfo("key2.subkey2.leaf")); |
1152 EXPECT_FALSE(node.DeleteMetaInfo("key3")); | 1124 EXPECT_FALSE(node.DeleteMetaInfo("key3")); |
1153 EXPECT_FALSE(node.GetMetaInfo("key1", &out_value)); | 1125 EXPECT_FALSE(node.GetMetaInfo("key1", &out_value)); |
1154 EXPECT_FALSE(node.GetMetaInfo("key2.subkey1", &out_value)); | 1126 EXPECT_FALSE(node.GetMetaInfo("key2.subkey1", &out_value)); |
1155 EXPECT_FALSE(node.GetMetaInfo("key2.subkey2", &out_value)); | 1127 EXPECT_FALSE(node.GetMetaInfo("key2.subkey2", &out_value)); |
1156 EXPECT_FALSE(node.GetMetaInfo("key2.subkey2.leaf", &out_value)); | 1128 EXPECT_FALSE(node.GetMetaInfo("key2.subkey2.leaf", &out_value)); |
1157 EXPECT_FALSE(node.GetMetaInfoMap()); | 1129 EXPECT_FALSE(node.GetMetaInfoMap()); |
1158 } | 1130 } |
1159 | 1131 |
1160 } // namespace | 1132 } // namespace |
OLD | NEW |