1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "components/enhanced_bookmarks/enhanced_bookmark_model.h"
7 #include "base/base64.h"
8 #include "base/macros.h"
9 #include "base/memory/scoped_ptr.h"
10 #include "base/message_loop/message_loop.h"
11 #include "base/run_loop.h"
12 #include "base/strings/string_number_conversions.h"
13 #include "base/strings/string_util.h"
14 #include "base/strings/utf_string_conversions.h"
15 #include "components/bookmarks/browser/bookmark_model.h"
16 #include "components/bookmarks/browser/bookmark_node.h"
17 #include "components/bookmarks/test/test_bookmark_client.h"
18 #include "components/enhanced_bookmarks/enhanced_bookmark_model_observer.h"
19 #include "components/enhanced_bookmarks/proto/metadata.pb.h"
20 #include "testing/gtest/include/gtest/gtest.h"
23 using bookmarks::BookmarkModel
;
24 using enhanced_bookmarks::EnhancedBookmarkModel
;
27 const std::string
BOOKMARK_URL("http://example.com/index.html");
30 class EnhancedBookmarkModelTest
31 : public testing::Test
,
32 public enhanced_bookmarks::EnhancedBookmarkModelObserver
{
34 EnhancedBookmarkModelTest()
36 shutting_down_calls_(0),
40 all_user_nodes_removed_calls_(0),
41 remote_id_changed_calls_(0),
45 last_remote_id_node_(NULL
) {}
46 ~EnhancedBookmarkModelTest() override
{}
48 void SetUp() override
{
49 message_loop_
.reset(new base::MessageLoop(base::MessageLoop::TYPE_DEFAULT
));
50 bookmark_client_
.reset(new bookmarks::TestBookmarkClient());
51 bookmark_model_
.reset(bookmark_client_
->CreateModel().release());
52 model_
.reset(new EnhancedBookmarkModel(bookmark_model_
.get(), "v1.0"));
53 model_
->AddObserver(this);
56 void TearDown() override
{
60 bookmark_model_
.reset();
61 bookmark_client_
.reset();
62 message_loop_
.reset();
66 const BookmarkNode
* AddBookmark() {
67 return AddBookmark("Some title", bookmark_model_
->other_node());
70 const BookmarkNode
* AddFolder() {
71 return AddFolder("Some title", bookmark_model_
->other_node());
74 const BookmarkNode
* AddBookmark(const std::string
& name
,
75 const BookmarkNode
* parent
) {
76 return model_
->AddURL(parent
,
78 base::ASCIIToUTF16(name
),
83 const BookmarkNode
* AddFolder(const std::string
& name
,
84 const BookmarkNode
* parent
) {
85 return model_
->AddFolder(parent
, 0, base::ASCIIToUTF16(name
));
88 std::string
GetVersion(const BookmarkNode
* node
) {
89 return GetMetaInfoField(node
, "stars.version");
92 std::string
GetId(const BookmarkNode
* node
) {
93 return GetMetaInfoField(node
, "stars.id");
96 std::string
GetOldId(const BookmarkNode
* node
) {
97 return GetMetaInfoField(node
, "stars.oldId");
100 std::string
GetMetaInfoField(const BookmarkNode
* node
,
101 const std::string
& name
) {
103 if (!node
->GetMetaInfo(name
, &value
))
104 return std::string();
108 scoped_ptr
<base::MessageLoop
> message_loop_
;
109 scoped_ptr
<bookmarks::TestBookmarkClient
> bookmark_client_
;
110 scoped_ptr
<BookmarkModel
> bookmark_model_
;
111 scoped_ptr
<EnhancedBookmarkModel
> model_
;
113 // EnhancedBookmarkModelObserver implementation:
114 void EnhancedBookmarkModelLoaded() override
{ loaded_calls_
++; }
115 void EnhancedBookmarkModelShuttingDown() override
{ shutting_down_calls_
++; }
116 void EnhancedBookmarkAdded(const BookmarkNode
* node
) override
{
120 void EnhancedBookmarkRemoved(const BookmarkNode
* node
) override
{
122 last_removed_
= node
;
124 void EnhancedBookmarkNodeChanged(const BookmarkNode
* node
) override
{
126 last_changed_
= node
;
128 void EnhancedBookmarkAllUserNodesRemoved() override
{
129 all_user_nodes_removed_calls_
++;
131 void EnhancedBookmarkRemoteIdChanged(const BookmarkNode
* node
,
132 const std::string
& old_remote_id
,
133 const std::string
& remote_id
) override
{
134 remote_id_changed_calls_
++;
135 last_remote_id_node_
= node
;
136 last_old_remote_id_
= old_remote_id
;
137 last_remote_id_
= remote_id
;
140 // Observer call counters:
142 int shutting_down_calls_
;
146 int all_user_nodes_removed_calls_
;
147 int remote_id_changed_calls_
;
149 // Observer parameter cache:
150 const BookmarkNode
* last_added_
;
151 const BookmarkNode
* last_removed_
;
152 const BookmarkNode
* last_changed_
;
153 const BookmarkNode
* last_remote_id_node_
;
154 std::string last_old_remote_id_
;
155 std::string last_remote_id_
;
158 DISALLOW_COPY_AND_ASSIGN(EnhancedBookmarkModelTest
);
161 TEST_F(EnhancedBookmarkModelTest
, TestEmptySnippet
) {
162 const BookmarkNode
* node
= AddBookmark();
164 std::string
snippet(model_
->GetSnippet(node
));
165 EXPECT_EQ(snippet
, "");
168 TEST_F(EnhancedBookmarkModelTest
, TestSnippet
) {
169 const BookmarkNode
* node
= AddBookmark();
171 // Binary serialize the protobuf.
172 image::collections::PageData data
;
173 data
.set_snippet("I'm happy!");
174 ASSERT_TRUE(data
.IsInitialized());
176 bool result
= data
.SerializeToString(&output
);
179 // base64 encode the output.
181 base::Base64Encode(output
, &encoded
);
182 bookmark_model_
->SetNodeMetaInfo(node
, "stars.pageData", encoded
);
184 std::string
snippet(model_
->GetSnippet(node
));
185 EXPECT_EQ(snippet
, "I'm happy!");
188 TEST_F(EnhancedBookmarkModelTest
, TestBadEncodingSnippet
) {
189 const BookmarkNode
* node
= AddBookmark();
191 // Binary serialize the protobuf.
192 image::collections::PageData data
;
193 data
.set_snippet("You are happy!");
194 ASSERT_TRUE(data
.IsInitialized());
196 bool result
= data
.SerializeToString(&output
);
199 // don't base 64 encode the output.
200 bookmark_model_
->SetNodeMetaInfo(node
, "stars.pageData", output
);
202 std::string
snippet(model_
->GetSnippet(node
));
203 EXPECT_EQ(snippet
, "");
206 TEST_F(EnhancedBookmarkModelTest
, TestOriginalImage
) {
207 const BookmarkNode
* node
= AddBookmark();
209 image::collections::ImageData data
;
210 // Intentionally make raw pointer.
211 image::collections::ImageData_ImageInfo
* info
=
212 new image::collections::ImageData_ImageInfo
;
213 info
->set_url("http://example.com/foobar");
215 info
->set_height(55);
216 // This method consumes the pointer.
217 data
.set_allocated_original_info(info
);
220 bool result
= data
.SerializePartialToString(&output
);
223 // base64 encode the output.
225 base::Base64Encode(output
, &encoded
);
226 bookmark_model_
->SetNodeMetaInfo(node
, "stars.imageData", encoded
);
231 result
= model_
->GetOriginalImage(node
, &url
, &width
, &height
);
233 EXPECT_EQ(url
, GURL("http://example.com/foobar"));
234 EXPECT_EQ(width
, 15);
235 EXPECT_EQ(height
, 55);
238 TEST_F(EnhancedBookmarkModelTest
, TestThumbnailImage
) {
239 const BookmarkNode
* node
= AddBookmark();
241 image::collections::ImageData data
;
242 // Intentionally make raw pointer.
243 image::collections::ImageData_ImageInfo
* info
=
244 new image::collections::ImageData_ImageInfo
;
245 info
->set_url("http://example.com/foobar");
247 info
->set_height(55);
248 // This method consumes the pointer.
249 data
.set_allocated_thumbnail_info(info
);
252 bool result
= data
.SerializePartialToString(&output
);
255 // base64 encode the output.
257 base::Base64Encode(output
, &encoded
);
258 bookmark_model_
->SetNodeMetaInfo(node
, "stars.imageData", encoded
);
263 result
= model_
->GetThumbnailImage(node
, &url
, &width
, &height
);
265 EXPECT_EQ(url
, GURL("http://example.com/foobar"));
266 EXPECT_EQ(width
, 15);
267 EXPECT_EQ(height
, 55);
270 TEST_F(EnhancedBookmarkModelTest
, TestOriginalImageMissingDimensions
) {
271 const BookmarkNode
* node
= AddBookmark();
273 image::collections::ImageData data
;
274 // Intentionally make raw pointer.
275 image::collections::ImageData_ImageInfo
* info
=
276 new image::collections::ImageData_ImageInfo
;
277 info
->set_url("http://example.com/foobar");
278 // This method consumes the pointer.
279 data
.set_allocated_original_info(info
);
282 bool result
= data
.SerializePartialToString(&output
);
285 // base64 encode the output.
287 base::Base64Encode(output
, &encoded
);
288 bookmark_model_
->SetNodeMetaInfo(node
, "stars.imageData", encoded
);
293 result
= model_
->GetOriginalImage(node
, &url
, &width
, &height
);
294 ASSERT_FALSE(result
);
297 TEST_F(EnhancedBookmarkModelTest
, TestOriginalImageBadUrl
) {
298 const BookmarkNode
* node
= AddBookmark();
300 image::collections::ImageData data
;
301 // Intentionally make raw pointer.
302 image::collections::ImageData_ImageInfo
* info
=
303 new image::collections::ImageData_ImageInfo
;
304 info
->set_url("asdf. 13r");
306 info
->set_height(55);
307 // This method consumes the pointer.
308 data
.set_allocated_original_info(info
);
311 bool result
= data
.SerializePartialToString(&output
);
314 // base64 encode the output.
316 base::Base64Encode(output
, &encoded
);
317 bookmark_model_
->SetNodeMetaInfo(node
, "stars.imageData", encoded
);
322 result
= model_
->GetOriginalImage(node
, &url
, &width
, &height
);
323 ASSERT_FALSE(result
);
326 TEST_F(EnhancedBookmarkModelTest
, TestEncodeDecode
) {
327 const BookmarkNode
* node
= AddBookmark();
330 model_
->SetOriginalImage(node
, GURL("http://example.com/i.jpg"), 22, 33);
336 result
= model_
->GetOriginalImage(node
, &url
, &width
, &height
);
338 EXPECT_EQ(url
, GURL("http://example.com/i.jpg"));
339 EXPECT_EQ(width
, 22);
340 EXPECT_EQ(height
, 33);
341 EXPECT_EQ("v1.0", GetVersion(node
));
344 TEST_F(EnhancedBookmarkModelTest
, TestDoubleEncodeDecode
) {
345 const BookmarkNode
* node
= AddBookmark();
347 // Encode some information.
349 model_
->SetOriginalImage(node
, GURL("http://example.com/i.jpg"), 22, 33);
351 // Encode some different information.
353 model_
->SetOriginalImage(node
, GURL("http://example.com/i.jpg"), 33, 44);
359 result
= model_
->GetOriginalImage(node
, &url
, &width
, &height
);
361 EXPECT_EQ(url
, GURL("http://example.com/i.jpg"));
362 EXPECT_EQ(width
, 33);
363 EXPECT_EQ(height
, 44);
364 EXPECT_EQ("v1.0", GetVersion(node
));
367 TEST_F(EnhancedBookmarkModelTest
, TestRemoteId
) {
368 const BookmarkNode
* node
= AddBookmark();
369 // Verify that the remote id starts with the correct prefix.
370 EXPECT_TRUE(StartsWithASCII(model_
->GetRemoteId(node
), "ebc_", true));
372 // Getting the remote id for nodes that don't have them should return the
374 const BookmarkNode
* existing_node
=
375 bookmark_model_
->AddURL(bookmark_model_
->other_node(),
377 base::ASCIIToUTF16("Title"),
378 GURL(GURL(BOOKMARK_URL
)));
379 EXPECT_TRUE(model_
->GetRemoteId(existing_node
).empty());
381 // Folder nodes should not have a remote id set on creation.
382 const BookmarkNode
* folder_node
= AddFolder();
383 EXPECT_TRUE(model_
->GetRemoteId(folder_node
).empty());
386 TEST_F(EnhancedBookmarkModelTest
, TestEmptyDescription
) {
387 const BookmarkNode
* node
= AddBookmark();
389 std::string
description(model_
->GetDescription(node
));
390 EXPECT_EQ(description
, "");
393 TEST_F(EnhancedBookmarkModelTest
, TestDescription
) {
394 const BookmarkNode
* node
= AddBookmark();
395 const std::string
description("This is the most useful description of all.");
397 // Set the description.
398 model_
->SetDescription(node
, description
);
400 // Check the description is the one that was set.
401 EXPECT_EQ(model_
->GetDescription(node
), description
);
402 EXPECT_EQ("v1.0", GetVersion(node
));
405 // If there is no notes field, the description should fall back on the snippet.
406 TEST_F(EnhancedBookmarkModelTest
, TestDescriptionFallback
) {
407 const BookmarkNode
* node
= AddBookmark();
409 // Binary serialize the protobuf.
410 image::collections::PageData data
;
411 data
.set_snippet("Joe Bar Team");
412 ASSERT_TRUE(data
.IsInitialized());
414 bool result
= data
.SerializeToString(&output
);
417 // base64 encode the output.
419 base::Base64Encode(output
, &encoded
);
420 bookmark_model_
->SetNodeMetaInfo(node
, "stars.pageData", encoded
);
422 // The snippet is used as the description.
423 std::string
snippet(model_
->GetSnippet(node
));
424 EXPECT_EQ("Joe Bar Team", model_
->GetDescription(node
));
426 // Set the description.
427 const std::string
description("This is the most useful description of all.");
428 model_
->SetDescription(node
, description
);
430 // Check the description is the one that was set.
431 EXPECT_EQ(model_
->GetDescription(node
), description
);
434 // Makes sure that the stars.version field is set every time
435 // EnhancedBookmarkModel makes a change to a node.
436 TEST_F(EnhancedBookmarkModelTest
, TestVersionField
) {
437 const BookmarkNode
* node
=
438 bookmark_model_
->AddURL(bookmark_model_
->other_node(), 0,
439 base::ASCIIToUTF16("Title"), GURL(BOOKMARK_URL
));
440 EXPECT_EQ("", GetVersion(node
));
442 model_
->SetDescription(node
, "foo");
443 EXPECT_EQ("v1.0", GetVersion(node
));
445 // Add a suffix to the version to set.
446 model_
->SetVersionSuffix("alpha");
448 model_
->SetDescription(node
, "foo");
449 // Since the description didn't actually change, the version field should
451 EXPECT_EQ("v1.0", GetVersion(node
));
453 model_
->SetDescription(node
, "bar");
454 EXPECT_EQ("v1.0/alpha", GetVersion(node
));
457 // Verifies that duplicate nodes are reset when the model is created.
458 TEST_F(EnhancedBookmarkModelTest
, ResetDuplicateNodesOnInitialization
) {
461 const BookmarkNode
* parent
= bookmark_model_
->other_node();
462 const BookmarkNode
* node1
= bookmark_model_
->AddURL(
463 parent
, 0, base::ASCIIToUTF16("Some title"), GURL(BOOKMARK_URL
));
464 const BookmarkNode
* node2
= bookmark_model_
->AddURL(
465 parent
, 0, base::ASCIIToUTF16("Some title"), GURL(BOOKMARK_URL
));
466 const BookmarkNode
* node3
= bookmark_model_
->AddURL(
467 parent
, 0, base::ASCIIToUTF16("Some title"), GURL(BOOKMARK_URL
));
468 const BookmarkNode
* node4
= bookmark_model_
->AddURL(
469 parent
, 0, base::ASCIIToUTF16("Some title"), GURL(BOOKMARK_URL
));
471 bookmark_model_
->SetNodeMetaInfo(node1
, "stars.id", "c_1");
472 bookmark_model_
->SetNodeMetaInfo(node2
, "stars.id", "c_2");
473 bookmark_model_
->SetNodeMetaInfo(node3
, "stars.id", "c_1");
474 bookmark_model_
->SetNodeMetaInfo(node4
, "stars.id", "c_1");
475 EXPECT_EQ("c_1", GetId(node1
));
476 EXPECT_EQ("c_2", GetId(node2
));
477 EXPECT_EQ("c_1", GetId(node3
));
478 EXPECT_EQ("c_1", GetId(node4
));
480 model_
.reset(new EnhancedBookmarkModel(bookmark_model_
.get(), "v2.0"));
481 base::RunLoop().RunUntilIdle();
482 EXPECT_EQ("c_2", GetId(node2
));
483 EXPECT_EQ("", GetId(node1
));
484 EXPECT_EQ("", GetId(node3
));
485 EXPECT_EQ("", GetId(node4
));
486 EXPECT_EQ("c_1", GetOldId(node1
));
487 EXPECT_EQ("c_1", GetOldId(node3
));
488 EXPECT_EQ("c_1", GetOldId(node4
));
489 EXPECT_EQ("v2.0", GetVersion(node1
));
490 EXPECT_EQ("v2.0", GetVersion(node3
));
491 EXPECT_EQ("v2.0", GetVersion(node4
));
494 // Verifies that duplicate nodes are reset if one is created.
495 TEST_F(EnhancedBookmarkModelTest
, ResetDuplicateAddedNodes
) {
496 BookmarkNode::MetaInfoMap meta_info
;
497 meta_info
["stars.id"] = "c_1";
498 const BookmarkNode
* parent
= bookmark_model_
->other_node();
500 const BookmarkNode
* node1
=
501 bookmark_model_
->AddURLWithCreationTimeAndMetaInfo(
504 base::ASCIIToUTF16("Some title"),
508 EXPECT_EQ("c_1", GetId(node1
));
510 const BookmarkNode
* node2
=
511 bookmark_model_
->AddURLWithCreationTimeAndMetaInfo(
514 base::ASCIIToUTF16("Some title"),
519 base::RunLoop().RunUntilIdle();
520 EXPECT_EQ("", GetId(node1
));
521 EXPECT_EQ("", GetId(node2
));
522 EXPECT_EQ("c_1", GetOldId(node1
));
523 EXPECT_EQ("c_1", GetOldId(node2
));
524 EXPECT_EQ("v1.0", GetVersion(node1
));
525 EXPECT_EQ("v1.0", GetVersion(node2
));
528 // Verifies that duplicate nodes are reset if an id is changed to a duplicate
530 TEST_F(EnhancedBookmarkModelTest
, ResetDuplicateChangedNodes
) {
531 const BookmarkNode
* node1
= AddBookmark();
532 const BookmarkNode
* node2
= AddBookmark();
534 bookmark_model_
->SetNodeMetaInfo(node1
, "stars.id", "c_1");
535 EXPECT_EQ("c_1", GetId(node1
));
537 bookmark_model_
->SetNodeMetaInfo(node2
, "stars.id", "c_1");
538 base::RunLoop().RunUntilIdle();
539 EXPECT_EQ("", GetId(node1
));
540 EXPECT_EQ("", GetId(node2
));
541 EXPECT_EQ("c_1", GetOldId(node1
));
542 EXPECT_EQ("c_1", GetOldId(node2
));
543 EXPECT_EQ("v1.0", GetVersion(node1
));
544 EXPECT_EQ("v1.0", GetVersion(node2
));
547 TEST_F(EnhancedBookmarkModelTest
, SetMultipleMetaInfo
) {
548 const BookmarkNode
* node
= AddBookmark();
549 BookmarkNode::MetaInfoMap meta_info
;
550 meta_info
["a"] = "aa";
551 meta_info
["b"] = "bb";
553 model_
->SetVersionSuffix("1");
554 model_
->SetMultipleMetaInfo(node
, meta_info
);
555 EXPECT_EQ("aa", GetMetaInfoField(node
, "a"));
556 EXPECT_EQ("bb", GetMetaInfoField(node
, "b"));
557 EXPECT_EQ("v1.0/1", GetVersion(node
));
559 // Not present fields does not erase the fields already set on the node.
560 meta_info
["a"] = "aaa";
561 model_
->SetVersionSuffix("2");
562 model_
->SetMultipleMetaInfo(node
, meta_info
);
563 EXPECT_EQ("aaa", GetMetaInfoField(node
, "a"));
564 EXPECT_EQ("bb", GetMetaInfoField(node
, "b"));
565 EXPECT_EQ("v1.0/2", GetVersion(node
));
567 // Not actually changing any values should not set the version field.
568 model_
->SetVersionSuffix("3");
569 model_
->SetMultipleMetaInfo(node
, meta_info
);
570 EXPECT_EQ("v1.0/2", GetVersion(node
));
573 TEST_F(EnhancedBookmarkModelTest
, ObserverShuttingDownEvent
) {
574 EXPECT_EQ(0, shutting_down_calls_
);
576 EXPECT_EQ(1, shutting_down_calls_
);
580 TEST_F(EnhancedBookmarkModelTest
, ObserverNodeAddedEvent
) {
581 EXPECT_EQ(0, added_calls_
);
582 const BookmarkNode
* node
= AddBookmark();
583 EXPECT_EQ(1, added_calls_
);
584 EXPECT_EQ(node
, last_added_
);
586 const BookmarkNode
* folder
= AddFolder();
587 EXPECT_EQ(2, added_calls_
);
588 EXPECT_EQ(folder
, last_added_
);
591 TEST_F(EnhancedBookmarkModelTest
, ObserverNodeRemovedEvent
) {
592 const BookmarkNode
* node
= AddBookmark();
593 const BookmarkNode
* folder
= AddFolder();
595 EXPECT_EQ(0, removed_calls_
);
596 bookmark_model_
->Remove(node
->parent(), node
->parent()->GetIndexOf(node
));
597 EXPECT_EQ(1, removed_calls_
);
598 EXPECT_EQ(node
, last_removed_
);
600 bookmark_model_
->Remove(folder
->parent(),
601 folder
->parent()->GetIndexOf(folder
));
602 EXPECT_EQ(2, removed_calls_
);
603 EXPECT_EQ(folder
, last_removed_
);
606 TEST_F(EnhancedBookmarkModelTest
, ObserverNodeChangedEvent
) {
607 const BookmarkNode
* node
= AddBookmark();
609 EXPECT_EQ(0, changed_calls_
);
610 bookmark_model_
->SetTitle(node
, base::ASCIIToUTF16("New Title"));
611 EXPECT_EQ(1, changed_calls_
);
612 EXPECT_EQ(node
, last_changed_
);
615 TEST_F(EnhancedBookmarkModelTest
, ObserverAllUserNodesRemovedEvent
) {
618 EXPECT_EQ(0, all_user_nodes_removed_calls_
);
619 bookmark_model_
->RemoveAllUserBookmarks();
620 EXPECT_EQ(0, removed_calls_
);
621 EXPECT_EQ(1, all_user_nodes_removed_calls_
);
624 TEST_F(EnhancedBookmarkModelTest
, ObserverRemoteIdChangedEvent
) {
625 const BookmarkNode
* node1
= AddFolder();
626 const BookmarkNode
* node2
= AddFolder();
628 EXPECT_EQ(0, remote_id_changed_calls_
);
629 bookmark_model_
->SetNodeMetaInfo(node1
, "stars.id", "c_1");
630 base::RunLoop().RunUntilIdle();
631 EXPECT_EQ(1, remote_id_changed_calls_
);
632 EXPECT_EQ(node1
, last_remote_id_node_
);
633 EXPECT_EQ("", last_old_remote_id_
);
634 EXPECT_EQ("c_1", last_remote_id_
);
636 bookmark_model_
->SetNodeMetaInfo(node2
, "stars.id", "c_2");
637 base::RunLoop().RunUntilIdle();
638 EXPECT_EQ(2, remote_id_changed_calls_
);
639 EXPECT_EQ(node2
, last_remote_id_node_
);
640 EXPECT_EQ("", last_old_remote_id_
);
641 EXPECT_EQ("c_2", last_remote_id_
);
643 bookmark_model_
->SetNodeMetaInfo(node1
, "stars.id", "c_3");
644 base::RunLoop().RunUntilIdle();
645 EXPECT_EQ(3, remote_id_changed_calls_
);
646 EXPECT_EQ(node1
, last_remote_id_node_
);
647 EXPECT_EQ("c_1", last_old_remote_id_
);
648 EXPECT_EQ("c_3", last_remote_id_
);
650 // Set to duplicate ids.
651 bookmark_model_
->SetNodeMetaInfo(node2
, "stars.id", "c_3");
652 EXPECT_EQ(4, remote_id_changed_calls_
);
653 EXPECT_EQ(node2
, last_remote_id_node_
);
654 EXPECT_EQ("c_2", last_old_remote_id_
);
655 EXPECT_EQ("c_3", last_remote_id_
);
656 base::RunLoop().RunUntilIdle();
657 EXPECT_EQ(6, remote_id_changed_calls_
);
658 EXPECT_EQ("", last_remote_id_
);
661 TEST_F(EnhancedBookmarkModelTest
, ShutDownWhileResetDuplicationScheduled
) {
662 const BookmarkNode
* node1
= AddBookmark();
663 const BookmarkNode
* node2
= AddBookmark();
664 bookmark_model_
->SetNodeMetaInfo(node1
, "stars.id", "c_1");
665 bookmark_model_
->SetNodeMetaInfo(node2
, "stars.id", "c_1");
668 base::RunLoop().RunUntilIdle();
671 TEST_F(EnhancedBookmarkModelTest
, NodeRemovedWhileResetDuplicationScheduled
) {
672 const BookmarkNode
* node1
= AddBookmark();
673 const BookmarkNode
* node2
= AddBookmark();
674 bookmark_model_
->SetNodeMetaInfo(node1
, "stars.id", "c_1");
675 bookmark_model_
->SetNodeMetaInfo(node2
, "stars.id", "c_1");
676 bookmark_model_
->Remove(node1
->parent(), node1
->parent()->GetIndexOf(node1
));
677 base::RunLoop().RunUntilIdle();
680 // Verifies that the NEEDS_OFFLINE_PROCESSING flag is set for nodes added
681 // with no remote id.
682 TEST_F(EnhancedBookmarkModelTest
, BookmarkAddedSetsOfflineProcessingFlag
) {
683 const BookmarkNode
* node
=
684 bookmark_model_
->AddURL(bookmark_model_
->other_node(),
686 base::ASCIIToUTF16("Some title"),
688 std::string flags_str
;
689 EXPECT_FALSE(node
->GetMetaInfo("stars.flags", &flags_str
));
690 base::RunLoop().RunUntilIdle();
691 ASSERT_TRUE(node
->GetMetaInfo("stars.flags", &flags_str
));
693 ASSERT_TRUE(base::StringToInt(flags_str
, &flags
));
694 EXPECT_EQ(1, (flags
& 1));
697 // Verifies that the NEEDS_OFFLINE_PROCESSING_FLAG is not set for added folders.
698 TEST_F(EnhancedBookmarkModelTest
, FolderAddedDoesNotSetOfflineProcessingFlag
) {
699 const BookmarkNode
* node
= AddFolder();
700 base::RunLoop().RunUntilIdle();
702 std::string flags_str
;
703 if (node
->GetMetaInfo("stars.flags", &flags_str
)) {
705 ASSERT_TRUE(base::StringToInt(flags_str
, &flags
));
706 EXPECT_EQ(0, (flags
& 1));
710 // Verifies that when a bookmark is added that has a remote id, the status of
711 // the NEEDS_OFFLINE_PROCESSING flag doesn't change.
712 TEST_F(EnhancedBookmarkModelTest
,
713 BookmarkAddedWithIdKeepsOfflineProcessingFlag
) {
714 BookmarkNode::MetaInfoMap meta_info
;
715 meta_info
["stars.id"] = "some_id";
716 meta_info
["stars.flags"] = "1";
718 const BookmarkNode
* node1
=
719 bookmark_model_
->AddURLWithCreationTimeAndMetaInfo(
720 bookmark_model_
->other_node(),
722 base::ASCIIToUTF16("Some title"),
726 base::RunLoop().RunUntilIdle();
727 std::string flags_str
;
728 ASSERT_TRUE(node1
->GetMetaInfo("stars.flags", &flags_str
));
730 ASSERT_TRUE(base::StringToInt(flags_str
, &flags
));
731 EXPECT_EQ(1, (flags
& 1));
733 meta_info
["stars.flags"] = "0";
734 const BookmarkNode
* node2
=
735 bookmark_model_
->AddURLWithCreationTimeAndMetaInfo(
736 bookmark_model_
->other_node(),
738 base::ASCIIToUTF16("Some title"),
742 base::RunLoop().RunUntilIdle();
743 ASSERT_TRUE(node2
->GetMetaInfo("stars.flags", &flags_str
));
744 ASSERT_TRUE(base::StringToInt(flags_str
, &flags
));
745 EXPECT_EQ(0, (flags
& 1));
748 TEST_F(EnhancedBookmarkModelTest
,
749 NodeRemovedWhileSetNeedsOfflineProcessingIsScheduled
) {
750 const BookmarkNode
* node
=
751 bookmark_model_
->AddURL(bookmark_model_
->other_node(),
753 base::ASCIIToUTF16("Some title"),
755 bookmark_model_
->Remove(node
->parent(), node
->parent()->GetIndexOf(node
));
756 base::RunLoop().RunUntilIdle();
759 TEST_F(EnhancedBookmarkModelTest
,
760 RemoveParentShouldRemoveChildrenFromMaps
) {
761 const BookmarkNode
* parent
= AddFolder();
762 const BookmarkNode
* node
= AddBookmark("Title", parent
);
763 std::string remote_id
= GetId(node
);
764 EXPECT_EQ(node
, model_
->BookmarkForRemoteId(remote_id
));
766 const BookmarkNode
* gp
= parent
->parent();
767 bookmark_model_
->Remove(gp
, gp
->GetIndexOf(parent
));
768 EXPECT_FALSE(model_
->BookmarkForRemoteId(remote_id
));
771 TEST_F(EnhancedBookmarkModelTest
, AddsRemoteIdToNonClonedKeys
) {
772 const std::set
<std::string
>& non_cloned_keys
=
773 bookmark_model_
->non_cloned_keys();
774 EXPECT_TRUE(non_cloned_keys
.find("stars.id") != non_cloned_keys
.end());