1*4882a593Smuzhiyun# 2*4882a593Smuzhiyun# SPDX-License-Identifier: MIT 3*4882a593Smuzhiyun# 4*4882a593Smuzhiyun 5*4882a593Smuzhiyunfrom oeqa.runtime.case import OERuntimeTestCase 6*4882a593Smuzhiyunfrom oeqa.core.decorator.depends import OETestDepends 7*4882a593Smuzhiyunfrom oeqa.core.decorator.data import skipIfNotInDataVar 8*4882a593Smuzhiyunfrom oeqa.runtime.decorator.package import OEHasPackage 9*4882a593Smuzhiyun 10*4882a593Smuzhiyunimport subprocess 11*4882a593Smuzhiyun 12*4882a593Smuzhiyunclass MultilibTest(OERuntimeTestCase): 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun def archtest(self, binary, arch): 15*4882a593Smuzhiyun """ 16*4882a593Smuzhiyun Check that ``binary`` has the ELF class ``arch`` (e.g. ELF32/ELF64). 17*4882a593Smuzhiyun """ 18*4882a593Smuzhiyun 19*4882a593Smuzhiyun dest = "{}/test_binary".format(self.td.get('T', '')) 20*4882a593Smuzhiyun self.target.copyFrom(binary, dest) 21*4882a593Smuzhiyun output = subprocess.check_output("readelf -h {}".format(dest), shell=True).decode() 22*4882a593Smuzhiyun os.remove(dest) 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun l = [l.split()[1] for l in output.split('\n') if "Class:" in l] 25*4882a593Smuzhiyun if l: 26*4882a593Smuzhiyun theclass = l[0] 27*4882a593Smuzhiyun else: 28*4882a593Smuzhiyun self.fail('Cannot parse readelf. Output:\n%s' % output) 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun msg = "%s isn't %s (is %s)" % (binary, arch, theclass) 31*4882a593Smuzhiyun self.assertEqual(theclass, arch, msg=msg) 32*4882a593Smuzhiyun 33*4882a593Smuzhiyun @skipIfNotInDataVar('MULTILIBS', 'multilib:lib32', 34*4882a593Smuzhiyun "This isn't a multilib:lib32 image") 35*4882a593Smuzhiyun @OETestDepends(['ssh.SSHTest.test_ssh']) 36*4882a593Smuzhiyun @OEHasPackage(['lib32-libc6']) 37*4882a593Smuzhiyun def test_check_multilib_libc(self): 38*4882a593Smuzhiyun """ 39*4882a593Smuzhiyun Check that a multilib image has both 32-bit and 64-bit libc in. 40*4882a593Smuzhiyun """ 41*4882a593Smuzhiyun self.archtest("/lib/libc.so.6", "ELF32") 42*4882a593Smuzhiyun self.archtest("/lib64/libc.so.6", "ELF64") 43*4882a593Smuzhiyun 44*4882a593Smuzhiyun @OETestDepends(['multilib.MultilibTest.test_check_multilib_libc']) 45*4882a593Smuzhiyun @OEHasPackage(['lib32-connman']) 46*4882a593Smuzhiyun def test_file_connman(self): 47*4882a593Smuzhiyun self.archtest("/usr/sbin/connmand", "ELF32") 48