1a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Copyright 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)package org.chromium.chrome.browser.test; 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.os.Parcel; 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.test.suitebuilder.annotation.SmallTest; 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import org.chromium.base.test.util.DisabledTest; 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import org.chromium.base.test.util.Feature; 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import org.chromium.chrome.browser.ChromeBrowserProvider.BookmarkNode; 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import org.chromium.chrome.browser.ChromeBrowserProvider.Type; 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import org.chromium.chrome.browser.test.util.BookmarkUtils; 15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)import org.chromium.chrome.shell.ChromeShellTestBase; 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import java.util.Random; 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Tests parceling of bookmark node hierarchies used by the provider client API. 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 22a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)public class ProviderBookmarkNodeTest extends ChromeShellTestBase { 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Random mGenerator = new Random(); 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) byte[][] mImageBlobs = null; 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @Override 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected void setUp() throws Exception { 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) super.setUp(); 29a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) launchChromeShellWithUrl(null); 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mImageBlobs = new byte[][] { 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BookmarkUtils.getIcon("chrome/provider/icon1.png"), 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BookmarkUtils.getIcon("chrome/provider/icon2.png"), 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BookmarkUtils.getIcon("chrome/provider/icon3.png"), 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (byte[] icon : mImageBlobs) { 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertNotNull(icon); 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private static BookmarkNode parcelNode(BookmarkNode node) { 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Parcel output = Parcel.obtain(); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Parcel input = Parcel.obtain(); 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node.writeToParcel(output, 0); 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) byte[] bytes = output.marshall(); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) input.unmarshall(bytes, 0, bytes.length); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) input.setDataPosition(0); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return BookmarkNode.CREATOR.createFromParcel(input); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private byte[] getRandomImageBlob() { 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return mImageBlobs[mGenerator.nextInt(mImageBlobs.length)]; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private static BookmarkNode createMockHierarchy() { 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Mock hierarchy. 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // + Bookmarks 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // - Google 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // - Google maps 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // + Youtube 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // + Empty folder 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // + Some other folder 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // - Surprised Vader 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // - Rickroll'D 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BookmarkNode root = new BookmarkNode(1, Type.FOLDER, "Bookmarks", null, null); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.addChild(new BookmarkNode(2, Type.URL, "Google", "http://www.google.com/", root)); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.addChild(new BookmarkNode(3, Type.URL, "GoogleMaps", "http://maps.google.com/", root)); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BookmarkNode folder1 = new BookmarkNode(4, Type.FOLDER, "Youtube", null, root); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.addChild(folder1); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) folder1.addChild(new BookmarkNode(5, Type.FOLDER, "Empty folder", null, folder1)); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BookmarkNode folder2 = new BookmarkNode(6, Type.FOLDER, "Some other folder", null, folder1); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) folder1.addChild(folder2); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) folder1.addChild(new BookmarkNode(7, Type.URL, "RickRoll'D", 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "http://www.youtube.com/watch?v=oHg5SJYRHA0", folder1)); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) folder2.addChild(new BookmarkNode(8, Type.URL, "Surprised Vader", 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "http://www.youtube.com/watch?v=9h1swNWgP8Q", folder2)); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return root; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the same mock hierarchy as createMockHierarchy, but with random favicon and 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // thumbnail information including null values. 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private BookmarkNode createMockHierarchyWithImages() { 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return addImagesRecursive(createMockHierarchy()); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private BookmarkNode addImagesRecursive(BookmarkNode node) { 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node.setFavicon(mGenerator.nextBoolean() ? getRandomImageBlob() : null); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node.setThumbnail(mGenerator.nextBoolean() ? getRandomImageBlob() : null); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (BookmarkNode child : node.children()) { 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) addImagesRecursive(child); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return node; 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private static boolean isSameHierarchy(BookmarkNode h1, BookmarkNode h2) { 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return isSameHierarchyDownwards(h1.getHierarchyRoot(), h2.getHierarchyRoot()); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private static boolean isSameHierarchyDownwards(BookmarkNode n1, BookmarkNode n2) { 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (n1 == null && n2 == null) return true; 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (n1 == null || n2 == null) return false; 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!n1.equalContents(n2)) return false; 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < n1.children().size(); ++i) { 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!isSameHierarchyDownwards(n1.children().get(i), n2.children().get(i))) return false; 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Tests parceling and comparing each of the nodes in the provided hierarchy. 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private boolean internalTestNodeHierarchyParceling(BookmarkNode node) { 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (node == null) return false; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BookmarkNode parceled = parcelNode(node); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!isSameHierarchy(node, parceled)) return false; 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (BookmarkNode child : node.children()) { 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!internalTestNodeHierarchyParceling(child)) return false; 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @SmallTest 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @Feature({"Android-ContentProvider"}) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * BUG 154683 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @DisabledTest 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public void testBookmarkNodeParceling() throws InterruptedException { 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertTrue(internalTestNodeHierarchyParceling(createMockHierarchy())); 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @SmallTest 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @Feature({"Android-ContentProvider"}) 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * BUG 154683 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @DisabledTest 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public void testBookmarkNodeParcelingWithImages() throws InterruptedException { 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertTrue(internalTestNodeHierarchyParceling(createMockHierarchyWithImages())); 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @SmallTest 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @Feature({"Android-ContentProvider"}) 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * BUG 154683 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @DisabledTest 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public void testSingleNodeParceling() throws InterruptedException { 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BookmarkNode node = new BookmarkNode(1, Type.URL, "Google", "http://www.google.com/", null); 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertTrue(internalTestNodeHierarchyParceling(node)); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) @SmallTest 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @Feature({"Android-ContentProvider"}) 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public void testInvalidHierarchy() throws InterruptedException { 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BookmarkNode root = new BookmarkNode(1, Type.FOLDER, "Bookmarks", null, null); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.addChild(new BookmarkNode(2, Type.URL, "Google", "http://www.google.com/", root)); 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.addChild(new BookmarkNode(2, Type.URL, "GoogleMaps", "http://maps.google.com/", root)); 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertFalse(internalTestNodeHierarchyParceling(root)); 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 171