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