OSDN Git Service

original
[gb-231r1-is01/GB_2.3_IS01.git] / sdk / sdkmanager / libs / sdklib / tests / com / android / sdklib / internal / repository / SdkRepoSourceTest.java
diff --git a/sdk/sdkmanager/libs/sdklib/tests/com/android/sdklib/internal/repository/SdkRepoSourceTest.java b/sdk/sdkmanager/libs/sdklib/tests/com/android/sdklib/internal/repository/SdkRepoSourceTest.java
new file mode 100644 (file)
index 0000000..aee811f
--- /dev/null
@@ -0,0 +1,429 @@
+/*\r
+ * Copyright (C) 2009 The Android Open Source Project\r
+ *\r
+ * Licensed under the Eclipse Public License, Version 1.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ *      http://www.eclipse.org/org/documents/epl-v10.php\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+\r
+package com.android.sdklib.internal.repository;\r
+\r
+import com.android.sdklib.SdkManager;\r
+import com.android.sdklib.repository.SdkRepoConstants;\r
+\r
+import org.w3c.dom.Document;\r
+\r
+import java.io.ByteArrayInputStream;\r
+import java.io.File;\r
+import java.io.FileInputStream;\r
+import java.io.IOException;\r
+import java.io.InputStream;\r
+import java.util.ArrayList;\r
+import java.util.Arrays;\r
+\r
+import junit.framework.TestCase;\r
+\r
+/**\r
+ * Tests for {@link SdkRepoSource}\r
+ */\r
+public class SdkRepoSourceTest extends TestCase {\r
+\r
+    /**\r
+     * An internal helper class to give us visibility to the protected members we want\r
+     * to test.\r
+     */\r
+    private static class MockSdkRepoSource extends SdkRepoSource {\r
+        public MockSdkRepoSource() {\r
+            super("fake-url", null /*uiName*/);\r
+        }\r
+\r
+        public Document _findAlternateToolsXml(InputStream xml) throws IOException {\r
+            return super.findAlternateToolsXml(xml);\r
+        }\r
+\r
+        public boolean _parsePackages(Document doc, String nsUri, ITaskMonitor monitor) {\r
+            return super.parsePackages(doc, nsUri, monitor);\r
+        }\r
+\r
+        public int _getXmlSchemaVersion(InputStream xml) {\r
+            return super.getXmlSchemaVersion(xml);\r
+        }\r
+\r
+        public String _validateXml(InputStream xml, String url, int version,\r
+                                   String[] outError, Boolean[] validatorFound) {\r
+            return super.validateXml(xml, url, version, outError, validatorFound);\r
+        }\r
+\r
+        public Document _getDocument(InputStream xml, ITaskMonitor monitor) {\r
+            return super.getDocument(xml, monitor);\r
+        }\r
+\r
+    }\r
+\r
+    private MockSdkRepoSource mSource;\r
+\r
+    @Override\r
+    protected void setUp() throws Exception {\r
+        super.setUp();\r
+\r
+        mSource = new MockSdkRepoSource();\r
+    }\r
+\r
+    @Override\r
+    protected void tearDown() throws Exception {\r
+        super.tearDown();\r
+\r
+        mSource = null;\r
+    }\r
+\r
+    public void testFindAlternateToolsXml_Errors() throws Exception {\r
+        // Support null as input\r
+        Document result = mSource._findAlternateToolsXml(null);\r
+        assertNull(result);\r
+\r
+        // Support an empty input\r
+        String str = "";\r
+        ByteArrayInputStream input = new ByteArrayInputStream(str.getBytes());\r
+        result = mSource._findAlternateToolsXml(input);\r
+        assertNull(result);\r
+\r
+        // Support a random string as input\r
+        str = "Some random string, not even HTML nor XML";\r
+        input = new ByteArrayInputStream(str.getBytes());\r
+        result = mSource._findAlternateToolsXml(input);\r
+        assertNull(result);\r
+\r
+        // Support an HTML input, e.g. a typical 404 document as returned by DL\r
+        str = "<html><head> " +\r
+        "<meta http-equiv=\"content-type\" content=\"text/html;charset=utf-8\"> " +\r
+        "<title>404 Not Found</title> " + "<style><!--" + "body {font-family: arial,sans-serif}" +\r
+        "div.nav { ... blah blah more css here ... color: green}" +\r
+        "//--></style> " + "<script><!--" + "var rc=404;" + "//-->" + "</script> " + "</head> " +\r
+        "<body text=#000000 bgcolor=#ffffff> " +\r
+        "<table border=0 cellpadding=2 cellspacing=0 width=100%><tr><td rowspan=3 width=1% nowrap> " +\r
+        "<b><font face=times color=#0039b6 size=10>G</font><font face=times color=#c41200 size=10>o</font><font face=times color=#f3c518 size=10>o</font><font face=times color=#0039b6 size=10>g</font><font face=times color=#30a72f size=10>l</font><font face=times color=#c41200 size=10>e</font>&nbsp;&nbsp;</b> " +\r
+        "<td>&nbsp;</td></tr> " +\r
+        "<tr><td bgcolor=\"#3366cc\"><font face=arial,sans-serif color=\"#ffffff\"><b>Error</b></td></tr> " +\r
+        "<tr><td>&nbsp;</td></tr></table> " + "<blockquote> " + "<H1>Not Found</H1> " +\r
+        "The requested URL <code>/404</code> was not found on this server." + " " + "<p> " +\r
+        "</blockquote> " +\r
+        "<table width=100% cellpadding=0 cellspacing=0><tr><td bgcolor=\"#3366cc\"><img alt=\"\" width=1 height=4></td></tr></table> " +\r
+        "</body></html> ";\r
+        input = new ByteArrayInputStream(str.getBytes());\r
+        result = mSource._findAlternateToolsXml(input);\r
+        assertNull(result);\r
+\r
+        // Support some random XML document, totally unrelated to our sdk-repository schema\r
+        str = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +\r
+        "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"" +\r
+        "    package=\"some.cool.app\" android:versionName=\"1.6.04\" android:versionCode=\"1604\">" +\r
+        "    <application android:label=\"@string/app_name\" android:icon=\"@drawable/icon\"/>" +\r
+        "</manifest>";\r
+        input = new ByteArrayInputStream(str.getBytes());\r
+        result = mSource._findAlternateToolsXml(input);\r
+        assertNull(result);\r
+    }\r
+\r
+    /**\r
+     * Validate we can load a new schema version 3 using the "alternate future tool" mode.\r
+     */\r
+    public void testFindAlternateToolsXml_3() throws Exception {\r
+        InputStream xmlStream = getTestResource(\r
+                    "/com/android/sdklib/testdata/repository_sample_3.xml");\r
+\r
+        Document result = mSource._findAlternateToolsXml(xmlStream);\r
+        assertNotNull(result);\r
+        MockMonitor mon = new MockMonitor();\r
+        assertTrue(mSource._parsePackages(result, SdkRepoConstants.NS_URI, mon));\r
+\r
+        assertEquals("Found Android SDK Tools, revision 1\n" +\r
+                     "Found Android SDK Tools, revision 42\n" +\r
+                     "Found Android SDK Platform-tools, revision 3\n",\r
+                mon.getCapturedDescriptions());\r
+        assertEquals("", mon.getCapturedResults());\r
+\r
+        // check the packages we found... we expected to find 2 tool packages and 1\r
+        // platform-tools package, with at least 1 archive each.\r
+        Package[] pkgs = mSource.getPackages();\r
+        assertEquals(3, pkgs.length);\r
+        for (Package p : pkgs) {\r
+            assertTrue((p instanceof ToolPackage) || (p instanceof PlatformToolPackage));\r
+            assertTrue(p.getArchives().length >= 1);\r
+        }\r
+    }\r
+\r
+    /**\r
+     * Validate we can still load an old repository in schema version 1\r
+     */\r
+    public void testLoadOldXml_1() throws Exception {\r
+        InputStream xmlStream = getTestResource(\r
+                    "/com/android/sdklib/testdata/repository_sample_1.xml");\r
+\r
+        // guess the version from the XML document\r
+        int version = mSource._getXmlSchemaVersion(xmlStream);\r
+        assertEquals(1, version);\r
+\r
+        Boolean[] validatorFound = new Boolean[] { Boolean.FALSE };\r
+        String[] validationError = new String[] { null };\r
+        String url = "not-a-valid-url://" + SdkRepoConstants.URL_DEFAULT_FILENAME;\r
+\r
+        String uri = mSource._validateXml(xmlStream, url, version, validationError, validatorFound);\r
+        assertEquals(Boolean.TRUE, validatorFound[0]);\r
+        assertEquals(null, validationError[0]);\r
+        assertEquals(SdkRepoConstants.getSchemaUri(1), uri);\r
+\r
+        // Validation was successful, load the document\r
+        MockMonitor monitor = new MockMonitor();\r
+        Document doc = mSource._getDocument(xmlStream, monitor);\r
+        assertNotNull(doc);\r
+\r
+        // Get the packages\r
+        assertTrue(mSource._parsePackages(doc, uri, monitor));\r
+\r
+        assertEquals("Found SDK Platform Android 1.0, API 1, revision 3\n" +\r
+                     "Found Documentation for Android SDK, API 1, revision 1\n" +\r
+                     "Found My First add-on by John Doe, Android API 1, revision 1\n" +\r
+                     "Found SDK Platform Android 1.1, API 2, revision 12\n" +\r
+                     "Found My Second add-on by John Deer, Android API 2, revision 42\n" +\r
+                     "Found SDK Platform Android Pastry Preview, revision 3\n" +\r
+                     "Found Android SDK Tools, revision 1\n" +\r
+                     "Found Documentation for Android SDK, API 2, revision 42\n" +\r
+                     "Found Android SDK Tools, revision 42\n" +\r
+                     "Found This add-on has no libraries by Joe Bar, Android API 4, revision 3\n" +\r
+                     "Found Usb Driver package, revision 43\n",\r
+                monitor.getCapturedDescriptions());\r
+        assertEquals("", monitor.getCapturedResults());\r
+\r
+        // check the packages we found... we expected to find 11 packages with each at least\r
+        // one archive.\r
+        Package[] pkgs = mSource.getPackages();\r
+        assertEquals(11, pkgs.length);\r
+        for (Package p : pkgs) {\r
+            assertTrue(p.getArchives().length >= 1);\r
+        }\r
+\r
+        // Check the extra packages path, vendor, install folder\r
+\r
+        final String osSdkPath = "SDK";\r
+        final SdkManager sdkManager = new MockEmptySdkManager(osSdkPath);\r
+\r
+        ArrayList<String> extraPaths   = new ArrayList<String>();\r
+        ArrayList<String> extraVendors = new ArrayList<String>();\r
+        ArrayList<File>   extraInstall = new ArrayList<File>();\r
+        for (Package p : pkgs) {\r
+            if (p instanceof ExtraPackage) {\r
+                extraPaths.add(((ExtraPackage) p).getPath());\r
+                extraVendors.add(((ExtraPackage) p).getVendor());\r
+                extraInstall.add(((ExtraPackage) p).getInstallFolder(osSdkPath, sdkManager));\r
+            }\r
+        }\r
+        assertEquals(\r
+                "[usb_driver]",\r
+                Arrays.toString(extraPaths.toArray()));\r
+        assertEquals(\r
+                "[]",\r
+                Arrays.toString(extraVendors.toArray()));\r
+        assertEquals(\r
+                "[SDK/extras/usb_driver]".replace('/', File.separatorChar),\r
+                Arrays.toString(extraInstall.toArray()));\r
+    }\r
+\r
+    /**\r
+     * Validate we can still load an old repository in schema version 2\r
+     */\r
+    public void testLoadOldXml_2() throws Exception {\r
+        InputStream xmlStream = getTestResource(\r
+                    "/com/android/sdklib/testdata/repository_sample_2.xml");\r
+\r
+        // guess the version from the XML document\r
+        int version = mSource._getXmlSchemaVersion(xmlStream);\r
+        assertEquals(2, version);\r
+\r
+        Boolean[] validatorFound = new Boolean[] { Boolean.FALSE };\r
+        String[] validationError = new String[] { null };\r
+        String url = "not-a-valid-url://" + SdkRepoConstants.URL_DEFAULT_FILENAME;\r
+\r
+        String uri = mSource._validateXml(xmlStream, url, version, validationError, validatorFound);\r
+        assertEquals(Boolean.TRUE, validatorFound[0]);\r
+        assertEquals(null, validationError[0]);\r
+        assertEquals(SdkRepoConstants.getSchemaUri(2), uri);\r
+\r
+        // Validation was successful, load the document\r
+        MockMonitor monitor = new MockMonitor();\r
+        Document doc = mSource._getDocument(xmlStream, monitor);\r
+        assertNotNull(doc);\r
+\r
+        // Get the packages\r
+        assertTrue(mSource._parsePackages(doc, uri, monitor));\r
+\r
+        assertEquals("Found SDK Platform Android 1.0, API 1, revision 3\n" +\r
+                     "Found Documentation for Android SDK, API 1, revision 1\n" +\r
+                     "Found My First add-on by John Doe, Android API 1, revision 1\n" +\r
+                     "Found SDK Platform Android 1.1, API 2, revision 12\n" +\r
+                     "Found My Second add-on by John Deer, Android API 2, revision 42\n" +\r
+                     "Found SDK Platform Android Pastry Preview, revision 3\n" +\r
+                     "Found Android SDK Tools, revision 1\n" +\r
+                     "Found Documentation for Android SDK, API 2, revision 42\n" +\r
+                     "Found Android SDK Tools, revision 42\n" +\r
+                     "Found This add-on has no libraries by Joe Bar, Android API 4, revision 3\n" +\r
+                     "Found Usb Driver package, revision 43 (Obsolete)\n" +\r
+                     "Found Extra API Dep package, revision 2 (Obsolete)\n" +\r
+                     "Found Samples for SDK API 14, revision 24 (Obsolete)\n",\r
+                monitor.getCapturedDescriptions());\r
+        assertEquals("", monitor.getCapturedResults());\r
+\r
+        // check the packages we found... we expected to find 13 packages with each at least\r
+        // one archive.\r
+        Package[] pkgs = mSource.getPackages();\r
+        assertEquals(13, pkgs.length);\r
+        for (Package p : pkgs) {\r
+            assertTrue(p.getArchives().length >= 1);\r
+        }\r
+\r
+        // Check the extra packages path, vendor, install folder\r
+\r
+        final String osSdkPath = "SDK";\r
+        final SdkManager sdkManager = new MockEmptySdkManager(osSdkPath);\r
+\r
+        ArrayList<String> extraPaths   = new ArrayList<String>();\r
+        ArrayList<String> extraVendors = new ArrayList<String>();\r
+        ArrayList<File>   extraInstall = new ArrayList<File>();\r
+        for (Package p : pkgs) {\r
+            if (p instanceof ExtraPackage) {\r
+                extraPaths.add(((ExtraPackage) p).getPath());\r
+                extraVendors.add(((ExtraPackage) p).getVendor());\r
+                extraInstall.add(((ExtraPackage) p).getInstallFolder(osSdkPath, sdkManager));\r
+            }\r
+        }\r
+        assertEquals(\r
+                "[usb_driver, extra_api_dep]",\r
+                Arrays.toString(extraPaths.toArray()));\r
+        assertEquals(\r
+                "[, ]",\r
+                Arrays.toString(extraVendors.toArray()));\r
+        assertEquals(\r
+                "[SDK/extras/usb_driver, SDK/extras/extra_api_dep]".replace('/', File.separatorChar),\r
+                Arrays.toString(extraInstall.toArray()));\r
+    }\r
+\r
+    /**\r
+     * Validate what we can load from repository in schema version 3\r
+     */\r
+    public void testLoadXml_3() throws Exception {\r
+        InputStream xmlStream = getTestResource(\r
+                    "/com/android/sdklib/testdata/repository_sample_3.xml");\r
+\r
+        // guess the version from the XML document\r
+        int version = mSource._getXmlSchemaVersion(xmlStream);\r
+        assertEquals(3, version);\r
+\r
+        Boolean[] validatorFound = new Boolean[] { Boolean.FALSE };\r
+        String[] validationError = new String[] { null };\r
+        String url = "not-a-valid-url://" + SdkRepoConstants.URL_DEFAULT_FILENAME;\r
+\r
+        String uri = mSource._validateXml(xmlStream, url, version, validationError, validatorFound);\r
+        assertEquals(Boolean.TRUE, validatorFound[0]);\r
+        assertEquals(null, validationError[0]);\r
+        assertEquals(SdkRepoConstants.getSchemaUri(3), uri);\r
+\r
+        // Validation was successful, load the document\r
+        MockMonitor monitor = new MockMonitor();\r
+        Document doc = mSource._getDocument(xmlStream, monitor);\r
+        assertNotNull(doc);\r
+\r
+        // Get the packages\r
+        assertTrue(mSource._parsePackages(doc, uri, monitor));\r
+\r
+        assertEquals("Found SDK Platform Android 1.0, API 1, revision 3\n" +\r
+                    "Found Documentation for Android SDK, API 1, revision 1\n" +\r
+                    "Found SDK Platform Android 1.1, API 2, revision 12\n" +\r
+                    "Found SDK Platform Android Pastry Preview, revision 3\n" +\r
+                    "Found Android SDK Tools, revision 1\n" +\r
+                    "Found Documentation for Android SDK, API 2, revision 42\n" +\r
+                    "Found Android SDK Tools, revision 42\n" +\r
+                    "Found Android SDK Platform-tools, revision 3\n" +\r
+                    "Found A USB Driver package, revision 43 (Obsolete)\n" +\r
+                    "Found Android Vendor Extra API Dep package, revision 2 (Obsolete)\n" +\r
+                    "Found Samples for SDK API 14, revision 24 (Obsolete)\n",\r
+                monitor.getCapturedDescriptions());\r
+        assertEquals("", monitor.getCapturedResults());\r
+\r
+        // check the packages we found... we expected to find 13 packages with each at least\r
+        // one archive.\r
+        Package[] pkgs = mSource.getPackages();\r
+        assertEquals(11, pkgs.length);\r
+        for (Package p : pkgs) {\r
+            assertTrue(p.getArchives().length >= 1);\r
+        }\r
+\r
+        // Check the extra packages path, vendor, install folder\r
+\r
+        final String osSdkPath = "SDK";\r
+        final SdkManager sdkManager = new MockEmptySdkManager(osSdkPath);\r
+\r
+        ArrayList<String> extraPaths   = new ArrayList<String>();\r
+        ArrayList<String> extraVendors = new ArrayList<String>();\r
+        ArrayList<File>   extraInstall = new ArrayList<File>();\r
+        for (Package p : pkgs) {\r
+            if (p instanceof ExtraPackage) {\r
+                extraPaths.add(((ExtraPackage) p).getPath());\r
+                extraVendors.add(((ExtraPackage) p).getVendor());\r
+                extraInstall.add(((ExtraPackage) p).getInstallFolder(osSdkPath, sdkManager));\r
+            }\r
+        }\r
+        assertEquals(\r
+                "[usb_driver, extra_api_dep]",\r
+                Arrays.toString(extraPaths.toArray()));\r
+        assertEquals(\r
+                "[a, android_vendor]",\r
+                Arrays.toString(extraVendors.toArray()));\r
+        assertEquals(\r
+                "[SDK/extras/a/usb_driver, SDK/extras/android_vendor/extra_api_dep]"\r
+                 .replace('/', File.separatorChar),\r
+                Arrays.toString(extraInstall.toArray()));\r
+    }\r
+\r
+    /**\r
+     * Returns an SdkLib file resource as a {@link ByteArrayInputStream},\r
+     * which has the advantage that we can use {@link InputStream#reset()} on it\r
+     * at any time to read it multiple times.\r
+     * <p/>\r
+     * The default for getResourceAsStream() is to return a {@link FileInputStream} that\r
+     * does not support reset(), yet we need it in the tested code.\r
+     *\r
+     * @throws IOException if some I/O read fails\r
+     */\r
+    private ByteArrayInputStream getTestResource(String filename) throws IOException {\r
+        InputStream xmlStream = this.getClass().getResourceAsStream(filename);\r
+\r
+        try {\r
+            byte[] data = new byte[8192];\r
+            int offset = 0;\r
+            int n;\r
+\r
+            while ((n = xmlStream.read(data, offset, data.length - offset)) != -1) {\r
+                offset += n;\r
+\r
+                if (offset == data.length) {\r
+                    byte[] newData = new byte[offset + 8192];\r
+                    System.arraycopy(data, 0, newData, 0, offset);\r
+                    data = newData;\r
+                }\r
+            }\r
+\r
+            return new ByteArrayInputStream(data, 0, offset);\r
+        } finally {\r
+            if (xmlStream != null) {\r
+                xmlStream.close();\r
+            }\r
+        }\r
+    }\r
+}\r