1*800a58d9SAndroid Build Coastguard Worker# Copyright 2018 - The Android Open Source Project 2*800a58d9SAndroid Build Coastguard Worker# 3*800a58d9SAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); 4*800a58d9SAndroid Build Coastguard Worker# you may not use this file except in compliance with the License. 5*800a58d9SAndroid Build Coastguard Worker# You may obtain a copy of the License at 6*800a58d9SAndroid Build Coastguard Worker# 7*800a58d9SAndroid Build Coastguard Worker# http://www.apache.org/licenses/LICENSE-2.0 8*800a58d9SAndroid Build Coastguard Worker# 9*800a58d9SAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software 10*800a58d9SAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, 11*800a58d9SAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*800a58d9SAndroid Build Coastguard Worker# See the License for the specific language governing permissions and 13*800a58d9SAndroid Build Coastguard Worker# limitations under the License. 14*800a58d9SAndroid Build Coastguard Worker"""Tests for host_setup_runner.""" 15*800a58d9SAndroid Build Coastguard Workerimport os 16*800a58d9SAndroid Build Coastguard Workerimport platform 17*800a58d9SAndroid Build Coastguard Workerimport shutil 18*800a58d9SAndroid Build Coastguard Workerimport sys 19*800a58d9SAndroid Build Coastguard Workerimport tempfile 20*800a58d9SAndroid Build Coastguard Workerimport unittest 21*800a58d9SAndroid Build Coastguard Worker 22*800a58d9SAndroid Build Coastguard Workerfrom unittest import mock 23*800a58d9SAndroid Build Coastguard Worker 24*800a58d9SAndroid Build Coastguard Workerfrom acloud.internal.lib import driver_test_lib 25*800a58d9SAndroid Build Coastguard Workerfrom acloud.internal.lib import utils 26*800a58d9SAndroid Build Coastguard Workerfrom acloud.setup import mkcert 27*800a58d9SAndroid Build Coastguard Workerfrom acloud.setup import setup_common 28*800a58d9SAndroid Build Coastguard Workerfrom acloud.setup.host_setup_runner import AvdPkgInstaller 29*800a58d9SAndroid Build Coastguard Workerfrom acloud.setup.host_setup_runner import CuttlefishCommonPkgInstaller 30*800a58d9SAndroid Build Coastguard Workerfrom acloud.setup.host_setup_runner import CuttlefishHostSetup 31*800a58d9SAndroid Build Coastguard Workerfrom acloud.setup.host_setup_runner import LocalCAHostSetup 32*800a58d9SAndroid Build Coastguard Worker 33*800a58d9SAndroid Build Coastguard Workerclass CuttlefishHostSetupTest(driver_test_lib.BaseDriverTest): 34*800a58d9SAndroid Build Coastguard Worker """Test CuttlsfishHostSetup.""" 35*800a58d9SAndroid Build Coastguard Worker 36*800a58d9SAndroid Build Coastguard Worker LSMOD_OUTPUT = """nvidia_modeset 860160 6 nvidia_drm 37*800a58d9SAndroid Build Coastguard Workermodule1 12312 1 38*800a58d9SAndroid Build Coastguard Workermodule2 12312 1 39*800a58d9SAndroid Build Coastguard Workerghash_clmulni_intel 16384 0 40*800a58d9SAndroid Build Coastguard Workeraesni_intel 167936 3 41*800a58d9SAndroid Build Coastguard Workeraes_x86_64 20480 1 aesni_intel 42*800a58d9SAndroid Build Coastguard Workerlrw 16384 1 aesni_intel""" 43*800a58d9SAndroid Build Coastguard Worker 44*800a58d9SAndroid Build Coastguard Worker # pylint: disable=invalid-name 45*800a58d9SAndroid Build Coastguard Worker def setUp(self): 46*800a58d9SAndroid Build Coastguard Worker """Set up the test.""" 47*800a58d9SAndroid Build Coastguard Worker super().setUp() 48*800a58d9SAndroid Build Coastguard Worker self.CuttlefishHostSetup = CuttlefishHostSetup() 49*800a58d9SAndroid Build Coastguard Worker 50*800a58d9SAndroid Build Coastguard Worker def testShouldRunFalse(self): 51*800a58d9SAndroid Build Coastguard Worker """Test ShouldRun returns False.""" 52*800a58d9SAndroid Build Coastguard Worker self.Patch(utils, "CheckUserInGroups", return_value=True) 53*800a58d9SAndroid Build Coastguard Worker self.Patch(CuttlefishHostSetup, "_CheckLoadedModules", return_value=True) 54*800a58d9SAndroid Build Coastguard Worker self.assertFalse(self.CuttlefishHostSetup.ShouldRun()) 55*800a58d9SAndroid Build Coastguard Worker 56*800a58d9SAndroid Build Coastguard Worker def testShouldRunTrue(self): 57*800a58d9SAndroid Build Coastguard Worker """Test ShouldRun returns True.""" 58*800a58d9SAndroid Build Coastguard Worker # 1. Checking groups fails. 59*800a58d9SAndroid Build Coastguard Worker self.Patch( 60*800a58d9SAndroid Build Coastguard Worker utils, "CheckUserInGroups", return_value=False) 61*800a58d9SAndroid Build Coastguard Worker self.Patch(CuttlefishHostSetup, "_CheckLoadedModules", return_value=True) 62*800a58d9SAndroid Build Coastguard Worker self.assertTrue(self.CuttlefishHostSetup.ShouldRun()) 63*800a58d9SAndroid Build Coastguard Worker 64*800a58d9SAndroid Build Coastguard Worker # 2. Checking modules fails. 65*800a58d9SAndroid Build Coastguard Worker self.Patch(utils, "CheckUserInGroups", return_value=True) 66*800a58d9SAndroid Build Coastguard Worker self.Patch( 67*800a58d9SAndroid Build Coastguard Worker CuttlefishHostSetup, "_CheckLoadedModules", return_value=False) 68*800a58d9SAndroid Build Coastguard Worker self.assertTrue(self.CuttlefishHostSetup.ShouldRun()) 69*800a58d9SAndroid Build Coastguard Worker 70*800a58d9SAndroid Build Coastguard Worker self.Patch(platform, "system", return_value="Mac") 71*800a58d9SAndroid Build Coastguard Worker self.assertFalse(self.CuttlefishHostSetup.ShouldRun()) 72*800a58d9SAndroid Build Coastguard Worker 73*800a58d9SAndroid Build Coastguard Worker # pylint: disable=no-member 74*800a58d9SAndroid Build Coastguard Worker def testRun(self): 75*800a58d9SAndroid Build Coastguard Worker """Test Run.""" 76*800a58d9SAndroid Build Coastguard Worker self.Patch(CuttlefishHostSetup, "ShouldRun", return_value=True) 77*800a58d9SAndroid Build Coastguard Worker self.Patch(CuttlefishHostSetup, "_GetProcessorType", 78*800a58d9SAndroid Build Coastguard Worker return_value="intel") 79*800a58d9SAndroid Build Coastguard Worker self.Patch(utils, "InteractWithQuestion", return_value="y") 80*800a58d9SAndroid Build Coastguard Worker self.Patch(setup_common, "CheckCmdOutput") 81*800a58d9SAndroid Build Coastguard Worker self.CuttlefishHostSetup.Run() 82*800a58d9SAndroid Build Coastguard Worker setup_common.CheckCmdOutput.assert_called() 83*800a58d9SAndroid Build Coastguard Worker setup_common.CheckCmdOutput.reset_mock() 84*800a58d9SAndroid Build Coastguard Worker 85*800a58d9SAndroid Build Coastguard Worker self.Patch(utils, "InteractWithQuestion", return_value="n") 86*800a58d9SAndroid Build Coastguard Worker self.CuttlefishHostSetup.Run() 87*800a58d9SAndroid Build Coastguard Worker setup_common.CheckCmdOutput.assert_not_called() 88*800a58d9SAndroid Build Coastguard Worker 89*800a58d9SAndroid Build Coastguard Worker # pylint: disable=protected-access 90*800a58d9SAndroid Build Coastguard Worker def testCheckLoadedModules(self): 91*800a58d9SAndroid Build Coastguard Worker """Test _CheckLoadedModules.""" 92*800a58d9SAndroid Build Coastguard Worker self.Patch( 93*800a58d9SAndroid Build Coastguard Worker setup_common, "CheckCmdOutput", return_value=self.LSMOD_OUTPUT) 94*800a58d9SAndroid Build Coastguard Worker 95*800a58d9SAndroid Build Coastguard Worker # Required modules are all in lsmod should return True. 96*800a58d9SAndroid Build Coastguard Worker self.assertTrue( 97*800a58d9SAndroid Build Coastguard Worker self.CuttlefishHostSetup._CheckLoadedModules(["module1", "module2"])) 98*800a58d9SAndroid Build Coastguard Worker # Required modules are not all in lsmod should return False. 99*800a58d9SAndroid Build Coastguard Worker self.assertFalse( 100*800a58d9SAndroid Build Coastguard Worker self.CuttlefishHostSetup._CheckLoadedModules(["module1", "module3"])) 101*800a58d9SAndroid Build Coastguard Worker 102*800a58d9SAndroid Build Coastguard Worker 103*800a58d9SAndroid Build Coastguard Workerclass AvdPkgInstallerTest(driver_test_lib.BaseDriverTest): 104*800a58d9SAndroid Build Coastguard Worker """Test AvdPkgInstallerTest.""" 105*800a58d9SAndroid Build Coastguard Worker 106*800a58d9SAndroid Build Coastguard Worker # pylint: disable=invalid-name 107*800a58d9SAndroid Build Coastguard Worker def setUp(self): 108*800a58d9SAndroid Build Coastguard Worker """Set up the test.""" 109*800a58d9SAndroid Build Coastguard Worker super().setUp() 110*800a58d9SAndroid Build Coastguard Worker self.AvdPkgInstaller = AvdPkgInstaller() 111*800a58d9SAndroid Build Coastguard Worker 112*800a58d9SAndroid Build Coastguard Worker def testShouldRun(self): 113*800a58d9SAndroid Build Coastguard Worker """Test ShouldRun.""" 114*800a58d9SAndroid Build Coastguard Worker self.Patch(platform, "system", return_value="Linux") 115*800a58d9SAndroid Build Coastguard Worker self.Patch(platform, "version", return_value="Unsupport") 116*800a58d9SAndroid Build Coastguard Worker self.assertFalse(self.AvdPkgInstaller.ShouldRun()) 117*800a58d9SAndroid Build Coastguard Worker 118*800a58d9SAndroid Build Coastguard Worker def testShouldNotRun(self): 119*800a58d9SAndroid Build Coastguard Worker """Test ShouldRun should raise error in non-linux os.""" 120*800a58d9SAndroid Build Coastguard Worker self.Patch(platform, "system", return_value="Mac") 121*800a58d9SAndroid Build Coastguard Worker self.assertFalse(self.AvdPkgInstaller.ShouldRun()) 122*800a58d9SAndroid Build Coastguard Worker 123*800a58d9SAndroid Build Coastguard Worker # pylint: disable=no-member 124*800a58d9SAndroid Build Coastguard Worker def testRun(self): 125*800a58d9SAndroid Build Coastguard Worker """Test Run.""" 126*800a58d9SAndroid Build Coastguard Worker self.Patch(platform, "system", return_value="Linux") 127*800a58d9SAndroid Build Coastguard Worker self.AvdPkgInstaller.PACKAGES = ["pkg1", "pkg2"] 128*800a58d9SAndroid Build Coastguard Worker self.Patch(setup_common, "PackageInstalled", return_value=False) 129*800a58d9SAndroid Build Coastguard Worker self.Patch(utils, "GetUserAnswerYes", return_value=True) 130*800a58d9SAndroid Build Coastguard Worker self.Patch(setup_common, "CheckCmdOutput") 131*800a58d9SAndroid Build Coastguard Worker self.Patch(setup_common, "InstallPackage") 132*800a58d9SAndroid Build Coastguard Worker self.AvdPkgInstaller.Run() 133*800a58d9SAndroid Build Coastguard Worker setup_common.InstallPackage.assert_called() 134*800a58d9SAndroid Build Coastguard Worker 135*800a58d9SAndroid Build Coastguard Worker self.Patch(utils, "GetUserAnswerYes", return_value=False) 136*800a58d9SAndroid Build Coastguard Worker self.Patch(sys, "exit") 137*800a58d9SAndroid Build Coastguard Worker self.AvdPkgInstaller.Run() 138*800a58d9SAndroid Build Coastguard Worker sys.exit.assert_called_once() 139*800a58d9SAndroid Build Coastguard Worker 140*800a58d9SAndroid Build Coastguard Worker 141*800a58d9SAndroid Build Coastguard Workerclass CuttlefishCommonPkgInstallerTest(driver_test_lib.BaseDriverTest): 142*800a58d9SAndroid Build Coastguard Worker """Test CuttlefishCommonPkgInstallerTest.""" 143*800a58d9SAndroid Build Coastguard Worker 144*800a58d9SAndroid Build Coastguard Worker # pylint: disable=invalid-name 145*800a58d9SAndroid Build Coastguard Worker def setUp(self): 146*800a58d9SAndroid Build Coastguard Worker """Set up the test.""" 147*800a58d9SAndroid Build Coastguard Worker super().setUp() 148*800a58d9SAndroid Build Coastguard Worker self.CuttlefishCommonPkgInstaller = CuttlefishCommonPkgInstaller() 149*800a58d9SAndroid Build Coastguard Worker 150*800a58d9SAndroid Build Coastguard Worker def testShouldRun(self): 151*800a58d9SAndroid Build Coastguard Worker """Test ShouldRun.""" 152*800a58d9SAndroid Build Coastguard Worker self.Patch(platform, "system", return_value="Linux") 153*800a58d9SAndroid Build Coastguard Worker self.Patch(setup_common, "PackageInstalled", return_value=False) 154*800a58d9SAndroid Build Coastguard Worker self.assertTrue(self.CuttlefishCommonPkgInstaller.ShouldRun()) 155*800a58d9SAndroid Build Coastguard Worker 156*800a58d9SAndroid Build Coastguard Worker self.Patch(setup_common, "PackageInstalled", return_value=True) 157*800a58d9SAndroid Build Coastguard Worker self.assertFalse(self.CuttlefishCommonPkgInstaller.ShouldRun()) 158*800a58d9SAndroid Build Coastguard Worker 159*800a58d9SAndroid Build Coastguard Worker self.Patch(platform, "system", return_value="Mac") 160*800a58d9SAndroid Build Coastguard Worker self.assertFalse(self.CuttlefishCommonPkgInstaller.ShouldRun()) 161*800a58d9SAndroid Build Coastguard Worker 162*800a58d9SAndroid Build Coastguard Worker # pylint: disable=no-member 163*800a58d9SAndroid Build Coastguard Worker @mock.patch.object(shutil, "rmtree") 164*800a58d9SAndroid Build Coastguard Worker @mock.patch.object(setup_common, "CheckCmdOutput") 165*800a58d9SAndroid Build Coastguard Worker def testRun(self, mock_cmd, mock_rmtree): 166*800a58d9SAndroid Build Coastguard Worker """Test Run.""" 167*800a58d9SAndroid Build Coastguard Worker fake_tmp_folder = "/tmp/cf-common" 168*800a58d9SAndroid Build Coastguard Worker self.Patch(tempfile, "mkdtemp", return_value=fake_tmp_folder) 169*800a58d9SAndroid Build Coastguard Worker self.Patch(utils, "GetUserAnswerYes", return_value=True) 170*800a58d9SAndroid Build Coastguard Worker self.Patch(CuttlefishCommonPkgInstaller, "ShouldRun", return_value=True) 171*800a58d9SAndroid Build Coastguard Worker self.Patch(setup_common, "IsPackageInAptList", return_value=False) 172*800a58d9SAndroid Build Coastguard Worker self.CuttlefishCommonPkgInstaller.Run() 173*800a58d9SAndroid Build Coastguard Worker self.assertEqual(mock_cmd.call_count, 1) 174*800a58d9SAndroid Build Coastguard Worker mock_rmtree.assert_called_once_with(fake_tmp_folder) 175*800a58d9SAndroid Build Coastguard Worker # Install cuttlefish-common from rapture 176*800a58d9SAndroid Build Coastguard Worker self.Patch(setup_common, "IsPackageInAptList", return_value=True) 177*800a58d9SAndroid Build Coastguard Worker self.Patch(setup_common, "InstallPackage") 178*800a58d9SAndroid Build Coastguard Worker self.CuttlefishCommonPkgInstaller.Run() 179*800a58d9SAndroid Build Coastguard Worker setup_common.InstallPackage.assert_called() 180*800a58d9SAndroid Build Coastguard Worker 181*800a58d9SAndroid Build Coastguard Worker self.Patch(utils, "GetUserAnswerYes", return_value=False) 182*800a58d9SAndroid Build Coastguard Worker self.Patch(sys, "exit") 183*800a58d9SAndroid Build Coastguard Worker self.CuttlefishCommonPkgInstaller.Run() 184*800a58d9SAndroid Build Coastguard Worker sys.exit.assert_called_once() 185*800a58d9SAndroid Build Coastguard Worker 186*800a58d9SAndroid Build Coastguard Worker 187*800a58d9SAndroid Build Coastguard Workerclass LocalCAHostSetupTest(driver_test_lib.BaseDriverTest): 188*800a58d9SAndroid Build Coastguard Worker """Test LocalCAHostSetupTest.""" 189*800a58d9SAndroid Build Coastguard Worker 190*800a58d9SAndroid Build Coastguard Worker # pylint: disable=invalid-name 191*800a58d9SAndroid Build Coastguard Worker def setUp(self): 192*800a58d9SAndroid Build Coastguard Worker """Set up the test.""" 193*800a58d9SAndroid Build Coastguard Worker super().setUp() 194*800a58d9SAndroid Build Coastguard Worker self.LocalCAHostSetup = LocalCAHostSetup() 195*800a58d9SAndroid Build Coastguard Worker 196*800a58d9SAndroid Build Coastguard Worker def testShouldRun(self): 197*800a58d9SAndroid Build Coastguard Worker """Test ShouldRun.""" 198*800a58d9SAndroid Build Coastguard Worker self.Patch(platform, "system", return_value="Linux") 199*800a58d9SAndroid Build Coastguard Worker self.Patch(os.path, "exists", return_value=False) 200*800a58d9SAndroid Build Coastguard Worker self.assertTrue(self.LocalCAHostSetup.ShouldRun()) 201*800a58d9SAndroid Build Coastguard Worker 202*800a58d9SAndroid Build Coastguard Worker self.Patch(os.path, "exists", return_value=True) 203*800a58d9SAndroid Build Coastguard Worker self.assertFalse(self.LocalCAHostSetup.ShouldRun()) 204*800a58d9SAndroid Build Coastguard Worker 205*800a58d9SAndroid Build Coastguard Worker self.Patch(platform, "system", return_value="Mac") 206*800a58d9SAndroid Build Coastguard Worker self.Patch(os.path, "exists", return_value=False) 207*800a58d9SAndroid Build Coastguard Worker self.assertFalse(self.LocalCAHostSetup.ShouldRun()) 208*800a58d9SAndroid Build Coastguard Worker 209*800a58d9SAndroid Build Coastguard Worker # pylint: disable=no-member 210*800a58d9SAndroid Build Coastguard Worker def testRun(self): 211*800a58d9SAndroid Build Coastguard Worker """Test Run.""" 212*800a58d9SAndroid Build Coastguard Worker self.Patch(utils, "GetUserAnswerYes", return_value=True) 213*800a58d9SAndroid Build Coastguard Worker self.Patch(LocalCAHostSetup, "ShouldRun", return_value=True) 214*800a58d9SAndroid Build Coastguard Worker self.Patch(mkcert, "Install") 215*800a58d9SAndroid Build Coastguard Worker self.LocalCAHostSetup.Run() 216*800a58d9SAndroid Build Coastguard Worker mkcert.Install.assert_called_once() 217*800a58d9SAndroid Build Coastguard Worker mkcert.Install.reset_mock() 218*800a58d9SAndroid Build Coastguard Worker 219*800a58d9SAndroid Build Coastguard Worker self.Patch(LocalCAHostSetup, "ShouldRun", return_value=False) 220*800a58d9SAndroid Build Coastguard Worker self.LocalCAHostSetup.Run() 221*800a58d9SAndroid Build Coastguard Worker mkcert.Install.assert_not_called() 222*800a58d9SAndroid Build Coastguard Worker 223*800a58d9SAndroid Build Coastguard Worker self.Patch(utils, "GetUserAnswerYes", return_value=False) 224*800a58d9SAndroid Build Coastguard Worker self.Patch(sys, "exit") 225*800a58d9SAndroid Build Coastguard Worker self.LocalCAHostSetup.Run() 226*800a58d9SAndroid Build Coastguard Worker mkcert.Install.assert_not_called() 227*800a58d9SAndroid Build Coastguard Worker 228*800a58d9SAndroid Build Coastguard Worker 229*800a58d9SAndroid Build Coastguard Workerif __name__ == "__main__": 230*800a58d9SAndroid Build Coastguard Worker unittest.main() 231