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