| /* |
| * Copyright (C) 2011 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.core; |
| |
| import com.android.SdkConstants; |
| import com.android.sdklib.internal.repository.packages.BrokenPackage; |
| import com.android.sdklib.internal.repository.packages.MockAddonPackage; |
| import com.android.sdklib.internal.repository.packages.MockBrokenPackage; |
| import com.android.sdklib.internal.repository.packages.MockBuildToolPackage; |
| import com.android.sdklib.internal.repository.packages.MockEmptyPackage; |
| import com.android.sdklib.internal.repository.packages.MockExtraPackage; |
| import com.android.sdklib.internal.repository.packages.MockPlatformPackage; |
| import com.android.sdklib.internal.repository.packages.MockPlatformToolPackage; |
| import com.android.sdklib.internal.repository.packages.MockSystemImagePackage; |
| import com.android.sdklib.internal.repository.packages.MockToolPackage; |
| import com.android.sdklib.internal.repository.packages.Package; |
| import com.android.sdklib.internal.repository.sources.SdkRepoSource; |
| import com.android.sdklib.internal.repository.sources.SdkSource; |
| import com.android.sdklib.internal.repository.updater.ISettingsPage; |
| import com.android.sdklib.internal.repository.updater.PkgItem; |
| import com.android.sdklib.repository.FullRevision; |
| import com.android.sdklib.repository.PkgProps; |
| import com.android.sdkuilib.internal.repository.MockSwtUpdaterData; |
| |
| import java.util.Properties; |
| |
| import junit.framework.TestCase; |
| |
| public class PackagesDiffLogicTest extends TestCase { |
| |
| private PackagesDiffLogic m; |
| private MockSwtUpdaterData u; |
| |
| @Override |
| protected void setUp() throws Exception { |
| super.setUp(); |
| |
| u = new MockSwtUpdaterData(); |
| m = new PackagesDiffLogic(u); |
| } |
| |
| @Override |
| protected void tearDown() throws Exception { |
| super.tearDown(); |
| } |
| |
| // ---- |
| // |
| // Test Details Note: the way load is implemented in PackageLoader, the |
| // loader processes each source and then for each source the packages are added |
| // to a list and the sorting algorithm is called with that list. Thus for |
| // one load, many calls to the sortByX/Y happen, with the list progressively |
| // being populated. |
| // However when the user switches sorting algorithm, the package list is not |
| // reloaded and is processed at once. |
| |
| public void testSortByApi_Empty() { |
| m.updateStart(); |
| assertFalse(m.updateSourcePackages(true /*sortByApi*/, null /*locals*/, new Package[0])); |
| assertFalse(m.updateEnd(true /*sortByApi*/)); |
| |
| // We also keep these 2 categories even if they contain nothing |
| assertEquals( |
| "PkgCategoryApi <API=TOOLS, label=Tools, #items=0>\n" + |
| "PkgCategoryApi <API=EXTRAS, label=Extras, #items=0>\n", |
| getTree(m, true /*displaySortByApi*/)); |
| } |
| |
| public void testSortByApi_AddSamePackage() { |
| SdkSource src1 = new SdkRepoSource("http://example.com/url", "repo1"); |
| |
| m.updateStart(); |
| // First insert local packages |
| assertTrue(m.updateSourcePackages(true /*sortByApi*/, null /*locals*/, new Package[] { |
| new MockEmptyPackage(src1, "some pkg", 1) |
| })); |
| |
| assertEquals( |
| "PkgCategoryApi <API=TOOLS, label=Tools, #items=0>\n" + |
| "PkgCategoryApi <API=EXTRAS, label=Extras, #items=1>\n" + |
| "-- <INSTALLED, pkg:MockEmptyPackage 'some pkg' rev=1>\n", |
| getTree(m, true /*displaySortByApi*/)); |
| |
| // Insert the next source |
| // Same package as the one installed, so we don't display it |
| assertFalse(m.updateSourcePackages(true /*sortByApi*/, src1, new Package[] { |
| new MockEmptyPackage(src1, "some pkg", 1) |
| })); |
| |
| assertFalse(m.updateEnd(true /*sortByApi*/)); |
| |
| assertEquals( |
| "PkgCategoryApi <API=TOOLS, label=Tools, #items=0>\n" + |
| "PkgCategoryApi <API=EXTRAS, label=Extras, #items=1>\n" + |
| "-- <INSTALLED, pkg:MockEmptyPackage 'some pkg' rev=1>\n", |
| getTree(m, true /*displaySortByApi*/)); |
| } |
| |
| public void testSortByApi_AddOtherPackage() { |
| SdkSource src1 = new SdkRepoSource("http://example.com/url", "repo1"); |
| |
| m.updateStart(); |
| // First insert local packages |
| assertTrue(m.updateSourcePackages(true /*sortByApi*/, null /*locals*/, new Package[] { |
| new MockEmptyPackage(src1, "some pkg", 1) |
| })); |
| |
| assertEquals( |
| "PkgCategoryApi <API=TOOLS, label=Tools, #items=0>\n" + |
| "PkgCategoryApi <API=EXTRAS, label=Extras, #items=1>\n" + |
| "-- <INSTALLED, pkg:MockEmptyPackage 'some pkg' rev=1>\n", |
| getTree(m, true /*displaySortByApi*/)); |
| |
| // Insert the next source |
| // Not the same package as the one installed, so we'll display it |
| assertTrue(m.updateSourcePackages(true /*sortByApi*/, src1, new Package[] { |
| new MockEmptyPackage(src1, "other pkg", 1) |
| })); |
| |
| assertFalse(m.updateEnd(true /*sortByApi*/)); |
| |
| assertEquals( |
| "PkgCategoryApi <API=TOOLS, label=Tools, #items=0>\n" + |
| "PkgCategoryApi <API=EXTRAS, label=Extras, #items=2>\n" + |
| "-- <INSTALLED, pkg:MockEmptyPackage 'some pkg' rev=1>\n" + |
| "-- <NEW, pkg:MockEmptyPackage 'other pkg' rev=1>\n", |
| getTree(m, true /*displaySortByApi*/)); |
| } |
| |
| public void testSortByApi_Update1() { |
| SdkSource src1 = new SdkRepoSource("http://example.com/url", "repo1"); |
| |
| // Typical case: user has a locally installed package in revision 1 |
| // The display list after sort should show that installed package. |
| m.updateStart(); |
| // First insert local packages |
| assertTrue(m.updateSourcePackages(true /*sortByApi*/, null /*locals*/, new Package[] { |
| new MockEmptyPackage(src1, "type1", 1) |
| })); |
| |
| assertEquals( |
| "PkgCategoryApi <API=TOOLS, label=Tools, #items=0>\n" + |
| "PkgCategoryApi <API=EXTRAS, label=Extras, #items=1>\n" + |
| "-- <INSTALLED, pkg:MockEmptyPackage 'type1' rev=1>\n", |
| getTree(m, true /*displaySortByApi*/)); |
| |
| assertTrue(m.updateSourcePackages(true /*sortByApi*/, src1, new Package[] { |
| new MockEmptyPackage(src1, "type1", 4), |
| new MockEmptyPackage(src1, "type1", 2) |
| })); |
| |
| assertFalse(m.updateEnd(true /*sortByApi*/)); |
| |
| assertEquals( |
| "PkgCategoryApi <API=TOOLS, label=Tools, #items=0>\n" + |
| "PkgCategoryApi <API=EXTRAS, label=Extras, #items=1>\n" + |
| "-- <INSTALLED, pkg:MockEmptyPackage 'type1' rev=1, updated by:MockEmptyPackage 'type1' rev=4>\n", |
| getTree(m, true /*displaySortByApi*/)); |
| } |
| |
| public void testSortByApi_Reload() { |
| SdkSource src1 = new SdkRepoSource("http://example.com/url", "repo1"); |
| |
| // First load reveals a package local package and its update |
| m.updateStart(); |
| // First insert local packages |
| assertTrue(m.updateSourcePackages(true /*sortByApi*/, null /*locals*/, new Package[] { |
| new MockEmptyPackage(src1, "type1", 1) |
| })); |
| assertTrue(m.updateSourcePackages(true /*sortByApi*/, src1, new Package[] { |
| new MockEmptyPackage(src1, "type1", 2) |
| })); |
| |
| assertFalse(m.updateEnd(true /*sortByApi*/)); |
| |
| assertEquals( |
| "PkgCategoryApi <API=TOOLS, label=Tools, #items=0>\n" + |
| "PkgCategoryApi <API=EXTRAS, label=Extras, #items=1>\n" + |
| "-- <INSTALLED, pkg:MockEmptyPackage 'type1' rev=1, updated by:MockEmptyPackage 'type1' rev=2>\n", |
| getTree(m, true /*displaySortByApi*/)); |
| |
| // Now simulate a reload that clears the package list and creates similar |
| // objects but not the same references. The only difference is that updateXyz |
| // returns false since nothing changes. |
| |
| m.updateStart(); |
| // First insert local packages |
| assertFalse(m.updateSourcePackages(true /*sortByApi*/, null /*locals*/, new Package[] { |
| new MockEmptyPackage(src1, "type1", 1) |
| })); |
| assertFalse(m.updateSourcePackages(true /*sortByApi*/, src1, new Package[] { |
| new MockEmptyPackage(src1, "type1", 2) |
| })); |
| |
| assertFalse(m.updateEnd(true /*sortByApi*/)); |
| |
| assertEquals( |
| "PkgCategoryApi <API=TOOLS, label=Tools, #items=0>\n" + |
| "PkgCategoryApi <API=EXTRAS, label=Extras, #items=1>\n" + |
| "-- <INSTALLED, pkg:MockEmptyPackage 'type1' rev=1, updated by:MockEmptyPackage 'type1' rev=2>\n", |
| getTree(m, true /*displaySortByApi*/)); |
| } |
| |
| public void testSortByApi_InstallPackage() { |
| SdkSource src1 = new SdkRepoSource("http://example.com/url", "repo1"); |
| |
| // First load reveals a new package |
| m.updateStart(); |
| // No local packages at first |
| assertFalse(m.updateSourcePackages(true /*sortByApi*/, null /*locals*/, new Package[0])); |
| assertTrue(m.updateSourcePackages(true /*sortByApi*/, src1, new Package[] { |
| new MockEmptyPackage(src1, "type1", 1) |
| })); |
| |
| assertFalse(m.updateEnd(true /*sortByApi*/)); |
| |
| assertEquals( |
| "PkgCategoryApi <API=TOOLS, label=Tools, #items=0>\n" + |
| "PkgCategoryApi <API=EXTRAS, label=Extras, #items=1>\n" + |
| "-- <NEW, pkg:MockEmptyPackage 'type1' rev=1>\n", |
| getTree(m, true /*displaySortByApi*/)); |
| |
| // Install it. |
| m.updateStart(); |
| // local packages |
| assertTrue(m.updateSourcePackages(true /*sortByApi*/, null /*locals*/, new Package[] { |
| new MockEmptyPackage(src1, "type1", 1) |
| })); |
| assertFalse(m.updateSourcePackages(true /*sortByApi*/, src1, new Package[] { |
| new MockEmptyPackage(src1, "type1", 1) |
| })); |
| |
| assertTrue(m.updateEnd(true /*sortByApi*/)); |
| |
| assertEquals( |
| "PkgCategoryApi <API=TOOLS, label=Tools, #items=0>\n" + |
| "PkgCategoryApi <API=EXTRAS, label=Extras, #items=1>\n" + |
| "-- <INSTALLED, pkg:MockEmptyPackage 'type1' rev=1>\n", |
| getTree(m, true /*displaySortByApi*/)); |
| |
| // Load reveals an update |
| m.updateStart(); |
| // local packages |
| assertFalse(m.updateSourcePackages(true /*sortByApi*/, null /*locals*/, new Package[] { |
| new MockEmptyPackage(src1, "type1", 1) |
| })); |
| assertTrue(m.updateSourcePackages(true /*sortByApi*/, src1, new Package[] { |
| new MockEmptyPackage(src1, "type1", 2) |
| })); |
| |
| assertFalse(m.updateEnd(true /*sortByApi*/)); |
| |
| assertEquals( |
| "PkgCategoryApi <API=TOOLS, label=Tools, #items=0>\n" + |
| "PkgCategoryApi <API=EXTRAS, label=Extras, #items=1>\n" + |
| "-- <INSTALLED, pkg:MockEmptyPackage 'type1' rev=1, updated by:MockEmptyPackage 'type1' rev=2>\n", |
| getTree(m, true /*displaySortByApi*/)); |
| } |
| |
| public void testSortByApi_DeletePackage() { |
| SdkSource src1 = new SdkRepoSource("http://example.com/url", "repo1"); |
| |
| // We have an installed package |
| m.updateStart(); |
| // local packages |
| assertTrue(m.updateSourcePackages(true /*sortByApi*/, null /*locals*/, new Package[] { |
| new MockEmptyPackage(src1, "type1", 1) |
| })); |
| assertTrue(m.updateSourcePackages(true /*sortByApi*/, src1, new Package[] { |
| new MockEmptyPackage(src1, "type1", 2) |
| })); |
| |
| assertFalse(m.updateEnd(true /*sortByApi*/)); |
| |
| assertEquals( |
| "PkgCategoryApi <API=TOOLS, label=Tools, #items=0>\n" + |
| "PkgCategoryApi <API=EXTRAS, label=Extras, #items=1>\n" + |
| "-- <INSTALLED, pkg:MockEmptyPackage 'type1' rev=1, updated by:MockEmptyPackage 'type1' rev=2>\n", |
| getTree(m, true /*displaySortByApi*/)); |
| |
| // User now deletes the installed package. |
| m.updateStart(); |
| // No local packages |
| assertTrue(m.updateSourcePackages(true /*sortByApi*/, null /*locals*/, new Package[0])); |
| assertTrue(m.updateSourcePackages(true /*sortByApi*/, src1, new Package[] { |
| new MockEmptyPackage(src1, "type1", 1) |
| })); |
| |
| assertFalse(m.updateEnd(true /*sortByApi*/)); |
| |
| assertEquals( |
| "PkgCategoryApi <API=TOOLS, label=Tools, #items=0>\n" + |
| "PkgCategoryApi <API=EXTRAS, label=Extras, #items=1>\n" + |
| "-- <NEW, pkg:MockEmptyPackage 'type1' rev=1>\n", |
| getTree(m, true /*displaySortByApi*/)); |
| } |
| |
| public void testSortByApi_NoRemoteSources() { |
| SdkSource src1 = new SdkRepoSource("http://example.com/url1", "repo1"); |
| SdkSource src2 = new SdkRepoSource("http://example.com/url2", "repo2"); |
| |
| // We have a couple installed packages |
| m.updateStart(); |
| // local packages |
| assertTrue(m.updateSourcePackages(true /*sortByApi*/, null /*locals*/, new Package[] { |
| new MockToolPackage(src1, 10, 3), |
| new MockPlatformToolPackage(src1, 3), |
| new MockExtraPackage(src2, "carrier", "custom_rom", 1, 0), |
| new MockExtraPackage(src2, "android", "usb_driver", 5, 3), |
| })); |
| // and no remote sources have been loaded (e.g. because there's no network) |
| assertFalse(m.updateEnd(true /*sortByApi*/)); |
| |
| assertEquals( |
| "PkgCategoryApi <API=TOOLS, label=Tools, #items=2>\n" + |
| "-- <INSTALLED, pkg:Android SDK Tools, revision 10>\n" + |
| "-- <INSTALLED, pkg:Android SDK Platform-tools, revision 3>\n" + |
| "PkgCategoryApi <API=EXTRAS, label=Extras, #items=2>\n" + |
| "-- <INSTALLED, pkg:Android USB Driver, revision 5>\n" + |
| "-- <INSTALLED, pkg:Carrier Custom Rom, revision 1>\n", |
| getTree(m, true /*displaySortByApi*/)); |
| |
| assertEquals( |
| "PkgCategorySource <source=repo1 (example.com), #items=2>\n" + |
| "-- <INSTALLED, pkg:Android SDK Tools, revision 10>\n" + |
| "-- <INSTALLED, pkg:Android SDK Platform-tools, revision 3>\n" + |
| "PkgCategorySource <source=repo2 (example.com), #items=2>\n" + |
| "-- <INSTALLED, pkg:Android USB Driver, revision 5>\n" + |
| "-- <INSTALLED, pkg:Carrier Custom Rom, revision 1>\n", |
| getTree(m, false /*displaySortByApi*/)); |
| } |
| |
| public void testSortByApi_CompleteUpdate() { |
| SdkSource src1 = new SdkRepoSource("http://1.example.com/url1", "repo1"); |
| SdkSource src2 = new SdkRepoSource("http://2.example.com/url2", "repo2"); |
| |
| // Resulting categories are sorted by Tools, descending platform API and finally Extras. |
| // Addons are sorted by name within their API. |
| // Extras are sorted by vendor name. |
| // The order packages are added to the mAllPkgItems list is purposedly different from |
| // the final order we get. |
| |
| // First update has the typical tools and a couple extras |
| m.updateStart(); |
| |
| assertTrue(m.updateSourcePackages(true /*sortByApi*/, null /*locals*/, new Package[] { |
| new MockToolPackage(src1, 10, 3), |
| new MockPlatformToolPackage(src1, 3), |
| new MockExtraPackage(src1, "android", "usb_driver", 4, 3), |
| })); |
| assertTrue(m.updateSourcePackages(true /*sortByApi*/, src1, new Package[] { |
| new MockToolPackage(src1, 10, 3), |
| new MockPlatformToolPackage(src1, 3), |
| new MockExtraPackage(src1, "carrier", "custom_rom", 1, 0), |
| new MockExtraPackage(src1, "android", "usb_driver", 5, 3), |
| })); |
| assertFalse(m.updateEnd(true /*sortByApi*/)); |
| |
| assertEquals( |
| "PkgCategoryApi <API=TOOLS, label=Tools, #items=2>\n" + |
| "-- <INSTALLED, pkg:Android SDK Tools, revision 10>\n" + |
| "-- <INSTALLED, pkg:Android SDK Platform-tools, revision 3>\n" + |
| "PkgCategoryApi <API=EXTRAS, label=Extras, #items=2>\n" + |
| "-- <INSTALLED, pkg:Android USB Driver, revision 4, updated by:Android USB Driver, revision 5>\n" + |
| "-- <NEW, pkg:Carrier Custom Rom, revision 1>\n", |
| getTree(m, true /*displaySortByApi*/)); |
| |
| // Next update adds platforms and addon, sorted in a category based on their API level |
| m.updateStart(); |
| MockPlatformPackage p1; |
| MockPlatformPackage p2; |
| @SuppressWarnings("unused") // keep p3 for clarity |
| MockPlatformPackage p3; |
| |
| assertTrue(m.updateSourcePackages(true /*sortByApi*/, null /*locals*/, new Package[] { |
| new MockToolPackage(src1, 10, 3), |
| new MockPlatformToolPackage(src1, 3), |
| new MockExtraPackage(src1, "android", "usb_driver", 4, 3), |
| // second update |
| p1 = new MockPlatformPackage(src1, 1, 2, 3), // API 1 |
| p3 = new MockPlatformPackage(src1, 3, 6, 3), |
| new MockAddonPackage(src2, "addon A", p1, 5), |
| new MockAddonPackage(src2, "addon D", p1, 10), |
| })); |
| assertTrue(m.updateSourcePackages(true /*sortByApi*/, src1, new Package[] { |
| new MockToolPackage(src1, 10, 3), |
| new MockPlatformToolPackage(src1, 3), |
| new MockExtraPackage(src1, "carrier", "custom_rom", 1, 0), |
| new MockExtraPackage(src1, "android", "usb_driver", 5, 3), |
| // second update |
| p2 = new MockPlatformPackage(src1, 2, 4, 3), // API 2 |
| })); |
| assertTrue(m.updateSourcePackages(true /*sortByApi*/, src2, new Package[] { |
| new MockAddonPackage(src2, "addon C", p2, 9), |
| new MockAddonPackage(src2, "addon A", p1, 6), |
| // the rev 7+8 will be ignored since there's a rev 9 coming after |
| new MockAddonPackage(src2, "addon B", p2, 7), |
| new MockAddonPackage(src2, "addon B", p2, 8), |
| new MockAddonPackage(src2, "addon B", p2, 9), |
| // 11+12 should be ignored updates, 13 will update 10 |
| new MockAddonPackage(src2, "addon D", p1, 10), |
| new MockAddonPackage(src2, "addon D", p1, 12), // note: 12 listed before 11 |
| new MockAddonPackage(src2, "addon D", p1, 11), |
| new MockAddonPackage(src2, "addon D", p1, 13), |
| })); |
| assertFalse(m.updateEnd(true /*sortByApi*/)); |
| |
| assertEquals( |
| "PkgCategoryApi <API=TOOLS, label=Tools, #items=2>\n" + |
| "-- <INSTALLED, pkg:Android SDK Tools, revision 10>\n" + |
| "-- <INSTALLED, pkg:Android SDK Platform-tools, revision 3>\n" + |
| "PkgCategoryApi <API=API 3, label=Android android-3 (API 3), #items=1>\n" + |
| "-- <INSTALLED, pkg:SDK Platform Android android-3, API 3, revision 6>\n" + |
| "PkgCategoryApi <API=API 2, label=Android android-2 (API 2), #items=3>\n" + |
| "-- <NEW, pkg:SDK Platform Android android-2, API 2, revision 4>\n" + |
| "-- <NEW, pkg:The addon B from vendor 2, Android API 2, revision 9>\n" + |
| "-- <NEW, pkg:The addon C from vendor 2, Android API 2, revision 9>\n" + |
| "PkgCategoryApi <API=API 1, label=Android android-1 (API 1), #items=3>\n" + |
| "-- <INSTALLED, pkg:SDK Platform Android android-1, API 1, revision 2>\n" + |
| "-- <INSTALLED, pkg:The addon A from vendor 1, Android API 1, revision 5, updated by:The addon A from vendor 1, Android API 1, revision 6>\n" + |
| "-- <INSTALLED, pkg:The addon D from vendor 1, Android API 1, revision 10, updated by:The addon D from vendor 1, Android API 1, revision 13>\n" + |
| "PkgCategoryApi <API=EXTRAS, label=Extras, #items=2>\n" + |
| "-- <INSTALLED, pkg:Android USB Driver, revision 4, updated by:Android USB Driver, revision 5>\n" + |
| "-- <NEW, pkg:Carrier Custom Rom, revision 1>\n", |
| getTree(m, true /*displaySortByApi*/)); |
| |
| // Reloading the same thing should have no impact except for the update methods |
| // returning false when they don't change the current list. |
| m.updateStart(); |
| |
| assertFalse(m.updateSourcePackages(true /*sortByApi*/, null /*locals*/, new Package[] { |
| new MockToolPackage(src1, 10, 3), |
| new MockPlatformToolPackage(src1, 3), |
| new MockExtraPackage(src1, "android", "usb_driver", 4, 3), |
| // second update |
| p1 = new MockPlatformPackage(src1, 1, 2, 3), |
| p3 = new MockPlatformPackage(src1, 3, 6, 3), |
| new MockAddonPackage(src2, "addon A", p1, 5), |
| new MockAddonPackage(src2, "addon D", p1, 10), |
| })); |
| assertFalse(m.updateSourcePackages(true /*sortByApi*/, src1, new Package[] { |
| new MockToolPackage(src1, 10, 3), |
| new MockPlatformToolPackage(src1, 3), |
| new MockExtraPackage(src1, "carrier", "custom_rom", 1, 0), |
| new MockExtraPackage(src1, "android", "usb_driver", 5, 3), |
| // second update |
| p2 = new MockPlatformPackage(src1, 2, 4, 3), |
| })); |
| assertTrue(m.updateSourcePackages(true /*sortByApi*/, src2, new Package[] { |
| new MockAddonPackage(src2, "addon C", p2, 9), |
| new MockAddonPackage(src2, "addon A", p1, 6), |
| // the rev 7+8 will be ignored since there's a rev 9 coming after |
| new MockAddonPackage(src2, "addon B", p2, 7), |
| new MockAddonPackage(src2, "addon B", p2, 8), |
| new MockAddonPackage(src2, "addon B", p2, 9), |
| // 11+12 should be ignored updates, 13 will update 10 |
| new MockAddonPackage(src2, "addon D", p1, 10), |
| new MockAddonPackage(src2, "addon D", p1, 12), // note: 12 listed before 11 |
| new MockAddonPackage(src2, "addon D", p1, 11), |
| new MockAddonPackage(src2, "addon D", p1, 13), |
| })); |
| assertFalse(m.updateEnd(true /*sortByApi*/)); |
| |
| assertEquals( |
| "PkgCategoryApi <API=TOOLS, label=Tools, #items=2>\n" + |
| "-- <INSTALLED, pkg:Android SDK Tools, revision 10>\n" + |
| "-- <INSTALLED, pkg:Android SDK Platform-tools, revision 3>\n" + |
| "PkgCategoryApi <API=API 3, label=Android android-3 (API 3), #items=1>\n" + |
| "-- <INSTALLED, pkg:SDK Platform Android android-3, API 3, revision 6>\n" + |
| "PkgCategoryApi <API=API 2, label=Android android-2 (API 2), #items=3>\n" + |
| "-- <NEW, pkg:SDK Platform Android android-2, API 2, revision 4>\n" + |
| "-- <NEW, pkg:The addon B from vendor 2, Android API 2, revision 9>\n" + |
| "-- <NEW, pkg:The addon C from vendor 2, Android API 2, revision 9>\n" + |
| "PkgCategoryApi <API=API 1, label=Android android-1 (API 1), #items=3>\n" + |
| "-- <INSTALLED, pkg:SDK Platform Android android-1, API 1, revision 2>\n" + |
| "-- <INSTALLED, pkg:The addon A from vendor 1, Android API 1, revision 5, updated by:The addon A from vendor 1, Android API 1, revision 6>\n" + |
| "-- <INSTALLED, pkg:The addon D from vendor 1, Android API 1, revision 10, updated by:The addon D from vendor 1, Android API 1, revision 13>\n" + |
| "PkgCategoryApi <API=EXTRAS, label=Extras, #items=2>\n" + |
| "-- <INSTALLED, pkg:Android USB Driver, revision 4, updated by:Android USB Driver, revision 5>\n" + |
| "-- <NEW, pkg:Carrier Custom Rom, revision 1>\n", |
| getTree(m, true /*displaySortByApi*/)); |
| } |
| |
| // ---- |
| |
| public void testSortBySource_Empty() { |
| m.updateStart(); |
| assertFalse(m.updateSourcePackages(false /*sortByApi*/, null /*locals*/, new Package[0])); |
| // UpdateEnd returns true since it removed the synthetic "unknown source" category |
| assertTrue(m.updateEnd(false /*sortByApi*/)); |
| |
| assertTrue(m.getCategories(false /*sortByApi*/).isEmpty()); |
| |
| assertEquals( |
| "", |
| getTree(m, false /*displaySortByApi*/)); |
| } |
| |
| public void testSortBySource_AddPackages() { |
| // Since we're sorting by source, items are grouped under their source |
| // even if installed. The 'local' source is only for installed items for |
| // which we don't know the source. |
| SdkSource src1 = new SdkRepoSource("http://example.com/url", "repo1"); |
| |
| m.updateStart(); |
| assertTrue(m.updateSourcePackages(false /*sortByApi*/, null /*locals*/, new Package[] { |
| new MockEmptyPackage(src1, "known source", 2), |
| new MockEmptyPackage(null, "unknown source", 3), |
| })); |
| |
| assertEquals( |
| "PkgCategorySource <source=Local Packages (no.source), #items=1>\n" + |
| "-- <INSTALLED, pkg:MockEmptyPackage 'unknown source' rev=3>\n" + |
| "PkgCategorySource <source=repo1 (example.com), #items=1>\n" + |
| "-- <INSTALLED, pkg:MockEmptyPackage 'known source' rev=2>\n", |
| getTree(m, false /*displaySortByApi*/)); |
| |
| assertTrue(m.updateSourcePackages(false /*sortByApi*/, src1, new Package[] { |
| new MockEmptyPackage(src1, "new", 1), |
| })); |
| |
| assertFalse(m.updateEnd(false /*sortByApi*/)); |
| |
| assertEquals( |
| "PkgCategorySource <source=Local Packages (no.source), #items=1>\n" + |
| "-- <INSTALLED, pkg:MockEmptyPackage 'unknown source' rev=3>\n" + |
| "PkgCategorySource <source=repo1 (example.com), #items=2>\n" + |
| "-- <NEW, pkg:MockEmptyPackage 'new' rev=1>\n" + |
| "-- <INSTALLED, pkg:MockEmptyPackage 'known source' rev=2>\n", |
| getTree(m, false /*displaySortByApi*/)); |
| } |
| |
| public void testSortBySource_Update1() { |
| |
| // Typical case: user has a locally installed package in revision 1 |
| // The display list after sort should show that instaled package. |
| SdkSource src1 = new SdkRepoSource("http://example.com/url", "repo1"); |
| m.updateStart(); |
| assertTrue(m.updateSourcePackages(false /*sortByApi*/, null /*locals*/, new Package[] { |
| new MockEmptyPackage(src1, "type1", 1), |
| })); |
| |
| assertEquals( |
| "PkgCategorySource <source=Local Packages (no.source), #items=0>\n" + |
| "PkgCategorySource <source=repo1 (example.com), #items=1>\n" + |
| "-- <INSTALLED, pkg:MockEmptyPackage 'type1' rev=1>\n", |
| getTree(m, false /*displaySortByApi*/)); |
| |
| // Edge case: the source reveals an update in revision 2. It is ignored since |
| // we already have a package in rev 4. |
| |
| assertTrue(m.updateSourcePackages(false /*sortByApi*/, src1, new Package[] { |
| new MockEmptyPackage(src1, "type1", 4), |
| new MockEmptyPackage(src1, "type1", 2), |
| })); |
| |
| assertTrue(m.updateEnd(false /*sortByApi*/)); |
| |
| assertEquals( |
| "PkgCategorySource <source=repo1 (example.com), #items=1>\n" + |
| "-- <INSTALLED, pkg:MockEmptyPackage 'type1' rev=1, updated by:MockEmptyPackage 'type1' rev=4>\n", |
| getTree(m, false /*displaySortByApi*/)); |
| } |
| |
| public void testSortBySource_Reload() { |
| |
| // First load reveals a package local package and its update |
| SdkSource src1 = new SdkRepoSource("http://example.com/url", "repo1"); |
| m.updateStart(); |
| assertTrue(m.updateSourcePackages(false /*sortByApi*/, null /*locals*/, new Package[] { |
| new MockEmptyPackage(src1, "type1", 1), |
| })); |
| assertTrue(m.updateSourcePackages(false /*sortByApi*/, src1, new Package[] { |
| new MockEmptyPackage(src1, "type1", 2), |
| })); |
| assertTrue(m.updateEnd(false /*sortByApi*/)); |
| |
| assertEquals( |
| "PkgCategorySource <source=repo1 (example.com), #items=1>\n" + |
| "-- <INSTALLED, pkg:MockEmptyPackage 'type1' rev=1, updated by:MockEmptyPackage 'type1' rev=2>\n", |
| getTree(m, false /*displaySortByApi*/)); |
| |
| // Now simulate a reload that clears the package list and creates similar |
| // objects but not the same references. Update methods return false since |
| // they don't change anything. |
| m.updateStart(); |
| assertFalse(m.updateSourcePackages(false /*sortByApi*/, null /*locals*/, new Package[] { |
| new MockEmptyPackage(src1, "type1", 1), |
| })); |
| assertFalse(m.updateSourcePackages(false /*sortByApi*/, src1, new Package[] { |
| new MockEmptyPackage(src1, "type1", 2), |
| })); |
| assertTrue(m.updateEnd(false /*sortByApi*/)); |
| |
| assertEquals( |
| "PkgCategorySource <source=repo1 (example.com), #items=1>\n" + |
| "-- <INSTALLED, pkg:MockEmptyPackage 'type1' rev=1, updated by:MockEmptyPackage 'type1' rev=2>\n", |
| getTree(m, false /*displaySortByApi*/)); |
| } |
| |
| public void testSortBySource_InstallPackage() { |
| |
| // First load reveals a new package |
| SdkSource src1 = new SdkRepoSource("http://example.com/url", "repo1"); |
| m.updateStart(); |
| // no local package |
| assertFalse(m.updateSourcePackages(false /*sortByApi*/, null /*locals*/, new Package[0])); |
| assertTrue(m.updateSourcePackages(false /*sortByApi*/, src1, new Package[] { |
| new MockEmptyPackage(src1, "type1", 1), |
| })); |
| assertTrue(m.updateEnd(false /*sortByApi*/)); |
| |
| assertEquals( |
| "PkgCategorySource <source=repo1 (example.com), #items=1>\n" + |
| "-- <NEW, pkg:MockEmptyPackage 'type1' rev=1>\n", |
| getTree(m, false /*displaySortByApi*/)); |
| |
| |
| // Install it. The display only shows the installed one, 'hiding' the remote package |
| m.updateStart(); |
| assertTrue(m.updateSourcePackages(false /*sortByApi*/, null /*locals*/, new Package[] { |
| new MockEmptyPackage(src1, "type1", 1), |
| })); |
| assertFalse(m.updateSourcePackages(false /*sortByApi*/, src1, new Package[] { |
| new MockEmptyPackage(src1, "type1", 1), |
| })); |
| assertTrue(m.updateEnd(false /*sortByApi*/)); |
| |
| assertEquals( |
| "PkgCategorySource <source=repo1 (example.com), #items=1>\n" + |
| "-- <INSTALLED, pkg:MockEmptyPackage 'type1' rev=1>\n", |
| getTree(m, false /*displaySortByApi*/)); |
| |
| // Now we have an update |
| m.updateStart(); |
| assertFalse(m.updateSourcePackages(false /*sortByApi*/, null /*locals*/, new Package[] { |
| new MockEmptyPackage(src1, "type1", 1), |
| })); |
| assertTrue(m.updateSourcePackages(false /*sortByApi*/, src1, new Package[] { |
| new MockEmptyPackage(src1, "type1", 2), |
| })); |
| assertTrue(m.updateEnd(false /*sortByApi*/)); |
| |
| assertEquals( |
| "PkgCategorySource <source=repo1 (example.com), #items=1>\n" + |
| "-- <INSTALLED, pkg:MockEmptyPackage 'type1' rev=1, updated by:MockEmptyPackage 'type1' rev=2>\n", |
| getTree(m, false /*displaySortByApi*/)); |
| } |
| |
| public void testSortBySource_DeletePackage() { |
| SdkSource src1 = new SdkRepoSource("http://example.com/url", "repo1"); |
| |
| // Start with an installed package and its matching remote package |
| m.updateStart(); |
| assertTrue(m.updateSourcePackages(false /*sortByApi*/, null /*locals*/, new Package[] { |
| new MockEmptyPackage(src1, "type1", 1), |
| })); |
| assertFalse(m.updateSourcePackages(false /*sortByApi*/, src1, new Package[] { |
| new MockEmptyPackage(src1, "type1", 1), |
| })); |
| assertTrue(m.updateEnd(false /*sortByApi*/)); |
| |
| assertEquals( |
| "PkgCategorySource <source=repo1 (example.com), #items=1>\n" + |
| "-- <INSTALLED, pkg:MockEmptyPackage 'type1' rev=1>\n", |
| getTree(m, false /*displaySortByApi*/)); |
| |
| // User now deletes the installed package. |
| m.updateStart(); |
| // no local package |
| assertTrue(m.updateSourcePackages(false /*sortByApi*/, null /*locals*/, new Package[0])); |
| assertTrue(m.updateSourcePackages(false /*sortByApi*/, src1, new Package[] { |
| new MockEmptyPackage(src1, "type1", 1), |
| })); |
| assertTrue(m.updateEnd(false /*sortByApi*/)); |
| |
| assertEquals( |
| "PkgCategorySource <source=repo1 (example.com), #items=1>\n" + |
| "-- <NEW, pkg:MockEmptyPackage 'type1' rev=1>\n", |
| getTree(m, false /*displaySortByApi*/)); |
| } |
| |
| public void testSortBySource_CompleteUpdate() { |
| SdkSource src1 = new SdkRepoSource("http://1.example.com/url1", "repo1"); |
| SdkSource src2 = new SdkRepoSource("http://2.example.com/url2", "repo2"); |
| |
| // First update has the typical tools and a couple extras |
| m.updateStart(); |
| |
| assertTrue(m.updateSourcePackages(false /*sortByApi*/, null /*locals*/, new Package[] { |
| new MockToolPackage(src1, 10, 3), |
| new MockPlatformToolPackage(src1, 3), |
| new MockExtraPackage(src1, "android", "usb_driver", 4, 3), |
| })); |
| assertTrue(m.updateSourcePackages(false /*sortByApi*/, src1, new Package[] { |
| new MockToolPackage(src1, 10, 3), |
| new MockPlatformToolPackage(src1, 3), |
| new MockExtraPackage(src1, "carrier", "custom_rom", 1, 0), |
| new MockExtraPackage(src1, "android", "usb_driver", 5, 3), |
| })); |
| assertTrue(m.updateEnd(false /*sortByApi*/)); |
| |
| assertEquals( |
| "PkgCategorySource <source=repo1 (1.example.com), #items=4>\n" + |
| "-- <INSTALLED, pkg:Android SDK Tools, revision 10>\n" + |
| "-- <INSTALLED, pkg:Android SDK Platform-tools, revision 3>\n" + |
| "-- <INSTALLED, pkg:Android USB Driver, revision 4, updated by:Android USB Driver, revision 5>\n" + |
| "-- <NEW, pkg:Carrier Custom Rom, revision 1>\n", |
| getTree(m, false /*displaySortByApi*/)); |
| |
| // Next update adds platforms and addon, sorted in a category based on their API level |
| m.updateStart(); |
| MockPlatformPackage p1; |
| MockPlatformPackage p2; |
| @SuppressWarnings("unused") // keep p3 for clarity |
| MockPlatformPackage p3; |
| |
| assertTrue(m.updateSourcePackages(false /*sortByApi*/, null /*locals*/, new Package[] { |
| new MockToolPackage(src1, 10, 3), |
| new MockPlatformToolPackage(src1, 3), |
| new MockExtraPackage(src1, "android", "usb_driver", 4, 3), |
| // second update |
| p1 = new MockPlatformPackage(src1, 1, 2, 3), // API 1 |
| p3 = new MockPlatformPackage(src1, 3, 6, 3), |
| new MockPlatformPackage(src1, 3, 6, 3), // API 3 |
| new MockAddonPackage(src2, "addon A", p1, 5), |
| new MockAddonPackage(src2, "addon D", p1, 10), |
| })); |
| assertTrue(m.updateSourcePackages(false /*sortByApi*/, src1, new Package[] { |
| new MockToolPackage(src1, 10, 3), |
| new MockPlatformToolPackage(src1, 3), |
| new MockExtraPackage(src1, "carrier", "custom_rom", 1, 0), |
| new MockExtraPackage(src1, "android", "usb_driver", 5, 3), |
| // second update |
| p2 = new MockPlatformPackage(src1, 2, 4, 3), // API 2 |
| })); |
| assertTrue(m.updateSourcePackages(false /*sortByApi*/, src2, new Package[] { |
| new MockAddonPackage(src2, "addon C", p2, 9), |
| new MockAddonPackage(src2, "addon A", p1, 6), |
| // the rev 7+8 will be ignored since there's a rev 9 coming after |
| new MockAddonPackage(src2, "addon B", p2, 7), |
| new MockAddonPackage(src2, "addon B", p2, 8), |
| new MockAddonPackage(src2, "addon B", p2, 9), |
| // 11+12 should be ignored updates, 13 will update 10 |
| new MockAddonPackage(src2, "addon D", p1, 10), |
| new MockAddonPackage(src2, "addon D", p1, 12), // note: 12 listed before 11 |
| new MockAddonPackage(src2, "addon D", p1, 11), |
| new MockAddonPackage(src2, "addon D", p1, 13), |
| })); |
| assertTrue(m.updateEnd(false /*sortByApi*/)); |
| |
| assertEquals( |
| "PkgCategorySource <source=repo1 (1.example.com), #items=7>\n" + |
| "-- <INSTALLED, pkg:Android SDK Tools, revision 10>\n" + |
| "-- <INSTALLED, pkg:Android SDK Platform-tools, revision 3>\n" + |
| "-- <INSTALLED, pkg:SDK Platform Android android-3, API 3, revision 6>\n" + |
| "-- <NEW, pkg:SDK Platform Android android-2, API 2, revision 4>\n" + |
| "-- <INSTALLED, pkg:SDK Platform Android android-1, API 1, revision 2>\n" + |
| "-- <INSTALLED, pkg:Android USB Driver, revision 4, updated by:Android USB Driver, revision 5>\n" + |
| "-- <NEW, pkg:Carrier Custom Rom, revision 1>\n" + |
| "PkgCategorySource <source=repo2 (2.example.com), #items=4>\n" + |
| "-- <NEW, pkg:The addon B from vendor 2, Android API 2, revision 9>\n" + |
| "-- <NEW, pkg:The addon C from vendor 2, Android API 2, revision 9>\n" + |
| "-- <INSTALLED, pkg:The addon A from vendor 1, Android API 1, revision 5, updated by:The addon A from vendor 1, Android API 1, revision 6>\n" + |
| "-- <INSTALLED, pkg:The addon D from vendor 1, Android API 1, revision 10, updated by:The addon D from vendor 1, Android API 1, revision 13>\n", |
| getTree(m, false /*displaySortByApi*/)); |
| |
| // Reloading the same thing should have no impact except for the update methods |
| // returning false when they don't change the current list. |
| m.updateStart(); |
| |
| assertFalse(m.updateSourcePackages(false /*sortByApi*/, null /*locals*/, new Package[] { |
| new MockToolPackage(src1, 10, 3), |
| new MockPlatformToolPackage(src1, 3), |
| new MockExtraPackage(src1, "android", "usb_driver", 4, 3), |
| // second update |
| p1 = new MockPlatformPackage(src1, 1, 2, 3), // API 1 |
| p3 = new MockPlatformPackage(src1, 3, 6, 3), |
| new MockPlatformPackage(src1, 3, 6, 3), // API 3 |
| new MockAddonPackage(src2, "addon A", p1, 5), |
| new MockAddonPackage(src2, "addon D", p1, 10), |
| })); |
| assertFalse(m.updateSourcePackages(false /*sortByApi*/, src1, new Package[] { |
| new MockToolPackage(src1, 10, 3), |
| new MockPlatformToolPackage(src1, 3), |
| new MockExtraPackage(src1, "carrier", "custom_rom", 1, 0), |
| new MockExtraPackage(src1, "android", "usb_driver", 5, 3), |
| // second update |
| p2 = new MockPlatformPackage(src1, 2, 4, 3), |
| })); |
| assertTrue(m.updateSourcePackages(false /*sortByApi*/, src2, new Package[] { |
| new MockAddonPackage(src2, "addon C", p2, 9), |
| new MockAddonPackage(src2, "addon A", p1, 6), |
| // the rev 7+8 will be ignored since there's a rev 9 coming after |
| new MockAddonPackage(src2, "addon B", p2, 7), |
| new MockAddonPackage(src2, "addon B", p2, 8), |
| new MockAddonPackage(src2, "addon B", p2, 9), |
| // 11+12 should be ignored updates, 13 will update 10 |
| new MockAddonPackage(src2, "addon D", p1, 10), |
| new MockAddonPackage(src2, "addon D", p1, 12), // note: 12 listed before 11 |
| new MockAddonPackage(src2, "addon D", p1, 11), |
| new MockAddonPackage(src2, "addon D", p1, 13), |
| })); |
| assertTrue(m.updateEnd(false /*sortByApi*/)); |
| |
| assertEquals( |
| "PkgCategorySource <source=repo1 (1.example.com), #items=7>\n" + |
| "-- <INSTALLED, pkg:Android SDK Tools, revision 10>\n" + |
| "-- <INSTALLED, pkg:Android SDK Platform-tools, revision 3>\n" + |
| "-- <INSTALLED, pkg:SDK Platform Android android-3, API 3, revision 6>\n" + |
| "-- <NEW, pkg:SDK Platform Android android-2, API 2, revision 4>\n" + |
| "-- <INSTALLED, pkg:SDK Platform Android android-1, API 1, revision 2>\n" + |
| "-- <INSTALLED, pkg:Android USB Driver, revision 4, updated by:Android USB Driver, revision 5>\n" + |
| "-- <NEW, pkg:Carrier Custom Rom, revision 1>\n" + |
| "PkgCategorySource <source=repo2 (2.example.com), #items=4>\n" + |
| "-- <NEW, pkg:The addon B from vendor 2, Android API 2, revision 9>\n" + |
| "-- <NEW, pkg:The addon C from vendor 2, Android API 2, revision 9>\n" + |
| "-- <INSTALLED, pkg:The addon A from vendor 1, Android API 1, revision 5, updated by:The addon A from vendor 1, Android API 1, revision 6>\n" + |
| "-- <INSTALLED, pkg:The addon D from vendor 1, Android API 1, revision 10, updated by:The addon D from vendor 1, Android API 1, revision 13>\n", |
| getTree(m, false /*displaySortByApi*/)); |
| } |
| |
| // ---- |
| |
| public void testIsFirstLoadComplete() { |
| // isFirstLoadComplete is a simple toggle that goes from true to false when read once |
| assertTrue(m.isFirstLoadComplete()); |
| assertFalse(m.isFirstLoadComplete()); |
| assertFalse(m.isFirstLoadComplete()); |
| } |
| |
| public void testCheckNewUpdateItems_NewOnly() { |
| // Populate the list with a few items and an update |
| SdkSource src1 = new SdkRepoSource("http://example.com/url", "repo1"); |
| m.updateStart(); |
| m.updateSourcePackages(true /*sortByApi*/, null /*locals*/, new Package[] { |
| new MockEmptyPackage(src1, "has update", 1), |
| new MockEmptyPackage(src1, "no update", 4) |
| }); |
| m.updateSourcePackages(true /*sortByApi*/, src1, new Package[] { |
| new MockEmptyPackage(src1, "has update", 2), |
| new MockEmptyPackage(src1, "new stuff", 3), |
| }); |
| m.updateEnd(true /*sortByApi*/); |
| // Nothing is checked at first |
| assertEquals( |
| "PkgCategoryApi <API=TOOLS, label=Tools, #items=0>\n" + |
| "PkgCategoryApi <API=EXTRAS, label=Extras, #items=3>\n" + |
| "-- <INSTALLED, pkg:MockEmptyPackage 'has update' rev=1, updated by:MockEmptyPackage 'has update' rev=2>\n" + |
| "-- <NEW, pkg:MockEmptyPackage 'new stuff' rev=3>\n" + |
| "-- <INSTALLED, pkg:MockEmptyPackage 'no update' rev=4>\n", |
| getTree(m, true /*displaySortByApi*/)); |
| assertEquals( |
| "PkgCategorySource <source=repo1 (example.com), #items=3>\n" + |
| "-- <INSTALLED, pkg:MockEmptyPackage 'has update' rev=1, updated by:MockEmptyPackage 'has update' rev=2>\n" + |
| "-- <NEW, pkg:MockEmptyPackage 'new stuff' rev=3>\n" + |
| "-- <INSTALLED, pkg:MockEmptyPackage 'no update' rev=4>\n", |
| getTree(m, false /*displaySortByApi*/)); |
| |
| // Now request to check new items only |
| m.checkNewUpdateItems(true, false, false, SdkConstants.PLATFORM_LINUX); |
| |
| assertEquals( |
| "PkgCategoryApi <API=TOOLS, label=Tools, #items=0>\n" + |
| "PkgCategoryApi <API=EXTRAS, label=Extras, #items=3>\n" + |
| "-- <INSTALLED, pkg:MockEmptyPackage 'has update' rev=1, updated by:MockEmptyPackage 'has update' rev=2>\n" + |
| "-- < * NEW, pkg:MockEmptyPackage 'new stuff' rev=3>\n" + |
| "-- <INSTALLED, pkg:MockEmptyPackage 'no update' rev=4>\n", |
| getTree(m, true /*displaySortByApi*/)); |
| assertEquals( |
| "PkgCategorySource <source=repo1 (example.com), #items=3>\n" + |
| "-- <INSTALLED, pkg:MockEmptyPackage 'has update' rev=1, updated by:MockEmptyPackage 'has update' rev=2>\n" + |
| "-- < * NEW, pkg:MockEmptyPackage 'new stuff' rev=3>\n" + |
| "-- <INSTALLED, pkg:MockEmptyPackage 'no update' rev=4>\n", |
| getTree(m, false /*displaySortByApi*/)); |
| } |
| |
| public void testCheckNewUpdateItems_UpdateOnly() { |
| // Populate the list with a few items and an update |
| SdkSource src1 = new SdkRepoSource("http://example.com/url", "repo1"); |
| m.updateStart(); |
| m.updateSourcePackages(true /*sortByApi*/, null /*locals*/, new Package[] { |
| new MockEmptyPackage(src1, "has update", 1), |
| new MockEmptyPackage(src1, "no update", 4) |
| }); |
| m.updateSourcePackages(true /*sortByApi*/, src1, new Package[] { |
| new MockEmptyPackage(src1, "has update", 2), |
| new MockEmptyPackage(src1, "new stuff", 3), |
| }); |
| m.updateEnd(true /*sortByApi*/); |
| // Nothing is checked at first |
| assertEquals( |
| "PkgCategoryApi <API=TOOLS, label=Tools, #items=0>\n" + |
| "PkgCategoryApi <API=EXTRAS, label=Extras, #items=3>\n" + |
| "-- <INSTALLED, pkg:MockEmptyPackage 'has update' rev=1, updated by:MockEmptyPackage 'has update' rev=2>\n" + |
| "-- <NEW, pkg:MockEmptyPackage 'new stuff' rev=3>\n" + |
| "-- <INSTALLED, pkg:MockEmptyPackage 'no update' rev=4>\n", |
| getTree(m, true /*displaySortByApi*/)); |
| assertEquals( |
| "PkgCategorySource <source=repo1 (example.com), #items=3>\n" + |
| "-- <INSTALLED, pkg:MockEmptyPackage 'has update' rev=1, updated by:MockEmptyPackage 'has update' rev=2>\n" + |
| "-- <NEW, pkg:MockEmptyPackage 'new stuff' rev=3>\n" + |
| "-- <INSTALLED, pkg:MockEmptyPackage 'no update' rev=4>\n", |
| getTree(m, false /*displaySortByApi*/)); |
| |
| // Now request to check update items only |
| m.checkNewUpdateItems(false, true, false, SdkConstants.PLATFORM_LINUX); |
| |
| assertEquals( |
| "PkgCategoryApi <API=TOOLS, label=Tools, #items=0>\n" + |
| "PkgCategoryApi <API=EXTRAS, label=Extras, #items=3>\n" + |
| "-- < * INSTALLED, pkg:MockEmptyPackage 'has update' rev=1, updated by:MockEmptyPackage 'has update' rev=2>\n" + |
| "-- <NEW, pkg:MockEmptyPackage 'new stuff' rev=3>\n" + |
| "-- <INSTALLED, pkg:MockEmptyPackage 'no update' rev=4>\n", |
| getTree(m, true /*displaySortByApi*/)); |
| assertEquals( |
| "PkgCategorySource <source=repo1 (example.com), #items=3>\n" + |
| "-- < * INSTALLED, pkg:MockEmptyPackage 'has update' rev=1, updated by:MockEmptyPackage 'has update' rev=2>\n" + |
| "-- <NEW, pkg:MockEmptyPackage 'new stuff' rev=3>\n" + |
| "-- <INSTALLED, pkg:MockEmptyPackage 'no update' rev=4>\n", |
| getTree(m, false /*displaySortByApi*/)); |
| } |
| |
| public void testCheckNewUpdateItems_SelectInitial() { |
| // Populate the list with typical items: tools, platforms tools, extras, 2 platforms. |
| // With nothing installed, this should pick the top platform and its system images |
| // (the mock platform claims to not have any included abi) |
| // It's ok not to select the tools, since they are a dependency of all platforms. |
| |
| SdkSource src1 = new SdkRepoSource("http://1.example.com/url1", "repo1"); |
| SdkSource src2 = new SdkRepoSource("http://2.example.com/url2", "repo2"); |
| |
| m.updateStart(); |
| MockPlatformPackage p1; |
| MockPlatformPackage p2; |
| |
| m.updateSourcePackages(true /*sortByApi*/, src1, new Package[] { |
| new MockToolPackage(src1, 10, 3), |
| new MockPlatformToolPackage(src1, 3), |
| new MockExtraPackage(src1, "google", "usb_driver", 5, 3), |
| p1 = new MockPlatformPackage(src1, 1, 2, 3), // API 1 |
| p2 = new MockPlatformPackage(src1, 2, 4, 3), // API 2 |
| new MockSystemImagePackage(src1, p2, 1, "armeabi"), |
| new MockSystemImagePackage(src1, p2, 1, "x86"), |
| }); |
| m.updateSourcePackages(true /*sortByApi*/, src2, new Package[] { |
| new MockAddonPackage(src2, "addon A", p1, 5), |
| new MockAddonPackage(src2, "addon B", p2, 7), |
| new MockExtraPackage(src2, "carrier", "custom_rom", 1, 0), |
| }); |
| m.updateEnd(true /*sortByApi*/); |
| |
| m.checkNewUpdateItems(false, true, true, SdkConstants.PLATFORM_LINUX); |
| |
| assertEquals( |
| "PkgCategoryApi <API=TOOLS, label=Tools, #items=2>\n" + |
| "-- <NEW, pkg:Android SDK Tools, revision 10>\n" + |
| "-- <NEW, pkg:Android SDK Platform-tools, revision 3>\n" + |
| "PkgCategoryApi <API=API 2, label=Android android-2 (API 2), #items=4>\n" + |
| "-- < * NEW, pkg:SDK Platform Android android-2, API 2, revision 4>\n" + |
| "-- < * NEW, pkg:ARM EABI System Image, Android API 2, revision 1>\n" + |
| "-- < * NEW, pkg:Intel x86 Atom System Image, Android API 2, revision 1>\n" + |
| "-- < * NEW, pkg:The addon B from vendor 2, Android API 2, revision 7>\n" + |
| "PkgCategoryApi <API=API 1, label=Android android-1 (API 1), #items=2>\n" + |
| "-- <NEW, pkg:SDK Platform Android android-1, API 1, revision 2>\n" + |
| "-- <NEW, pkg:The addon A from vendor 1, Android API 1, revision 5>\n" + |
| "PkgCategoryApi <API=EXTRAS, label=Extras, #items=2>\n" + |
| "-- <NEW, pkg:Carrier Custom Rom, revision 1>\n" + |
| "-- <NEW, pkg:Google USB Driver, revision 5>\n", |
| getTree(m, true /*displaySortByApi*/)); |
| assertEquals( |
| "PkgCategorySource <source=repo1 (1.example.com), #items=7>\n" + |
| "-- <NEW, pkg:Android SDK Tools, revision 10>\n" + |
| "-- <NEW, pkg:Android SDK Platform-tools, revision 3>\n" + |
| "-- < * NEW, pkg:SDK Platform Android android-2, API 2, revision 4>\n" + |
| "-- <NEW, pkg:SDK Platform Android android-1, API 1, revision 2>\n" + |
| "-- < * NEW, pkg:ARM EABI System Image, Android API 2, revision 1>\n" + |
| "-- < * NEW, pkg:Intel x86 Atom System Image, Android API 2, revision 1>\n" + |
| "-- <NEW, pkg:Google USB Driver, revision 5>\n" + |
| "PkgCategorySource <source=repo2 (2.example.com), #items=3>\n" + |
| "-- < * NEW, pkg:The addon B from vendor 2, Android API 2, revision 7>\n" + |
| "-- <NEW, pkg:The addon A from vendor 1, Android API 1, revision 5>\n" + |
| "-- <NEW, pkg:Carrier Custom Rom, revision 1>\n", |
| getTree(m, false /*displaySortByApi*/)); |
| |
| // We don't install the USB driver by default on Mac or Linux, only on Windows |
| m.clear(); |
| m.updateStart(); |
| m.updateSourcePackages(true /*sortByApi*/, src1, new Package[] { |
| new MockExtraPackage(src1, "google", "usb_driver", 5, 3), |
| }); |
| m.updateEnd(true /*sortByApi*/); |
| m.checkNewUpdateItems(false, true, true, SdkConstants.PLATFORM_LINUX); |
| |
| assertEquals( |
| "PkgCategoryApi <API=TOOLS, label=Tools, #items=0>\n" + |
| "PkgCategoryApi <API=EXTRAS, label=Extras, #items=1>\n" + |
| "-- <NEW, pkg:Google USB Driver, revision 5>\n", |
| getTree(m, true /*displaySortByApi*/)); |
| assertEquals( |
| "PkgCategorySource <source=repo1 (1.example.com), #items=1>\n" + |
| "-- <NEW, pkg:Google USB Driver, revision 5>\n", |
| getTree(m, false /*displaySortByApi*/)); |
| |
| m.clear(); |
| m.updateStart(); |
| m.updateSourcePackages(true /*sortByApi*/, src1, new Package[] { |
| new MockExtraPackage(src1, "google", "usb_driver", 5, 3), |
| }); |
| m.updateEnd(true /*sortByApi*/); |
| m.checkNewUpdateItems(false, true, true, SdkConstants.PLATFORM_DARWIN); |
| |
| assertEquals( |
| "PkgCategoryApi <API=TOOLS, label=Tools, #items=0>\n" + |
| "PkgCategoryApi <API=EXTRAS, label=Extras, #items=1>\n" + |
| "-- <NEW, pkg:Google USB Driver, revision 5>\n", |
| getTree(m, true /*displaySortByApi*/)); |
| assertEquals( |
| "PkgCategorySource <source=repo1 (1.example.com), #items=1>\n" + |
| "-- <NEW, pkg:Google USB Driver, revision 5>\n", |
| getTree(m, false /*displaySortByApi*/)); |
| |
| m.clear(); |
| m.updateStart(); |
| m.updateSourcePackages(true /*sortByApi*/, src1, new Package[] { |
| new MockExtraPackage(src1, "google", "usb_driver", 5, 3), |
| }); |
| m.updateEnd(true /*sortByApi*/); |
| m.checkNewUpdateItems(false, true, true, SdkConstants.PLATFORM_WINDOWS); |
| |
| assertEquals( |
| "PkgCategoryApi <API=TOOLS, label=Tools, #items=0>\n" + |
| "PkgCategoryApi <API=EXTRAS, label=Extras, #items=1>\n" + |
| "-- < * NEW, pkg:Google USB Driver, revision 5>\n", |
| getTree(m, true /*displaySortByApi*/)); |
| assertEquals( |
| "PkgCategorySource <source=repo1 (1.example.com), #items=1>\n" + |
| "-- < * NEW, pkg:Google USB Driver, revision 5>\n", |
| getTree(m, false /*displaySortByApi*/)); |
| |
| } |
| |
| public void testCheckUncheckAllItems() { |
| // Populate the list with a couple items and an update |
| SdkSource src1 = new SdkRepoSource("http://example.com/url", "repo1"); |
| m.updateStart(); |
| m.updateSourcePackages(true /*sortByApi*/, null /*locals*/, new Package[] { |
| new MockEmptyPackage(src1, "type1", 1) |
| }); |
| m.updateSourcePackages(true /*sortByApi*/, src1, new Package[] { |
| new MockEmptyPackage(src1, "type1", 2), |
| new MockEmptyPackage(src1, "type3", 3), |
| }); |
| m.updateEnd(true /*sortByApi*/); |
| // Nothing is checked at first |
| assertEquals( |
| "PkgCategoryApi <API=TOOLS, label=Tools, #items=0>\n" + |
| "PkgCategoryApi <API=EXTRAS, label=Extras, #items=2>\n" + |
| "-- <INSTALLED, pkg:MockEmptyPackage 'type1' rev=1, updated by:MockEmptyPackage 'type1' rev=2>\n" + |
| "-- <NEW, pkg:MockEmptyPackage 'type3' rev=3>\n", |
| getTree(m, true /*displaySortByApi*/)); |
| |
| // Manually check the items in the sort-by-API case, but not the source |
| for (PkgItem item : m.getAllPkgItems(true /*byApi*/, false /*bySource*/)) { |
| item.setChecked(true); |
| } |
| |
| // by-api sort should be checked but not by source |
| assertEquals( |
| "PkgCategoryApi <API=TOOLS, label=Tools, #items=0>\n" + |
| "PkgCategoryApi <API=EXTRAS, label=Extras, #items=2>\n" + |
| "-- < * INSTALLED, pkg:MockEmptyPackage 'type1' rev=1, updated by:MockEmptyPackage 'type1' rev=2>\n" + |
| "-- < * NEW, pkg:MockEmptyPackage 'type3' rev=3>\n", |
| getTree(m, true /*displaySortByApi*/)); |
| assertEquals( |
| "PkgCategorySource <source=repo1 (example.com), #items=2>\n" + |
| "-- <INSTALLED, pkg:MockEmptyPackage 'type1' rev=1, updated by:MockEmptyPackage 'type1' rev=2>\n" + |
| "-- <NEW, pkg:MockEmptyPackage 'type3' rev=3>\n", |
| getTree(m, false /*displaySortByApi*/)); |
| |
| // now uncheck them all |
| m.uncheckAllItems(); |
| |
| assertEquals( |
| "PkgCategoryApi <API=TOOLS, label=Tools, #items=0>\n" + |
| "PkgCategoryApi <API=EXTRAS, label=Extras, #items=2>\n" + |
| "-- <INSTALLED, pkg:MockEmptyPackage 'type1' rev=1, updated by:MockEmptyPackage 'type1' rev=2>\n" + |
| "-- <NEW, pkg:MockEmptyPackage 'type3' rev=3>\n", |
| getTree(m, true /*displaySortByApi*/)); |
| assertEquals( |
| "PkgCategorySource <source=repo1 (example.com), #items=2>\n" + |
| "-- <INSTALLED, pkg:MockEmptyPackage 'type1' rev=1, updated by:MockEmptyPackage 'type1' rev=2>\n" + |
| "-- <NEW, pkg:MockEmptyPackage 'type3' rev=3>\n", |
| getTree(m, false /*displaySortByApi*/)); |
| |
| // Manually check the items in both by-api and by-source |
| for (PkgItem item : m.getAllPkgItems(true /*byApi*/, true /*bySource*/)) { |
| item.setChecked(true); |
| } |
| |
| assertEquals( |
| "PkgCategoryApi <API=TOOLS, label=Tools, #items=0>\n" + |
| "PkgCategoryApi <API=EXTRAS, label=Extras, #items=2>\n" + |
| "-- < * INSTALLED, pkg:MockEmptyPackage 'type1' rev=1, updated by:MockEmptyPackage 'type1' rev=2>\n" + |
| "-- < * NEW, pkg:MockEmptyPackage 'type3' rev=3>\n", |
| getTree(m, true /*displaySortByApi*/)); |
| assertEquals( |
| "PkgCategorySource <source=repo1 (example.com), #items=2>\n" + |
| "-- < * INSTALLED, pkg:MockEmptyPackage 'type1' rev=1, updated by:MockEmptyPackage 'type1' rev=2>\n" + |
| "-- < * NEW, pkg:MockEmptyPackage 'type3' rev=3>\n", |
| getTree(m, false /*displaySortByApi*/)); |
| |
| // now uncheck them all |
| m.uncheckAllItems(); |
| |
| assertEquals( |
| "PkgCategoryApi <API=TOOLS, label=Tools, #items=0>\n" + |
| "PkgCategoryApi <API=EXTRAS, label=Extras, #items=2>\n" + |
| "-- <INSTALLED, pkg:MockEmptyPackage 'type1' rev=1, updated by:MockEmptyPackage 'type1' rev=2>\n" + |
| "-- <NEW, pkg:MockEmptyPackage 'type3' rev=3>\n", |
| getTree(m, true /*displaySortByApi*/)); |
| assertEquals( |
| "PkgCategorySource <source=repo1 (example.com), #items=2>\n" + |
| "-- <INSTALLED, pkg:MockEmptyPackage 'type1' rev=1, updated by:MockEmptyPackage 'type1' rev=2>\n" + |
| "-- <NEW, pkg:MockEmptyPackage 'type3' rev=3>\n", |
| getTree(m, false /*displaySortByApi*/)); |
| } |
| |
| // ---- |
| |
| public void testLocalIsNewer() { |
| // This tests an edge case that typically happens only during development where |
| // one would have a local package which revision number is larger than what the |
| // remove repositories can offer. In this case we don't want to offer the remote |
| // package as an "upgrade" nor as a downgrade. |
| |
| // Populate the list with local revisions 5 and lower remote revisions 3 |
| SdkSource src1 = new SdkRepoSource("http://example.com/url", "repo1"); |
| m.updateStart(); |
| m.updateSourcePackages(true /*sortByApi*/, null /*locals*/, new Package[] { |
| new MockToolPackage( src1, 5, 5), |
| new MockPlatformToolPackage(src1, 5), |
| }); |
| m.updateSourcePackages(true /*sortByApi*/, src1, new Package[] { |
| new MockToolPackage( src1, 3, 3), |
| new MockPlatformToolPackage(src1, 3), |
| }); |
| m.updateEnd(true /*sortByApi*/); |
| |
| // The remote packages in rev 3 are hidden by the local packages in rev 5 |
| assertEquals( |
| "PkgCategoryApi <API=TOOLS, label=Tools, #items=2>\n" + |
| "-- <INSTALLED, pkg:Android SDK Tools, revision 5>\n" + |
| "-- <INSTALLED, pkg:Android SDK Platform-tools, revision 5>\n" + |
| "PkgCategoryApi <API=EXTRAS, label=Extras, #items=0>\n", |
| getTree(m, true /*displaySortByApi*/)); |
| assertEquals( |
| "PkgCategorySource <source=repo1 (example.com), #items=2>\n" + |
| "-- <INSTALLED, pkg:Android SDK Tools, revision 5>\n" + |
| "-- <INSTALLED, pkg:Android SDK Platform-tools, revision 5>\n", |
| getTree(m, false /*displaySortByApi*/)); |
| } |
| |
| public void testSourceDups() { |
| // This tests an edge case were 2 remote repositories are giving the |
| // same kind of packages. In rev 14, we didn't want to merge them together |
| // unless they had the same hostname. In rev 15, we now treat them the same. |
| |
| // repo1, 2 and 3 have the same hostname so redundancy is ok |
| SdkSource src1 = new SdkRepoSource("http://example.com/url1", "repo1"); |
| SdkSource src2 = new SdkRepoSource("http://example.com/url2", "repo2"); |
| SdkSource src3 = new SdkRepoSource("http://example.com/url3", "repo3"); |
| // repo4 has a different hostname but as of rev 15, the packages will be merged together. |
| SdkSource src4 = new SdkRepoSource("http://4.example.com/url4", "repo4"); |
| MockPlatformPackage p1 = null; |
| |
| m.updateStart(); |
| m.updateSourcePackages(true /*sortByApi*/, null /*locals*/, new Package[] { |
| new MockToolPackage( src1, 3, 3), |
| new MockPlatformToolPackage(src1, 3), |
| p1 = new MockPlatformPackage(src1, 1, 2, 3), // API 1 |
| }); |
| m.updateSourcePackages(true /*sortByApi*/, src2, new Package[] { |
| new MockAddonPackage(src2, "addon A", p1, 5), |
| new MockAddonPackage(src2, "addon B", p1, 6), |
| }); |
| m.updateSourcePackages(true /*sortByApi*/, src3, new Package[] { |
| new MockAddonPackage(src3, "addon A", p1, 5), // same as addon A rev 5 from src2 |
| new MockAddonPackage(src3, "addon B", p1, 7), // upgrades addon B rev 6 from src2 |
| }); |
| m.updateSourcePackages(true /*sortByApi*/, src4, new Package[] { |
| new MockAddonPackage(src4, "addon A", p1, 5), // same as addon A rev 5 from src2 |
| new MockAddonPackage(src4, "addon B", p1, 7), // upgrades addon B rev 6 from src2 |
| }); |
| m.updateEnd(true /*sortByApi*/); |
| |
| // The remote packages in rev 3 are hidden by the local packages in rev 5. |
| // When sorting by API, the user can tell where the packages come from by looking |
| // at the UI tooltip on the packages. |
| assertEquals( |
| "PkgCategoryApi <API=TOOLS, label=Tools, #items=2>\n" + |
| "-- <INSTALLED, pkg:Android SDK Tools, revision 3>\n" + |
| "-- <INSTALLED, pkg:Android SDK Platform-tools, revision 3>\n" + |
| "PkgCategoryApi <API=API 1, label=Android android-1 (API 1), #items=3>\n" + |
| "-- <INSTALLED, pkg:SDK Platform Android android-1, API 1, revision 2>\n" + |
| "-- <NEW, pkg:The addon A from vendor 1, Android API 1, revision 5>\n" + // from src2+3+4 |
| "-- <NEW, pkg:The addon B from vendor 1, Android API 1, revision 7>\n" + // from src3+4 |
| "PkgCategoryApi <API=EXTRAS, label=Extras, #items=0>\n", |
| getTree(m, true /*displaySortByApi*/)); |
| // When sorting by source, the src4 source is listed, however since its |
| // packages are the same as the ones from src2 or src3 the packages themselves |
| // are not shown. |
| assertEquals( |
| "PkgCategorySource <source=repo1 (example.com), #items=3>\n" + |
| "-- <INSTALLED, pkg:Android SDK Tools, revision 3>\n" + |
| "-- <INSTALLED, pkg:Android SDK Platform-tools, revision 3>\n" + |
| "-- <INSTALLED, pkg:SDK Platform Android android-1, API 1, revision 2>\n" + |
| "PkgCategorySource <source=repo2 (example.com), #items=1>\n" + |
| "-- <NEW, pkg:The addon A from vendor 1, Android API 1, revision 5>\n" + // from src2+3+4 |
| "PkgCategorySource <source=repo3 (example.com), #items=1>\n" + |
| "-- <NEW, pkg:The addon B from vendor 1, Android API 1, revision 7>\n" + // from src3+4 |
| "PkgCategorySource <source=repo4 (4.example.com), #items=0>\n", |
| getTree(m, false /*displaySortByApi*/)); |
| } |
| |
| public void testRenamedExtraPackage() { |
| // Starting with schemas repo v5 and addon v3, an extra package can be renamed |
| // using the "old-paths" attribute. This test checks that the diff logic will |
| // match an old extra and its new name together. |
| |
| // First scenario: local pkg "old_path1" and remote pkg "new_path2". |
| // Since the new package does not provide an old_paths attribute, the |
| // new package is not treated as an update. |
| |
| SdkSource src1 = new SdkRepoSource("http://example.com/url1", "repo1"); |
| m.updateStart(); |
| m.updateSourcePackages(true /*sortByApi*/, null /*locals*/, new Package[] { |
| new MockExtraPackage(src1, "vendor1", "old_path1", 1, 1), |
| }); |
| m.updateSourcePackages(true /*sortByApi*/, src1, new Package[] { |
| new MockExtraPackage(src1, "vendor1", "new_path2", 2, 1), |
| }); |
| m.updateEnd(true /*sortByApi*/); |
| |
| assertEquals( |
| "PkgCategoryApi <API=TOOLS, label=Tools, #items=0>\n" + |
| "PkgCategoryApi <API=EXTRAS, label=Extras, #items=2>\n" + |
| "-- <NEW, pkg:Vendor1 New Path2, revision 2>\n" + |
| "-- <INSTALLED, pkg:Vendor1 Old Path1, revision 1>\n", |
| getTree(m, true /*displaySortByApi*/)); |
| assertEquals( |
| "PkgCategorySource <source=repo1 (example.com), #items=2>\n" + |
| "-- <NEW, pkg:Vendor1 New Path2, revision 2>\n" + |
| "-- <INSTALLED, pkg:Vendor1 Old Path1, revision 1>\n", |
| getTree(m, false /*displaySortByApi*/)); |
| |
| // Now, start again, but this time the new package uses the old-path attribute |
| Properties props = new Properties(); |
| props.setProperty(PkgProps.EXTRA_OLD_PATHS, "old_path1;oldpath2"); |
| m.clear(); |
| |
| m.updateStart(); |
| m.updateSourcePackages(true /*sortByApi*/, null /*locals*/, new Package[] { |
| new MockExtraPackage(src1, "vendor1", "old_path1", 1, 1), |
| }); |
| m.updateSourcePackages(true /*sortByApi*/, src1, new Package[] { |
| new MockExtraPackage(src1, props, "vendor1", "new_path2", 2), |
| }); |
| m.updateEnd(true /*sortByApi*/); |
| |
| assertEquals( |
| "PkgCategoryApi <API=TOOLS, label=Tools, #items=0>\n" + |
| "PkgCategoryApi <API=EXTRAS, label=Extras, #items=1>\n" + |
| "-- <INSTALLED, pkg:Vendor1 Old Path1, revision 1, updated by:Vendor1 New Path2, revision 2>\n", |
| getTree(m, true /*displaySortByApi*/)); |
| assertEquals( |
| "PkgCategorySource <source=repo1 (example.com), #items=1>\n" + |
| "-- <INSTALLED, pkg:Vendor1 Old Path1, revision 1, updated by:Vendor1 New Path2, revision 2>\n", |
| getTree(m, false /*displaySortByApi*/)); |
| } |
| |
| public void testBrokenAddon() { |
| SdkSource src1 = new SdkRepoSource("http://1.example.com/url1", "repo1"); |
| SdkSource src2 = new SdkRepoSource("http://2.example.com/url2", "repo2"); |
| |
| MockPlatformPackage p1 = null; |
| MockAddonPackage a1 = null; |
| |
| // User has a platform + addon locally installed |
| m.updateStart(); |
| m.updateSourcePackages(true /*sortByApi*/, null /*locals*/, new Package[] { |
| p1 = new MockPlatformPackage(src1, 1, 2, 3), // API 1 |
| a1 = new MockAddonPackage(src2, "addon A", p1, 4), |
| }); |
| m.updateSourcePackages(true /*sortByApi*/, src1 /*locals*/, new Package[] { |
| p1 |
| }); |
| m.updateSourcePackages(true /*sortByApi*/, src2 /*locals*/, new Package[] { |
| a1 |
| }); |
| m.updateEnd(true /*sortByApi*/); |
| assertEquals( |
| "PkgCategoryApi <API=TOOLS, label=Tools, #items=0>\n" + |
| "PkgCategoryApi <API=API 1, label=Android android-1 (API 1), #items=2>\n" + |
| "-- <INSTALLED, pkg:SDK Platform Android android-1, API 1, revision 2>\n" + |
| "-- <INSTALLED, pkg:The addon A from vendor 1, Android API 1, revision 4>\n" + |
| "PkgCategoryApi <API=EXTRAS, label=Extras, #items=0>\n", |
| getTree(m, true /*displaySortByApi*/)); |
| assertEquals( |
| "PkgCategorySource <source=repo1 (1.example.com), #items=1>\n" + |
| "-- <INSTALLED, pkg:SDK Platform Android android-1, API 1, revision 2>\n" + |
| "PkgCategorySource <source=repo2 (2.example.com), #items=1>\n" + |
| "-- <INSTALLED, pkg:The addon A from vendor 1, Android API 1, revision 4>\n", |
| getTree(m, false /*displaySortByApi*/)); |
| |
| // Now user deletes the platform on disk and reload. |
| // The local package parser will only find a broken addon. |
| m.updateStart(); |
| m.updateSourcePackages(true /*sortByApi*/, null /*locals*/, new Package[] { |
| new MockBrokenPackage(BrokenPackage.MIN_API_LEVEL_NOT_SPECIFIED, 1), |
| }); |
| m.updateSourcePackages(true /*sortByApi*/, src1 /*locals*/, new Package[] { |
| new MockPlatformPackage(src1, 1, 2, 3) |
| }); |
| m.updateSourcePackages(true /*sortByApi*/, src2 /*locals*/, new Package[] { |
| new MockAddonPackage(src2, "addon A", p1, 4) |
| }); |
| m.updateEnd(true /*sortByApi*/); |
| assertEquals( |
| "PkgCategoryApi <API=TOOLS, label=Tools, #items=0>\n" + |
| "PkgCategoryApi <API=API 1, label=Android android-1 (API 1), #items=2>\n" + |
| "-- <NEW, pkg:SDK Platform Android android-1, API 1, revision 2>\n" + |
| "-- <NEW, pkg:The addon A from vendor 1, Android API 1, revision 4>\n" + |
| "PkgCategoryApi <API=EXTRAS, label=Extras, #items=1>\n" + |
| "-- <INSTALLED, pkg:Broken package for API 1>\n", |
| getTree(m, true /*displaySortByApi*/)); |
| assertEquals( |
| "PkgCategorySource <source=repo1 (1.example.com), #items=1>\n" + |
| "-- <NEW, pkg:SDK Platform Android android-1, API 1, revision 2>\n" + |
| "PkgCategorySource <source=repo2 (2.example.com), #items=1>\n" + |
| "-- <NEW, pkg:The addon A from vendor 1, Android API 1, revision 4>\n" + |
| "PkgCategorySource <source=Local Packages (no.source), #items=1>\n" + |
| "-- <INSTALLED, pkg:Broken package for API 1>\n", |
| getTree(m, false /*displaySortByApi*/)); |
| |
| // Now user restores the missing platform on disk. |
| m.updateStart(); |
| m.updateSourcePackages(true /*sortByApi*/, null /*locals*/, new Package[] { |
| p1 = new MockPlatformPackage(src1, 1, 2, 3), // API 1 |
| a1 = new MockAddonPackage(src2, "addon A", p1, 4), |
| }); |
| m.updateSourcePackages(true /*sortByApi*/, src1 /*locals*/, new Package[] { |
| p1 |
| }); |
| m.updateSourcePackages(true /*sortByApi*/, src2 /*locals*/, new Package[] { |
| a1 |
| }); |
| m.updateEnd(true /*sortByApi*/); |
| assertEquals( |
| "PkgCategoryApi <API=TOOLS, label=Tools, #items=0>\n" + |
| "PkgCategoryApi <API=API 1, label=Android android-1 (API 1), #items=2>\n" + |
| "-- <INSTALLED, pkg:SDK Platform Android android-1, API 1, revision 2>\n" + |
| "-- <INSTALLED, pkg:The addon A from vendor 1, Android API 1, revision 4>\n" + |
| "PkgCategoryApi <API=EXTRAS, label=Extras, #items=0>\n", |
| getTree(m, true /*displaySortByApi*/)); |
| assertEquals( |
| "PkgCategorySource <source=repo1 (1.example.com), #items=1>\n" + |
| "-- <INSTALLED, pkg:SDK Platform Android android-1, API 1, revision 2>\n" + |
| "PkgCategorySource <source=repo2 (2.example.com), #items=1>\n" + |
| "-- <INSTALLED, pkg:The addon A from vendor 1, Android API 1, revision 4>\n", |
| getTree(m, false /*displaySortByApi*/)); |
| } |
| |
| public void testToolsUpdate() { |
| SdkSource src1 = new SdkRepoSource("http://1.example.com/url1", "repo1"); |
| SdkSource src2 = new SdkRepoSource("http://2.example.com/url2", "repo2"); |
| MockPlatformPackage p1; |
| |
| m.updateStart(); |
| m.updateSourcePackages(true /*sortByApi*/, null /*locals*/, new Package[] { |
| new MockToolPackage(3, 3), // tool package has no source defined |
| new MockPlatformToolPackage(src1, 3), |
| p1 = new MockPlatformPackage(src1, 1, 2, 3), // API 1 |
| }); |
| m.updateSourcePackages(true /*sortByApi*/, src1, new Package[] { |
| new MockToolPackage(src1, 4, 4), |
| new MockPlatformToolPackage(src1, 4), |
| }); |
| m.updateSourcePackages(true /*sortByApi*/, src2, new Package[] { |
| new MockAddonPackage(src2, "addon A", p1, 5), |
| new MockAddonPackage(src2, "addon B", p1, 6), |
| }); |
| m.updateEnd(true /*sortByApi*/); |
| |
| // The remote packages in rev 3 are hidden by the local packages in rev 5 |
| assertEquals( |
| "PkgCategoryApi <API=TOOLS, label=Tools, #items=2>\n" + |
| "-- <INSTALLED, pkg:Android SDK Tools, revision 3, updated by:Android SDK Tools, revision 4>\n" + |
| "-- <INSTALLED, pkg:Android SDK Platform-tools, revision 3, updated by:Android SDK Platform-tools, revision 4>\n" + |
| "PkgCategoryApi <API=API 1, label=Android android-1 (API 1), #items=3>\n" + |
| "-- <INSTALLED, pkg:SDK Platform Android android-1, API 1, revision 2>\n" + |
| "-- <NEW, pkg:The addon A from vendor 1, Android API 1, revision 5>\n" + |
| "-- <NEW, pkg:The addon B from vendor 1, Android API 1, revision 6>\n" + |
| "PkgCategoryApi <API=EXTRAS, label=Extras, #items=0>\n", |
| getTree(m, true /*displaySortByApi*/)); |
| assertEquals( |
| "PkgCategorySource <source=Local Packages (no.source), #items=1>\n" + |
| "-- <INSTALLED, pkg:Android SDK Tools, revision 3, updated by:Android SDK Tools, revision 4>\n" + |
| "PkgCategorySource <source=repo1 (1.example.com), #items=2>\n" + |
| "-- <INSTALLED, pkg:Android SDK Platform-tools, revision 3, updated by:Android SDK Platform-tools, revision 4>\n" + |
| "-- <INSTALLED, pkg:SDK Platform Android android-1, API 1, revision 2>\n" + |
| "PkgCategorySource <source=repo2 (2.example.com), #items=2>\n" + |
| "-- <NEW, pkg:The addon A from vendor 1, Android API 1, revision 5>\n" + |
| "-- <NEW, pkg:The addon B from vendor 1, Android API 1, revision 6>\n", |
| getTree(m, false /*displaySortByApi*/)); |
| } |
| |
| public void testToolsMinorUpdate() { |
| // Test: Check a minor revision updates an installed major revision. |
| |
| SdkSource src1 = new SdkRepoSource("http://1.example.com/url1", "repo1"); |
| |
| m.updateStart(); |
| m.updateSourcePackages(true /*sortByApi*/, null /*locals*/, new Package[] { |
| new MockToolPackage(3, 3), // Tools 3.0.0 |
| new MockPlatformToolPackage(src1, 3), |
| }); |
| m.updateSourcePackages(true /*sortByApi*/, src1, new Package[] { |
| new MockToolPackage(src1, new FullRevision(3, 0, 1), 3), // Tools 3.0.1 |
| }); |
| m.updateEnd(true /*sortByApi*/); |
| |
| assertEquals( |
| "PkgCategoryApi <API=TOOLS, label=Tools, #items=2>\n" + |
| "-- <INSTALLED, pkg:Android SDK Tools, revision 3, updated by:Android SDK Tools, revision 3.0.1>\n" + |
| "-- <INSTALLED, pkg:Android SDK Platform-tools, revision 3>\n" + |
| "PkgCategoryApi <API=EXTRAS, label=Extras, #items=0>\n", |
| getTree(m, true /*displaySortByApi*/)); |
| assertEquals( |
| "PkgCategorySource <source=Local Packages (no.source), #items=1>\n" + |
| "-- <INSTALLED, pkg:Android SDK Tools, revision 3, updated by:Android SDK Tools, revision 3.0.1>\n" + |
| "PkgCategorySource <source=repo1 (1.example.com), #items=1>\n" + |
| "-- <INSTALLED, pkg:Android SDK Platform-tools, revision 3>\n", |
| getTree(m, false /*displaySortByApi*/)); |
| } |
| |
| public void testToolsPreviewsDisabled() { |
| // Test: No local tools installed. The remote server has both tools and platforms |
| // in release and RC versions. However the settings "enable previews" is disabled |
| // (which is the default) so the previews are not actually loaded from the server. |
| |
| SdkSource src1 = new SdkRepoSource("http://1.example.com/url1", "repo1"); |
| |
| m.updateStart(); |
| m.updateSourcePackages(true /*sortByApi*/, src1, new Package[] { |
| new MockToolPackage(src1, new FullRevision(2, 0, 0), 3), // Tools 2 |
| new MockToolPackage(src1, new FullRevision(4, 0, 0, 1), 3), // Tools 4 rc1 |
| new MockPlatformToolPackage(src1, new FullRevision(3, 0, 0)), // Plat-T 3 |
| new MockPlatformToolPackage(src1, new FullRevision(5, 0, 0, 1)), // Plat-T 5 rc1 |
| }); |
| m.updateEnd(true /*sortByApi*/); |
| |
| assertEquals( |
| "PkgCategoryApi <API=TOOLS, label=Tools, #items=2>\n" + |
| "-- <NEW, pkg:Android SDK Tools, revision 2>\n" + |
| "-- <NEW, pkg:Android SDK Platform-tools, revision 3>\n" + |
| "PkgCategoryApi <API=EXTRAS, label=Extras, #items=0>\n", |
| getTree(m, true /*displaySortByApi*/)); |
| assertEquals( |
| "PkgCategorySource <source=repo1 (1.example.com), #items=2>\n" + |
| "-- <NEW, pkg:Android SDK Tools, revision 2>\n" + |
| "-- <NEW, pkg:Android SDK Platform-tools, revision 3>\n", |
| getTree(m, false /*displaySortByApi*/)); |
| } |
| |
| public void testToolsPreviews() { |
| // Test: No local tools installed. The remote server has both tools and platforms |
| // in release and RC versions. |
| |
| // Enable previews in the settings |
| u.overrideSetting(ISettingsPage.KEY_ENABLE_PREVIEWS, true); |
| |
| SdkSource src1 = new SdkRepoSource("http://1.example.com/url1", "repo1"); |
| |
| m.updateStart(); |
| m.updateSourcePackages(true /*sortByApi*/, src1, new Package[] { |
| new MockToolPackage(src1, new FullRevision(2, 0, 0), 3), // Tools 2 |
| new MockToolPackage(src1, new FullRevision(4, 0, 0, 1), 3), // Tools 4 rc1 |
| new MockPlatformToolPackage(src1, new FullRevision(3, 0, 0)), // Plat-T 3 |
| new MockPlatformToolPackage(src1, new FullRevision(5, 0, 0, 1)), // Plat-T 5 rc1 |
| }); |
| m.updateEnd(true /*sortByApi*/); |
| |
| assertEquals( |
| "PkgCategoryApi <API=TOOLS, label=Tools, #items=2>\n" + |
| "-- <NEW, pkg:Android SDK Tools, revision 2>\n" + |
| "-- <NEW, pkg:Android SDK Platform-tools, revision 3>\n" + |
| "PkgCategoryApi <API=TOOLS-PREVIEW, label=Tools (Preview Channel), #items=2>\n" + |
| "-- <NEW, pkg:Android SDK Tools, revision 4 rc1>\n" + |
| "-- <NEW, pkg:Android SDK Platform-tools, revision 5 rc1>\n" + |
| "PkgCategoryApi <API=EXTRAS, label=Extras, #items=0>\n", |
| getTree(m, true /*displaySortByApi*/)); |
| assertEquals( |
| "PkgCategorySource <source=repo1 (1.example.com), #items=4>\n" + |
| "-- <NEW, pkg:Android SDK Tools, revision 2>\n" + |
| "-- <NEW, pkg:Android SDK Tools, revision 4 rc1>\n" + |
| "-- <NEW, pkg:Android SDK Platform-tools, revision 3>\n" + |
| "-- <NEW, pkg:Android SDK Platform-tools, revision 5 rc1>\n", |
| getTree(m, false /*displaySortByApi*/)); |
| } |
| |
| public void testPreviewUpdateInstalledRelease() { |
| // Test: Local release Tools 3.0.0 installed, server has both a release 3.0.1 available |
| // and a Tools Preview 4.0.0 rc1 available. |
| // => v3 is updated by 3.0.1 |
| // => v4.0.0rc1 does not update 3.0.0, instead it's a separate download. |
| |
| // Enable previews in the settings |
| u.overrideSetting(ISettingsPage.KEY_ENABLE_PREVIEWS, true); |
| |
| SdkSource src1 = new SdkRepoSource("http://1.example.com/url1", "repo1"); |
| |
| m.updateStart(); |
| m.updateSourcePackages(true /*sortByApi*/, null /*locals*/, new Package[] { |
| new MockToolPackage(3, 3), // tool package has no source defined |
| new MockPlatformToolPackage(src1, 3), |
| new MockPlatformPackage(src1, 1, 2, 3), // API 1 |
| }); |
| m.updateSourcePackages(true /*sortByApi*/, src1, new Package[] { |
| new MockToolPackage(src1, 3, 3), // Tools 3 |
| new MockToolPackage(src1, new FullRevision(3, 0, 1), 3), // Tools 3.0.1 |
| new MockToolPackage(src1, new FullRevision(4, 0, 0, 1), 3), // Tools 4 rc1 |
| new MockPlatformToolPackage(src1, new FullRevision(3, 0, 1)), // PT 3.0.1 |
| new MockPlatformToolPackage(src1, new FullRevision(4, 0, 0, 1)), // PT 4 rc1 |
| }); |
| m.updateEnd(true /*sortByApi*/); |
| |
| assertEquals( |
| "PkgCategoryApi <API=TOOLS, label=Tools, #items=2>\n" + |
| "-- <INSTALLED, pkg:Android SDK Tools, revision 3, updated by:Android SDK Tools, revision 3.0.1>\n" + |
| "-- <INSTALLED, pkg:Android SDK Platform-tools, revision 3, updated by:Android SDK Platform-tools, revision 3.0.1>\n" + |
| "PkgCategoryApi <API=TOOLS-PREVIEW, label=Tools (Preview Channel), #items=2>\n" + |
| "-- <NEW, pkg:Android SDK Tools, revision 4 rc1>\n" + |
| "-- <NEW, pkg:Android SDK Platform-tools, revision 4 rc1>\n" + |
| "PkgCategoryApi <API=API 1, label=Android android-1 (API 1), #items=1>\n" + |
| "-- <INSTALLED, pkg:SDK Platform Android android-1, API 1, revision 2>\n" + |
| "PkgCategoryApi <API=EXTRAS, label=Extras, #items=0>\n", |
| getTree(m, true /*displaySortByApi*/)); |
| assertEquals( |
| "PkgCategorySource <source=Local Packages (no.source), #items=1>\n" + |
| "-- <INSTALLED, pkg:Android SDK Tools, revision 3, updated by:Android SDK Tools, revision 3.0.1>\n" + |
| "PkgCategorySource <source=repo1 (1.example.com), #items=4>\n" + |
| "-- <NEW, pkg:Android SDK Tools, revision 4 rc1>\n" + |
| "-- <INSTALLED, pkg:Android SDK Platform-tools, revision 3, updated by:Android SDK Platform-tools, revision 3.0.1>\n" + |
| "-- <NEW, pkg:Android SDK Platform-tools, revision 4 rc1>\n" + |
| "-- <INSTALLED, pkg:SDK Platform Android android-1, API 1, revision 2>\n", |
| getTree(m, false /*displaySortByApi*/)); |
| |
| // Now request to check new items and updates: |
| // Tools 4 rc1 is greater than the installed Tools 3, but it's a preview so we will NOT |
| // auto-select it by default even though we requested to select "NEW" packages. We |
| // want the user to manually opt-in into the rc/preview package. |
| // However Tools 3 has a 3.0.1 update that we'll auto-select. |
| m.checkNewUpdateItems(true, true, false, SdkConstants.PLATFORM_LINUX); |
| |
| assertEquals( |
| "PkgCategoryApi <API=TOOLS, label=Tools, #items=2>\n" + |
| "-- < * INSTALLED, pkg:Android SDK Tools, revision 3, updated by:Android SDK Tools, revision 3.0.1>\n" + |
| "-- < * INSTALLED, pkg:Android SDK Platform-tools, revision 3, updated by:Android SDK Platform-tools, revision 3.0.1>\n" + |
| "PkgCategoryApi <API=TOOLS-PREVIEW, label=Tools (Preview Channel), #items=2>\n" + |
| "-- <NEW, pkg:Android SDK Tools, revision 4 rc1>\n" + |
| "-- <NEW, pkg:Android SDK Platform-tools, revision 4 rc1>\n" + |
| "PkgCategoryApi <API=API 1, label=Android android-1 (API 1), #items=1>\n" + |
| "-- <INSTALLED, pkg:SDK Platform Android android-1, API 1, revision 2>\n" + |
| "PkgCategoryApi <API=EXTRAS, label=Extras, #items=0>\n", |
| getTree(m, true /*displaySortByApi*/)); |
| assertEquals( |
| "PkgCategorySource <source=Local Packages (no.source), #items=1>\n" + |
| "-- < * INSTALLED, pkg:Android SDK Tools, revision 3, updated by:Android SDK Tools, revision 3.0.1>\n" + |
| "PkgCategorySource <source=repo1 (1.example.com), #items=4>\n" + |
| "-- <NEW, pkg:Android SDK Tools, revision 4 rc1>\n" + |
| "-- < * INSTALLED, pkg:Android SDK Platform-tools, revision 3, updated by:Android SDK Platform-tools, revision 3.0.1>\n" + |
| "-- <NEW, pkg:Android SDK Platform-tools, revision 4 rc1>\n" + |
| "-- <INSTALLED, pkg:SDK Platform Android android-1, API 1, revision 2>\n", |
| getTree(m, false /*displaySortByApi*/)); |
| |
| } |
| |
| public void testPreviewUpdateInstalledPreview() { |
| // Test: Local preview Tools 3.0.1rc1 installed, server has both a release 3.0.0 available |
| // and a Tools Preview 3.0.1 rc2 available. |
| // => Installed 3.0.1rc1 can be updated by 3.0.1rc2 |
| // => There's a separate "new" download for 3.0.0, not installed and NOT updating 3.0.1rc1. |
| |
| // Enable previews in the settings |
| u.overrideSetting(ISettingsPage.KEY_ENABLE_PREVIEWS, true); |
| |
| SdkSource src1 = new SdkRepoSource("http://1.example.com/url1", "repo1"); |
| |
| m.updateStart(); |
| m.updateSourcePackages(true /*sortByApi*/, null /*locals*/, new Package[] { |
| new MockToolPackage(src1, new FullRevision(3, 0, 1, 1), 4), // T 3.0.1rc1 |
| new MockPlatformToolPackage(src1, new FullRevision(4, 0, 1, 1)), // PT 4.0.1rc1 |
| new MockPlatformPackage(src1, 1, 2, 3), // API 1 |
| }); |
| m.updateSourcePackages(true /*sortByApi*/, src1, new Package[] { |
| new MockToolPackage(src1, new FullRevision(3, 0, 0), 4), // T 3.0.0 |
| new MockToolPackage(src1, new FullRevision(3, 0, 1, 2), 4), // T 3.0.1rc2 |
| new MockPlatformToolPackage(src1, new FullRevision(4, 0, 0)), // PT 4.0.0 |
| new MockPlatformToolPackage(src1, new FullRevision(4, 0, 1, 2)), // PT 4.0.1 rc2 |
| }); |
| m.updateEnd(true /*sortByApi*/); |
| |
| assertEquals( |
| "PkgCategoryApi <API=TOOLS, label=Tools, #items=2>\n" + |
| "-- <NEW, pkg:Android SDK Tools, revision 3>\n" + |
| "-- <NEW, pkg:Android SDK Platform-tools, revision 4>\n" + |
| "PkgCategoryApi <API=TOOLS-PREVIEW, label=Tools (Preview Channel), #items=2>\n" + |
| "-- <INSTALLED, pkg:Android SDK Tools, revision 3.0.1 rc1, updated by:Android SDK Tools, revision 3.0.1 rc2>\n" + |
| "-- <INSTALLED, pkg:Android SDK Platform-tools, revision 4.0.1 rc1, updated by:Android SDK Platform-tools, revision 4.0.1 rc2>\n" + |
| "PkgCategoryApi <API=API 1, label=Android android-1 (API 1), #items=1>\n" + |
| "-- <INSTALLED, pkg:SDK Platform Android android-1, API 1, revision 2>\n" + |
| "PkgCategoryApi <API=EXTRAS, label=Extras, #items=0>\n", |
| getTree(m, true /*displaySortByApi*/)); |
| assertEquals( |
| "PkgCategorySource <source=repo1 (1.example.com), #items=5>\n" + |
| "-- <NEW, pkg:Android SDK Tools, revision 3>\n" + |
| "-- <INSTALLED, pkg:Android SDK Tools, revision 3.0.1 rc1, updated by:Android SDK Tools, revision 3.0.1 rc2>\n" + |
| "-- <NEW, pkg:Android SDK Platform-tools, revision 4>\n" + |
| "-- <INSTALLED, pkg:Android SDK Platform-tools, revision 4.0.1 rc1, updated by:Android SDK Platform-tools, revision 4.0.1 rc2>\n" + |
| "-- <INSTALLED, pkg:SDK Platform Android android-1, API 1, revision 2>\n", |
| getTree(m, false /*displaySortByApi*/)); |
| |
| // Auto select new and update items. In this case: |
| // - the previews have updates available. |
| // - we're not selecting the non-installed "3.0" version that is older than the |
| // currently installed "3.0.1rc1" version since that would be a downgrade. |
| m.checkNewUpdateItems(true, true, false, SdkConstants.PLATFORM_LINUX); |
| |
| assertEquals( |
| "PkgCategoryApi <API=TOOLS, label=Tools, #items=2>\n" + |
| "-- <NEW, pkg:Android SDK Tools, revision 3>\n" + |
| "-- <NEW, pkg:Android SDK Platform-tools, revision 4>\n" + |
| "PkgCategoryApi <API=TOOLS-PREVIEW, label=Tools (Preview Channel), #items=2>\n" + |
| "-- < * INSTALLED, pkg:Android SDK Tools, revision 3.0.1 rc1, updated by:Android SDK Tools, revision 3.0.1 rc2>\n" + |
| "-- < * INSTALLED, pkg:Android SDK Platform-tools, revision 4.0.1 rc1, updated by:Android SDK Platform-tools, revision 4.0.1 rc2>\n" + |
| "PkgCategoryApi <API=API 1, label=Android android-1 (API 1), #items=1>\n" + |
| "-- <INSTALLED, pkg:SDK Platform Android android-1, API 1, revision 2>\n" + |
| "PkgCategoryApi <API=EXTRAS, label=Extras, #items=0>\n", |
| getTree(m, true /*displaySortByApi*/)); |
| assertEquals( |
| "PkgCategorySource <source=repo1 (1.example.com), #items=5>\n" + |
| "-- <NEW, pkg:Android SDK Tools, revision 3>\n" + |
| "-- < * INSTALLED, pkg:Android SDK Tools, revision 3.0.1 rc1, updated by:Android SDK Tools, revision 3.0.1 rc2>\n" + |
| "-- <NEW, pkg:Android SDK Platform-tools, revision 4>\n" + |
| "-- < * INSTALLED, pkg:Android SDK Platform-tools, revision 4.0.1 rc1, updated by:Android SDK Platform-tools, revision 4.0.1 rc2>\n" + |
| "-- <INSTALLED, pkg:SDK Platform Android android-1, API 1, revision 2>\n", |
| getTree(m, false /*displaySortByApi*/)); |
| |
| // ----- |
| |
| // Now simulate that the server has a final package (3.0.1) to replace the |
| // installed 3.0.1rc1 package. It's not installed yet, just available. |
| // - A new 3.0.1 will be available. |
| // - The server no longer lists the RC since there's a final package, yet it is |
| // still locally installed. |
| // - The 3.0.1 rc1 is not listed as having an update, since we treat the previews |
| // separately. TODO: consider having the 3.0.1 show up as both a new item /and/ |
| // as an update to the 3.0.1rc1. That may have some other side effects. |
| |
| m.uncheckAllItems(); |
| m.updateStart(); |
| m.updateSourcePackages(true /*sortByApi*/, null /*locals*/, new Package[] { |
| new MockToolPackage(src1, new FullRevision(3, 0, 1, 1), 4), // T 3.0.1rc1 |
| new MockPlatformToolPackage(src1, new FullRevision(4, 0, 1, 1)), // PT 4.0.1rc1 |
| new MockPlatformPackage(src1, 1, 2, 3), // API 1 |
| }); |
| m.updateSourcePackages(true /*sortByApi*/, src1, new Package[] { |
| new MockToolPackage(src1, new FullRevision(3, 0, 1), 4), // T 3.0.1 |
| new MockPlatformToolPackage(src1, new FullRevision(4, 0, 1)), // PT 4.0.1 |
| }); |
| m.updateEnd(true /*sortByApi*/); |
| |
| assertEquals( |
| "PkgCategoryApi <API=TOOLS, label=Tools, #items=2>\n" + |
| "-- <NEW, pkg:Android SDK Tools, revision 3.0.1>\n" + |
| "-- <NEW, pkg:Android SDK Platform-tools, revision 4.0.1>\n" + |
| "PkgCategoryApi <API=TOOLS-PREVIEW, label=Tools (Preview Channel), #items=2>\n" + |
| "-- <INSTALLED, pkg:Android SDK Tools, revision 3.0.1 rc1>\n" + |
| "-- <INSTALLED, pkg:Android SDK Platform-tools, revision 4.0.1 rc1>\n" + |
| "PkgCategoryApi <API=API 1, label=Android android-1 (API 1), #items=1>\n" + |
| "-- <INSTALLED, pkg:SDK Platform Android android-1, API 1, revision 2>\n" + |
| "PkgCategoryApi <API=EXTRAS, label=Extras, #items=0>\n", |
| getTree(m, true /*displaySortByApi*/)); |
| assertEquals( |
| "PkgCategorySource <source=repo1 (1.example.com), #items=5>\n" + |
| "-- <NEW, pkg:Android SDK Tools, revision 3.0.1>\n" + |
| "-- <INSTALLED, pkg:Android SDK Tools, revision 3.0.1 rc1>\n" + |
| "-- <NEW, pkg:Android SDK Platform-tools, revision 4.0.1>\n" + |
| "-- <INSTALLED, pkg:Android SDK Platform-tools, revision 4.0.1 rc1>\n" + |
| "-- <INSTALLED, pkg:SDK Platform Android android-1, API 1, revision 2>\n", |
| getTree(m, false /*displaySortByApi*/)); |
| |
| // Auto select new and update items. In this case the new items are considered |
| // updates and yet new at the same time. |
| // Test by selecting new items only: |
| m.checkNewUpdateItems(true, false, false, SdkConstants.PLATFORM_LINUX); |
| |
| assertEquals( |
| "PkgCategoryApi <API=TOOLS, label=Tools, #items=2>\n" + |
| "-- < * NEW, pkg:Android SDK Tools, revision 3.0.1>\n" + |
| "-- < * NEW, pkg:Android SDK Platform-tools, revision 4.0.1>\n" + |
| "PkgCategoryApi <API=TOOLS-PREVIEW, label=Tools (Preview Channel), #items=2>\n" + |
| "-- <INSTALLED, pkg:Android SDK Tools, revision 3.0.1 rc1>\n" + |
| "-- <INSTALLED, pkg:Android SDK Platform-tools, revision 4.0.1 rc1>\n" + |
| "PkgCategoryApi <API=API 1, label=Android android-1 (API 1), #items=1>\n" + |
| "-- <INSTALLED, pkg:SDK Platform Android android-1, API 1, revision 2>\n" + |
| "PkgCategoryApi <API=EXTRAS, label=Extras, #items=0>\n", |
| getTree(m, true /*displaySortByApi*/)); |
| |
| // Test by selecting update items only: |
| m.uncheckAllItems(); |
| m.checkNewUpdateItems(false, true, false, SdkConstants.PLATFORM_LINUX); |
| |
| assertEquals( |
| "PkgCategoryApi <API=TOOLS, label=Tools, #items=2>\n" + |
| "-- < * NEW, pkg:Android SDK Tools, revision 3.0.1>\n" + |
| "-- < * NEW, pkg:Android SDK Platform-tools, revision 4.0.1>\n" + |
| "PkgCategoryApi <API=TOOLS-PREVIEW, label=Tools (Preview Channel), #items=2>\n" + |
| "-- <INSTALLED, pkg:Android SDK Tools, revision 3.0.1 rc1>\n" + |
| "-- <INSTALLED, pkg:Android SDK Platform-tools, revision 4.0.1 rc1>\n" + |
| "PkgCategoryApi <API=API 1, label=Android android-1 (API 1), #items=1>\n" + |
| "-- <INSTALLED, pkg:SDK Platform Android android-1, API 1, revision 2>\n" + |
| "PkgCategoryApi <API=EXTRAS, label=Extras, #items=0>\n", |
| getTree(m, true /*displaySortByApi*/)); |
| |
| |
| // ----- |
| |
| // Now simulate that the user has installed the final package (3.0.1) to replace the |
| // installed 3.0.1rc1 package. |
| // - The 3.0.1 is installed. |
| // - The 3.0.1 rc1 isn't listed anymore by the server. |
| |
| m.uncheckAllItems(); |
| m.updateStart(); |
| m.updateSourcePackages(true /*sortByApi*/, null /*locals*/, new Package[] { |
| new MockToolPackage(src1, new FullRevision(3, 0, 1), 4), // T 3.0.1 |
| new MockPlatformToolPackage(src1, new FullRevision(4, 0, 1)), // PT 4.0.1 |
| new MockPlatformPackage(src1, 1, 2, 3), // API 1 |
| }); |
| m.updateSourcePackages(true /*sortByApi*/, src1, new Package[] { |
| new MockToolPackage(src1, new FullRevision(3, 0, 1), 4), // T 3.0.1 |
| new MockPlatformToolPackage(src1, new FullRevision(4, 0, 1)), // PT 4.0.1 |
| }); |
| m.updateEnd(true /*sortByApi*/); |
| |
| assertEquals( |
| "PkgCategoryApi <API=TOOLS, label=Tools, #items=2>\n" + |
| "-- <INSTALLED, pkg:Android SDK Tools, revision 3.0.1>\n" + |
| "-- <INSTALLED, pkg:Android SDK Platform-tools, revision 4.0.1>\n" + |
| "PkgCategoryApi <API=API 1, label=Android android-1 (API 1), #items=1>\n" + |
| "-- <INSTALLED, pkg:SDK Platform Android android-1, API 1, revision 2>\n" + |
| "PkgCategoryApi <API=EXTRAS, label=Extras, #items=0>\n", |
| getTree(m, true /*displaySortByApi*/)); |
| assertEquals( |
| "PkgCategorySource <source=repo1 (1.example.com), #items=3>\n" + |
| "-- <INSTALLED, pkg:Android SDK Tools, revision 3.0.1>\n" + |
| "-- <INSTALLED, pkg:Android SDK Platform-tools, revision 4.0.1>\n" + |
| "-- <INSTALLED, pkg:SDK Platform Android android-1, API 1, revision 2>\n", |
| getTree(m, false /*displaySortByApi*/)); |
| } |
| |
| public void testBuildTool_New() { |
| // Test: No local packages installed. Remote server has tools, platform-tools and |
| // build-tools. Even though build-tools isn't a dependency we want to auto-select |
| // the latest one as an install candidate. |
| |
| // Enable previews in the settings |
| u.overrideSetting(ISettingsPage.KEY_ENABLE_PREVIEWS, true); |
| |
| SdkSource src1 = new SdkRepoSource("http://1.example.com/url1", "repo1"); |
| |
| m.updateStart(); |
| m.updateSourcePackages(true /*sortByApi*/, src1, new Package[] { |
| new MockToolPackage (src1, new FullRevision(2, 0, 0), 3), // Tools 2 |
| new MockPlatformToolPackage(src1, new FullRevision(3, 0, 0)), // Plat-T 3 |
| new MockBuildToolPackage (src1, new FullRevision(4, 0, 0)), // Build-T 3 |
| }); |
| m.updateEnd(true /*sortByApi*/); |
| |
| assertEquals( |
| "PkgCategoryApi <API=TOOLS, label=Tools, #items=3>\n" + |
| "-- <NEW, pkg:Android SDK Tools, revision 2>\n" + |
| "-- <NEW, pkg:Android SDK Platform-tools, revision 3>\n" + |
| "-- <NEW, pkg:Android SDK Build-tools, revision 4>\n" + |
| "PkgCategoryApi <API=EXTRAS, label=Extras, #items=0>\n", |
| getTree(m, true /*displaySortByApi*/)); |
| assertEquals( |
| "PkgCategorySource <source=repo1 (1.example.com), #items=3>\n" + |
| "-- <NEW, pkg:Android SDK Tools, revision 2>\n" + |
| "-- <NEW, pkg:Android SDK Platform-tools, revision 3>\n" + |
| "-- <NEW, pkg:Android SDK Build-tools, revision 4>\n", |
| getTree(m, false /*displaySortByApi*/)); |
| |
| // Auto select top items. This doesn't selected build-tools since no tools are installed. |
| m.checkNewUpdateItems(false, false, true, SdkConstants.PLATFORM_LINUX); |
| |
| assertEquals( |
| "PkgCategoryApi <API=TOOLS, label=Tools, #items=3>\n" + |
| "-- <NEW, pkg:Android SDK Tools, revision 2>\n" + |
| "-- <NEW, pkg:Android SDK Platform-tools, revision 3>\n" + |
| "-- <NEW, pkg:Android SDK Build-tools, revision 4>\n" + |
| "PkgCategoryApi <API=EXTRAS, label=Extras, #items=0>\n", |
| getTree(m, true /*displaySortByApi*/)); |
| |
| // Auto select new items. This obviously selects the build-tools since its new. |
| m.checkNewUpdateItems(true, false, false, SdkConstants.PLATFORM_LINUX); |
| |
| assertEquals( |
| "PkgCategoryApi <API=TOOLS, label=Tools, #items=3>\n" + |
| "-- < * NEW, pkg:Android SDK Tools, revision 2>\n" + |
| "-- < * NEW, pkg:Android SDK Platform-tools, revision 3>\n" + |
| "-- < * NEW, pkg:Android SDK Build-tools, revision 4>\n" + |
| "PkgCategoryApi <API=EXTRAS, label=Extras, #items=0>\n", |
| getTree(m, true /*displaySortByApi*/)); |
| } |
| |
| public void testBuildTool_InitialTop() { |
| // Test Build tools auto-selected as an initial top package. |
| // This time we have the tool package installed. |
| // When we first start and select the top packages, we should also auto-select |
| // the latest platform-tools and build-tools if none are installed. |
| |
| // Enable previews in the settings |
| u.overrideSetting(ISettingsPage.KEY_ENABLE_PREVIEWS, true); |
| |
| SdkSource src1 = new SdkRepoSource("http://1.example.com/url1", "repo1"); |
| |
| // First the local install only has tools, no plat-tools or build-tools. |
| |
| m.uncheckAllItems(); |
| m.updateStart(); |
| m.updateSourcePackages(true /*sortByApi*/, null /*locals*/, new Package[] { |
| new MockToolPackage (null, new FullRevision(2, 0, 0), 3), // Tools 2 |
| }); |
| m.updateSourcePackages(true /*sortByApi*/, src1, new Package[] { |
| new MockToolPackage (src1, new FullRevision(2, 1, 0), 3), // Tools 2.1 |
| new MockPlatformToolPackage(src1, new FullRevision(3, 0, 0)), // Plat-T 3.1 |
| new MockBuildToolPackage (src1, new FullRevision(4, 0, 0)), // Build-T 4.1 |
| }); |
| m.updateEnd(true /*sortByApi*/); |
| |
| // Auto select top items. |
| m.checkNewUpdateItems(false, false, true, SdkConstants.PLATFORM_LINUX); |
| |
| assertEquals( |
| "PkgCategoryApi <API=TOOLS, label=Tools, #items=3>\n" + |
| "-- <INSTALLED, pkg:Android SDK Tools, revision 2, updated by:Android SDK Tools, revision 2.1>\n" + |
| "-- < * NEW, pkg:Android SDK Platform-tools, revision 3>\n" + |
| "-- < * NEW, pkg:Android SDK Build-tools, revision 4>\n" + |
| "PkgCategoryApi <API=EXTRAS, label=Extras, #items=0>\n", |
| getTree(m, true /*displaySortByApi*/)); |
| |
| // Next we start again but this time the local install as all 3 tools. |
| // Auto-selecting the top shouldn't select the updated packages available. |
| |
| m.uncheckAllItems(); |
| m.updateStart(); |
| m.updateSourcePackages(true /*sortByApi*/, null /*locals*/, new Package[] { |
| new MockToolPackage (null, new FullRevision(2, 0, 0), 3), // Tools 2 |
| new MockPlatformToolPackage(null, new FullRevision(3, 0, 0)), // Plat-T 3 |
| new MockBuildToolPackage (null, new FullRevision(4, 0, 0)), // Build-T 4 |
| }); |
| m.updateSourcePackages(true /*sortByApi*/, src1, new Package[] { |
| new MockToolPackage (src1, new FullRevision(2, 1, 0), 3), // Tools 2.1 |
| new MockPlatformToolPackage(src1, new FullRevision(3, 1, 0)), // Plat-T 3.1 |
| new MockBuildToolPackage (src1, new FullRevision(4, 1, 0)), // Build-T 4.1 |
| }); |
| m.updateEnd(true /*sortByApi*/); |
| |
| // Auto select top items. |
| m.checkNewUpdateItems(false, false, true, SdkConstants.PLATFORM_LINUX); |
| |
| assertEquals( |
| "PkgCategoryApi <API=TOOLS, label=Tools, #items=4>\n" + |
| "-- <INSTALLED, pkg:Android SDK Tools, revision 2, updated by:Android SDK Tools, revision 2.1>\n" + |
| "-- <INSTALLED, pkg:Android SDK Platform-tools, revision 3, updated by:Android SDK Platform-tools, revision 3.1>\n" + |
| "-- <NEW, pkg:Android SDK Build-tools, revision 4.1>\n" + |
| "-- <INSTALLED, pkg:Android SDK Build-tools, revision 4>\n" + |
| "PkgCategoryApi <API=EXTRAS, label=Extras, #items=0>\n", |
| getTree(m, true /*displaySortByApi*/)); |
| |
| // If we do request updates + top, they are selected however except for build-tools |
| // since new versions are not considered as updates. |
| m.uncheckAllItems(); |
| m.checkNewUpdateItems(false, true, true, SdkConstants.PLATFORM_LINUX); |
| |
| assertEquals( |
| "PkgCategoryApi <API=TOOLS, label=Tools, #items=4>\n" + |
| "-- < * INSTALLED, pkg:Android SDK Tools, revision 2, updated by:Android SDK Tools, revision 2.1>\n" + |
| "-- < * INSTALLED, pkg:Android SDK Platform-tools, revision 3, updated by:Android SDK Platform-tools, revision 3.1>\n" + |
| "-- <NEW, pkg:Android SDK Build-tools, revision 4.1>\n" + |
| "-- <INSTALLED, pkg:Android SDK Build-tools, revision 4>\n" + |
| "PkgCategoryApi <API=EXTRAS, label=Extras, #items=0>\n", |
| getTree(m, true /*displaySortByApi*/)); |
| } |
| |
| |
| |
| // ---- |
| |
| /** |
| * Simulates the display we would have in the Packages Tree. |
| * This always depends on mCurrentCategories like the tree does. |
| * The display format is something like: |
| * <pre> |
| * PkgCategory <description> |
| * -- <PkgItem description> |
| * </pre> |
| */ |
| public String getTree(PackagesDiffLogic l, boolean displaySortByApi) { |
| StringBuilder sb = new StringBuilder(); |
| |
| for (PkgCategory cat : m.getCategories(displaySortByApi)) { |
| sb.append(cat.toString()).append('\n'); |
| for (PkgItem item : cat.getItems()) { |
| sb.append("-- ").append(item.toString()).append('\n'); |
| } |
| } |
| |
| return sb.toString(); |
| } |
| } |