OSDN Git Service

original
[gb-231r1-is01/GB_2.3_IS01.git] / sdk / sdkmanager / libs / sdkuilib / tests / com / android / sdkuilib / internal / repository / UpdaterLogicTest.java
diff --git a/sdk/sdkmanager/libs/sdkuilib/tests/com/android/sdkuilib/internal/repository/UpdaterLogicTest.java b/sdk/sdkmanager/libs/sdkuilib/tests/com/android/sdkuilib/internal/repository/UpdaterLogicTest.java
new file mode 100644 (file)
index 0000000..72229ff
--- /dev/null
@@ -0,0 +1,356 @@
+/*\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