--- /dev/null
+/*\r
+ * Copyright (C) 2009 The Android Open Source Project\r
+ *\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ * http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+\r
+package com.android.sdkuilib.internal.repository;\r
+\r
+import com.android.sdklib.ISdkLog;\r
+import com.android.sdklib.SdkManager;\r
+import com.android.sdklib.internal.avd.AvdManager;\r
+import com.android.sdklib.internal.repository.Archive;\r
+import com.android.sdklib.internal.repository.ITaskFactory;\r
+import com.android.sdklib.internal.repository.ITaskMonitor;\r
+import com.android.sdklib.internal.repository.MockAddonPackage;\r
+import com.android.sdklib.internal.repository.MockBrokenPackage;\r
+import com.android.sdklib.internal.repository.MockPlatformPackage;\r
+import com.android.sdklib.internal.repository.MockPlatformToolPackage;\r
+import com.android.sdklib.internal.repository.MockToolPackage;\r
+import com.android.sdklib.internal.repository.Package;\r
+import com.android.sdklib.internal.repository.SdkRepoSource;\r
+import com.android.sdklib.internal.repository.SdkSource;\r
+import com.android.sdklib.internal.repository.SdkSourceCategory;\r
+import com.android.sdklib.internal.repository.SdkSources;\r
+import com.android.sdkuilib.internal.repository.icons.ImageFactory;\r
+\r
+import org.eclipse.swt.widgets.Shell;\r
+\r
+import java.util.ArrayList;\r
+import java.util.Arrays;\r
+import java.util.Collection;\r
+import java.util.List;\r
+\r
+import junit.framework.TestCase;\r
+\r
+public class UpdaterLogicTest extends TestCase {\r
+\r
+ private static class NullUpdaterData implements IUpdaterData {\r
+\r
+ public AvdManager getAvdManager() {\r
+ return null;\r
+ }\r
+\r
+ public ImageFactory getImageFactory() {\r
+ return null;\r
+ }\r
+\r
+ public ISdkLog getSdkLog() {\r
+ return null;\r
+ }\r
+\r
+ public SdkManager getSdkManager() {\r
+ return null;\r
+ }\r
+\r
+ public SettingsController getSettingsController() {\r
+ return null;\r
+ }\r
+\r
+ public ITaskFactory getTaskFactory() {\r
+ return null;\r
+ }\r
+\r
+ public Shell getWindowShell() {\r
+ return null;\r
+ }\r
+\r
+ }\r
+\r
+ private static class MockUpdaterLogic extends UpdaterLogic {\r
+ private final Package[] mRemotePackages;\r
+\r
+ public MockUpdaterLogic(IUpdaterData updaterData, Package[] remotePackages) {\r
+ super(updaterData);\r
+ mRemotePackages = remotePackages;\r
+ }\r
+\r
+ @Override\r
+ protected void fetchRemotePackages(Collection<Package> remotePkgs,\r
+ SdkSource[] remoteSources) {\r
+ // Ignore remoteSources and instead uses the remotePackages list given to the\r
+ // constructor.\r
+ if (mRemotePackages != null) {\r
+ remotePkgs.addAll(Arrays.asList(mRemotePackages));\r
+ }\r
+ }\r
+ }\r
+\r
+ /**\r
+ * Addon packages depend on a base platform package.\r
+ * This test checks that UpdaterLogic.findPlatformToolsDependency(...)\r
+ * can find the base platform for a given addon.\r
+ */\r
+ public void testFindAddonDependency() {\r
+ MockUpdaterLogic mul = new MockUpdaterLogic(new NullUpdaterData(), null);\r
+\r
+ MockPlatformPackage p1 = new MockPlatformPackage(1, 1);\r
+ MockPlatformPackage p2 = new MockPlatformPackage(2, 1);\r
+\r
+ MockAddonPackage a1 = new MockAddonPackage(p1, 1);\r
+ MockAddonPackage a2 = new MockAddonPackage(p2, 2);\r
+\r
+ ArrayList<ArchiveInfo> out = new ArrayList<ArchiveInfo>();\r
+ ArrayList<Archive> selected = new ArrayList<Archive>();\r
+ ArrayList<Package> remote = new ArrayList<Package>();\r
+\r
+ // a2 depends on p2, which is not in the locals\r
+ Package[] localPkgs = { p1, a1 };\r
+ ArchiveInfo[] locals = mul.createLocalArchives(localPkgs);\r
+\r
+ SdkSource[] sources = null;\r
+\r
+ // a2 now depends on a "fake" archive info with no newArchive that wraps the missing\r
+ // underlying platform.\r
+ ArchiveInfo fai = mul.findPlatformDependency(a2, out, selected, remote, sources, locals);\r
+ assertNotNull(fai);\r
+ assertNull(fai.getNewArchive());\r
+ assertTrue(fai.isRejected());\r
+ assertEquals(0, out.size());\r
+\r
+ // p2 is now selected, and should be scheduled for install in out\r
+ Archive p2_archive = p2.getArchives()[0];\r
+ selected.add(p2_archive);\r
+ ArchiveInfo ai2 = mul.findPlatformDependency(a2, out, selected, remote, sources, locals);\r
+ assertNotNull(ai2);\r
+ assertSame(p2_archive, ai2.getNewArchive());\r
+ assertEquals(1, out.size());\r
+ assertSame(p2_archive, out.get(0).getNewArchive());\r
+ }\r
+\r
+ /**\r
+ * Broken add-on packages require an exact platform package to be present or installed.\r
+ * This tests checks that findExactApiLevelDependency() can find a base\r
+ * platform package for a given broken add-on package.\r
+ */\r
+ public void testFindExactApiLevelDependency() {\r
+ MockUpdaterLogic mul = new MockUpdaterLogic(new NullUpdaterData(), null);\r
+\r
+ MockPlatformPackage p1 = new MockPlatformPackage(1, 1);\r
+ MockPlatformPackage p2 = new MockPlatformPackage(2, 1);\r
+\r
+ MockBrokenPackage a1 = new MockBrokenPackage(0, 1);\r
+ MockBrokenPackage a2 = new MockBrokenPackage(0, 2);\r
+\r
+ ArrayList<ArchiveInfo> out = new ArrayList<ArchiveInfo>();\r
+ ArrayList<Archive> selected = new ArrayList<Archive>();\r
+ ArrayList<Package> remote = new ArrayList<Package>();\r
+\r
+ // a2 depends on p2, which is not in the locals\r
+ Package[] localPkgs = { p1, a1 };\r
+ ArchiveInfo[] locals = mul.createLocalArchives(localPkgs);\r
+\r
+ SdkSource[] sources = null;\r
+\r
+ // a1 depends on p1, which can be found in the locals. p1 is already "installed"\r
+ // so we donn't need to suggest it as a dependency to solve any problem.\r
+ ArchiveInfo found = mul.findExactApiLevelDependency(\r
+ a1, out, selected, remote, sources, locals);\r
+ assertNull(found);\r
+\r
+ // a2 now depends on a "fake" archive info with no newArchive that wraps the missing\r
+ // underlying platform.\r
+ found = mul.findExactApiLevelDependency(a2, out, selected, remote, sources, locals);\r
+ assertNotNull(found);\r
+ assertNull(found.getNewArchive());\r
+ assertTrue(found.isRejected());\r
+ assertEquals(0, out.size());\r
+\r
+ // p2 is now selected, and should be scheduled for install in out\r
+ Archive p2_archive = p2.getArchives()[0];\r
+ selected.add(p2_archive);\r
+ found = mul.findExactApiLevelDependency(a2, out, selected, remote, sources, locals);\r
+ assertNotNull(found);\r
+ assertSame(p2_archive, found.getNewArchive());\r
+ assertEquals(1, out.size());\r
+ assertSame(p2_archive, out.get(0).getNewArchive());\r
+ }\r
+\r
+ /**\r
+ * Platform packages depend on a tool package.\r
+ * This tests checks that UpdaterLogic.findToolsDependency() can find a base\r
+ * tool package for a given platform package.\r
+ */\r
+ public void testFindPlatformDependency() {\r
+ MockUpdaterLogic mul = new MockUpdaterLogic(new NullUpdaterData(), null);\r
+\r
+ MockPlatformToolPackage pt1 = new MockPlatformToolPackage(1);\r
+\r
+ MockToolPackage t1 = new MockToolPackage(1, 1);\r
+ MockToolPackage t2 = new MockToolPackage(2, 1);\r
+\r
+ MockPlatformPackage p2 = new MockPlatformPackage(2, 1, 2);\r
+\r
+ ArrayList<ArchiveInfo> out = new ArrayList<ArchiveInfo>();\r
+ ArrayList<Archive> selected = new ArrayList<Archive>();\r
+ ArrayList<Package> remote = new ArrayList<Package>();\r
+\r
+ // p2 depends on t2, which is not locally installed\r
+ Package[] localPkgs = { t1, pt1 };\r
+ ArchiveInfo[] locals = mul.createLocalArchives(localPkgs);\r
+\r
+ SdkSource[] sources = null;\r
+\r
+ // p2 now depends on a "fake" archive info with no newArchive that wraps the missing\r
+ // underlying tool\r
+ ArchiveInfo fai = mul.findToolsDependency(p2, out, selected, remote, sources, locals);\r
+ assertNotNull(fai);\r
+ assertNull(fai.getNewArchive());\r
+ assertTrue(fai.isRejected());\r
+ assertEquals(0, out.size());\r
+\r
+ // t2 is now selected and can be used as a dependency\r
+ Archive t2_archive = t2.getArchives()[0];\r
+ selected.add(t2_archive);\r
+ ArchiveInfo ai2 = mul.findToolsDependency(p2, out, selected, remote, sources, locals);\r
+ assertNotNull(ai2);\r
+ assertSame(t2_archive, ai2.getNewArchive());\r
+ assertEquals(1, out.size());\r
+ assertSame(t2_archive, out.get(0).getNewArchive());\r
+ }\r
+\r
+ /**\r
+ * Tool packages require a platform-tool package to be present or installed.\r
+ * This tests checks that UpdaterLogic.findPlatformToolsDependency() can find a base\r
+ * platform-tool package for a given tool package.\r
+ */\r
+ public void testFindPlatformToolDependency() {\r
+ MockUpdaterLogic mul = new MockUpdaterLogic(new NullUpdaterData(), null);\r
+\r
+ MockPlatformToolPackage t1 = new MockPlatformToolPackage(1);\r
+ MockPlatformToolPackage t2 = new MockPlatformToolPackage(2);\r
+\r
+ MockToolPackage p2 = new MockToolPackage(2, 2);\r
+\r
+ ArrayList<ArchiveInfo> out = new ArrayList<ArchiveInfo>();\r
+ ArrayList<Archive> selected = new ArrayList<Archive>();\r
+ ArrayList<Package> remote = new ArrayList<Package>();\r
+\r
+ // p2 depends on t2, which is not locally installed\r
+ Package[] localPkgs = { t1 };\r
+ ArchiveInfo[] locals = mul.createLocalArchives(localPkgs);\r
+\r
+ SdkSource[] sources = null;\r
+\r
+ // p2 now depends on a "fake" archive info with no newArchive that wraps the missing\r
+ // underlying tool\r
+ ArchiveInfo fai = mul.findPlatformToolsDependency(\r
+ p2, out, selected, remote, sources, locals);\r
+ assertNotNull(fai);\r
+ assertNull(fai.getNewArchive());\r
+ assertTrue(fai.isRejected());\r
+ assertEquals(0, out.size());\r
+\r
+ // t2 is now selected and can be used as a dependency\r
+ Archive t2_archive = t2.getArchives()[0];\r
+ selected.add(t2_archive);\r
+ ArchiveInfo ai2 = mul.findPlatformToolsDependency(\r
+ p2, out, selected, remote, sources, locals);\r
+ assertNotNull(ai2);\r
+ assertSame(t2_archive, ai2.getNewArchive());\r
+ assertEquals(1, out.size());\r
+ assertSame(t2_archive, out.get(0).getNewArchive());\r
+ }\r
+\r
+ public void testComputeRevisionUpdate() {\r
+ // Scenario:\r
+ // - user has tools rev 7 installed + plat-tools rev 1 installed\r
+ // - server has tools rev 8, depending on plat-tools rev 2\r
+ // - server has tools rev 9, depending on plat-tools rev 3\r
+ // - server has platform 9 that requires min-tools-rev 9\r
+ //\r
+ // If we do an update all, we want to the installer to pick up:\r
+ // - the new platform 9\r
+ // - the tools rev 9 (required by platform 9)\r
+ // - the plat-tools rev 3 (required by tools rev 9)\r
+\r
+ final MockPlatformToolPackage pt1 = new MockPlatformToolPackage(1);\r
+ final MockPlatformToolPackage pt2 = new MockPlatformToolPackage(2);\r
+ final MockPlatformToolPackage pt3 = new MockPlatformToolPackage(3);\r
+\r
+ final MockToolPackage t7 = new MockToolPackage(7, 1 /*min-plat-tools*/);\r
+ final MockToolPackage t8 = new MockToolPackage(8, 2 /*min-plat-tools*/);\r
+ final MockToolPackage t9 = new MockToolPackage(9, 3 /*min-plat-tools*/);\r
+\r
+ final MockPlatformPackage p9 = new MockPlatformPackage(9, 1, 9 /*min-tools*/);\r
+\r
+ // Note: the mock updater logic gets the remotes packages from the array given\r
+ // here and bypasses the source (to avoid fetching any actual URLs)\r
+ MockUpdaterLogic mul = new MockUpdaterLogic(new NullUpdaterData(),\r
+ new Package[] { t8, pt2, t9, pt3, p9 });\r
+\r
+ SdkSources sources = new SdkSources();\r
+ Package[] localPkgs = { t7, pt1 };\r
+\r
+ List<ArchiveInfo> selected = mul.computeUpdates(\r
+ null /*selectedArchives*/,\r
+ sources,\r
+ localPkgs,\r
+ false /*includeObsoletes*/);\r
+\r
+ assertEquals(\r
+ "[Android SDK Platform-tools, revision 3, " +\r
+ "Android SDK Tools, revision 9]",\r
+ Arrays.toString(selected.toArray()));\r
+\r
+ mul.addNewPlatforms(\r
+ selected,\r
+ sources,\r
+ localPkgs,\r
+ false /*includeObsoletes*/);\r
+\r
+ assertEquals(\r
+ "[Android SDK Platform-tools, revision 3, " +\r
+ "Android SDK Tools, revision 9, " +\r
+ "SDK Platform Android android-9, API 9, revision 1]",\r
+ Arrays.toString(selected.toArray()));\r
+\r
+ // Now try again but reverse the order of the remote package list.\r
+\r
+ mul = new MockUpdaterLogic(new NullUpdaterData(),\r
+ new Package[] { p9, t9, pt3, t8, pt2 });\r
+\r
+ selected = mul.computeUpdates(\r
+ null /*selectedArchives*/,\r
+ sources,\r
+ localPkgs,\r
+ false /*includeObsoletes*/);\r
+\r
+ assertEquals(\r
+ "[Android SDK Platform-tools, revision 3, " +\r
+ "Android SDK Tools, revision 9]",\r
+ Arrays.toString(selected.toArray()));\r
+\r
+ mul.addNewPlatforms(\r
+ selected,\r
+ sources,\r
+ localPkgs,\r
+ false /*includeObsoletes*/);\r
+\r
+ assertEquals(\r
+ "[Android SDK Platform-tools, revision 3, " +\r
+ "Android SDK Tools, revision 9, " +\r
+ "SDK Platform Android android-9, API 9, revision 1]",\r
+ Arrays.toString(selected.toArray()));\r
+ }\r
+}\r