1// Copyright 2012 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 5package org.chromium.chrome.browser.test; 6 7import android.os.Parcel; 8import android.test.suitebuilder.annotation.SmallTest; 9 10import org.chromium.base.test.util.DisabledTest; 11import org.chromium.base.test.util.Feature; 12import org.chromium.chrome.browser.ChromeBrowserProvider.BookmarkNode; 13import org.chromium.chrome.browser.ChromeBrowserProvider.Type; 14import org.chromium.chrome.browser.test.util.BookmarkUtils; 15import org.chromium.chrome.shell.ChromeShellTestBase; 16 17import java.util.Random; 18 19/** 20 * Tests parceling of bookmark node hierarchies used by the provider client API. 21 */ 22public class ProviderBookmarkNodeTest extends ChromeShellTestBase { 23 Random mGenerator = new Random(); 24 byte[][] mImageBlobs = null; 25 26 @Override 27 protected void setUp() throws Exception { 28 super.setUp(); 29 launchChromeShellWithUrl(null); 30 31 mImageBlobs = new byte[][] { 32 BookmarkUtils.getIcon("chrome/provider/icon1.png"), 33 BookmarkUtils.getIcon("chrome/provider/icon2.png"), 34 BookmarkUtils.getIcon("chrome/provider/icon3.png"), 35 }; 36 37 for (byte[] icon : mImageBlobs) { 38 assertNotNull(icon); 39 } 40 } 41 42 private static BookmarkNode parcelNode(BookmarkNode node) { 43 Parcel output = Parcel.obtain(); 44 Parcel input = Parcel.obtain(); 45 node.writeToParcel(output, 0); 46 byte[] bytes = output.marshall(); 47 48 input.unmarshall(bytes, 0, bytes.length); 49 input.setDataPosition(0); 50 51 return BookmarkNode.CREATOR.createFromParcel(input); 52 } 53 54 private byte[] getRandomImageBlob() { 55 return mImageBlobs[mGenerator.nextInt(mImageBlobs.length)]; 56 } 57 58 private static BookmarkNode createMockHierarchy() { 59 // Mock hierarchy. 60 // + Bookmarks 61 // - Google 62 // - Google maps 63 // + Youtube 64 // + Empty folder 65 // + Some other folder 66 // - Surprised Vader 67 // - Rickroll'D 68 BookmarkNode root = new BookmarkNode(1, Type.FOLDER, "Bookmarks", null, null); 69 root.addChild(new BookmarkNode(2, Type.URL, "Google", "http://www.google.com/", root)); 70 root.addChild(new BookmarkNode(3, Type.URL, "GoogleMaps", "http://maps.google.com/", root)); 71 72 BookmarkNode folder1 = new BookmarkNode(4, Type.FOLDER, "Youtube", null, root); 73 root.addChild(folder1); 74 folder1.addChild(new BookmarkNode(5, Type.FOLDER, "Empty folder", null, folder1)); 75 76 BookmarkNode folder2 = new BookmarkNode(6, Type.FOLDER, "Some other folder", null, folder1); 77 folder1.addChild(folder2); 78 79 folder1.addChild(new BookmarkNode(7, Type.URL, "RickRoll'D", 80 "http://www.youtube.com/watch?v=oHg5SJYRHA0", folder1)); 81 folder2.addChild(new BookmarkNode(8, Type.URL, "Surprised Vader", 82 "http://www.youtube.com/watch?v=9h1swNWgP8Q", folder2)); 83 return root; 84 } 85 86 // Returns the same mock hierarchy as createMockHierarchy, but with random favicon and 87 // thumbnail information including null values. 88 private BookmarkNode createMockHierarchyWithImages() { 89 return addImagesRecursive(createMockHierarchy()); 90 } 91 92 private BookmarkNode addImagesRecursive(BookmarkNode node) { 93 node.setFavicon(mGenerator.nextBoolean() ? getRandomImageBlob() : null); 94 node.setThumbnail(mGenerator.nextBoolean() ? getRandomImageBlob() : null); 95 96 for (BookmarkNode child : node.children()) { 97 addImagesRecursive(child); 98 } 99 100 return node; 101 } 102 103 private static boolean isSameHierarchy(BookmarkNode h1, BookmarkNode h2) { 104 return isSameHierarchyDownwards(h1.getHierarchyRoot(), h2.getHierarchyRoot()); 105 } 106 107 private static boolean isSameHierarchyDownwards(BookmarkNode n1, BookmarkNode n2) { 108 if (n1 == null && n2 == null) return true; 109 if (n1 == null || n2 == null) return false; 110 if (!n1.equalContents(n2)) return false; 111 for (int i = 0; i < n1.children().size(); ++i) { 112 if (!isSameHierarchyDownwards(n1.children().get(i), n2.children().get(i))) return false; 113 } 114 return true; 115 } 116 117 // Tests parceling and comparing each of the nodes in the provided hierarchy. 118 private boolean internalTestNodeHierarchyParceling(BookmarkNode node) { 119 if (node == null) return false; 120 121 BookmarkNode parceled = parcelNode(node); 122 if (!isSameHierarchy(node, parceled)) return false; 123 124 for (BookmarkNode child : node.children()) { 125 if (!internalTestNodeHierarchyParceling(child)) return false; 126 } 127 128 return true; 129 } 130 131 /** 132 * @SmallTest 133 * @Feature({"Android-ContentProvider"}) 134 * BUG 154683 135 */ 136 @DisabledTest 137 public void testBookmarkNodeParceling() throws InterruptedException { 138 assertTrue(internalTestNodeHierarchyParceling(createMockHierarchy())); 139 } 140 141 /** 142 * @SmallTest 143 * @Feature({"Android-ContentProvider"}) 144 * BUG 154683 145 */ 146 @DisabledTest 147 public void testBookmarkNodeParcelingWithImages() throws InterruptedException { 148 assertTrue(internalTestNodeHierarchyParceling(createMockHierarchyWithImages())); 149 } 150 151 /** 152 * @SmallTest 153 * @Feature({"Android-ContentProvider"}) 154 * BUG 154683 155 */ 156 @DisabledTest 157 public void testSingleNodeParceling() throws InterruptedException { 158 BookmarkNode node = new BookmarkNode(1, Type.URL, "Google", "http://www.google.com/", null); 159 assertTrue(internalTestNodeHierarchyParceling(node)); 160 } 161 162 @SmallTest 163 @Feature({"Android-ContentProvider"}) 164 public void testInvalidHierarchy() throws InterruptedException { 165 BookmarkNode root = new BookmarkNode(1, Type.FOLDER, "Bookmarks", null, null); 166 root.addChild(new BookmarkNode(2, Type.URL, "Google", "http://www.google.com/", root)); 167 root.addChild(new BookmarkNode(2, Type.URL, "GoogleMaps", "http://maps.google.com/", root)); 168 assertFalse(internalTestNodeHierarchyParceling(root)); 169 } 170} 171