Fix ADT test data references.

- Remove reference to ADT from sdklib tests.
- Move ADT test data to be closer to their test classes, and to make it obvious
this data is only for ADT unit tests.
This commit is contained in:
Brett Chabot
2009-11-03 12:29:42 -08:00
parent 8d700bdf67
commit fd893b5fb0
14 changed files with 64 additions and 138 deletions

View File

@@ -28,9 +28,13 @@ import junit.framework.TestCase;
public class AndroidManifestParserTest extends TestCase {
private AndroidManifestParser mManifestTestApp;
private AndroidManifestParser mManifestInstrumentation;
private static final String INSTRUMENTATION_XML = "AndroidManifest-instrumentation.xml"; //$NON-NLS-1$
private static final String TESTAPP_XML = "AndroidManifest-testapp.xml"; //$NON-NLS-1$
private static final String TESTDATA_PATH =
"com/android/ide/eclipse/testdata/"; //$NON-NLS-1$
private static final String INSTRUMENTATION_XML = TESTDATA_PATH +
"AndroidManifest-instrumentation.xml"; //$NON-NLS-1$
private static final String TESTAPP_XML = TESTDATA_PATH +
"AndroidManifest-testapp.xml"; //$NON-NLS-1$
private static final String PACKAGE_NAME = "com.android.testapp"; //$NON-NLS-1$
private static final String ACTIVITY_NAME = "com.android.testapp.MainActivity"; //$NON-NLS-1$
private static final String LIBRARY_NAME = "android.test.runner"; //$NON-NLS-1$
@@ -40,26 +44,24 @@ public class AndroidManifestParserTest extends TestCase {
@Override
protected void setUp() throws Exception {
super.setUp();
String testFilePath = AdtTestData.getInstance().getTestFilePath(
TESTAPP_XML);
String testFilePath = AdtTestData.getInstance().getTestFilePath(TESTAPP_XML);
mManifestTestApp = AndroidManifestParser.parseForData(testFilePath);
assertNotNull(mManifestTestApp);
testFilePath = AdtTestData.getInstance().getTestFilePath(
INSTRUMENTATION_XML);
testFilePath = AdtTestData.getInstance().getTestFilePath(INSTRUMENTATION_XML);
mManifestInstrumentation = AndroidManifestParser.parseForData(testFilePath);
assertNotNull(mManifestInstrumentation);
}
public void testGetInstrumentationInformation() {
assertEquals(1, mManifestInstrumentation.getInstrumentations().length);
assertEquals(INSTRUMENTATION_NAME,
assertEquals(INSTRUMENTATION_NAME,
mManifestInstrumentation.getInstrumentations()[0].getName());
assertEquals(INSTRUMENTATION_TARGET,
assertEquals(INSTRUMENTATION_TARGET,
mManifestInstrumentation.getInstrumentations()[0].getTargetPackage());
}
public void testGetPackage() {
assertEquals(PACKAGE_NAME, mManifestTestApp.getPackage());
}
@@ -80,7 +82,7 @@ public class AndroidManifestParserTest extends TestCase {
assertTrue(activity.hasAction());
assertTrue(activity.isHomeActivity());
}
private void assertEquals(Activity lhs, Activity rhs) {
assertTrue(lhs == rhs || (lhs != null && rhs != null));
if (lhs != null && rhs != null) {
@@ -93,7 +95,7 @@ public class AndroidManifestParserTest extends TestCase {
public void testGetUsesLibraries() {
assertEquals(1, mManifestTestApp.getUsesLibraries().length);
assertEquals(LIBRARY_NAME, mManifestTestApp.getUsesLibraries()[0]);
assertEquals(LIBRARY_NAME, mManifestTestApp.getUsesLibraries()[0]);
}
public void testGetPackageName() {

View File

@@ -17,9 +17,6 @@
package com.android.ide.eclipse.adt.internal.resources;
import com.android.ide.eclipse.adt.internal.resources.AttrsXmlParser;
import com.android.ide.eclipse.adt.internal.resources.DeclareStyleableInfo;
import com.android.ide.eclipse.adt.internal.resources.ViewClassInfo;
import com.android.ide.eclipse.adt.internal.resources.DeclareStyleableInfo.AttributeInfo;
import com.android.ide.eclipse.adt.internal.resources.DeclareStyleableInfo.AttributeInfo.Format;
import com.android.ide.eclipse.tests.AdtTestData;
@@ -32,20 +29,23 @@ import java.util.Map;
import junit.framework.TestCase;
public class AttrsXmlParserTest extends TestCase {
private AttrsXmlParser mParser;
private String mFilePath;
private static final String MOCK_DATA_PATH =
"com/android/ide/eclipse/testdata/mock_attrs.xml"; //$NON-NLS-1$
@Override
public void setUp() throws Exception {
mFilePath = AdtTestData.getInstance().getTestFilePath("mock_attrs.xml"); //$NON-NLS-1$
mFilePath = AdtTestData.getInstance().getTestFilePath(MOCK_DATA_PATH); //$NON-NLS-1$
mParser = new AttrsXmlParser(mFilePath);
}
@Override
public void tearDown() throws Exception {
}
public final void testGetDocument() throws Exception {
assertNotNull(_getDocument());
}
@@ -53,12 +53,12 @@ public class AttrsXmlParserTest extends TestCase {
public void testGetOsAttrsXmlPath() throws Exception {
assertEquals(mFilePath, mParser.getOsAttrsXmlPath());
}
public final void testPreload() throws Exception {
assertSame(mParser, mParser.preload());
}
public final void testLoadViewAttributes() throws Exception {
mParser.preload();
ViewClassInfo info = new ViewClassInfo(
@@ -66,7 +66,7 @@ public class AttrsXmlParserTest extends TestCase {
"mock_android.something.Theme", //$NON-NLS-1$
"Theme"); //$NON-NLS-1$
mParser.loadViewAttributes(info);
assertEquals("These are the standard attributes that make up a complete theme.", //$NON-NLS-1$
info.getJavaDoc());
AttributeInfo[] attrs = info.getAttributes();
@@ -75,7 +75,7 @@ public class AttrsXmlParserTest extends TestCase {
assertEquals(1, info.getAttributes()[0].getFormats().length);
assertEquals(Format.DIMENSION, info.getAttributes()[0].getFormats()[0]);
}
public final void testEnumFlagValues() throws Exception {
/* The XML being read contains:
<!-- Standard orientation constant. -->
@@ -90,32 +90,32 @@ public class AttrsXmlParserTest extends TestCase {
mParser.preload();
Map<String, Map<String, Integer>> attrMap = mParser.getEnumFlagValues();
assertTrue(attrMap.containsKey("orientation"));
Map<String, Integer> valueMap = attrMap.get("orientation");
assertTrue(valueMap.containsKey("horizontal"));
assertTrue(valueMap.containsKey("vertical"));
assertEquals(Integer.valueOf(0), valueMap.get("horizontal"));
assertEquals(Integer.valueOf(1), valueMap.get("vertical"));
}
public final void testDeprecated() throws Exception {
mParser.preload();
DeclareStyleableInfo dep = mParser.getDeclareStyleableList().get("DeprecatedTest");
assertNotNull(dep);
AttributeInfo[] attrs = dep.getAttributes();
assertEquals(4, attrs.length);
assertEquals("deprecated-inline", attrs[0].getName());
assertEquals("In-line deprecated.", attrs[0].getDeprecatedDoc());
assertEquals("Deprecated comments using delimiters.", attrs[0].getJavaDoc());
assertEquals("deprecated-multiline", attrs[1].getName());
assertEquals("Multi-line version of deprecated that works till the next tag.",
attrs[1].getDeprecatedDoc());
assertEquals("Deprecated comments on their own line.", attrs[1].getJavaDoc());
assertEquals("deprecated-not", attrs[2].getName());
assertEquals(null, attrs[2].getDeprecatedDoc());
assertEquals("This attribute is not deprecated.", attrs[2].getJavaDoc());
@@ -126,7 +126,7 @@ public class AttrsXmlParserTest extends TestCase {
}
//---- access to private methods
private Document _getDocument() throws Exception {
Method method = AttrsXmlParser.class.getDeclaredMethod("getDocument"); //$NON-NLS-1$
method.setAccessible(true);

View File

@@ -40,7 +40,8 @@ public class AndroidJarLoaderTest extends TestCase {
/** Creates an instance of {@link AndroidJarLoader} on our test data JAR */
@Override
public void setUp() throws Exception {
String jarfilePath = AdtTestData.getInstance().getTestFilePath("jar_example.jar"); //$NON-NLS-1$
String jarfilePath = AdtTestData.getInstance().getTestFilePath(
"com/android/ide/eclipse/testdata/jar_example.jar"); //$NON-NLS-1$
mFrameworkClassLoader = new AndroidJarLoader(jarfilePath);
}

View File

@@ -19,15 +19,12 @@ package com.android.ide.eclipse.adt.internal.sdk;
import com.android.ide.eclipse.adt.internal.resources.AttrsXmlParser;
import com.android.ide.eclipse.adt.internal.resources.ViewClassInfo;
import com.android.ide.eclipse.adt.internal.resources.ViewClassInfo.LayoutParamsInfo;
import com.android.ide.eclipse.adt.internal.sdk.AndroidJarLoader;
import com.android.ide.eclipse.adt.internal.sdk.AndroidTargetParser;
import com.android.ide.eclipse.adt.internal.sdk.LayoutParamsParser;
import com.android.ide.eclipse.adt.internal.sdk.AndroidJarLoader.ClassWrapper;
import com.android.ide.eclipse.adt.internal.sdk.IAndroidClassLoader.IClassDescriptor;
import com.android.ide.eclipse.tests.AdtTestData;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.TreeMap;
@@ -36,7 +33,7 @@ import junit.framework.TestCase;
/**
* Test the inner private methods of PlatformDataParser.
*
*
* Convention: method names that start with an underscore are actually local wrappers
* that call private methods from {@link AndroidTargetParser} using reflection.
* This is inspired by the Python coding rule which mandates underscores prefixes for
@@ -44,30 +41,26 @@ import junit.framework.TestCase;
*/
public class LayoutParamsParserTest extends TestCase {
private static final String MOCK_DATA_PATH =
"com/android/ide/eclipse/testdata/mock_attrs.xml"; //$NON-NLS-1$
private static class MockFrameworkClassLoader extends AndroidJarLoader {
MockFrameworkClassLoader() {
super(null /* osFrameworkLocation */);
}
@Override
public HashMap<String, ArrayList<IClassDescriptor>> findClassesDerivingFrom(
String rootPackage, String[] superClasses) throws ClassFormatError {
return new HashMap<String, ArrayList<IClassDescriptor>>();
}
}
private static class MockAttrsXmlPath {
public String getPath() {
ClassLoader cl = this.getClass().getClassLoader();
URL res = cl.getResource("data/mock_attrs.xml"); //$NON-NLS-1$
return res.getFile();
}
}
private static class MockLayoutParamsParser extends LayoutParamsParser {
public MockLayoutParamsParser() {
super(new MockFrameworkClassLoader(),
new AttrsXmlParser(new MockAttrsXmlPath().getPath()).preload());
new AttrsXmlParser(
AdtTestData.getInstance().getTestFilePath(MOCK_DATA_PATH)).preload());
mTopViewClass = new ClassWrapper(mock_android.view.View.class);
mTopGroupClass = new ClassWrapper(mock_android.view.ViewGroup.class);
@@ -82,7 +75,7 @@ public class LayoutParamsParserTest extends TestCase {
}
private MockLayoutParamsParser mParser;
@Override
public void setUp() throws Exception {
mParser = new MockLayoutParamsParser();
@@ -91,7 +84,7 @@ public class LayoutParamsParserTest extends TestCase {
@Override
public void tearDown() throws Exception {
}
public final void testFindLayoutParams() throws Exception {
assertEquals(mock_android.view.ViewGroup.LayoutParams.class,
((ClassWrapper)_findLayoutParams(mock_android.view.ViewGroup.class)).wrappedClass());
@@ -102,7 +95,7 @@ public class LayoutParamsParserTest extends TestCase {
assertEquals(mock_android.widget.TableLayout.LayoutParams.class,
((ClassWrapper)_findLayoutParams(mock_android.widget.TableLayout.class)).wrappedClass());
}
public final void testGetLayoutParamsInfo() throws Exception {
LayoutParamsInfo info1 = _getLayoutParamsInfo(
mock_android.view.ViewGroup.LayoutParams.class);
@@ -115,7 +108,7 @@ public class LayoutParamsParserTest extends TestCase {
assertNotNull(info2);
// LinearLayout.LayoutData links to ViewGroup.LayoutParams
assertSame(info1, info2.getSuperClass());
LayoutParamsInfo info3 = _getLayoutParamsInfo(
mock_android.widget.TableLayout.LayoutParams.class);
assertNotNull(info3);
@@ -124,7 +117,7 @@ public class LayoutParamsParserTest extends TestCase {
assertNotSame(info1, info3.getSuperClass());
assertNotSame(info2, info3.getSuperClass());
// TableLayout.LayoutParams => ViewGroup.MarginLayoutParams => ViewGroup.LayoutParams
assertSame(info1, info3.getSuperClass().getSuperClass());
assertSame(info1, info3.getSuperClass().getSuperClass());
}
public final void testGetLayoutClasses() throws Exception {
@@ -132,7 +125,7 @@ public class LayoutParamsParserTest extends TestCase {
}
//---- access to private methods
/** Calls the private constructor of the parser */
@SuppressWarnings("unused")
private AndroidTargetParser _Constructor(String osJarPath) throws Exception {
@@ -141,7 +134,7 @@ public class LayoutParamsParserTest extends TestCase {
constructor.setAccessible(true);
return constructor.newInstance(osJarPath);
}
/** calls the private getLayoutClasses() of the parser */
@SuppressWarnings("unused")
private void _getLayoutClasses() throws Exception {
@@ -149,7 +142,7 @@ public class LayoutParamsParserTest extends TestCase {
method.setAccessible(true);
method.invoke(mParser);
}
/** calls the private addGroup() of the parser */
@SuppressWarnings("unused")
private ViewClassInfo _addGroup(Class<?> groupClass) throws Exception {
@@ -175,7 +168,7 @@ public class LayoutParamsParserTest extends TestCase {
method.setAccessible(true);
return (LayoutParamsInfo) method.invoke(mParser, new ClassWrapper(layoutParamsClass));
}
/** calls the private findLayoutParams() of the parser */
private IClassDescriptor _findLayoutParams(Class<?> groupClass) throws Exception {
Method method = LayoutParamsParser.class.getDeclaredMethod("findLayoutParams", //$NON-NLS-1$

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.7 KiB

View File

@@ -1,49 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2008 The Android Open Source Project
Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
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.
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
>
<Button
android:id="@+id/bouton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="My Button Text"
>
</Button>
<View
android:id="@+id/surface"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="2"
/>
<TextView
android:id="@+id/status"
android:paddingLeft="2dip"
android:layout_weight="0"
android:background="@drawable/black"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:lines="1"
android:gravity="center_vertical|center_horizontal"
android:text="My TextView Text"
/>
</LinearLayout>

View File

@@ -1,275 +0,0 @@
<?xml version="1.0"?>
<!--
* Copyright (C) 2009 The Android Open Source Project
*
* Licensed under the Apache License, version 2.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.apache.org/licenses/LICENSE-2.0
*
* 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.
-->
<sdk:sdk-repository
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:sdk="http://schemas.android.com/sdk/android/repository/1">
<!-- Define a couple of licenses. These will be referenced by uses-license later. -->
<sdk:license type="text" id="license1">
This is the license
for this platform.
</sdk:license>
<sdk:license id="license2">
Licenses are only of type 'text' right now, so this is implied.
</sdk:license>
<!-- Inner elements must be either platform, add-on, doc or tool.
There can be 0 or more of each, in any order. -->
<sdk:platform>
<sdk:version>1.0</sdk:version>
<sdk:api-level>1</sdk:api-level>
<sdk:revision>3</sdk:revision>
<sdk:uses-license ref="license1" />
<sdk:description>Some optional description</sdk:description>
<sdk:desc-url>http://www.example.com/platform1.html</sdk:desc-url>
<sdk:release-note>This is an optional release note
for this package. It's a free multi-line text.
</sdk:release-note>
<sdk:release-url>http://some/url/for/the/release/note.html</sdk:release-url>
<sdk:min-tools-rev>2</sdk:min-tools-rev>
<!-- The archives node is mandatory and it cannot be empty. -->
<sdk:archives>
<sdk:archive os="any">
<sdk:size>65536</sdk:size>
<sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
<sdk:url>http://www.example.com/files/plat1.zip</sdk:url>
</sdk:archive>
</sdk:archives>
</sdk:platform>
<sdk:doc>
<sdk:api-level>1</sdk:api-level>
<sdk:revision>1</sdk:revision>
<!-- the license element is not mandatory. -->
<sdk:description>Some optional description</sdk:description>
<sdk:desc-url>http://www.example.com/docs.html</sdk:desc-url>
<sdk:archives>
<sdk:archive os="any">
<sdk:size>65536</sdk:size>
<sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
<sdk:url>http://www.example.com/docs/docs1.zip</sdk:url>
</sdk:archive>
</sdk:archives>
</sdk:doc>
<sdk:add-on>
<sdk:name>My First add-on</sdk:name>
<sdk:api-level>1</sdk:api-level>
<sdk:vendor>John Doe</sdk:vendor>
<sdk:revision>1</sdk:revision>
<sdk:uses-license ref="license2" />
<sdk:description>Some optional description</sdk:description>
<sdk:desc-url>http://www.example.com/myfirstaddon</sdk:desc-url>
<sdk:archives>
<sdk:archive os="any">
<sdk:size>65536</sdk:size>
<sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
<sdk:url>http://www.example.com/add-ons/first.zip</sdk:url>
</sdk:archive>
</sdk:archives>
<!-- The libs node is mandatory, however it can be empty. -->
<sdk:libs>
<sdk:lib>
<sdk:name>android.blah.somelib</sdk:name>
<sdk:description>The description for this library.</sdk:description>
</sdk:lib>
<sdk:lib>
<!-- sdk:description is optional, name is not -->
<sdk:name>com.android.mymaps</sdk:name>
</sdk:lib>
</sdk:libs>
</sdk:add-on>
<sdk:platform>
<sdk:version>1.1</sdk:version>
<sdk:api-level>2</sdk:api-level>
<sdk:revision>12</sdk:revision>
<sdk:uses-license ref="license1" />
<!-- sdk:description and sdk:desc-url are optional -->
<sdk:archives>
<sdk:archive os="windows">
<!-- arch attribute is optional -->
<sdk:size>65536</sdk:size>
<sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
<sdk:url>distrib/platform-2-12-win.zip</sdk:url>
</sdk:archive>
<sdk:archive os="macosx" arch="any">
<sdk:size>65536</sdk:size>
<sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
<sdk:url>distrib/platform-2-12-mac.zip</sdk:url>
</sdk:archive>
<sdk:archive os="macosx" arch="ppc">
<sdk:size>65536</sdk:size>
<sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
<sdk:url>distrib/platform-2-12-mac.zip</sdk:url>
</sdk:archive>
<sdk:archive os="linux" arch="x86">
<sdk:size>65536</sdk:size>
<sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
<sdk:url>distrib/platform-2-12-linux.tar.bz2</sdk:url>
</sdk:archive>
<sdk:archive os="linux" arch="x86_64">
<sdk:size>65536</sdk:size>
<sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
<sdk:url>distrib/platform-2-12-linux.tar.bz2</sdk:url>
</sdk:archive>
</sdk:archives>
</sdk:platform>
<sdk:add-on>
<sdk:name>My Second add-on</sdk:name>
<sdk:api-level>2</sdk:api-level>
<sdk:vendor>John Deer</sdk:vendor>
<sdk:revision>42</sdk:revision>
<sdk:archives>
<sdk:archive os="windows">
<sdk:size>65536</sdk:size>
<sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
<sdk:url>distrib/second-42-win.zip</sdk:url>
</sdk:archive>
<sdk:archive os="linux">
<sdk:size>65536</sdk:size>
<sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
<sdk:url>distrib/second-42-linux.tar.bz2</sdk:url>
</sdk:archive>
</sdk:archives>
<sdk:libs>
<sdk:lib>
<sdk:name>android.blah.somelib</sdk:name>
<sdk:description>The description for this library.</sdk:description>
</sdk:lib>
<sdk:lib>
<sdk:name>com.android.mymaps</sdk:name>
</sdk:lib>
</sdk:libs>
<sdk:uses-license ref="license2" />
</sdk:add-on>
<sdk:platform>
<sdk:version>Pastry</sdk:version>
<sdk:api-level>5</sdk:api-level>
<sdk:codename>Pastry</sdk:codename>
<sdk:revision>3</sdk:revision>
<sdk:uses-license ref="license1" />
<sdk:description>Preview version for Pastry</sdk:description>
<sdk:desc-url>http://www.example.com/platform1.html</sdk:desc-url>
<!-- The archives node is mandatory and it cannot be empty. -->
<sdk:archives>
<sdk:archive os="any">
<sdk:size>65536</sdk:size>
<sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
<sdk:url>http://www.example.com/files/plat1.zip</sdk:url>
</sdk:archive>
</sdk:archives>
</sdk:platform>
<sdk:tool>
<sdk:revision>1</sdk:revision>
<sdk:description>Some optional description</sdk:description>
<sdk:desc-url>http://www.example.com/tools.html</sdk:desc-url>
<sdk:uses-license ref="license1" />
<sdk:archives>
<sdk:archive os="any">
<sdk:size>65536</sdk:size>
<sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
<sdk:url>http://www.example.com/files/tools1.zip</sdk:url>
</sdk:archive>
</sdk:archives>
</sdk:tool>
<sdk:doc>
<sdk:api-level>2</sdk:api-level>
<sdk:revision>42</sdk:revision>
<sdk:uses-license ref="license2" />
<sdk:archives>
<sdk:archive os="windows">
<sdk:size>65536</sdk:size>
<sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
<sdk:url>distrib/docs/2.zip</sdk:url>
</sdk:archive>
<sdk:archive os="linux">
<sdk:size>65536</sdk:size>
<sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
<sdk:url>distrib/docs2-linux.tar.bz2</sdk:url>
</sdk:archive>
<sdk:archive os="macosx">
<sdk:size>65536</sdk:size>
<sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
<sdk:url>distrib/docs2-mac.tar.bz2</sdk:url>
</sdk:archive>
</sdk:archives>
</sdk:doc>
<sdk:tool>
<sdk:revision>42</sdk:revision>
<sdk:uses-license ref="license1" />
<sdk:archives>
<sdk:archive os="windows">
<sdk:size>65536</sdk:size>
<sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
<sdk:url>distrib/tools/2.zip</sdk:url>
</sdk:archive>
<sdk:archive os="linux">
<sdk:size>65536</sdk:size>
<sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
<sdk:url>distrib/tools2-linux.tar.bz2</sdk:url>
</sdk:archive>
<sdk:archive os="macosx">
<sdk:size>65536</sdk:size>
<sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
<sdk:url>distrib/tools2-mac.tar.bz2</sdk:url>
</sdk:archive>
</sdk:archives>
</sdk:tool>
<sdk:add-on>
<sdk:uses-license ref="license2" />
<sdk:name>This add-on has no libraries</sdk:name>
<sdk:api-level>4</sdk:api-level>
<sdk:vendor>Joe Bar</sdk:vendor>
<sdk:revision>3</sdk:revision>
<sdk:archives>
<sdk:archive os="any" arch="any">
<sdk:size>65536</sdk:size>
<sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
<sdk:url>distrib/imnotanarchiveimadoctorjim.zip</sdk:url>
</sdk:archive>
</sdk:archives>
<!-- The libs node is mandatory, however it can be empty. -->
<sdk:libs />
</sdk:add-on>
<sdk:extra>
<sdk:path>usb_driver</sdk:path>
<sdk:uses-license ref="license2" />
<sdk:revision>43</sdk:revision>
<sdk:archives>
<sdk:archive os="any" arch="any">
<sdk:size>65536</sdk:size>
<sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
<sdk:url>distrib/extraduff.zip</sdk:url>
</sdk:archive>
</sdk:archives>
<sdk:description>An Extra package for the USB driver, it will install in $SDK/usb_driver</sdk:description>
<sdk:desc-url>http://www.example.com/extra.html</sdk:desc-url>
<sdk:min-tools-rev>3</sdk:min-tools-rev>
</sdk:extra>
</sdk:sdk-repository>