blob: 3d77f011ee65c802363ebf1426c239f68e057f4c [file] [log] [blame]
/*
* 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;
import com.android.sdklib.internal.repository.AddonsListFetcher.Site;
import com.android.sdklib.repository.SdkAddonsListConstants;
import org.w3c.dom.Document;
import java.io.ByteArrayInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
import junit.framework.TestCase;
/**
* Tests for {@link AddonsListFetcher}
*/
public class AddonsListFetcherTest extends TestCase {
/**
* An internal helper class to give us visibility to the protected members we want
* to test.
*/
private static class MockAddonsListFetcher extends AddonsListFetcher {
public Site[] _parseAddonsList(Document doc,
String nsUri,
String baseUrl,
ITaskMonitor monitor) {
return super.parseAddonsList(doc, nsUri, baseUrl, 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 MockAddonsListFetcher mFetcher;
@Override
protected void setUp() throws Exception {
super.setUp();
mFetcher = new MockAddonsListFetcher();
}
@Override
protected void tearDown() throws Exception {
super.tearDown();
mFetcher = null;
}
/**
* Validate we can load a valid addon schema version 1
*/
public void testLoadAddonsListXml_1() throws Exception {
InputStream xmlStream =
getTestResource("/com/android/sdklib/testdata/addons_list_sample_1.xml");
// guess the version from the XML document
int version = mFetcher._getXmlSchemaVersion(xmlStream);
assertEquals(1, version);
Boolean[] validatorFound = new Boolean[] { Boolean.FALSE };
String[] validationError = new String[] { null };
String url = "not-a-valid-url://addons_list.xml";
String uri = mFetcher._validateXml(
xmlStream, url, version, validationError, validatorFound);
assertEquals(Boolean.TRUE, validatorFound[0]);
assertEquals(null, validationError[0]);
assertEquals(SdkAddonsListConstants.getSchemaUri(1), uri);
// Validation was successful, load the document
MockMonitor monitor = new MockMonitor();
Document doc = mFetcher._getDocument(xmlStream, monitor);
assertNotNull(doc);
// Get the sites
Site[] result = mFetcher._parseAddonsList(doc, uri, "http://base/url/", monitor);
assertEquals("", monitor.getCapturedDescriptions());
assertEquals("", monitor.getCapturedLog());
assertEquals("", monitor.getCapturedErrorLog());
assertEquals("", monitor.getCapturedVerboseLog());
// check the sites we found...
// The XML file is UTF-8 so we support character sets (but the Java source file is
// not, so we use the \\u notation to create the Unicode String)
assertEquals(
"[<ADDON_SITE URL='http://www.example.com/my_addons.xml' Name='My Example Add-ons.'>, " +
"<ADDON_SITE URL='http://www.example.co.jp/addons.xml' Name='\u3042\u308A\u304C\u3068\u3046\u3054\u3056\u3044\u307E\u3059\u3002'>, " +
"<ADDON_SITE URL='http://www.example.com/' Name='Example of directory URL.'>, " +
"<ADDON_SITE URL='http://base/url/relative_url.xml' Name='Relative URL.'>]",
Arrays.toString(result));
assertEquals(4, result.length);
}
/**
* Validate we can load a valid addon schema version 2
*/
public void testLoadAddonsListXml_2() throws Exception {
InputStream xmlStream =
getTestResource("/com/android/sdklib/testdata/addons_list_sample_2.xml");
// guess the version from the XML document
int version = mFetcher._getXmlSchemaVersion(xmlStream);
assertEquals(2, version);
Boolean[] validatorFound = new Boolean[] { Boolean.FALSE };
String[] validationError = new String[] { null };
String url = "not-a-valid-url://addons_list.xml";
String uri = mFetcher._validateXml(
xmlStream, url, version, validationError, validatorFound);
assertEquals(Boolean.TRUE, validatorFound[0]);
assertEquals(null, validationError[0]);
assertEquals(SdkAddonsListConstants.getSchemaUri(2), uri);
// Validation was successful, load the document
MockMonitor monitor = new MockMonitor();
Document doc = mFetcher._getDocument(xmlStream, monitor);
assertNotNull(doc);
// Get the sites
Site[] result = mFetcher._parseAddonsList(doc, uri, "http://base/url/", monitor);
assertEquals("", monitor.getCapturedDescriptions());
assertEquals("", monitor.getCapturedLog());
assertEquals("", monitor.getCapturedErrorLog());
assertEquals("", monitor.getCapturedVerboseLog());
// check the sites we found...
// The XML file is UTF-8 so we support character sets (but the Java source file is
// not, so we use the \\u notation to create the Unicode String)
assertEquals(
"[<ADDON_SITE URL='http://www.example.com/my_addons.xml' Name='My Example Add-ons.'>, " +
"<ADDON_SITE URL='http://www.example.co.jp/addons.xml' Name='\u3042\u308A\u304C\u3068\u3046\u3054\u3056\u3044\u307E\u3059\u3002'>, " +
"<ADDON_SITE URL='http://www.example.com/' Name='Example of directory URL.'>, " +
"<SYS_IMG_SITE URL='http://www.example.com/' Name='Example of sys-img URL using the default xml filename.'>, " +
"<SYS_IMG_SITE URL='http://www.example.com/specific_file.xml' Name='Example of sys-img URL using a specific xml filename.'>, " +
"<ADDON_SITE URL='http://base/url/relative/url.xml' Name='Relative URL.'>]",
Arrays.toString(result));
assertEquals(6, result.length);
}
/**
* Validate there isn't a next-version we haven't tested yet
*/
public void testLoadAddonsListXml_3() throws Exception {
InputStream xmlStream = getTestResource("/com/android/sdklib/testdata/addons_list_sample_3.xml");
assertNull("There is a sample for addons-list-3.xsd but there is not corresponding unit test", xmlStream);
}
// IMPORTANT: Each time you add a test here for a new version, you should
// also add a test in ValidateAddonsListXmlTest.
/**
* 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();
}
}
}
}