/* * Copyright (C) 2009 The Android Open Source Project * * Licensed under the Eclipse Public License, Version 1.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.eclipse.org/org/documents/epl-v10.php * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.sdklib.internal.repository.sources; import com.android.sdklib.SdkManager; import com.android.sdklib.internal.repository.ITaskMonitor; import com.android.sdklib.internal.repository.MockEmptySdkManager; import com.android.sdklib.internal.repository.MockMonitor; import com.android.sdklib.internal.repository.packages.ExtraPackage; import com.android.sdklib.internal.repository.packages.IMinPlatformToolsDependency; import com.android.sdklib.internal.repository.packages.IMinToolsDependency; import com.android.sdklib.internal.repository.packages.Package; import com.android.sdklib.internal.repository.packages.PlatformPackage; import com.android.sdklib.internal.repository.packages.PlatformToolPackage; import com.android.sdklib.internal.repository.packages.SourcePackage; import com.android.sdklib.internal.repository.packages.SystemImagePackage; import com.android.sdklib.internal.repository.packages.ToolPackage; import com.android.sdklib.repository.SdkRepoConstants; import com.android.utils.Pair; import org.w3c.dom.Document; import org.xml.sax.ErrorHandler; import org.xml.sax.SAXException; import org.xml.sax.SAXParseException; import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.Arrays; import junit.framework.TestCase; /** * Tests for {@link SdkRepoSource} */ public class SdkRepoSourceTest extends TestCase { /** * An internal helper class to give us visibility to the protected members we want * to test. */ private static class MockSdkRepoSource extends SdkRepoSource { public MockSdkRepoSource() { super("fake-url", null /*uiName*/); } /** * Returns a pair of Document (which can be null) and the captured stdout/stderr output * (which is the empty string by default). */ public Pair<Document, String> _findAlternateToolsXml(InputStream xml) throws IOException { final StringBuilder output = new StringBuilder(); Document doc = super.findAlternateToolsXml(xml, new ErrorHandler() { @Override public void warning(SAXParseException exception) throws SAXException { output.append("WARN: " + exception.getMessage()).append('\n'); } @Override public void fatalError(SAXParseException exception) throws SAXException { output.append("FATAL: " + exception.getMessage()).append('\n'); } @Override public void error(SAXParseException exception) throws SAXException { output.append("ERROR: " + exception.getMessage()).append('\n'); } }); return Pair.of(doc, output.toString()); } public boolean _parsePackages(Document doc, String nsUri, ITaskMonitor monitor) { return super.parsePackages(doc, nsUri, monitor); } public int _getXmlSchemaVersion(InputStream xml) { return super.getXmlSchemaVersion(xml); } public String _validateXml(InputStream xml, String url, int version, String[] outError, Boolean[] validatorFound) { return super.validateXml(xml, url, version, outError, validatorFound); } public Document _getDocument(InputStream xml, ITaskMonitor monitor) { return super.getDocument(xml, monitor); } } private MockSdkRepoSource mSource; @Override protected void setUp() throws Exception { super.setUp(); System.setProperty("THROW_DEEP_EXCEPTION_DURING_TESTING", "1"); mSource = new MockSdkRepoSource(); } @Override protected void tearDown() throws Exception { super.tearDown(); mSource = null; } public void testFindAlternateToolsXml_Errors() throws Exception { // Support null as input Pair<Document, String> result = mSource._findAlternateToolsXml(null); assertEquals(Pair.of((Document) null, ""), result); // Support an empty input String str = ""; ByteArrayInputStream input = new ByteArrayInputStream(str.getBytes()); result = mSource._findAlternateToolsXml(input); assertEquals( Pair.of((Document) null, "FATAL: Premature end of file.\n"), result); // Support a random string as input str = "Some random string, not even HTML nor XML"; input = new ByteArrayInputStream(str.getBytes()); result = mSource._findAlternateToolsXml(input); assertEquals( Pair.of((Document) null, "FATAL: Content is not allowed in prolog.\n"), result); // Support an HTML input, e.g. a typical 404 document as returned by DL str = "<html><head> " + "<meta http-equiv=\"content-type\" content=\"text/html;charset=utf-8\"> " + "<title>404 Not Found</title> " + "<style><!--" + "body {font-family: arial,sans-serif}" + "div.nav { ... blah blah more css here ... color: green}" + "//--></style> " + "<script><!--" + "var rc=404;" + "//-->" + "</script> " + "</head> " + "<body text=#000000 bgcolor=#ffffff> " + "<table border=0 cellpadding=2 cellspacing=0 width=100%><tr><td rowspan=3 width=1% nowrap> " + "<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>  </b> " + "<td> </td></tr> " + "<tr><td bgcolor=\"#3366cc\"><font face=arial,sans-serif color=\"#ffffff\"><b>Error</b></td></tr> " + "<tr><td> </td></tr></table> " + "<blockquote> " + "<H1>Not Found</H1> " + "The requested URL <code>/404</code> was not found on this server." + " " + "<p> " + "</blockquote> " + "<table width=100% cellpadding=0 cellspacing=0><tr><td bgcolor=\"#3366cc\"><img alt=\"\" width=1 height=4></td></tr></table> " + "</body></html> "; input = new ByteArrayInputStream(str.getBytes()); result = mSource._findAlternateToolsXml(input); assertEquals( Pair.of((Document) null, "FATAL: The element type \"meta\" must be terminated by the matching end-tag \"</meta>\".\n"), result); // Support some random XML document, totally unrelated to our sdk-repository schema str = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" + "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"" + " package=\"some.cool.app\" android:versionName=\"1.6.04\" android:versionCode=\"1604\">" + " <application android:label=\"@string/app_name\" android:icon=\"@drawable/icon\"/>" + "</manifest>"; input = new ByteArrayInputStream(str.getBytes()); result = mSource._findAlternateToolsXml(input); assertEquals(Pair.of((Document) null, ""), result); } /** * Validate we can load a new schema version 3 using the "alternate future tool" mode. */ public void testFindAlternateToolsXml_3() throws Exception { InputStream xmlStream = getTestResource( "/com/android/sdklib/testdata/repository_sample_03.xml"); Pair<Document, String> result = mSource._findAlternateToolsXml(xmlStream); assertNotNull(result.getFirst()); assertEquals("", result.getSecond()); MockMonitor monitor = new MockMonitor(); assertTrue(mSource._parsePackages(result.getFirst(), SdkRepoConstants.NS_URI, monitor)); assertEquals("Found Android SDK Tools, revision 1\n" + "Found Android SDK Tools, revision 42\n" + "Found Android SDK Platform-tools, revision 3\n", monitor.getCapturedVerboseLog()); assertEquals("", monitor.getCapturedLog()); assertEquals("", monitor.getCapturedErrorLog()); // check the packages we found... we expected to find 2 tool packages and 1 // platform-tools package, with at least 1 archive each. Package[] pkgs = mSource.getPackages(); assertEquals(3, pkgs.length); for (Package p : pkgs) { assertTrue((p instanceof ToolPackage) || (p instanceof PlatformToolPackage)); assertTrue(p.getArchives().length >= 1); } } /** * Validate we can still load an old repository in schema version 1 */ public void testLoadRepoXml_01() throws Exception { String filename = "/com/android/sdklib/testdata/repository_sample_01.xml"; InputStream xmlStream = getTestResource(filename); assertNotNull("Missing test file: " + filename, xmlStream); // guess the version from the XML document int version = mSource._getXmlSchemaVersion(xmlStream); assertEquals(1, version); Boolean[] validatorFound = new Boolean[] { Boolean.FALSE }; String[] validationError = new String[] { null }; String url = "not-a-valid-url://" + SdkRepoConstants.URL_DEFAULT_FILENAME; String uri = mSource._validateXml(xmlStream, url, version, validationError, validatorFound); assertEquals(Boolean.TRUE, validatorFound[0]); assertEquals(null, validationError[0]); assertEquals(SdkRepoConstants.getSchemaUri(1), uri); // Validation was successful, load the document MockMonitor monitor = new MockMonitor(); Document doc = mSource._getDocument(xmlStream, monitor); assertNotNull(doc); // Get the packages assertTrue(mSource._parsePackages(doc, uri, monitor)); assertEquals("Found SDK Platform Android 1.0, API 1, revision 3\n" + "Found Documentation for Android SDK, API 1, revision 1\n" + "Found My First add-on, Android API 1, revision 1\n" + "Found SDK Platform Android 1.1, API 2, revision 12\n" + "Found My Second add-on, Android API 2, revision 42\n" + "Found SDK Platform Android Pastry Preview, revision 3\n" + "Found Android SDK Tools, revision 1\n" + "Found Documentation for Android SDK, API 2, revision 42\n" + "Found Android SDK Tools, revision 42\n" + "Found This add-on has no libraries, Android API 4, revision 3\n" + "Found Usb Driver, revision 43\n", monitor.getCapturedVerboseLog()); assertEquals("", monitor.getCapturedLog()); assertEquals("", monitor.getCapturedErrorLog()); // check the packages we found... we expected to find 11 packages with each at least // one archive. Package[] pkgs = mSource.getPackages(); assertEquals(11, pkgs.length); for (Package p : pkgs) { assertTrue(p.getArchives().length >= 1); } // Check the extra packages path, vendor, install folder final String osSdkPath = "SDK"; final SdkManager sdkManager = new MockEmptySdkManager(osSdkPath); ArrayList<String> extraPaths = new ArrayList<String>(); ArrayList<String> extraVendors = new ArrayList<String>(); ArrayList<File> extraInstall = new ArrayList<File>(); for (Package p : pkgs) { if (p instanceof ExtraPackage) { ExtraPackage ep = (ExtraPackage) p; extraPaths.add(ep.getPath()); extraVendors.add(ep.getVendorId() + "/" + ep.getVendorDisplay()); extraInstall.add(ep.getInstallFolder(osSdkPath, sdkManager)); } } assertEquals( "[usb_driver]", Arrays.toString(extraPaths.toArray())); assertEquals( "[/]", Arrays.toString(extraVendors.toArray())); assertEquals( "[SDK/extras/usb_driver]".replace('/', File.separatorChar), Arrays.toString(extraInstall.toArray())); } /** * Validate we can still load an old repository in schema version 2 */ public void testLoadRepoXml_02() throws Exception { String filename = "/com/android/sdklib/testdata/repository_sample_02.xml"; InputStream xmlStream = getTestResource(filename); assertNotNull("Missing test file: " + filename, xmlStream); // guess the version from the XML document int version = mSource._getXmlSchemaVersion(xmlStream); assertEquals(2, version); Boolean[] validatorFound = new Boolean[] { Boolean.FALSE }; String[] validationError = new String[] { null }; String url = "not-a-valid-url://" + SdkRepoConstants.URL_DEFAULT_FILENAME; String uri = mSource._validateXml(xmlStream, url, version, validationError, validatorFound); assertEquals(Boolean.TRUE, validatorFound[0]); assertEquals(null, validationError[0]); assertEquals(SdkRepoConstants.getSchemaUri(2), uri); // Validation was successful, load the document MockMonitor monitor = new MockMonitor(); Document doc = mSource._getDocument(xmlStream, monitor); assertNotNull(doc); // Get the packages assertTrue(mSource._parsePackages(doc, uri, monitor)); assertEquals("Found SDK Platform Android 1.0, API 1, revision 3\n" + "Found Documentation for Android SDK, API 1, revision 1\n" + "Found My First add-on, Android API 1, revision 1\n" + "Found SDK Platform Android 1.1, API 2, revision 12\n" + "Found My Second add-on, Android API 2, revision 42\n" + "Found SDK Platform Android Pastry Preview, revision 3\n" + "Found Android SDK Tools, revision 1\n" + "Found Documentation for Android SDK, API 2, revision 42\n" + "Found Android SDK Tools, revision 42\n" + "Found This add-on has no libraries, Android API 4, revision 3\n" + "Found Usb Driver, revision 43 (Obsolete)\n" + "Found Extra API Dep, revision 2 (Obsolete)\n" + "Found Samples for SDK API 14, revision 24 (Obsolete)\n", monitor.getCapturedVerboseLog()); assertEquals("", monitor.getCapturedLog()); assertEquals("", monitor.getCapturedErrorLog()); // check the packages we found... we expected to find 13 packages with each at least // one archive. Package[] pkgs = mSource.getPackages(); assertEquals(13, pkgs.length); for (Package p : pkgs) { assertTrue(p.getArchives().length >= 1); } // Check the extra packages path, vendor, install folder final String osSdkPath = "SDK"; final SdkManager sdkManager = new MockEmptySdkManager(osSdkPath); ArrayList<String> extraPaths = new ArrayList<String>(); ArrayList<String> extraVendors = new ArrayList<String>(); ArrayList<File> extraInstall = new ArrayList<File>(); for (Package p : pkgs) { if (p instanceof ExtraPackage) { ExtraPackage ep = (ExtraPackage) p; extraPaths.add(ep.getPath()); extraVendors.add(ep.getVendorId() + "/" + ep.getVendorDisplay()); extraInstall.add(ep.getInstallFolder(osSdkPath, sdkManager)); } } assertEquals( "[extra_api_dep, usb_driver]", Arrays.toString(extraPaths.toArray())); assertEquals( "[/, /]", Arrays.toString(extraVendors.toArray())); assertEquals( "[SDK/extras/extra_api_dep, SDK/extras/usb_driver]".replace('/', File.separatorChar), Arrays.toString(extraInstall.toArray())); } /** * Validate what we can load from repository in schema version 3 */ public void testLoadRepoXml_03() throws Exception { String filename = "/com/android/sdklib/testdata/repository_sample_03.xml"; InputStream xmlStream = getTestResource(filename); assertNotNull("Missing test file: " + filename, xmlStream); // guess the version from the XML document int version = mSource._getXmlSchemaVersion(xmlStream); assertEquals(3, version); Boolean[] validatorFound = new Boolean[] { Boolean.FALSE }; String[] validationError = new String[] { null }; String url = "not-a-valid-url://" + SdkRepoConstants.URL_DEFAULT_FILENAME; String uri = mSource._validateXml(xmlStream, url, version, validationError, validatorFound); assertEquals(Boolean.TRUE, validatorFound[0]); assertEquals(null, validationError[0]); assertEquals(SdkRepoConstants.getSchemaUri(3), uri); // Validation was successful, load the document MockMonitor monitor = new MockMonitor(); Document doc = mSource._getDocument(xmlStream, monitor); assertNotNull(doc); // Get the packages assertTrue(mSource._parsePackages(doc, uri, monitor)); assertEquals("Found SDK Platform Android 1.0, API 1, revision 3\n" + "Found Documentation for Android SDK, API 1, revision 1\n" + "Found SDK Platform Android 1.1, API 2, revision 12\n" + "Found SDK Platform Android Pastry Preview, revision 3\n" + "Found Android SDK Tools, revision 1\n" + "Found Documentation for Android SDK, API 2, revision 42\n" + "Found Android SDK Tools, revision 42\n" + "Found Android SDK Platform-tools, revision 3\n" + "Found A USB Driver, revision 43 (Obsolete)\n" + "Found Android Vendor Extra API Dep, revision 2 (Obsolete)\n" + "Found Samples for SDK API 14, revision 24 (Obsolete)\n", monitor.getCapturedVerboseLog()); assertEquals("", monitor.getCapturedLog()); assertEquals("", monitor.getCapturedErrorLog()); // check the packages we found... we expected to find 13 packages with each at least // one archive. Package[] pkgs = mSource.getPackages(); assertEquals(11, pkgs.length); for (Package p : pkgs) { assertTrue(p.getArchives().length >= 1); } // Check the extra packages path, vendor, install folder final String osSdkPath = "SDK"; final SdkManager sdkManager = new MockEmptySdkManager(osSdkPath); ArrayList<String> extraPaths = new ArrayList<String>(); ArrayList<String> extraVendors = new ArrayList<String>(); ArrayList<File> extraInstall = new ArrayList<File>(); for (Package p : pkgs) { if (p instanceof ExtraPackage) { ExtraPackage ep = (ExtraPackage) p; extraPaths.add(ep.getPath()); extraVendors.add(ep.getVendorId() + "/" + ep.getVendorDisplay()); extraInstall.add(ep.getInstallFolder(osSdkPath, sdkManager)); } } assertEquals( "[extra_api_dep, usb_driver]", Arrays.toString(extraPaths.toArray())); assertEquals( "[android_vendor/android_vendor, a/a]", Arrays.toString(extraVendors.toArray())); assertEquals( "[SDK/extras/android_vendor/extra_api_dep, SDK/extras/a/usb_driver]" .replace('/', File.separatorChar), Arrays.toString(extraInstall.toArray())); } /** * Validate what we can load from repository in schema version 4 */ public void testLoadRepoXml_04() throws Exception { String filename = "/com/android/sdklib/testdata/repository_sample_04.xml"; InputStream xmlStream = getTestResource(filename); assertNotNull("Missing test file: " + filename, xmlStream); // guess the version from the XML document int version = mSource._getXmlSchemaVersion(xmlStream); assertEquals(4, version); Boolean[] validatorFound = new Boolean[] { Boolean.FALSE }; String[] validationError = new String[] { null }; String url = "not-a-valid-url://" + SdkRepoConstants.URL_DEFAULT_FILENAME; String uri = mSource._validateXml(xmlStream, url, version, validationError, validatorFound); assertEquals(Boolean.TRUE, validatorFound[0]); assertEquals(null, validationError[0]); assertEquals(SdkRepoConstants.getSchemaUri(4), uri); // Validation was successful, load the document MockMonitor monitor = new MockMonitor(); Document doc = mSource._getDocument(xmlStream, monitor); assertNotNull(doc); // Get the packages assertTrue(mSource._parsePackages(doc, uri, monitor)); assertEquals("Found SDK Platform Android 1.0, API 1, revision 3\n" + "Found Documentation for Android SDK, API 1, revision 1\n" + "Found SDK Platform Android 1.1, API 2, revision 12\n" + "Found SDK Platform Android Pastry Preview, revision 3\n" + "Found Android SDK Tools, revision 1\n" + "Found Documentation for Android SDK, API 2, revision 42\n" + "Found Android SDK Tools, revision 42\n" + "Found Android SDK Platform-tools, revision 3\n" + "Found A USB Driver, revision 43 (Obsolete)\n" + "Found Android Vendor Extra API Dep, revision 2 (Obsolete)\n" + "Found Samples for SDK API 14, revision 24 (Obsolete)\n", monitor.getCapturedVerboseLog()); assertEquals("", monitor.getCapturedLog()); assertEquals("", monitor.getCapturedErrorLog()); // check the packages we found... we expected to find 13 packages with each at least // one archive. // Note the order doesn't necessary match the one from the // assertEquald(getCapturedVerboseLog) because packages are sorted using the // Packages' sorting order, e.g. all platforms are sorted by descending API level, etc. Package[] pkgs = mSource.getPackages(); assertEquals(11, pkgs.length); for (Package p : pkgs) { assertTrue(p.getArchives().length >= 1); } // Check the layoutlib of the platform packages. ArrayList<Pair<Integer, Integer>> layoutlibVers = new ArrayList<Pair<Integer,Integer>>(); for (Package p : pkgs) { if (p instanceof PlatformPackage) { layoutlibVers.add(((PlatformPackage) p).getLayoutlibVersion()); } } assertEquals( "[Pair [first=1, second=0], " + // platform API 5 preview "Pair [first=5, second=31415], " + // platform API 2 "Pair [first=5, second=0]]", // platform API 1 Arrays.toString(layoutlibVers.toArray())); // Check the extra packages path, vendor, install folder and project-files final String osSdkPath = "SDK"; final SdkManager sdkManager = new MockEmptySdkManager(osSdkPath); ArrayList<String> extraPaths = new ArrayList<String>(); ArrayList<String> extraVendors = new ArrayList<String>(); ArrayList<File> extraInstall = new ArrayList<File>(); ArrayList<ArrayList<String>> extraFilePaths = new ArrayList<ArrayList<String>>(); for (Package p : pkgs) { if (p instanceof ExtraPackage) { ExtraPackage ep = (ExtraPackage) p; extraPaths.add(ep.getPath()); extraVendors.add(ep.getVendorId() + "/" + ep.getVendorDisplay()); extraInstall.add(ep.getInstallFolder(osSdkPath, sdkManager)); ArrayList<String> filePaths = new ArrayList<String>(); for (String filePath : ep.getProjectFiles()) { filePaths.add(filePath); } extraFilePaths.add(filePaths); } } assertEquals( "[extra_api_dep, usb_driver]", Arrays.toString(extraPaths.toArray())); assertEquals( "[android_vendor/android_vendor, a/a]", Arrays.toString(extraVendors.toArray())); assertEquals( "[SDK/extras/android_vendor/extra_api_dep, SDK/extras/a/usb_driver]" .replace('/', File.separatorChar), Arrays.toString(extraInstall.toArray())); assertEquals( "[[v8/veggies_8.jar, readme.txt, dir1/dir 2 with space/mylib.jar], " + "[]]", Arrays.toString(extraFilePaths.toArray())); } /** * Validate what we can load from repository in schema version 5 */ public void testLoadRepoXml_05() throws Exception { String filename = "/com/android/sdklib/testdata/repository_sample_05.xml"; InputStream xmlStream = getTestResource(filename); assertNotNull("Missing test file: " + filename, xmlStream); // guess the version from the XML document int version = mSource._getXmlSchemaVersion(xmlStream); assertEquals(5, version); Boolean[] validatorFound = new Boolean[] { Boolean.FALSE }; String[] validationError = new String[] { null }; String url = "not-a-valid-url://" + SdkRepoConstants.URL_DEFAULT_FILENAME; String uri = mSource._validateXml(xmlStream, url, version, validationError, validatorFound); assertEquals(Boolean.TRUE, validatorFound[0]); assertEquals(null, validationError[0]); assertEquals(SdkRepoConstants.getSchemaUri(5), uri); // Validation was successful, load the document MockMonitor monitor = new MockMonitor(); Document doc = mSource._getDocument(xmlStream, monitor); assertNotNull(doc); // Get the packages assertTrue(mSource._parsePackages(doc, uri, monitor)); assertEquals("Found SDK Platform Android 1.0, API 1, revision 3\n" + "Found Documentation for Android SDK, API 1, revision 1\n" + "Found Sources for Android SDK, API 1, revision 1\n" + "Found SDK Platform Android 1.1, API 2, revision 12\n" + "Found Intel x86 Atom System Image, Android API 2, revision 1\n" + "Found ARM EABI v7a System Image, Android API 2, revision 2\n" + "Found Sources for Android SDK, API 2, revision 2\n" + "Found SDK Platform Android Pastry Preview, revision 3\n" + "Found Android SDK Tools, revision 1\n" + "Found Documentation for Android SDK, API 2, revision 42\n" + "Found Android SDK Tools, revision 42\n" + "Found Android SDK Platform-tools, revision 3\n" + "Found A USB Driver, revision 43 (Obsolete)\n" + "Found Android Vendor Extra API Dep, revision 2 (Obsolete)\n" + "Found Samples for SDK API 14, revision 24 (Obsolete)\n" + "Found ARM EABI System Image, Android API 42, revision 12\n" + "Found Sources for Android SDK, API 42, revision 12\n", monitor.getCapturedVerboseLog()); assertEquals("", monitor.getCapturedLog()); assertEquals("", monitor.getCapturedErrorLog()); // check the packages we found... we expected to find 13 packages with each at least // one archive. // Note the order doesn't necessary match the one from the // assertEquald(getCapturedVerboseLog) because packages are sorted using the // Packages' sorting order, e.g. all platforms are sorted by descending API level, etc. Package[] pkgs = mSource.getPackages(); assertEquals(17, pkgs.length); for (Package p : pkgs) { assertTrue(p.getArchives().length >= 1); } // Check the layoutlib & included-abi of the platform packages. ArrayList<Pair<Integer, Integer>> layoutlibVers = new ArrayList<Pair<Integer,Integer>>(); ArrayList<String> includedAbi = new ArrayList<String>(); for (Package p : pkgs) { if (p instanceof PlatformPackage) { layoutlibVers.add(((PlatformPackage) p).getLayoutlibVersion()); String abi = ((PlatformPackage) p).getIncludedAbi(); includedAbi.add(abi == null ? "(null)" : abi); } } assertEquals( "[Pair [first=1, second=0], " + // platform API 5 preview "Pair [first=5, second=31415], " + // platform API 2 "Pair [first=5, second=0]]", // platform API 1 Arrays.toString(layoutlibVers.toArray())); assertEquals( "[(null), " + // platform API 5 preview "x86, " + // platform API 2 "armeabi]", // platform API 1 Arrays.toString(includedAbi.toArray())); // Check the extra packages path, vendor, install folder, project-files, old-paths final String osSdkPath = "SDK"; final SdkManager sdkManager = new MockEmptySdkManager(osSdkPath); ArrayList<String> extraPaths = new ArrayList<String>(); ArrayList<String> extraVendors = new ArrayList<String>(); ArrayList<File> extraInstall = new ArrayList<File>(); ArrayList<ArrayList<String>> extraFilePaths = new ArrayList<ArrayList<String>>(); for (Package p : pkgs) { if (p instanceof ExtraPackage) { ExtraPackage ep = (ExtraPackage) p; // combine path and old-paths in the form "path [old_path1, old_path2]" extraPaths.add(ep.getPath() + " " + Arrays.toString(ep.getOldPaths())); extraVendors.add(ep.getVendorId() + "/" + ep.getVendorDisplay()); extraInstall.add(ep.getInstallFolder(osSdkPath, sdkManager)); ArrayList<String> filePaths = new ArrayList<String>(); for (String filePath : ep.getProjectFiles()) { filePaths.add(filePath); } extraFilePaths.add(filePaths); } } assertEquals( "[extra_api_dep [path1, old_path2, oldPath3], " + "usb_driver []]", Arrays.toString(extraPaths.toArray())); assertEquals( "[android_vendor/android_vendor, " + "a/a]", Arrays.toString(extraVendors.toArray())); assertEquals( ("[SDK/extras/android_vendor/extra_api_dep, " + "SDK/extras/a/usb_driver]").replace('/', File.separatorChar), Arrays.toString(extraInstall.toArray())); assertEquals( "[[v8/veggies_8.jar, readme.txt, dir1/dir 2 with space/mylib.jar], " + "[]]", Arrays.toString(extraFilePaths.toArray())); // Check the system-image packages ArrayList<String> sysImgVersionAbi = new ArrayList<String>(); for (Package p : pkgs) { if (p instanceof SystemImagePackage) { SystemImagePackage sip = (SystemImagePackage) p; String v = sip.getAndroidVersion().getApiString(); String a = sip.getAbi(); sysImgVersionAbi.add(String.format("%1$s %2$s", v, a)); //$NON-NLS-1$ } } assertEquals( "[42 armeabi, " + "2 armeabi-v7a, " + "2 x86]", Arrays.toString(sysImgVersionAbi.toArray())); // Check the source packages ArrayList<String> sourceVersion = new ArrayList<String>(); for (Package p : pkgs) { if (p instanceof SourcePackage) { SourcePackage sp = (SourcePackage) p; String v = sp.getAndroidVersion().getApiString(); sourceVersion.add(v); } } assertEquals( "[42, 2, 1]", Arrays.toString(sourceVersion.toArray())); } /** * Validate what we can load from repository in schema version 6 */ public void testLoadRepoXml_06() throws Exception { String filename = "/com/android/sdklib/testdata/repository_sample_06.xml"; InputStream xmlStream = getTestResource(filename); assertNotNull("Missing test file: " + filename, xmlStream); // guess the version from the XML document int version = mSource._getXmlSchemaVersion(xmlStream); assertEquals(6, version); Boolean[] validatorFound = new Boolean[] { Boolean.FALSE }; String[] validationError = new String[] { null }; String url = "not-a-valid-url://" + SdkRepoConstants.URL_DEFAULT_FILENAME; String uri = mSource._validateXml(xmlStream, url, version, validationError, validatorFound); assertEquals(Boolean.TRUE, validatorFound[0]); assertEquals(null, validationError[0]); assertEquals(SdkRepoConstants.getSchemaUri(6), uri); // Validation was successful, load the document MockMonitor monitor = new MockMonitor(); Document doc = mSource._getDocument(xmlStream, monitor); assertNotNull(doc); // Get the packages assertTrue(mSource._parsePackages(doc, uri, monitor)); assertEquals("Found SDK Platform Android 1.0, API 1, revision 3\n" + "Found Documentation for Android SDK, API 1, revision 1\n" + "Found Sources for Android SDK, API 1, revision 1\n" + "Found SDK Platform Android 1.1, API 2, revision 12\n" + "Found Intel x86 Atom System Image, Android API 2, revision 1\n" + "Found ARM EABI v7a System Image, Android API 2, revision 2\n" + "Found Sources for Android SDK, API 2, revision 2\n" + "Found SDK Platform Android Pastry Preview, revision 3\n" + "Found Android SDK Tools, revision 1\n" + "Found Documentation for Android SDK, API 2, revision 42\n" + "Found Android SDK Tools, revision 42\n" + "Found Android SDK Platform-tools, revision 3\n" + "Found Samples for SDK API 14, revision 24 (Obsolete)\n" + "Found ARM EABI System Image, Android API 42, revision 12\n" + "Found MIPS System Image, Android API 42, revision 12\n" + "Found Sources for Android SDK, API 42, revision 12\n", monitor.getCapturedVerboseLog()); assertEquals("", monitor.getCapturedLog()); assertEquals("", monitor.getCapturedErrorLog()); // check the packages we found... we expected to find 13 packages with each at least // one archive. // Note the order doesn't necessary match the one from the // assertEquald(getCapturedVerboseLog) because packages are sorted using the // Packages' sorting order, e.g. all platforms are sorted by descending API level, etc. Package[] pkgs = mSource.getPackages(); assertEquals(16, pkgs.length); for (Package p : pkgs) { assertTrue(p.getArchives().length >= 1); } // Check the layoutlib & included-abi of the platform packages. ArrayList<Pair<Integer, Integer>> layoutlibVers = new ArrayList<Pair<Integer,Integer>>(); ArrayList<String> includedAbi = new ArrayList<String>(); for (Package p : pkgs) { if (p instanceof PlatformPackage) { layoutlibVers.add(((PlatformPackage) p).getLayoutlibVersion()); String abi = ((PlatformPackage) p).getIncludedAbi(); includedAbi.add(abi == null ? "(null)" : abi); } } assertEquals( "[Pair [first=1, second=0], " + // platform API 5 preview "Pair [first=5, second=31415], " + // platform API 2 "Pair [first=5, second=0]]", // platform API 1 Arrays.toString(layoutlibVers.toArray())); assertEquals( "[(null), " + // platform API 5 preview "x86, " + // platform API 2 "armeabi]", // platform API 1 Arrays.toString(includedAbi.toArray())); // Check the extra packages path, vendor, install folder, project-files, old-paths final String osSdkPath = "SDK"; final SdkManager sdkManager = new MockEmptySdkManager(osSdkPath); ArrayList<String> extraPaths = new ArrayList<String>(); ArrayList<String> extraVendors = new ArrayList<String>(); ArrayList<File> extraInstall = new ArrayList<File>(); ArrayList<ArrayList<String>> extraFilePaths = new ArrayList<ArrayList<String>>(); for (Package p : pkgs) { if (p instanceof ExtraPackage) { ExtraPackage ep = (ExtraPackage) p; // combine path and old-paths in the form "path [old_path1, old_path2]" extraPaths.add(ep.getPath() + " " + Arrays.toString(ep.getOldPaths())); extraVendors.add(ep.getVendorId() + "/" + ep.getVendorDisplay()); extraInstall.add(ep.getInstallFolder(osSdkPath, sdkManager)); ArrayList<String> filePaths = new ArrayList<String>(); for (String filePath : ep.getProjectFiles()) { filePaths.add(filePath); } extraFilePaths.add(filePaths); } } // There are no extra packages anymore in repository-6 assertEquals("[]", Arrays.toString(extraPaths.toArray())); assertEquals("[]", Arrays.toString(extraVendors.toArray())); assertEquals("[]", Arrays.toString(extraInstall.toArray())); assertEquals("[]", Arrays.toString(extraFilePaths.toArray())); // Check the system-image packages ArrayList<String> sysImgVersionAbi = new ArrayList<String>(); for (Package p : pkgs) { if (p instanceof SystemImagePackage) { SystemImagePackage sip = (SystemImagePackage) p; String v = sip.getAndroidVersion().getApiString(); String a = sip.getAbi(); sysImgVersionAbi.add(String.format("%1$s %2$s", v, a)); //$NON-NLS-1$ } } assertEquals( "[42 armeabi, " + "42 mips, " + "2 armeabi-v7a, " + "2 x86]", Arrays.toString(sysImgVersionAbi.toArray())); // Check the source packages ArrayList<String> sourceVersion = new ArrayList<String>(); for (Package p : pkgs) { if (p instanceof SourcePackage) { SourcePackage sp = (SourcePackage) p; String v = sp.getAndroidVersion().getApiString(); sourceVersion.add(v); } } assertEquals( "[42, 2, 1]", Arrays.toString(sourceVersion.toArray())); } /** * Validate what we can load from repository in schema version 7 */ public void testLoadRepoXml_07() throws Exception { String filename = "/com/android/sdklib/testdata/repository_sample_07.xml"; InputStream xmlStream = getTestResource(filename); assertNotNull("Missing test file: " + filename, xmlStream); // guess the version from the XML document int version = mSource._getXmlSchemaVersion(xmlStream); assertEquals(7, version); Boolean[] validatorFound = new Boolean[] { Boolean.FALSE }; String[] validationError = new String[] { null }; String url = "not-a-valid-url://" + SdkRepoConstants.URL_DEFAULT_FILENAME; String uri = mSource._validateXml(xmlStream, url, version, validationError, validatorFound); assertEquals(Boolean.TRUE, validatorFound[0]); assertEquals(null, validationError[0]); assertEquals(SdkRepoConstants.getSchemaUri(7), uri); // Validation was successful, load the document MockMonitor monitor = new MockMonitor(); Document doc = mSource._getDocument(xmlStream, monitor); assertNotNull(doc); // Get the packages assertTrue(mSource._parsePackages(doc, uri, monitor)); assertEquals("Found SDK Platform Android 1.0, API 1, revision 3\n" + "Found Documentation for Android SDK, API 1, revision 1\n" + "Found Sources for Android SDK, API 1, revision 1\n" + "Found SDK Platform Android 1.1, API 2, revision 12\n" + "Found Intel x86 Atom System Image, Android API 2, revision 1\n" + "Found ARM EABI v7a System Image, Android API 2, revision 2\n" + "Found Sources for Android SDK, API 2, revision 2\n" + "Found SDK Platform Android Pastry Preview, revision 3\n" + "Found Android SDK Tools, revision 1.2.3 rc4\n" + "Found Documentation for Android SDK, API 2, revision 42\n" + "Found Android SDK Tools, revision 42\n" + "Found Android SDK Platform-tools, revision 3 rc5\n" + "Found Samples for SDK API 14, revision 24 (Obsolete)\n" + "Found Samples for SDK API 14, revision 25 (Obsolete)\n" + "Found ARM EABI System Image, Android API 42, revision 12\n" + "Found MIPS System Image, Android API 42, revision 12\n" + "Found Sources for Android SDK, API 42, revision 12\n", monitor.getCapturedVerboseLog()); assertEquals("", monitor.getCapturedLog()); assertEquals("", monitor.getCapturedErrorLog()); // check the packages we found... we expected to find 13 packages with each at least // one archive. // Note the order doesn't necessary match the one from the // assertEquald(getCapturedVerboseLog) because packages are sorted using the // Packages' sorting order, e.g. all platforms are sorted by descending API level, etc. Package[] pkgs = mSource.getPackages(); assertEquals(17, pkgs.length); for (Package p : pkgs) { assertTrue(p.getArchives().length >= 1); } // Check the layoutlib & included-abi of the platform packages. ArrayList<Pair<Integer, Integer>> layoutlibVers = new ArrayList<Pair<Integer,Integer>>(); ArrayList<String> includedAbi = new ArrayList<String>(); for (Package p : pkgs) { if (p instanceof PlatformPackage) { layoutlibVers.add(((PlatformPackage) p).getLayoutlibVersion()); String abi = ((PlatformPackage) p).getIncludedAbi(); includedAbi.add(abi == null ? "(null)" : abi); } } assertEquals( "[Pair [first=1, second=0], " + // platform API 5 preview "Pair [first=5, second=31415], " + // platform API 2 "Pair [first=5, second=0]]", // platform API 1 Arrays.toString(layoutlibVers.toArray())); assertEquals( "[(null), " + // platform API 5 preview "x86, " + // platform API 2 "armeabi]", // platform API 1 Arrays.toString(includedAbi.toArray())); // Check the extra packages path, vendor, install folder, project-files, old-paths final String osSdkPath = "SDK"; final SdkManager sdkManager = new MockEmptySdkManager(osSdkPath); ArrayList<String> extraPaths = new ArrayList<String>(); ArrayList<String> extraVendors = new ArrayList<String>(); ArrayList<File> extraInstall = new ArrayList<File>(); ArrayList<ArrayList<String>> extraFilePaths = new ArrayList<ArrayList<String>>(); for (Package p : pkgs) { if (p instanceof ExtraPackage) { ExtraPackage ep = (ExtraPackage) p; // combine path and old-paths in the form "path [old_path1, old_path2]" extraPaths.add(ep.getPath() + " " + Arrays.toString(ep.getOldPaths())); extraVendors.add(ep.getVendorId() + "/" + ep.getVendorDisplay()); extraInstall.add(ep.getInstallFolder(osSdkPath, sdkManager)); ArrayList<String> filePaths = new ArrayList<String>(); for (String filePath : ep.getProjectFiles()) { filePaths.add(filePath); } extraFilePaths.add(filePaths); } } // There are no extra packages anymore in repository-6 assertEquals("[]", Arrays.toString(extraPaths.toArray())); assertEquals("[]", Arrays.toString(extraVendors.toArray())); assertEquals("[]", Arrays.toString(extraInstall.toArray())); assertEquals("[]", Arrays.toString(extraFilePaths.toArray())); // Check the system-image packages ArrayList<String> sysImgVersionAbi = new ArrayList<String>(); for (Package p : pkgs) { if (p instanceof SystemImagePackage) { SystemImagePackage sip = (SystemImagePackage) p; String v = sip.getAndroidVersion().getApiString(); String a = sip.getAbi(); sysImgVersionAbi.add(String.format("%1$s %2$s", v, a)); //$NON-NLS-1$ } } assertEquals( "[42 armeabi, " + "42 mips, " + "2 armeabi-v7a, " + "2 x86]", Arrays.toString(sysImgVersionAbi.toArray())); // Check the source packages ArrayList<String> sourceVersion = new ArrayList<String>(); for (Package p : pkgs) { if (p instanceof SourcePackage) { SourcePackage sp = (SourcePackage) p; String v = sp.getAndroidVersion().getApiString(); sourceVersion.add(v); } } assertEquals( "[42, 2, 1]", Arrays.toString(sourceVersion.toArray())); // Check the min-tools-rev ArrayList<String> minToolsRevs = new ArrayList<String>(); for (Package p : pkgs) { if (p instanceof IMinToolsDependency) { minToolsRevs.add(p.getListDescription() + ": " + ((IMinToolsDependency) p).getMinToolsRevision().toShortString()); } } assertEquals( "[SDK Platform Android Pastry Preview: 0, " + "SDK Platform Android 1.1: 0, " + "SDK Platform Android 1.0: 2.0.1, " + "Samples for SDK API 14 (Obsolete): 5, " + "Samples for SDK API 14 (Obsolete): 5.1.2 rc3]", Arrays.toString(minToolsRevs.toArray())); // Check the min-platform-tools-rev ArrayList<String> minPlatToolsRevs = new ArrayList<String>(); for (Package p : pkgs) { if (p instanceof IMinPlatformToolsDependency) { minPlatToolsRevs.add(p.getListDescription() + ": " + ((IMinPlatformToolsDependency) p).getMinPlatformToolsRevision().toShortString()); } } assertEquals( "[Android SDK Tools: 4, " + "Android SDK Tools: 4 rc5]", Arrays.toString(minPlatToolsRevs.toArray())); } /** * Validate what we can load from repository in schema version 8 */ public void testLoadRepoXml_08() throws Exception { String filename = "/com/android/sdklib/testdata/repository_sample_08.xml"; InputStream xmlStream = getTestResource(filename); assertNotNull("Missing test file: " + filename, xmlStream); // guess the version from the XML document int version = mSource._getXmlSchemaVersion(xmlStream); assertEquals(8, version); Boolean[] validatorFound = new Boolean[] { Boolean.FALSE }; String[] validationError = new String[] { null }; String url = "not-a-valid-url://" + SdkRepoConstants.URL_DEFAULT_FILENAME; String uri = mSource._validateXml(xmlStream, url, version, validationError, validatorFound); assertEquals(Boolean.TRUE, validatorFound[0]); assertEquals(null, validationError[0]); assertEquals(SdkRepoConstants.getSchemaUri(8), uri); // Validation was successful, load the document MockMonitor monitor = new MockMonitor(); Document doc = mSource._getDocument(xmlStream, monitor); assertNotNull(doc); // Get the packages assertTrue(mSource._parsePackages(doc, uri, monitor)); assertEquals("Found SDK Platform Android 1.0, API 1, revision 3\n" + "Found Documentation for Android SDK, API 1, revision 1\n" + "Found Sources for Android SDK, API 1, revision 1\n" + "Found SDK Platform Android 1.1, API 2, revision 12\n" + "Found Intel x86 Atom System Image, Android API 2, revision 1\n" + "Found ARM EABI v7a System Image, Android API 2, revision 2\n" + "Found Sources for Android SDK, API 2, revision 2\n" + "Found SDK Platform Android Pastry Preview, revision 3\n" + "Found Android SDK Tools, revision 1.2.3 rc4\n" + "Found Android SDK Build-tools, revision 3 rc5\n" + "Found Android SDK Build-tools, revision 3.0.1\n" + "Found Documentation for Android SDK, API 2, revision 42\n" + "Found Android SDK Tools, revision 42\n" + "Found Android SDK Platform-tools, revision 3 rc5\n" + "Found Android SDK Build-tools, revision 3\n" + "Found Samples for SDK API 14, revision 24 (Obsolete)\n" + "Found Samples for SDK API 14, revision 25 (Obsolete)\n" + "Found ARM EABI System Image, Android API 42, revision 12\n" + "Found MIPS System Image, Android API 42, revision 12\n" + "Found Sources for Android SDK, API 42, revision 12\n" + "Found Android SDK Build-tools, revision 12.13.14\n", monitor.getCapturedVerboseLog()); assertEquals("", monitor.getCapturedLog()); assertEquals("", monitor.getCapturedErrorLog()); // check the packages we found... we expected to find 13 packages with each at least // one archive. // Note the order doesn't necessary match the one from the // assertEquald(getCapturedVerboseLog) because packages are sorted using the // Packages' sorting order, e.g. all platforms are sorted by descending API level, etc. Package[] pkgs = mSource.getPackages(); assertEquals(21, pkgs.length); for (Package p : pkgs) { assertTrue(p.getArchives().length >= 1); } // Check the layoutlib & included-abi of the platform packages. ArrayList<Pair<Integer, Integer>> layoutlibVers = new ArrayList<Pair<Integer,Integer>>(); ArrayList<String> includedAbi = new ArrayList<String>(); for (Package p : pkgs) { if (p instanceof PlatformPackage) { layoutlibVers.add(((PlatformPackage) p).getLayoutlibVersion()); String abi = ((PlatformPackage) p).getIncludedAbi(); includedAbi.add(abi == null ? "(null)" : abi); } } assertEquals( "[Pair [first=1, second=0], " + // platform API 5 preview "Pair [first=5, second=31415], " + // platform API 2 "Pair [first=5, second=0]]", // platform API 1 Arrays.toString(layoutlibVers.toArray())); assertEquals( "[(null), " + // platform API 5 preview "x86, " + // platform API 2 "armeabi]", // platform API 1 Arrays.toString(includedAbi.toArray())); // Check the extra packages path, vendor, install folder, project-files, old-paths final String osSdkPath = "SDK"; final SdkManager sdkManager = new MockEmptySdkManager(osSdkPath); ArrayList<String> extraPaths = new ArrayList<String>(); ArrayList<String> extraVendors = new ArrayList<String>(); ArrayList<File> extraInstall = new ArrayList<File>(); ArrayList<ArrayList<String>> extraFilePaths = new ArrayList<ArrayList<String>>(); for (Package p : pkgs) { if (p instanceof ExtraPackage) { ExtraPackage ep = (ExtraPackage) p; // combine path and old-paths in the form "path [old_path1, old_path2]" extraPaths.add(ep.getPath() + " " + Arrays.toString(ep.getOldPaths())); extraVendors.add(ep.getVendorId() + "/" + ep.getVendorDisplay()); extraInstall.add(ep.getInstallFolder(osSdkPath, sdkManager)); ArrayList<String> filePaths = new ArrayList<String>(); for (String filePath : ep.getProjectFiles()) { filePaths.add(filePath); } extraFilePaths.add(filePaths); } } // There are no extra packages anymore in repository-6 assertEquals("[]", Arrays.toString(extraPaths.toArray())); assertEquals("[]", Arrays.toString(extraVendors.toArray())); assertEquals("[]", Arrays.toString(extraInstall.toArray())); assertEquals("[]", Arrays.toString(extraFilePaths.toArray())); // Check the system-image packages ArrayList<String> sysImgVersionAbi = new ArrayList<String>(); for (Package p : pkgs) { if (p instanceof SystemImagePackage) { SystemImagePackage sip = (SystemImagePackage) p; String v = sip.getAndroidVersion().getApiString(); String a = sip.getAbi(); sysImgVersionAbi.add(String.format("%1$s %2$s", v, a)); //$NON-NLS-1$ } } assertEquals( "[42 armeabi, " + "42 mips, " + "2 armeabi-v7a, " + "2 x86]", Arrays.toString(sysImgVersionAbi.toArray())); // Check the source packages ArrayList<String> sourceVersion = new ArrayList<String>(); for (Package p : pkgs) { if (p instanceof SourcePackage) { SourcePackage sp = (SourcePackage) p; String v = sp.getAndroidVersion().getApiString(); sourceVersion.add(v); } } assertEquals( "[42, 2, 1]", Arrays.toString(sourceVersion.toArray())); // Check the min-tools-rev ArrayList<String> minToolsRevs = new ArrayList<String>(); for (Package p : pkgs) { if (p instanceof IMinToolsDependency) { minToolsRevs.add(p.getListDescription() + ": " + ((IMinToolsDependency) p).getMinToolsRevision().toShortString()); } } assertEquals( "[SDK Platform Android Pastry Preview: 0, " + "SDK Platform Android 1.1: 0, " + "SDK Platform Android 1.0: 2.0.1, " + "Samples for SDK API 14 (Obsolete): 5, " + "Samples for SDK API 14 (Obsolete): 5.1.2 rc3]", Arrays.toString(minToolsRevs.toArray())); // Check the min-platform-tools-rev ArrayList<String> minPlatToolsRevs = new ArrayList<String>(); for (Package p : pkgs) { if (p instanceof IMinPlatformToolsDependency) { minPlatToolsRevs.add(p.getListDescription() + ": " + ((IMinPlatformToolsDependency) p).getMinPlatformToolsRevision().toShortString()); } } assertEquals( "[Android SDK Tools: 4, " + "Android SDK Tools: 4 rc5]", Arrays.toString(minPlatToolsRevs.toArray())); // Check the list display of the packages ArrayList<String> listDescs = new ArrayList<String>(); for (Package p : pkgs) { listDescs.add(p.getListDescription()); } assertEquals( "[Android SDK Tools, " + "Android SDK Tools, " + "Android SDK Platform-tools, " + "Android SDK Build-tools, " + "Android SDK Build-tools, " + "Android SDK Build-tools, " + "Android SDK Build-tools, " + "Documentation for Android SDK, " + "Documentation for Android SDK, " + "SDK Platform Android Pastry Preview, " + "SDK Platform Android 1.1, " + "SDK Platform Android 1.0, " + "Samples for SDK API 14 (Obsolete), " + "Samples for SDK API 14 (Obsolete), " + "ARM EABI System Image, " + "MIPS System Image, " + "ARM EABI v7a System Image, " + "Intel x86 Atom System Image, " + "Sources for Android SDK, " + "Sources for Android SDK, " + "Sources for Android SDK]", Arrays.toString(listDescs.toArray())); } /** * Validate what we can load from repository in schema version 9 */ public void testLoadRepoXml_09() throws Exception { String filename = "/com/android/sdklib/testdata/repository_sample_09.xml"; InputStream xmlStream = getTestResource(filename); assertNotNull("Missing test file: " + filename, xmlStream); // guess the version from the XML document int version = mSource._getXmlSchemaVersion(xmlStream); assertEquals(9, version); Boolean[] validatorFound = new Boolean[] { Boolean.FALSE }; String[] validationError = new String[] { null }; String url = "not-a-valid-url://" + SdkRepoConstants.URL_DEFAULT_FILENAME; String uri = mSource._validateXml(xmlStream, url, version, validationError, validatorFound); assertEquals(Boolean.TRUE, validatorFound[0]); assertEquals(null, validationError[0]); assertEquals(SdkRepoConstants.getSchemaUri(9), uri); // Validation was successful, load the document MockMonitor monitor = new MockMonitor(); Document doc = mSource._getDocument(xmlStream, monitor); assertNotNull(doc); // Get the packages assertTrue(mSource._parsePackages(doc, uri, monitor)); // Verbose log order matches the XML order and not the sorted display order. assertEquals("Found SDK Platform Android 1.0, API 1, revision 3\n" + "Found Documentation for Android SDK, API 1, revision 1\n" + "Found Sources for Android SDK, API 1, revision 1\n" + "Found SDK Platform Android 1.1, API 2, revision 12\n" + "Found Intel x86 Atom System Image, Android API 2, revision 1\n" + "Found ARM EABI v7a System Image, Android API 2, revision 2\n" + "Found Custom Thing ARM EABI v7a System Image, Android API 2, revision 2\n" + "Found Sources for Android SDK, API 2, revision 2\n" + "Found SDK Platform Android Pastry Preview, revision 3\n" + "Found Android SDK Tools, revision 1.2.3 rc4\n" + "Found Android SDK Build-tools, revision 3 rc5\n" + "Found Android SDK Build-tools, revision 3.0.1\n" + "Found Documentation for Android SDK, API 2, revision 42\n" + "Found Android SDK Tools, revision 42\n" + "Found Android SDK Platform-tools, revision 3 rc5\n" + "Found Android SDK Build-tools, revision 3\n" + "Found Samples for SDK API 14, revision 24 (Obsolete)\n" + "Found Samples for SDK API 14, revision 25 (Obsolete)\n" + "Found Variant 1 ARM EABI System Image, Android API 42, revision 12\n" + "Found Variant 1 MIPS System Image, Android API 42, revision 12\n" + "Found Variant 2 MIPS System Image, Android API 42, revision 12\n" + "Found Sources for Android SDK, API 42, revision 12\n" + "Found Android SDK Build-tools, revision 12.13.14\n", monitor.getCapturedVerboseLog()); assertEquals("", monitor.getCapturedLog()); assertEquals("", monitor.getCapturedErrorLog()); // check the packages we found... we expected to find 13 packages with each at least // one archive. // Note the order doesn't necessary match the one from the // assertEquald(getCapturedVerboseLog) because packages are sorted using the // Packages' sorting order, e.g. all platforms are sorted by descending API level, etc. // Order is defined by // com.android.sdklib.internal.repository.packages.Package.comparisonKey() Package[] pkgs = mSource.getPackages(); assertEquals(23, pkgs.length); for (Package p : pkgs) { assertTrue(p.getArchives().length >= 1); } // Check the layoutlib & included-abi of the platform packages. ArrayList<Pair<Integer, Integer>> layoutlibVers = new ArrayList<Pair<Integer,Integer>>(); ArrayList<String> includedAbi = new ArrayList<String>(); for (Package p : pkgs) { if (p instanceof PlatformPackage) { layoutlibVers.add(((PlatformPackage) p).getLayoutlibVersion()); String abi = ((PlatformPackage) p).getIncludedAbi(); includedAbi.add(abi == null ? "(null)" : abi); } } assertEquals( "[Pair [first=1, second=0], " + // platform API 5 preview "Pair [first=5, second=31415], " + // platform API 2 "Pair [first=5, second=0]]", // platform API 1 Arrays.toString(layoutlibVers.toArray())); assertEquals( "[(null), " + // platform API 5 preview "x86, " + // platform API 2 "armeabi]", // platform API 1 Arrays.toString(includedAbi.toArray())); // Check the extra packages path, vendor, install folder, project-files, old-paths final String osSdkPath = "SDK"; final SdkManager sdkManager = new MockEmptySdkManager(osSdkPath); ArrayList<String> extraPaths = new ArrayList<String>(); ArrayList<String> extraVendors = new ArrayList<String>(); ArrayList<File> extraInstall = new ArrayList<File>(); ArrayList<ArrayList<String>> extraFilePaths = new ArrayList<ArrayList<String>>(); for (Package p : pkgs) { if (p instanceof ExtraPackage) { ExtraPackage ep = (ExtraPackage) p; // combine path and old-paths in the form "path [old_path1, old_path2]" extraPaths.add(ep.getPath() + " " + Arrays.toString(ep.getOldPaths())); extraVendors.add(ep.getVendorId() + "/" + ep.getVendorDisplay()); extraInstall.add(ep.getInstallFolder(osSdkPath, sdkManager)); ArrayList<String> filePaths = new ArrayList<String>(); for (String filePath : ep.getProjectFiles()) { filePaths.add(filePath); } extraFilePaths.add(filePaths); } } // There are no extra packages anymore in repository-6 assertEquals("[]", Arrays.toString(extraPaths.toArray())); assertEquals("[]", Arrays.toString(extraVendors.toArray())); assertEquals("[]", Arrays.toString(extraInstall.toArray())); assertEquals("[]", Arrays.toString(extraFilePaths.toArray())); // Check the system-image packages ArrayList<String> sysImgInfo = new ArrayList<String>(); for (Package p : pkgs) { if (p instanceof SystemImagePackage) { SystemImagePackage sip = (SystemImagePackage) p; sysImgInfo.add(String.format("%1$s %2$s: %3$s", //$NON-NLS-1$ sip.getAndroidVersion().getApiString(), sip.getAbi(), sip.getTag())); } } assertEquals( "[42 armeabi: variant-1 [Variant 1], " + "42 mips: variant-1 [Variant 1], " + "42 mips: variant-2 [Variant 2], " + "2 armeabi-v7a: coolThing [Custom Thing], " + "2 armeabi-v7a: default [Default], " + "2 x86: default [Default]]", Arrays.toString(sysImgInfo.toArray())); // Check the source packages ArrayList<String> sourceVersion = new ArrayList<String>(); for (Package p : pkgs) { if (p instanceof SourcePackage) { SourcePackage sp = (SourcePackage) p; String v = sp.getAndroidVersion().getApiString(); sourceVersion.add(v); } } assertEquals( "[42, 2, 1]", Arrays.toString(sourceVersion.toArray())); // Check the min-tools-rev ArrayList<String> minToolsRevs = new ArrayList<String>(); for (Package p : pkgs) { if (p instanceof IMinToolsDependency) { minToolsRevs.add(p.getListDescription() + ": " + ((IMinToolsDependency) p).getMinToolsRevision().toShortString()); } } assertEquals( "[SDK Platform Android Pastry Preview: 0, " + "SDK Platform Android 1.1: 0, " + "SDK Platform Android 1.0: 2.0.1, " + "Samples for SDK API 14 (Obsolete): 5, " + "Samples for SDK API 14 (Obsolete): 5.1.2 rc3]", Arrays.toString(minToolsRevs.toArray())); // Check the min-platform-tools-rev ArrayList<String> minPlatToolsRevs = new ArrayList<String>(); for (Package p : pkgs) { if (p instanceof IMinPlatformToolsDependency) { minPlatToolsRevs.add(p.getListDescription() + ": " + ((IMinPlatformToolsDependency) p).getMinPlatformToolsRevision().toShortString()); } } assertEquals( "[Android SDK Tools: 4, " + "Android SDK Tools: 4 rc5]", Arrays.toString(minPlatToolsRevs.toArray())); // Check the list display of the packages ArrayList<String> listDescs = new ArrayList<String>(); for (Package p : pkgs) { listDescs.add(p.getListDescription()); } assertEquals( "[Android SDK Tools, " + "Android SDK Tools, " + "Android SDK Platform-tools, " + "Android SDK Build-tools, " + "Android SDK Build-tools, " + "Android SDK Build-tools, " + "Android SDK Build-tools, " + "Documentation for Android SDK, " + "Documentation for Android SDK, " + "SDK Platform Android Pastry Preview, " + "SDK Platform Android 1.1, " + "SDK Platform Android 1.0, " + "Samples for SDK API 14 (Obsolete), " + "Samples for SDK API 14 (Obsolete), " + "Variant 1 ARM EABI System Image, " + "Variant 1 MIPS System Image, " + "Variant 2 MIPS System Image, " + "Custom Thing ARM EABI v7a System Image, " + "ARM EABI v7a System Image, " + "Intel x86 Atom System Image, " + "Sources for Android SDK, " + "Sources for Android SDK, " + "Sources for Android SDK]", Arrays.toString(listDescs.toArray())); } /** * Validate what we can load from repository in schema version 10 */ public void testLoadRepoXml_10() throws Exception { String filename = "/com/android/sdklib/testdata/repository_sample_10.xml"; InputStream xmlStream = getTestResource(filename); assertNotNull("Missing test file: " + filename, xmlStream); // guess the version from the XML document int version = mSource._getXmlSchemaVersion(xmlStream); assertEquals(10, version); Boolean[] validatorFound = new Boolean[] { Boolean.FALSE }; String[] validationError = new String[] { null }; String url = "not-a-valid-url://" + SdkRepoConstants.URL_DEFAULT_FILENAME; String uri = mSource._validateXml(xmlStream, url, version, validationError, validatorFound); assertEquals(Boolean.TRUE, validatorFound[0]); assertEquals(null, validationError[0]); assertEquals(SdkRepoConstants.getSchemaUri(10), uri); // Validation was successful, load the document MockMonitor monitor = new MockMonitor(); Document doc = mSource._getDocument(xmlStream, monitor); assertNotNull(doc); // Get the packages assertTrue(mSource._parsePackages(doc, uri, monitor)); // Verbose log order matches the XML order and not the sorted display order. assertEquals("Found The first Android platform ever, revision 3\n" + // list-display "Found Doc for first platform, revision 1\n" + // list-display "Found Sources for first platform, revision 1\n" + // list-display "Found SDK Platform Android 1.1, API 2, revision 12\n" + "Found Sources for Android SDK, API 2, revision 2\n" + "Found SDK Platform Android Pastry Preview, revision 3\n" + "Found Tools in version 1.2.3.4, revision 1.2.3 rc4\n" + // list-display "Found Build tools v3 (preview 5), revision 3 rc5\n" + // list-display "Found Android SDK Build-tools, revision 3.0.1\n" + "Found Documentation for Android SDK, API 2, revision 42\n" + "Found Android SDK Tools, revision 42\n" + "Found Android SDK Platform-tools, revision 3 rc5\n" + "Found Android SDK Build-tools, revision 3\n" + "Found Samples from Android 14, revision 24 (Obsolete)\n" + // list-display "Found Samples for SDK API 14, revision 25 (Obsolete)\n" + "Found Sources for Android SDK, API 42, revision 12\n" + "Found Android SDK Build-tools, revision 12.13.14\n", monitor.getCapturedVerboseLog()); assertEquals("", monitor.getCapturedLog()); assertEquals("", monitor.getCapturedErrorLog()); // check the packages we found... we expected to find 13 packages with each at least // one archive. // Note the order doesn't necessary match the one from the // assertEquald(getCapturedVerboseLog) because packages are sorted using the // Packages' sorting order, e.g. all platforms are sorted by descending API level, etc. // Order is defined by // com.android.sdklib.internal.repository.packages.Package.comparisonKey() Package[] pkgs = mSource.getPackages(); assertEquals(17, pkgs.length); for (Package p : pkgs) { assertTrue(p.getArchives().length >= 1); } // Check the layoutlib & included-abi of the platform packages. ArrayList<Pair<Integer, Integer>> layoutlibVers = new ArrayList<Pair<Integer,Integer>>(); ArrayList<String> includedAbi = new ArrayList<String>(); for (Package p : pkgs) { if (p instanceof PlatformPackage) { layoutlibVers.add(((PlatformPackage) p).getLayoutlibVersion()); String abi = ((PlatformPackage) p).getIncludedAbi(); includedAbi.add(abi == null ? "(null)" : abi); } } assertEquals( "[Pair [first=1, second=0], " + // platform API 5 preview "Pair [first=5, second=31415], " + // platform API 2 "Pair [first=5, second=0]]", // platform API 1 Arrays.toString(layoutlibVers.toArray())); assertEquals( "[(null), " + // platform API 5 preview "x86, " + // platform API 2 "armeabi]", // platform API 1 Arrays.toString(includedAbi.toArray())); // Check the extra packages path, vendor, install folder, project-files, old-paths final String osSdkPath = "SDK"; final SdkManager sdkManager = new MockEmptySdkManager(osSdkPath); ArrayList<String> extraPaths = new ArrayList<String>(); ArrayList<String> extraVendors = new ArrayList<String>(); ArrayList<File> extraInstall = new ArrayList<File>(); ArrayList<ArrayList<String>> extraFilePaths = new ArrayList<ArrayList<String>>(); for (Package p : pkgs) { if (p instanceof ExtraPackage) { ExtraPackage ep = (ExtraPackage) p; // combine path and old-paths in the form "path [old_path1, old_path2]" extraPaths.add(ep.getPath() + " " + Arrays.toString(ep.getOldPaths())); extraVendors.add(ep.getVendorId() + "/" + ep.getVendorDisplay()); extraInstall.add(ep.getInstallFolder(osSdkPath, sdkManager)); ArrayList<String> filePaths = new ArrayList<String>(); for (String filePath : ep.getProjectFiles()) { filePaths.add(filePath); } extraFilePaths.add(filePaths); } } // There are no extra packages anymore in repository-6 assertEquals("[]", Arrays.toString(extraPaths.toArray())); assertEquals("[]", Arrays.toString(extraVendors.toArray())); assertEquals("[]", Arrays.toString(extraInstall.toArray())); assertEquals("[]", Arrays.toString(extraFilePaths.toArray())); // Check the system-image packages -- there can't be any in schema 10 anymore ArrayList<String> sysImgInfo = new ArrayList<String>(); for (Package p : pkgs) { if (p instanceof SystemImagePackage) { SystemImagePackage sip = (SystemImagePackage) p; sysImgInfo.add(String.format("%1$s %2$s: %3$s", //$NON-NLS-1$ sip.getAndroidVersion().getApiString(), sip.getAbi(), sip.getTag())); } } assertEquals("[]", Arrays.toString(sysImgInfo.toArray())); // Check the source packages ArrayList<String> sourceVersion = new ArrayList<String>(); for (Package p : pkgs) { if (p instanceof SourcePackage) { SourcePackage sp = (SourcePackage) p; String v = sp.getAndroidVersion().getApiString(); sourceVersion.add(v); } } assertEquals( "[42, 2, 1]", Arrays.toString(sourceVersion.toArray())); // Check the min-tools-rev ArrayList<String> minToolsRevs = new ArrayList<String>(); for (Package p : pkgs) { if (p instanceof IMinToolsDependency) { minToolsRevs.add(p.getListDescription() + ": " + ((IMinToolsDependency) p).getMinToolsRevision().toShortString()); } } assertEquals( "[SDK Platform Android Pastry Preview: 0, " + "SDK Platform Android 1.1: 0, " + "The first Android platform ever: 2.0.1, " + // list-display "Samples from Android 14 (Obsolete): 5, " + // list-display "Samples for SDK API 14 (Obsolete): 5.1.2 rc3]", Arrays.toString(minToolsRevs.toArray())); // Check the min-platform-tools-rev ArrayList<String> minPlatToolsRevs = new ArrayList<String>(); for (Package p : pkgs) { if (p instanceof IMinPlatformToolsDependency) { minPlatToolsRevs.add(p.getListDescription() + ": " + ((IMinPlatformToolsDependency) p).getMinPlatformToolsRevision().toShortString()); } } assertEquals( "[Tools in version 1.2.3.4: 4, " + // list-display "Android SDK Tools: 4 rc5]", Arrays.toString(minPlatToolsRevs.toArray())); // Check the list display of the packages ArrayList<String> listDescs = new ArrayList<String>(); for (Package p : pkgs) { listDescs.add(p.getListDescription()); } assertEquals( "[Tools in version 1.2.3.4, " + // list-display "Android SDK Tools, " + "Android SDK Platform-tools, " + "Android SDK Build-tools, " + "Android SDK Build-tools, " + "Android SDK Build-tools, " + "Build tools v3 (preview 5), " + // list-display "Documentation for Android SDK, " + "Doc for first platform, " + // list-display "SDK Platform Android Pastry Preview, " + "SDK Platform Android 1.1, " + "The first Android platform ever, " + // list-display "Samples from Android 14 (Obsolete), " + // list-display "Samples for SDK API 14 (Obsolete), " + "Sources for Android SDK, " + "Sources for Android SDK, " + "Sources for first platform]", // list-display Arrays.toString(listDescs.toArray())); } /** * Validate there isn't a next-version we haven't tested yet */ public void testLoadRepoXml_11() throws Exception { InputStream xmlStream = getTestResource("/com/android/sdklib/testdata/repository_sample_11.xml"); assertNull("There is a sample for repository-11.xsd but there is not corresponding unit test", xmlStream); } // ---- helper --- /** * Returns an SdkLib file resource as a {@link ByteArrayInputStream}, * which has the advantage that we can use {@link InputStream#reset()} on it * at any time to read it multiple times. * <p/> * The default for getResourceAsStream() is to return a {@link FileInputStream} that * does not support reset(), yet we need it in the tested code. * * @throws IOException if some I/O read fails */ private ByteArrayInputStream getTestResource(String filename) throws IOException { InputStream xmlStream = this.getClass().getResourceAsStream(filename); if (xmlStream == null) { return null; } try { byte[] data = new byte[8192]; int offset = 0; int n; while ((n = xmlStream.read(data, offset, data.length - offset)) != -1) { offset += n; if (offset == data.length) { byte[] newData = new byte[offset + 8192]; System.arraycopy(data, 0, newData, 0, offset); data = newData; } } return new ByteArrayInputStream(data, 0, offset); } finally { if (xmlStream != null) { xmlStream.close(); } } } }