1# 2# SPDX-License-Identifier: MIT 3# 4 5import os 6import fnmatch 7import time 8 9from oeqa.runtime.case import OERuntimeTestCase 10from oeqa.core.decorator.depends import OETestDepends 11from oeqa.core.decorator.data import skipIfDataVar 12from oeqa.runtime.decorator.package import OEHasPackage 13from oeqa.core.utils.path import findFile 14 15class RpmBasicTest(OERuntimeTestCase): 16 17 @OEHasPackage(['rpm']) 18 @OETestDepends(['ssh.SSHTest.test_ssh']) 19 def test_rpm_help(self): 20 status, output = self.target.run('rpm --help') 21 msg = 'status and output: %s and %s' % (status, output) 22 self.assertEqual(status, 0, msg=msg) 23 24 @OETestDepends(['rpm.RpmBasicTest.test_rpm_help']) 25 def test_rpm_query(self): 26 status, output = self.target.run('ls /var/lib/rpm/') 27 if status != 0: 28 self.skipTest('No /var/lib/rpm on target') 29 status, output = self.target.run('rpm -q rpm') 30 msg = 'status and output: %s and %s' % (status, output) 31 self.assertEqual(status, 0, msg=msg) 32 33 @OETestDepends(['rpm.RpmBasicTest.test_rpm_query']) 34 def test_rpm_query_nonroot(self): 35 36 def set_up_test_user(u): 37 status, output = self.target.run('id -u %s' % u) 38 if status: 39 status, output = self.target.run('useradd %s' % u) 40 msg = 'Failed to create new user: %s' % output 41 self.assertTrue(status == 0, msg=msg) 42 43 def exec_as_test_user(u): 44 status, output = self.target.run('su -c id %s' % u) 45 msg = 'Failed to execute as new user' 46 self.assertTrue("({0})".format(u) in output, msg=msg) 47 48 status, output = self.target.run('su -c "rpm -qa" %s ' % u) 49 msg = 'status: %s. Cannot run rpm -qa: %s' % (status, output) 50 self.assertEqual(status, 0, msg=msg) 51 52 def wait_for_no_process_for_user(u, timeout = 120): 53 timeout_at = time.time() + timeout 54 while time.time() < timeout_at: 55 _, output = self.target.run(self.tc.target_cmds['ps']) 56 if u + ' ' not in output: 57 return 58 time.sleep(1) 59 user_pss = [ps for ps in output.split("\n") if u + ' ' in ps] 60 msg = "There're %s 's process(es) still running: %s".format(u, "\n".join(user_pss)) 61 assertTrue(True, msg=msg) 62 63 def unset_up_test_user(u): 64 # ensure no test1 process in running 65 wait_for_no_process_for_user(u) 66 status, output = self.target.run('userdel -r %s' % u) 67 msg = 'Failed to erase user: %s' % output 68 self.assertTrue(status == 0, msg=msg) 69 70 tuser = 'test1' 71 72 try: 73 set_up_test_user(tuser) 74 exec_as_test_user(tuser) 75 finally: 76 unset_up_test_user(tuser) 77 78 79class RpmInstallRemoveTest(OERuntimeTestCase): 80 81 @classmethod 82 def setUpClass(cls): 83 pkgarch = cls.td['TUNE_PKGARCH'].replace('-', '_') 84 rpmdir = os.path.join(cls.tc.td['DEPLOY_DIR'], 'rpm', pkgarch) 85 # Pick base-passwd-doc as a test file to get installed, because it's small 86 # and it will always be built for standard targets 87 rpm_doc = 'base-passwd-doc-*.%s.rpm' % pkgarch 88 if not os.path.exists(rpmdir): 89 return 90 for f in fnmatch.filter(os.listdir(rpmdir), rpm_doc): 91 cls.test_file = os.path.join(rpmdir, f) 92 cls.dst = '/tmp/base-passwd-doc.rpm' 93 94 @OETestDepends(['rpm.RpmBasicTest.test_rpm_query']) 95 def test_rpm_install(self): 96 self.tc.target.copyTo(self.test_file, self.dst) 97 status, output = self.target.run('rpm -ivh /tmp/base-passwd-doc.rpm') 98 msg = 'Failed to install base-passwd-doc package: %s' % output 99 self.assertEqual(status, 0, msg=msg) 100 self.tc.target.run('rm -f %s' % self.dst) 101 102 @OETestDepends(['rpm.RpmInstallRemoveTest.test_rpm_install']) 103 def test_rpm_remove(self): 104 status,output = self.target.run('rpm -e base-passwd-doc') 105 msg = 'Failed to remove base-passwd-doc package: %s' % output 106 self.assertEqual(status, 0, msg=msg) 107 108 @OETestDepends(['rpm.RpmInstallRemoveTest.test_rpm_remove']) 109 def test_check_rpm_install_removal_log_file_size(self): 110 """ 111 Summary: Check that rpm writes into /var/log/messages 112 Expected: There should be some RPM prefixed entries in the above file. 113 Product: BSPs 114 Author: Alexandru Georgescu <alexandru.c.georgescu@intel.com> 115 Author: Alexander Kanavin <alex.kanavin@gmail.com> 116 AutomatedBy: Daniel Istrate <daniel.alexandrux.istrate@intel.com> 117 """ 118 db_files_cmd = 'ls /var/lib/rpm/rpmdb.sqlite*' 119 check_log_cmd = "grep RPM /var/log/messages | wc -l" 120 121 # Make sure that some database files are under /var/lib/rpm as 'rpmdb.sqlite' 122 status, output = self.target.run(db_files_cmd) 123 msg = 'Failed to find database files under /var/lib/rpm/ as rpmdb.sqlite' 124 self.assertEqual(0, status, msg=msg) 125 126 self.tc.target.copyTo(self.test_file, self.dst) 127 128 # Remove the package just in case 129 self.target.run('rpm -e base-passwd-doc') 130 131 # Install/Remove a package 10 times 132 for i in range(10): 133 status, output = self.target.run('rpm -ivh /tmp/base-passwd-doc.rpm') 134 msg = 'Failed to install base-passwd-doc package. Reason: {}'.format(output) 135 self.assertEqual(0, status, msg=msg) 136 137 status, output = self.target.run('rpm -e base-passwd-doc') 138 msg = 'Failed to remove base-passwd-doc package. Reason: {}'.format(output) 139 self.assertEqual(0, status, msg=msg) 140 141 self.tc.target.run('rm -f %s' % self.dst) 142 143 144