1 /*
2  * Copyright (C) 2017 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package android.appsecurity.cts;
18 
19 import static org.junit.Assert.assertTrue;
20 
21 import android.platform.test.annotations.AppModeFull;
22 import android.platform.test.annotations.AppModeInstant;
23 import com.android.tradefed.testtype.DeviceJUnit4ClassRunner;
24 
25 import org.junit.After;
26 import org.junit.Before;
27 import org.junit.Test;
28 import org.junit.runner.RunWith;
29 
30 /**
31  * Test that install of apps using major version codes is being handled properly.
32  */
33 @RunWith(DeviceJUnit4ClassRunner.class)
34 public class MajorVersionTest extends BaseAppSecurityTest {
35     private static final String PKG = "com.android.cts.majorversion";
36     private static final String APK_000000000000ffff = "CtsMajorVersion000000000000ffff.apk";
37     private static final String APK_00000000ffffffff = "CtsMajorVersion00000000ffffffff.apk";
38     private static final String APK_000000ff00000000 = "CtsMajorVersion000000ff00000000.apk";
39     private static final String APK_000000ffffffffff = "CtsMajorVersion000000ffffffffff.apk";
40 
41     @Before
setUp()42     public void setUp() throws Exception {
43         Utils.prepareSingleUser(getDevice());
44         getDevice().uninstallPackage(PKG);
45     }
46 
47     @After
tearDown()48     public void tearDown() throws Exception {
49         getDevice().uninstallPackage(PKG);
50     }
51 
52     @Test
53     @AppModeFull(reason = "'full' portion of the hostside test")
testInstallMinorVersion_full()54     public void testInstallMinorVersion_full() throws Exception {
55         testInstallMinorVersion(false);
56     }
57     @Test
58     @AppModeInstant(reason = "'instant' portion of the hostside test")
testInstallMinorVersion_instant()59     public void testInstallMinorVersion_instant() throws Exception {
60         testInstallMinorVersion(true);
61     }
testInstallMinorVersion(boolean instant)62     private void testInstallMinorVersion(boolean instant) throws Exception {
63         new InstallMultiple(instant).addApk(APK_000000000000ffff).run();
64         assertTrue(getDevice().getInstalledPackageNames().contains(PKG));
65         runVersionDeviceTests("testCheckVersion");
66     }
67 
68     @Test
69     @AppModeFull(reason = "'full' portion of the hostside test")
testInstallMajorVersion_full()70     public void testInstallMajorVersion_full() throws Exception {
71         testInstallMajorVersion(false);
72     }
73     @Test
74     @AppModeInstant(reason = "'instant' portion of the hostside test")
testInstallMajorVersion_instant()75     public void testInstallMajorVersion_instant() throws Exception {
76         testInstallMajorVersion(true);
77     }
testInstallMajorVersion(boolean instant)78     private void testInstallMajorVersion(boolean instant) throws Exception {
79         new InstallMultiple(instant).addApk(APK_000000ff00000000).run();
80         assertTrue(getDevice().getInstalledPackageNames().contains(PKG));
81         runVersionDeviceTests("testCheckVersion");
82     }
83 
84     @Test
85     @AppModeFull(reason = "'full' portion of the hostside test")
testInstallUpdateAcrossMinorMajorVersion_full()86     public void testInstallUpdateAcrossMinorMajorVersion_full() throws Exception {
87         testInstallUpdateAcrossMinorMajorVersion(false);
88     }
89     @Test
90     @AppModeInstant(reason = "'instant' portion of the hostside test")
testInstallUpdateAcrossMinorMajorVersion_instant()91     public void testInstallUpdateAcrossMinorMajorVersion_instant() throws Exception {
92         testInstallUpdateAcrossMinorMajorVersion(true);
93     }
testInstallUpdateAcrossMinorMajorVersion(boolean instant)94     private void testInstallUpdateAcrossMinorMajorVersion(boolean instant) throws Exception {
95         new InstallMultiple(instant).addApk(APK_000000000000ffff).run();
96         assertTrue(getDevice().getInstalledPackageNames().contains(PKG));
97         runVersionDeviceTests("testCheckVersion");
98         new InstallMultiple(instant).addApk(APK_00000000ffffffff).run();
99         assertTrue(getDevice().getInstalledPackageNames().contains(PKG));
100         runVersionDeviceTests("testCheckVersion");
101         new InstallMultiple(instant).addApk(APK_000000ff00000000).run();
102         assertTrue(getDevice().getInstalledPackageNames().contains(PKG));
103         runVersionDeviceTests("testCheckVersion");
104         new InstallMultiple(instant).addApk(APK_000000ffffffffff).run();
105         assertTrue(getDevice().getInstalledPackageNames().contains(PKG));
106         runVersionDeviceTests("testCheckVersion");
107     }
108 
109     @Test
110     @AppModeFull(reason = "'full' portion of the hostside test")
testInstallDowngradeAcrossMajorMinorVersion_full()111     public void testInstallDowngradeAcrossMajorMinorVersion_full() throws Exception {
112         testInstallDowngradeAcrossMajorMinorVersion(false);
113     }
114     @Test
115     @AppModeInstant(reason = "'instant' portion of the hostside test")
testInstallDowngradeAcrossMajorMinorVersion_instant()116     public void testInstallDowngradeAcrossMajorMinorVersion_instant() throws Exception {
117         testInstallDowngradeAcrossMajorMinorVersion(true);
118     }
testInstallDowngradeAcrossMajorMinorVersion(boolean instant)119     private void testInstallDowngradeAcrossMajorMinorVersion(boolean instant) throws Exception {
120         new InstallMultiple(instant).addApk(APK_000000ffffffffff).run();
121         assertTrue(getDevice().getInstalledPackageNames().contains(PKG));
122         runVersionDeviceTests("testCheckVersion");
123         new InstallMultiple(instant).addApk(APK_00000000ffffffff)
124                 .runExpectingFailure("INSTALL_FAILED_VERSION_DOWNGRADE");
125         assertTrue(getDevice().getInstalledPackageNames().contains(PKG));
126         runVersionDeviceTests("testCheckVersion");
127         new InstallMultiple(instant).addApk(APK_000000ff00000000)
128                 .runExpectingFailure("INSTALL_FAILED_VERSION_DOWNGRADE");
129         assertTrue(getDevice().getInstalledPackageNames().contains(PKG));
130         runVersionDeviceTests("testCheckVersion");
131         new InstallMultiple(instant).addApk(APK_000000000000ffff)
132                 .runExpectingFailure("INSTALL_FAILED_VERSION_DOWNGRADE");
133         assertTrue(getDevice().getInstalledPackageNames().contains(PKG));
134         runVersionDeviceTests("testCheckVersion");
135     }
136 
runVersionDeviceTests(String testMethodName)137     private void runVersionDeviceTests(String testMethodName) throws Exception {
138         runDeviceTests(PKG, PKG + ".VersionTest", testMethodName);
139     }
140 }
141