blob: 4ed0d373926cbcae77e79b0eb5bfe63e167fc03a [file] [log] [blame]
#!/usr/bin/python
import unittest, os, time, re, glob, logging
import common
from autotest_lib.client.common_lib.test_utils import mock
from autotest_lib.client.bin import kernel, job, utils, kernelexpand
from autotest_lib.client.bin import kernel_config, boottool, os_dep
class TestAddKernelToBootLoader(unittest.TestCase):
def add_to_bootloader(self, base_args, args, bootloader_args,
bootloader_root, tag='image', image='image',
initrd='initrd'):
god = mock.mock_god()
bootloader = god.create_mock_class(boottool.boottool, "boottool")
# record
bootloader.remove_kernel.expect_call(tag)
bootloader.add_kernel.expect_call(image, tag, initrd=initrd,
args='_dummy_', root=bootloader_root)
for a in bootloader_args.split():
bootloader.add_args.expect_call(kernel=tag, args=a)
bootloader.remove_args.expect_call(kernel=tag, args='_dummy_')
# run and check
kernel._add_kernel_to_bootloader(bootloader, base_args, tag, args,
image, initrd)
god.check_playback()
def test_add_kernel_to_bootloader(self):
self.add_to_bootloader(base_args='baseargs', args='',
bootloader_args='baseargs', bootloader_root=None)
self.add_to_bootloader(base_args='arg1 root=/dev/oldroot arg2',
args='root=/dev/newroot arg3',
bootloader_args='arg1 arg2 arg3',
bootloader_root='/dev/newroot')
class TestBootableKernel(unittest.TestCase):
def setUp(self):
self.god = mock.mock_god()
self.god.stub_function(time, "time")
self.god.stub_function(utils, "system")
self.god.stub_function(kernel, "_add_kernel_to_bootloader")
job_ = self.god.create_mock_class(job.job, "job")
self.kernel = kernel.BootableKernel(job_)
self.kernel.job.bootloader = self.god.create_mock_class(
boottool.boottool, "boottool")
def tearDown(self):
# note: time.time() can only be unstubbed via tearDown()
self.god.unstub_all()
def boot_kernel(self, ident_check):
notes = "applied_patches"
when = 1
args = ''
base_args = 'base_args'
tag = 'ident'
subdir = 'subdir'
self.kernel.image = 'image'
self.kernel.initrd = 'initrd'
self.kernel.installed_as = tag
# record
args_ = args
if ident_check:
time.time.expect_call().and_return(when)
args_ += " IDENT=%d" % when
status = ["job.end_reboot_and_verify", when, tag, subdir, notes]
else:
status = ["job.end_reboot", subdir, tag, notes]
self.kernel.job.next_step_prepend.expect_call(status)
self.kernel.job.config_get.expect_call(
'boot.default_args').and_return(base_args)
kernel._add_kernel_to_bootloader.expect_call(
self.kernel.job.bootloader, base_args, tag,
args_, self.kernel.image, self.kernel.initrd)
utils.system.expect_call('touch /fastboot')
self.kernel.job.start_reboot.expect_call()
self.kernel.job.reboot.expect_call(tag=tag)
# run and check
self.kernel._boot_kernel(args=args, ident_check=ident_check,
expected_ident=tag, subdir=subdir, notes=notes)
self.god.check_playback()
def test_boot_kernel(self):
self.boot_kernel(ident_check=False)
self.boot_kernel(ident_check=True)
class TestKernel(unittest.TestCase):
def setUp(self):
self.god = mock.mock_god()
logging.disable(logging.CRITICAL)
self.god.stub_function(time, "time")
self.god.stub_function(os, "mkdir")
self.god.stub_function(os, "chdir")
self.god.stub_function(os, "symlink")
self.god.stub_function(os, "remove")
self.god.stub_function(os.path, "isdir")
self.god.stub_function(os.path, "exists")
self.god.stub_function(os.path, "isfile")
self.god.stub_function(os_dep, "commands")
self.god.stub_function(kernel, "open")
self.god.stub_function(utils, "system")
self.god.stub_function(utils, "system_output")
self.god.stub_function(utils, "get_file")
self.god.stub_function(utils, "get_current_kernel_arch")
self.god.stub_function(utils, "cat_file_to_cmd")
self.god.stub_function(utils, "force_copy")
self.god.stub_function(utils, "extract_tarball_to_dir")
self.god.stub_function(utils, "count_cpus")
self.god.stub_function(utils, "get_os_vendor")
self.god.stub_function(kernelexpand, "expand_classic")
self.god.stub_function(kernel_config, "modules_needed")
self.god.stub_function(glob, "glob")
def dummy_mark(filename, msg):
pass
self.god.stub_with(kernel, '_mark', dummy_mark)
self.job = self.god.create_mock_class(job.job, "job")
self.job.bootloader = self.god.create_mock_class(boottool.boottool,
"boottool")
class DummyLoggingManager(object):
def tee_redirect_debug_dir(self, *args, **kwargs):
pass
def restore(self, *args, **kwargs):
pass
self.job.logging = DummyLoggingManager()
self.job.autodir = "autodir"
self.base_tree = "2.6.24"
self.tmp_dir = "tmpdir"
self.subdir = "subdir"
def tearDown(self):
self.god.unstub_all()
def construct_kernel(self):
self.kernel = kernel.kernel.__new__(kernel.kernel)
self.god.stub_function(self.kernel, "extract")
# setup
self.src_dir = os.path.join(self.tmp_dir, 'src')
self.build_dir = os.path.join(self.tmp_dir, "build_dir")
self.config_dir = os.path.join(self.subdir, 'config')
self.log_dir = os.path.join(self.subdir, 'debug')
self.results_dir = os.path.join(self.subdir, 'results')
# record
os.path.isdir.expect_call(self.src_dir).and_return(True)
utils.system.expect_call('rm -rf ' + self.src_dir)
os.path.isdir.expect_call(self.build_dir).and_return(True)
utils.system.expect_call('rm -rf ' + self.build_dir)
os.path.exists.expect_call(self.src_dir).and_return(False)
os.mkdir.expect_call(self.src_dir)
for path in [self.config_dir, self.log_dir, self.results_dir]:
os.path.exists.expect_call(path).and_return(True)
utils.system.expect_call('rm -rf ' + path)
os.mkdir.expect_call(path)
logpath = os.path.join(self.log_dir, 'build_log')
self.logfile = self.god.create_mock_class(file, "file")
kernel.open.expect_call(logpath, 'w+').and_return(self.logfile)
utils.get_current_kernel_arch.expect_call().and_return('ia64')
self.logfile.write.expect_call('BASE: %s\n' % self.base_tree)
self.kernel.extract.expect_call(self.base_tree)
# finish creation of kernel object and test (and unstub extract)
self.kernel.__init__(self.job, self.base_tree, self.subdir,
self.tmp_dir, "build_dir")
self.god.check_playback()
self.god.unstub(self.kernel, "extract")
def test_constructor(self):
self.construct_kernel()
def test_kernelexpand1(self):
self.construct_kernel()
ret_val = self.kernel.kernelexpand("/path/to/kernel")
self.assertEquals(ret_val, ["/path/to/kernel"])
self.god.check_playback()
def test_kernel_expand2(self):
self.construct_kernel()
kernel = "kernel.tar.gz"
# record
self.job.config_get.expect_call('mirror.mirrors').and_return('mirror')
kernelexpand.expand_classic.expect_call(kernel,
'mirror').and_return('patches')
# run
self.assertEquals(self.kernel.kernelexpand(kernel), 'patches')
self.god.check_playback()
def test_kernel_expand3(self):
self.construct_kernel()
kernel = "kernel.tar.gz"
# record
self.job.config_get.expect_call('mirror.mirrors')
self.job.config_get.expect_call(
'mirror.ftp_kernel_org').and_return('mirror')
korg = 'http://www.kernel.org/pub/linux/kernel'
mirrors = [
[ korg + '/v2.6', 'mirror' + '/v2.6' ],
[ korg + '/people/akpm/patches/2.6', 'mirror' + '/akpm' ],
[ korg + '/people/mbligh', 'mirror' + '/mbligh' ],
]
kernelexpand.expand_classic.expect_call(kernel,
mirrors).and_return('patches')
# run
self.assertEquals(self.kernel.kernelexpand(kernel), 'patches')
self.god.check_playback()
def test_extract1(self):
self.construct_kernel()
# setup
self.god.stub_function(self.kernel, "get_kernel_tree")
# record
os.path.exists.expect_call(self.base_tree).and_return(True)
self.kernel.get_kernel_tree.expect_call(self.base_tree)
self.job.record.expect_call('GOOD', self.subdir, 'kernel.extract')
# run
self.kernel.extract(self.base_tree)
self.god.check_playback()
self.god.unstub(self.kernel, "get_kernel_tree")
def test_extract2(self):
self.construct_kernel()
# setup
self.god.stub_function(self.kernel, "kernelexpand")
self.god.stub_function(self.kernel, "get_kernel_tree")
self.god.stub_function(self.kernel, "patch")
# record
os.path.exists.expect_call(self.base_tree).and_return(False)
components = ["component0", "component1"]
self.kernel.kernelexpand.expect_call(self.base_tree).and_return(
components)
self.kernel.get_kernel_tree.expect_call(components[0])
self.kernel.patch.expect_call(components[1])
self.job.record.expect_call('GOOD', self.subdir, 'kernel.extract')
# run
self.kernel.extract(self.base_tree)
self.god.check_playback()
self.god.unstub(self.kernel, "kernelexpand")
self.god.unstub(self.kernel, "get_kernel_tree")
self.god.unstub(self.kernel, "patch")
def test_patch1(self):
self.construct_kernel()
patches = ('patch1', 'patch2')
self.god.stub_function(self.kernel, "apply_patches")
self.god.stub_function(self.kernel, "get_patches")
#record
self.kernel.get_patches.expect_call(patches).and_return(patches)
self.kernel.apply_patches.expect_call(patches)
self.job.record.expect_call('GOOD', self.subdir, 'kernel.patch')
#run
self.kernel.patch(*patches)
self.god.check_playback()
self.god.unstub(self.kernel, "apply_patches")
self.god.unstub(self.kernel, "get_patches")
def test_patch2(self):
self.construct_kernel()
patches = []
# record
self.job.record.expect_call('GOOD', self.subdir, 'kernel.patch')
# run
self.kernel.patch(*patches)
self.god.check_playback()
def test_config(self):
self.construct_kernel()
# setup
self.god.stub_function(self.kernel, "set_cross_cc")
self.god.stub_class(kernel_config, "kernel_config")
# record
self.kernel.set_cross_cc.expect_call()
kernel_config.kernel_config.expect_new(self.job, self.build_dir,
self.config_dir, '', None,
False, self.base_tree, None)
self.job.record.expect_call('GOOD', self.subdir, 'kernel.config')
# run
self.kernel.config()
self.god.check_playback()
self.god.unstub(self.kernel, "set_cross_cc")
def test_get_patches(self):
self.construct_kernel()
# setup
patches = ['patch1', 'patch2', 'patch3']
local_patches = []
# record
for patch in patches:
dest = os.path.join(self.src_dir, os.path.basename(patch))
utils.get_file.expect_call(patch, dest)
utils.system_output.expect_call(
'md5sum ' + dest).and_return('md5sum')
local_patches.append((patch, dest, 'md5sum'))
# run and check
self.assertEquals(self.kernel.get_patches(patches), local_patches)
self.god.check_playback()
def test_apply_patches(self):
self.construct_kernel()
# setup
patches = []
patches.append(('patch1', 'patch1.gz', 'md5sum1'))
patches.append(('patch2', 'patch2.bz2', 'md5sum2'))
patches.append(('patch3', 'patch3', 'md5sum3'))
applied_patches = []
# record
os.chdir.expect_call(self.build_dir)
patch_id = "%s %s %s" % ('patch1', 'patch1', 'md5sum1')
log = "PATCH: " + patch_id + "\n"
utils.cat_file_to_cmd.expect_call('patch1.gz',
'patch -p1 > /dev/null')
self.logfile.write.expect_call(log)
applied_patches.append(patch_id)
patch_id = "%s %s %s" % ('patch2', 'patch2', 'md5sum2')
log = "PATCH: " + patch_id + "\n"
utils.cat_file_to_cmd.expect_call('patch2.bz2',
'patch -p1 > /dev/null')
self.logfile.write.expect_call(log)
applied_patches.append(patch_id)
utils.force_copy.expect_call('patch3',
self.results_dir).and_return('local_patch3')
self.job.relative_path.expect_call('local_patch3').and_return(
'rel_local_patch3')
patch_id = "%s %s %s" % ('patch3', 'rel_local_patch3', 'md5sum3')
log = "PATCH: " + patch_id + "\n"
utils.cat_file_to_cmd.expect_call('patch3',
'patch -p1 > /dev/null')
self.logfile.write.expect_call(log)
applied_patches.append(patch_id)
# run and test
self.kernel.apply_patches(patches)
self.assertEquals(self.kernel.applied_patches, applied_patches)
self.god.check_playback()
def test_get_kernel_tree1(self):
self.construct_kernel()
# record
os.path.isdir.expect_call(self.base_tree).and_return(True)
os.symlink.expect_call(self.base_tree, self.build_dir)
# run and check
self.kernel.get_kernel_tree(self.base_tree)
self.god.check_playback()
def test_get_kernel_tree2(self):
self.construct_kernel()
# record
os.path.isdir.expect_call(self.base_tree).and_return(False)
os.chdir.expect_call(os.path.dirname(self.src_dir))
tarball = os.path.join(self.src_dir, os.path.basename(self.base_tree))
utils.get_file.expect_call(self.base_tree, tarball)
utils.extract_tarball_to_dir.expect_call(tarball,
self.build_dir)
# run and check
self.kernel.get_kernel_tree(self.base_tree)
self.god.check_playback()
def test_extraversion(self):
self.construct_kernel()
tag = "tag"
# setup
self.god.stub_function(self.kernel, "config")
# record
os.chdir.expect_call(self.build_dir)
extraversion_sub = r's/^CONFIG_LOCALVERSION=\s*"\(.*\)"/CONFIG_LOCALVERSION='
cfg = self.build_dir + '/.config'
p = extraversion_sub + '"\\1-%s"/' % tag
utils.system.expect_call('mv %s %s.old' % (cfg, cfg))
utils.system.expect_call("sed '%s' < %s.old > %s" % (p, cfg, cfg))
self.kernel.config.expect_call(make='oldconfig')
# run and check
self.kernel.extraversion(tag)
self.god.check_playback()
def test_build(self):
self.construct_kernel()
self.god.stub_function(self.kernel, "extraversion")
self.god.stub_function(self.kernel, "set_cross_cc")
self.god.stub_function(self.kernel, "get_kernel_build_ver")
self.kernel.build_target = 'build_target'
# record
os_dep.commands.expect_call('gcc', 'make')
logfile = os.path.join(self.log_dir, 'kernel_build')
os.chdir.expect_call(self.build_dir)
self.kernel.extraversion.expect_call('autotest')
self.kernel.set_cross_cc.expect_call()
utils.system.expect_call('make dep', ignore_status=True)
utils.count_cpus.expect_call().and_return(4)
threads = 2 * 4
build_string = 'make -j %d %s %s' % (threads, '', 'build_target')
utils.system.expect_call(build_string)
kernel_config.modules_needed.expect_call('.config').and_return(True)
utils.system.expect_call('make -j %d modules' % (threads))
self.kernel.get_kernel_build_ver.expect_call().and_return('2.6.24')
kernel_version = re.sub('-autotest', '', '2.6.24')
self.logfile.write.expect_call('BUILD VERSION: %s\n' % kernel_version)
utils.force_copy.expect_call(self.build_dir+'/System.map',
self.results_dir)
self.job.record.expect_call('GOOD', self.subdir, 'kernel.build')
# run and check
self.kernel.build()
self.god.check_playback()
def test_build_timed(self):
self.construct_kernel()
self.god.stub_function(self.kernel, "set_cross_cc")
self.god.stub_function(self.kernel, "clean")
# record
os.chdir.expect_call(self.build_dir)
self.kernel.set_cross_cc.expect_call()
self.kernel.clean.expect_call()
build_string = "/usr/bin/time -o /dev/null make -j 8 vmlinux"
build_string += ' > /dev/null 2>&1'
utils.system.expect_call(build_string)
os.path.isfile.expect_call('vmlinux').and_return(True)
# run and check
self.kernel.build_timed(threads=8)
self.god.check_playback()
def test_clean(self):
self.construct_kernel()
# record
os.chdir.expect_call(self.build_dir)
utils.system.expect_call('make clean > /dev/null 2> /dev/null')
self.job.record.expect_call('GOOD', self.subdir, 'kernel.clean')
# run and check
self.kernel.clean()
self.god.check_playback()
def test_mkinitrd(self):
self.construct_kernel()
# record
utils.get_os_vendor.expect_call().and_return('Ubuntu')
os.path.isfile.expect_call('initrd').and_return(True)
os.remove.expect_call('initrd')
self.job.config_get.expect_call(
'kernel.mkinitrd_extra_args').and_return(None)
args = ''
glob.glob.expect_call('/lib/modules/2.6.24*').and_return(['2.6.24'])
os.path.isfile.expect_call('/usr/sbin/mkinitrd').and_return(True)
cmd = '/usr/sbin/mkinitrd'
utils.system.expect_call('%s %s -o initrd 2.6.24' % (cmd, args))
self.job.record.expect_call('GOOD', self.subdir, 'kernel.mkinitrd')
# run and check
self.kernel.mkinitrd(version="2.6.24", image="image",
system_map="system_map", initrd="initrd")
self.god.check_playback()
def test_install(self):
self.construct_kernel()
tag = 'autotest'
prefix = '/'
self.kernel.build_image = None
self.kernel.build_target = 'build_target'
self.god.stub_function(self.kernel, "get_kernel_build_ver")
self.god.stub_function(self.kernel, "mkinitrd")
# record
os.chdir.expect_call(self.build_dir)
os.path.isdir.expect_call(prefix).and_return(False)
os.mkdir.expect_call(prefix)
boot_dir = os.path.join(prefix, 'boot')
os.path.isdir.expect_call(boot_dir).and_return(False)
os.mkdir.expect_call(boot_dir)
glob.glob.expect_call(
'arch/*/boot/' + 'build_target').and_return('')
build_image = self.kernel.build_target
utils.force_copy.expect_call('vmlinux',
'/boot/vmlinux-autotest')
utils.force_copy.expect_call('build_target',
'/boot/vmlinuz-autotest')
utils.force_copy.expect_call('System.map',
'/boot/System.map-autotest')
utils.force_copy.expect_call('.config',
'/boot/config-autotest')
kernel_config.modules_needed.expect_call('.config').and_return(True)
utils.system.expect_call('make modules_install INSTALL_MOD_PATH=%s'
% prefix)
initrd = boot_dir + '/initrd-' + tag
self.kernel.get_kernel_build_ver.expect_call().and_return('2.6.24')
self.kernel.mkinitrd.expect_call('2.6.24', '/boot/vmlinuz-autotest',
'/boot/System.map-autotest', '/boot/initrd-autotest')
self.job.record.expect_call('GOOD', self.subdir, 'kernel.install')
# run and check
self.kernel.install()
self.god.check_playback()
def test_get_kernel_build_arch1(self):
self.construct_kernel()
# record
utils.get_current_kernel_arch.expect_call().and_return("i386")
# run and check
self.assertEquals(self.kernel.get_kernel_build_arch(), "i386")
self.god.check_playback()
def test_get_kernel_build_arch2(self):
self.construct_kernel()
# run and check
self.assertEquals(self.kernel.get_kernel_build_arch('i586'), "i386")
self.god.check_playback()
def test_get_kernel_build_release(self):
self.construct_kernel()
mock_file = self.god.create_mock_class(file, "file")
# record
for f in [self.build_dir + "/include/linux/version.h",
self.build_dir + "/include/linux/utsrelease.h"]:
os.path.exists.expect_call(f).and_return(True)
kernel.open.expect_call(f, 'r').and_return(mock_file)
mock_file.readlines.expect_call().and_return("Some lines")
mock_file.close.expect_call()
for f in [self.build_dir + "/include/linux/compile.h",
self.build_dir + "/include/generated/utsrelease.h",
self.build_dir + "/include/generated/compile.h"]:
os.path.exists.expect_call(f).and_return(False)
# run and test
self.kernel.get_kernel_build_release()
self.god.check_playback()
def test_get_kernel_build_ident(self):
self.construct_kernel()
self.god.stub_function(self.kernel, "get_kernel_build_release")
# record
self.kernel.get_kernel_build_release.expect_call().and_return(
("AwesomeRelease", "1.0"))
# run and check
self.assertEquals(self.kernel.get_kernel_build_ident(),
"AwesomeRelease::1.0")
self.god.check_playback()
def test_boot(self):
self.construct_kernel()
self.god.stub_function(self.kernel, "get_kernel_build_ident")
self.god.stub_function(self.kernel, "install")
self.god.stub_function(self.kernel, "_boot_kernel")
self.kernel.applied_patches = "applied_patches"
self.kernel.installed_as = None
args = ''
expected_ident = 'ident'
ident = True
# record
self.kernel.install.expect_call()
self.kernel.get_kernel_build_ident.expect_call(
).and_return(expected_ident)
self.kernel._boot_kernel.expect_call(
args, ident, expected_ident,
self.subdir, self.kernel.applied_patches)
# run and check
self.kernel.boot(args=args, ident=ident)
self.god.check_playback()
if __name__ == "__main__":
unittest.main()