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

Side by Side Diff: chrome/test/live_sync/bookmarks_helper.cc

Issue 7259005: Allow sync integration tests to operate on multiple datatypes: Preferences + Bookmarks (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Add BookmarksHelper class. (TODO: Trim lines to 80 chars) Created 9 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 | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright (c) 2011 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.
4
5 #include "chrome/test/live_sync/bookmarks_helper.h"
6
7 #include "base/rand_util.h"
8 #include "base/string_number_conversions.h"
9 #include "base/stringprintf.h"
10 #include "base/utf_string_conversions.h"
11 #include "chrome/browser/bookmarks/bookmark_model.h"
12 #include "chrome/browser/bookmarks/bookmark_model_observer.h"
13 #include "chrome/browser/bookmarks/bookmark_utils.h"
14 #include "chrome/browser/profiles/profile.h"
15 #include "chrome/browser/sync/glue/bookmark_change_processor.h"
16 #include "chrome/browser/sync/profile_sync_service_harness.h"
17 #include "chrome/test/live_sync/live_sync_test.h"
18 #include "chrome/test/ui_test_utils.h"
19 #include "testing/gtest/include/gtest/gtest.h"
20 #include "third_party/skia/include/core/SkBitmap.h"
21 #include "ui/base/models/tree_node_iterator.h"
22 #include "ui/gfx/codec/png_codec.h"
23
24 namespace {
25
26 // Helper class used to wait for changes to take effect on the favicon of a
27 // particular bookmark node in a particular bookmark model.
28 class FaviconChangeObserver : public BookmarkModelObserver {
29 public:
30 FaviconChangeObserver(BookmarkModel* model, const BookmarkNode* node)
31 : model_(model),
32 node_(node),
33 wait_for_load_(false) {
34 model->AddObserver(this);
35 }
36 virtual ~FaviconChangeObserver() {
37 model_->RemoveObserver(this);
38 }
39 void WaitForGetFavicon() {
40 wait_for_load_ = true;
41 ui_test_utils::RunMessageLoop();
42 ASSERT_TRUE(node_->is_favicon_loaded());
43 }
44 void WaitForSetFavicon() {
45 wait_for_load_ = false;
46 ui_test_utils::RunMessageLoop();
47 }
48 virtual void Loaded(BookmarkModel* model) OVERRIDE {}
49 virtual void BookmarkNodeMoved(BookmarkModel* model,
50 const BookmarkNode* old_parent,
51 int old_index,
52 const BookmarkNode* new_parent,
53 int new_index) OVERRIDE {}
54 virtual void BookmarkNodeAdded(BookmarkModel* model,
55 const BookmarkNode* parent,
56 int index) OVERRIDE {}
57 virtual void BookmarkNodeRemoved(BookmarkModel* model,
58 const BookmarkNode* parent,
59 int old_index,
60 const BookmarkNode* node) OVERRIDE {}
61 virtual void BookmarkNodeChanged(BookmarkModel* model,
62 const BookmarkNode* node) OVERRIDE {
63 if (model == model_ && node == node_)
64 model->GetFavicon(node);
65 }
66 virtual void BookmarkNodeChildrenReordered(
67 BookmarkModel* model,
68 const BookmarkNode* node) OVERRIDE {}
69 virtual void BookmarkNodeFaviconChanged(
70 BookmarkModel* model,
71 const BookmarkNode* node) OVERRIDE {
72 if (model == model_ && node == node_) {
73 if (!wait_for_load_ || (wait_for_load_ && node->is_favicon_loaded()))
74 MessageLoopForUI::current()->Quit();
75 }
76 }
77
78 private:
79 BookmarkModel* model_;
80 const BookmarkNode* node_;
81 bool wait_for_load_;
82 DISALLOW_COPY_AND_ASSIGN(FaviconChangeObserver);
83 };
84
85 } // namespace
86
87 BookmarksHelper::BookmarksHelper() {}
88
89 BookmarksHelper::~BookmarksHelper() {}
90
91 // static
92 BookmarkModel* BookmarksHelper::GetBookmarkModel(int index) {
93 return test()->GetProfile(index)->GetBookmarkModel();
94 }
95
96 // static
97 const BookmarkNode* BookmarksHelper::GetBookmarkBarNode(int index) {
98 return GetBookmarkModel(index)->GetBookmarkBarNode();
99 }
100
101 // static
102 const BookmarkNode* BookmarksHelper::GetOtherNode(int index) {
103 return GetBookmarkModel(index)->other_node();
104 }
105
106 // static
107 BookmarkModel* BookmarksHelper::GetVerifierBookmarkModel() {
108 return test()->verifier()->GetBookmarkModel();
109 }
110
111 // static
112 bool BookmarksHelper::EnableEncryption(int index) {
113 return test()->GetClient(index)->EnableEncryptionForType(syncable::BOOKMARKS);
114 }
115
116 // static
117 bool BookmarksHelper::IsEncrypted(int index) {
118 return test()->GetClient(index)->IsTypeEncrypted(syncable::BOOKMARKS);
119 }
120
121 // static
122 const BookmarkNode* BookmarksHelper::AddURL(int profile,
123 const std::wstring& title,
124 const GURL& url) {
125 return AddURL(profile, GetBookmarkBarNode(profile), 0, title, url);
126 }
127
128 // static
129 const BookmarkNode* BookmarksHelper::AddURL(int profile,
130 int index,
131 const std::wstring& title,
132 const GURL& url) {
133 return AddURL(profile, GetBookmarkBarNode(profile), index, title, url);
134 }
135
136 // static
137 const BookmarkNode* BookmarksHelper::AddURL(int profile,
138 const BookmarkNode* parent,
139 int index,
140 const std::wstring& title,
141 const GURL& url) {
142 if (GetBookmarkModel(profile)->GetNodeByID(parent->id()) != parent) {
143 LOG(ERROR) << "Node " << parent->GetTitle() << " does not belong to "
144 << "Profile " << profile;
145 return NULL;
146 }
147 const BookmarkNode* result = GetBookmarkModel(profile)->
148 AddURL(parent, index, WideToUTF16(title), url);
149 if (!result) {
150 LOG(ERROR) << "Could not add bookmark " << title << " to Profile "
151 << profile;
152 return NULL;
153 }
154 if (test()->use_verifier()) {
155 const BookmarkNode* v_parent = NULL;
156 FindNodeInVerifier(GetBookmarkModel(profile), parent, &v_parent);
157 const BookmarkNode* v_node = GetVerifierBookmarkModel()->
158 AddURL(v_parent, index, WideToUTF16(title), url);
159 if (!v_node) {
160 LOG(ERROR) << "Could not add bookmark " << title << " to the verifier";
161 return NULL;
162 }
163 EXPECT_TRUE(NodesMatch(v_node, result));
164 }
165 return result;
166 }
167
168 // static
169 const BookmarkNode* BookmarksHelper::AddFolder(int profile,
170 const std::wstring& title) {
171 return AddFolder(profile, GetBookmarkBarNode(profile), 0, title);
172 }
173
174 // static
175 const BookmarkNode* BookmarksHelper::AddFolder(int profile,
176 int index,
177 const std::wstring& title) {
178 return AddFolder(profile, GetBookmarkBarNode(profile), index, title);
179 }
180
181 // static
182 const BookmarkNode* BookmarksHelper::AddFolder(int profile,
183 const BookmarkNode* parent,
184 int index,
185 const std::wstring& title) {
186 if (GetBookmarkModel(profile)->GetNodeByID(parent->id()) != parent) {
187 LOG(ERROR) << "Node " << parent->GetTitle() << " does not belong to "
188 << "Profile " << profile;
189 return NULL;
190 }
191 const BookmarkNode* result =
192 GetBookmarkModel(profile)->AddFolder(parent, index, WideToUTF16(title));
193 EXPECT_TRUE(result);
194 if (!result) {
195 LOG(ERROR) << "Could not add folder " << title << " to Profile "
196 << profile;
197 return NULL;
198 }
199 if (test()->use_verifier()) {
200 const BookmarkNode* v_parent = NULL;
201 FindNodeInVerifier(GetBookmarkModel(profile), parent, &v_parent);
202 const BookmarkNode* v_node = GetVerifierBookmarkModel()->AddFolder(
203 v_parent, index, WideToUTF16(title));
204 if (!v_node) {
205 LOG(ERROR) << "Could not add folder " << title << " to the verifier";
206 return NULL;
207 }
208 EXPECT_TRUE(NodesMatch(v_node, result));
209 }
210 return result;
211 }
212
213 // static
214 void BookmarksHelper::SetTitle(int profile,
215 const BookmarkNode* node,
216 const std::wstring& new_title) {
217 ASSERT_EQ(GetBookmarkModel(profile)->GetNodeByID(node->id()), node)
218 << "Node " << node->GetTitle() << " does not belong to "
219 << "Profile " << profile;
220 if (test()->use_verifier()) {
221 const BookmarkNode* v_node = NULL;
222 FindNodeInVerifier(GetBookmarkModel(profile), node, &v_node);
223 GetVerifierBookmarkModel()->SetTitle(v_node, WideToUTF16(new_title));
224 }
225 GetBookmarkModel(profile)->SetTitle(node, WideToUTF16(new_title));
226 }
227
228 // static
229 void BookmarksHelper::SetFavicon(
230 int profile,
231 const BookmarkNode* node,
232 const std::vector<unsigned char>& icon_bytes_vector) {
233 ASSERT_EQ(GetBookmarkModel(profile)->GetNodeByID(node->id()), node)
234 << "Node " << node->GetTitle() << " does not belong to "
235 << "Profile " << profile;
236 ASSERT_EQ(BookmarkNode::URL, node->type())
237 << "Node " << node->GetTitle() << " must be a url.";
238 if (test()->use_verifier()) {
239 const BookmarkNode* v_node = NULL;
240 FindNodeInVerifier(GetBookmarkModel(profile), node, &v_node);
241 FaviconChangeObserver v_observer(GetVerifierBookmarkModel(), v_node);
242 browser_sync::BookmarkChangeProcessor::ApplyBookmarkFavicon(
243 v_node, test()->verifier(), icon_bytes_vector);
244 v_observer.WaitForSetFavicon();
245 }
246 FaviconChangeObserver observer(GetBookmarkModel(profile), node);
247 browser_sync::BookmarkChangeProcessor::ApplyBookmarkFavicon(
248 node, test()->GetProfile(profile), icon_bytes_vector);
249 observer.WaitForSetFavicon();
250 }
251
252 // static
253 const BookmarkNode* BookmarksHelper::SetURL(int profile,
254 const BookmarkNode* node,
255 const GURL& new_url) {
256 if (GetBookmarkModel(profile)->GetNodeByID(node->id()) != node) {
257 LOG(ERROR) << "Node " << node->GetTitle() << " does not belong to "
258 << "Profile " << profile;
259 return NULL;
260 }
261 if (test()->use_verifier()) {
262 const BookmarkNode* v_node = NULL;
263 FindNodeInVerifier(GetBookmarkModel(profile), node, &v_node);
264 bookmark_utils::ApplyEditsWithNoFolderChange(
265 GetVerifierBookmarkModel(),
266 v_node->parent(),
267 BookmarkEditor::EditDetails(v_node),
268 v_node->GetTitle(),
269 new_url);
270 }
271 return bookmark_utils::ApplyEditsWithNoFolderChange(
272 GetBookmarkModel(profile),
273 node->parent(),
274 BookmarkEditor::EditDetails(node),
275 node->GetTitle(),
276 new_url);
277 }
278
279 // static
280 void BookmarksHelper::Move(int profile,
281 const BookmarkNode* node,
282 const BookmarkNode* new_parent,
283 int index) {
284 ASSERT_EQ(GetBookmarkModel(profile)->GetNodeByID(node->id()), node)
285 << "Node " << node->GetTitle() << " does not belong to "
286 << "Profile " << profile;
287 if (test()->use_verifier()) {
288 const BookmarkNode* v_new_parent = NULL;
289 const BookmarkNode* v_node = NULL;
290 FindNodeInVerifier(GetBookmarkModel(profile), new_parent, &v_new_parent);
291 FindNodeInVerifier(GetBookmarkModel(profile), node, &v_node);
292 GetVerifierBookmarkModel()->Move(v_node, v_new_parent, index);
293 }
294 GetBookmarkModel(profile)->Move(node, new_parent, index);
295 }
296
297 // static
298 void BookmarksHelper::Remove(int profile,
299 const BookmarkNode* parent,
300 int index) {
301 ASSERT_EQ(GetBookmarkModel(profile)->GetNodeByID(parent->id()), parent)
302 << "Node " << parent->GetTitle() << " does not belong to "
303 << "Profile " << profile;
304 if (test()->use_verifier()) {
305 const BookmarkNode* v_parent = NULL;
306 FindNodeInVerifier(GetBookmarkModel(profile), parent, &v_parent);
307 ASSERT_TRUE(NodesMatch(parent->GetChild(index), v_parent->GetChild(index)));
308 GetVerifierBookmarkModel()->Remove(v_parent, index);
309 }
310 GetBookmarkModel(profile)->Remove(parent, index);
311 }
312
313 // static
314 void BookmarksHelper::SortChildren(int profile,
315 const BookmarkNode* parent) {
316 ASSERT_EQ(GetBookmarkModel(profile)->GetNodeByID(parent->id()), parent)
317 << "Node " << parent->GetTitle() << " does not belong to "
318 << "Profile " << profile;
319 if (test()->use_verifier()) {
320 const BookmarkNode* v_parent = NULL;
321 FindNodeInVerifier(GetBookmarkModel(profile), parent, &v_parent);
322 GetVerifierBookmarkModel()->SortChildren(v_parent);
323 }
324 GetBookmarkModel(profile)->SortChildren(parent);
325 }
326
327 // static
328 void BookmarksHelper::ReverseChildOrder(int profile,
329 const BookmarkNode* parent) {
330 ASSERT_EQ(GetBookmarkModel(profile)->GetNodeByID(parent->id()), parent)
331 << "Node " << parent->GetTitle() << " does not belong to "
332 << "Profile " << profile;
333 int child_count = parent->child_count();
334 if (child_count <= 0)
335 return;
336 for (int index = 0; index < child_count; ++index) {
337 Move(profile, parent->GetChild(index), parent, child_count - index);
338 }
339 }
340
341 // static
342 bool BookmarksHelper::ModelMatchesVerifier(int profile) {
343 if (!test()->use_verifier()) {
344 LOG(ERROR) << "Illegal to call ModelMatchesVerifier() after "
345 << "DisableVerifier(). Use ModelsMatch() instead.";
346 return false;
347 }
348 return BookmarkModelsMatch(GetVerifierBookmarkModel(),
349 GetBookmarkModel(profile));
350 }
351
352 // static
353 bool BookmarksHelper::AllModelsMatchVerifier() {
354 for (int i = 0; i < test()->num_clients(); ++i) {
355 if (!ModelMatchesVerifier(i)) {
356 LOG(ERROR) << "Model " << i << " does not match the verifier.";
357 return false;
358 }
359 }
360 return true;
361 }
362
363 // static
364 bool BookmarksHelper::ModelsMatch(int profile_a, int profile_b) {
365 return BookmarkModelsMatch(GetBookmarkModel(profile_a),
366 GetBookmarkModel(profile_b));
367 }
368
369 // static
370 bool BookmarksHelper::AllModelsMatch() {
371 for (int i = 1; i < test()->num_clients(); ++i) {
372 if (!ModelsMatch(0, i)) {
373 LOG(ERROR) << "Model " << i << " does not match Model 0.";
374 return false;
375 }
376 }
377 return true;
378 }
379
380 // static
381 bool BookmarksHelper::ContainsDuplicateBookmarks(int profile) {
382 ui::TreeNodeIterator<const BookmarkNode> iterator(
383 GetBookmarkModel(profile)->root_node());
384 while (iterator.has_next()) {
385 const BookmarkNode* node = iterator.Next();
386 if (node->is_folder())
387 continue;
388 std::vector<const BookmarkNode*> nodes;
389 GetBookmarkModel(profile)->GetNodesByURL(node->GetURL(), &nodes);
390 EXPECT_TRUE(nodes.size() >= 1);
391 for (std::vector<const BookmarkNode*>::const_iterator it = nodes.begin();
392 it != nodes.end(); ++it) {
393 if (node->id() != (*it)->id() &&
394 node->parent() == (*it)->parent() &&
395 node->GetTitle() == (*it)->GetTitle()){
396 return true;
397 }
398 }
399 }
400 return false;
401 }
402
403 // static
404 const BookmarkNode* BookmarksHelper::GetUniqueNodeByURL(int profile,
405 const GURL& url) {
406 std::vector<const BookmarkNode*> nodes;
407 GetBookmarkModel(profile)->GetNodesByURL(url, &nodes);
408 EXPECT_EQ(1U, nodes.size());
409 if (nodes.empty())
410 return NULL;
411 return nodes[0];
412 }
413
414 // static
415 int BookmarksHelper::CountBookmarksWithTitlesMatching(
416 int profile,
417 const std::wstring& title) {
418 return CountNodesWithTitlesMatching(GetBookmarkModel(profile),
419 BookmarkNode::URL,
420 WideToUTF16(title));
421 }
422
423 // static
424 int BookmarksHelper::CountFoldersWithTitlesMatching(
425 int profile,
426 const std::wstring& title) {
427 return CountNodesWithTitlesMatching(GetBookmarkModel(profile),
428 BookmarkNode::FOLDER,
429 WideToUTF16(title));
430 }
431
432 // static
433 int BookmarksHelper::CountNodesWithTitlesMatching(
434 BookmarkModel* model,
435 BookmarkNode::Type node_type,
436 const string16& title) {
437 ui::TreeNodeIterator<const BookmarkNode> iterator(model->root_node());
438 // Walk through the model tree looking for bookmark nodes of node type
439 // |node_type| whose titles match |title|.
440 int count = 0;
441 while (iterator.has_next()) {
442 const BookmarkNode* node = iterator.Next();
443 if ((node->type() == node_type) && (node->GetTitle() == title))
444 ++count;
445 }
446 return count;
447 }
448
449 // static
450 std::vector<unsigned char> BookmarksHelper::CreateFavicon(int seed) {
451 const int w = 16;
452 const int h = 16;
453 SkBitmap bmp;
454 bmp.setConfig(SkBitmap::kARGB_8888_Config, w, h);
455 bmp.allocPixels();
456 uint32_t* src_data = bmp.getAddr32(0, 0);
457 for (int i = 0; i < w * h; ++i) {
458 src_data[i] = SkPreMultiplyARGB((seed + i) % 255,
459 (seed + i) % 250,
460 (seed + i) % 245,
461 (seed + i) % 240);
462 }
463 std::vector<unsigned char> favicon;
464 gfx::PNGCodec::EncodeBGRASkBitmap(bmp, false, &favicon);
465 return favicon;
466 }
467
468 // static
469 std::string BookmarksHelper::IndexedURL(int i) {
470 return StringPrintf("http://www.host.ext:1234/path/filename/%d", i);
471 }
472
473 // static
474 std::wstring BookmarksHelper::IndexedURLTitle(int i) {
475 return StringPrintf(L"URL Title %d", i);
476 }
477
478 // static
479 std::wstring BookmarksHelper::IndexedFolderName(int i) {
480 return StringPrintf(L"Folder Name %d", i);
481 }
482
483 // static
484 std::wstring BookmarksHelper::IndexedSubfolderName(int i) {
485 return StringPrintf(L"Subfolder Name %d", i);
486 }
487
488 // static
489 std::wstring BookmarksHelper::IndexedSubsubfolderName(int i) {
490 return StringPrintf(L"Subsubfolder Name %d", i);
491 }
492
493 // static
494 void BookmarksHelper::FindNodeInVerifier(BookmarkModel* foreign_model,
495 const BookmarkNode* foreign_node,
496 const BookmarkNode** result) {
497 // Climb the tree.
498 std::stack<int> path;
499 const BookmarkNode* walker = foreign_node;
500 while (walker != foreign_model->root_node()) {
501 path.push(walker->parent()->GetIndexOf(walker));
502 walker = walker->parent();
503 }
504
505 // Swing over to the other tree.
506 walker = GetVerifierBookmarkModel()->root_node();
507
508 // Climb down.
509 while (!path.empty()) {
510 ASSERT_TRUE(walker->is_folder());
511 ASSERT_LT(path.top(), walker->child_count());
512 walker = walker->GetChild(path.top());
513 path.pop();
514 }
515
516 ASSERT_TRUE(NodesMatch(foreign_node, walker));
517 *result = walker;
518 }
519
520 // static
521 bool BookmarksHelper::BookmarkModelsMatch(BookmarkModel* model_a,
522 BookmarkModel* model_b) {
523 bool ret_val = true;
524 ui::TreeNodeIterator<const BookmarkNode> iterator_a(model_a->root_node());
525 ui::TreeNodeIterator<const BookmarkNode> iterator_b(model_b->root_node());
526 while (iterator_a.has_next()) {
527 const BookmarkNode* node_a = iterator_a.Next();
528 if (!iterator_b.has_next()) {
529 LOG(ERROR) << "Models do not match.";
530 return false;
531 }
532 const BookmarkNode* node_b = iterator_b.Next();
533 ret_val = ret_val && NodesMatch(node_a, node_b);
534 if (node_a->is_folder() || node_b->is_folder())
535 continue;
536 ret_val = ret_val && FaviconsMatch(model_a, model_b, node_a, node_b);
537 }
538 ret_val = ret_val && (!iterator_b.has_next());
539 return ret_val;
540 }
541
542 // static
543 bool BookmarksHelper::NodesMatch(const BookmarkNode* node_a,
544 const BookmarkNode* node_b) {
545 if (node_a == NULL || node_b == NULL)
546 return node_a == node_b;
547 if (node_a->is_folder() != node_b->is_folder()) {
548 LOG(ERROR) << "Cannot compare folder with bookmark";
549 return false;
550 }
551 if (node_a->GetTitle() != node_b->GetTitle()) {
552 LOG(ERROR) << "Title mismatch: " << node_a->GetTitle() << " vs. "
553 << node_b->GetTitle();
554 return false;
555 }
556 if (node_a->GetURL() != node_b->GetURL()) {
557 LOG(ERROR) << "URL mismatch: " << node_a->GetURL() << " vs. "
558 << node_b->GetURL();
559 return false;
560 }
561 if (node_a->parent()->GetIndexOf(node_a) !=
562 node_b->parent()->GetIndexOf(node_b)) {
563 LOG(ERROR) << "Index mismatch: "
564 << node_a->parent()->GetIndexOf(node_a) << " vs. "
565 << node_b->parent()->GetIndexOf(node_b);
566 return false;
567 }
568 return true;
569 }
570
571 // static
572 bool BookmarksHelper::FaviconsMatch(BookmarkModel* model_a,
573 BookmarkModel* model_b,
574 const BookmarkNode* node_a,
575 const BookmarkNode* node_b) {
576 const SkBitmap& bitmap_a = GetFavicon(model_a, node_a);
577 const SkBitmap& bitmap_b = GetFavicon(model_b, node_b);
578 return FaviconBitmapsMatch(bitmap_a, bitmap_b);
579 }
580
581 // static
582 const SkBitmap& BookmarksHelper::GetFavicon(BookmarkModel* model,
583 const BookmarkNode* node) {
584 // If a favicon was explicitly set, we may need to wait for it to be loaded
585 // via BookmarkModel::GetFavIcon(), which is an asynchronous operation.
586 if (!node->is_favicon_loaded()) {
587 FaviconChangeObserver observer(model, node);
588 model->GetFavicon(node);
589 observer.WaitForGetFavicon();
590 }
591 EXPECT_TRUE(node->is_favicon_loaded());
592 return node->favicon();
593 }
594
595 // static
596 bool BookmarksHelper::FaviconBitmapsMatch(const SkBitmap& bitmap_a,
597 const SkBitmap& bitmap_b) {
598 if (bitmap_a.getSize() == 0U && bitmap_a.getSize() == 0U)
599 return true;
600 if ((bitmap_a.getSize() != bitmap_b.getSize()) ||
601 (bitmap_a.width() != bitmap_b.width()) ||
602 (bitmap_a.height() != bitmap_b.height())) {
603 LOG(ERROR) << "Favicon size mismatch: " << bitmap_a.getSize() << " ("
604 << bitmap_a.width() << "x" << bitmap_a.height() << ") vs. "
605 << bitmap_b.getSize() << " (" << bitmap_b.width() << "x"
606 << bitmap_b.height() << ")";
607 return false;
608 }
609 SkAutoLockPixels bitmap_lock_a(bitmap_a);
610 SkAutoLockPixels bitmap_lock_b(bitmap_b);
611 void* node_pixel_addr_a = bitmap_a.getPixels();
612 EXPECT_TRUE(node_pixel_addr_a);
613 void* node_pixel_addr_b = bitmap_b.getPixels();
614 EXPECT_TRUE(node_pixel_addr_b);
615 if (memcmp(node_pixel_addr_a, node_pixel_addr_b, bitmap_a.getSize()) != 0) {
616 LOG(ERROR) << "Favicon bitmap mismatch";
617 return false;
618 } else {
619 return true;
620 }
621 }
OLDNEW
« no previous file with comments | « chrome/test/live_sync/bookmarks_helper.h ('k') | chrome/test/live_sync/live_bookmarks_sync_test.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698