def test_live_build_cross_build(self): with ExitStack() as resources: tmpdir = resources.enter_context(TemporaryDirectory()) root_dir = os.path.join(tmpdir, 'root_dir') mock = LiveBuildMocker(root_dir) resources.enter_context(LogCapture()) resources.enter_context( patch('ubuntu_image.helpers.run', mock.run)) resources.enter_context( patch('ubuntu_image.helpers.get_host_arch', return_value='amd64')) resources.enter_context( patch('ubuntu_image.helpers.find_executable', return_value='/usr/bin/qemu-arm-static-fake')) env = OrderedDict() env['PROJECT'] = 'ubuntu-server' env['SUITE'] = 'xenial' env['ARCH'] = 'armhf' live_build(root_dir, env) self.assertEqual(len(mock.call_args_list), 3) self.assertEqual( mock.call_args_list[1], ['sudo', 'PROJECT=ubuntu-server', 'SUITE=xenial', 'ARCH=armhf', 'lb', 'config', '--bootstrap-qemu-arch', 'armhf', '--bootstrap-qemu-static', '/usr/bin/qemu-arm-static-fake', '--architectures', 'armhf']) self.assertEqual( mock.call_args_list[2], ['sudo', 'PROJECT=ubuntu-server', 'SUITE=xenial', 'ARCH=armhf', 'lb', 'build'])
def test_live_build_no_cross_build(self): with ExitStack() as resources: tmpdir = resources.enter_context(TemporaryDirectory()) root_dir = os.path.join(tmpdir, 'root_dir') mock = LiveBuildMocker(root_dir) resources.enter_context(LogCapture()) resources.enter_context( patch('ubuntu_image.helpers.run', mock.run)) resources.enter_context( patch('ubuntu_image.helpers.get_host_arch', return_value='amd64')) resources.enter_context( patch('ubuntu_image.helpers.find_executable', return_value='/usr/bin/qemu-arm-static')) env = OrderedDict() env['PROJECT'] = 'ubuntu-server' env['SUITE'] = 'xenial' env['ARCH'] = 'armhf' live_build(root_dir, env, enable_cross_build=False) # Make sure that if we explicity disable cross-building, no # cross-build arguments are passed to lb config self.assertEqual(len(mock.call_args_list), 3) self.assertEqual( mock.call_args_list[1], ['sudo', 'PROJECT=ubuntu-server', 'SUITE=xenial', 'ARCH=armhf', 'lb', 'config'])
def test_live_build_with_full_args(self): with ExitStack() as resources: tmpdir = resources.enter_context(TemporaryDirectory()) root_dir = os.path.join(tmpdir, 'root_dir') mock = LiveBuildMocker(root_dir) resources.enter_context(LogCapture()) resources.enter_context(patch('ubuntu_image.helpers.run', mock.run)) resources.enter_context( patch('ubuntu_image.helpers.get_host_arch', return_value='amd64')) env = OrderedDict() env['PROJECT'] = 'ubuntu-cpc' env['SUITE'] = 'xenial' env['ARCH'] = 'amd64' env['SUBPROJECT'] = 'live' env['SUBARCH'] = 'ubuntu-cpc' env['PROPOSED'] = 'true' env['IMAGEFORMAT'] = 'ext4' env['EXTRA_PPAS'] = '******' live_build(root_dir, env) self.assertEqual(len(mock.call_args_list), 3) self.assertEqual(mock.call_args_list[1], [ 'sudo', 'PROJECT=ubuntu-cpc', 'SUITE=xenial', 'ARCH=amd64', 'SUBPROJECT=live', 'SUBARCH=ubuntu-cpc', 'PROPOSED=true', 'IMAGEFORMAT=ext4', 'EXTRA_PPAS=foo1/bar1 foo2', 'lb', 'config' ]) self.assertEqual(mock.call_args_list[2], [ 'sudo', 'PROJECT=ubuntu-cpc', 'SUITE=xenial', 'ARCH=amd64', 'SUBPROJECT=live', 'SUBARCH=ubuntu-cpc', 'PROPOSED=true', 'IMAGEFORMAT=ext4', 'EXTRA_PPAS=foo1/bar1 foo2', 'lb', 'build' ])
def test_live_build_env_livecd(self): with ExitStack() as resources: tmpdir = resources.enter_context(TemporaryDirectory()) auto_dir = os.path.join(tmpdir, 'auto') os.mkdir(auto_dir) with open(os.path.join(auto_dir, 'config'), 'w') as fp: fp.write('DUMMY') root_dir = os.path.join(tmpdir, 'root_dir') mock = LiveBuildMocker(root_dir) resources.enter_context(LogCapture()) resources.enter_context( patch('ubuntu_image.helpers.run', mock.run)) resources.enter_context( envar('UBUNTU_IMAGE_LIVECD_ROOTFS_AUTO_PATH', auto_dir)) env = OrderedDict() env['PROJECT'] = 'ubuntu-server' env['SUITE'] = 'xenial' env['ARCH'] = 'amd64' live_build(root_dir, env) # Make sure that we had no dpkg -L call made. self.assertEqual(len(mock.call_args_list), 2) self.assertEqual( mock.call_args_list[0], ['sudo', 'PROJECT=ubuntu-server', 'SUITE=xenial', 'ARCH=amd64', 'lb', 'config']) self.assertEqual( mock.call_args_list[1], ['sudo', 'PROJECT=ubuntu-server', 'SUITE=xenial', 'ARCH=amd64', 'lb', 'build']) config_path = os.path.join(root_dir, 'auto', 'config') self.assertTrue(os.path.exists(config_path)) with open(os.path.join(config_path), 'r') as fp: self.assertEqual(fp.read(), 'DUMMY')
def test_fs_contents(self): # Run the action classic builder through the steps needed to # at least call `lb config && lb build`. output = self._resources.enter_context(NamedTemporaryFile()) workdir = self._resources.enter_context(TemporaryDirectory()) unpackdir = os.path.join(workdir, 'unpack') mock = LiveBuildMocker(unpackdir) args = SimpleNamespace( cmd='classic', project='ubuntu-cpc', suite='xenial', arch='amd64', image_format='img', output=output.name, subproject='subproject', subarch='subarch', output_dir=None, workdir=workdir, cloud_init=None, with_proposed='1', extra_ppas='******', hooks_directory=[], disk_info=None, disable_console_conf=False, gadget_tree=self.gadget_tree, filesystem=None, ) state = self._resources.enter_context(XXXClassicBuilder(args)) # Mock out rootfs generation `live_build` # and create dummy top-level filesystem layout. self._resources.enter_context( patch('ubuntu_image.helpers.run', mock.run)) state.run_thru('populate_bootfs_contents') # How does the root and boot file systems look? files = [ '{boot}/EFI/boot/bootx64.efi', '{boot}/EFI/boot/grubx64.efi', '{boot}/EFI/ubuntu/grub.cfg', '{root}/boot/', ] for filename in files: path = filename.format( root=state.rootfs, boot=state.gadget.volumes['pc'].bootfs, ) self.assertTrue(os.path.exists(path), path) # Simply check if all top-level files and folders exist. for dirname in DIRS_UNDER_ROOTFS: path = os.path.join(state.rootfs, dirname) self.assertTrue(os.path.exists(path), path)
def test_live_build_cross_build_no_static(self): with ExitStack() as resources: tmpdir = resources.enter_context(TemporaryDirectory()) root_dir = os.path.join(tmpdir, 'root_dir') mock = LiveBuildMocker(root_dir) resources.enter_context(LogCapture()) resources.enter_context(patch('ubuntu_image.helpers.run', mock.run)) resources.enter_context( patch('ubuntu_image.helpers.get_host_arch', return_value='amd64')) resources.enter_context( patch('ubuntu_image.helpers.find_executable', return_value=None)) env = OrderedDict() env['PROJECT'] = 'ubuntu-server' env['SUITE'] = 'xenial' env['ARCH'] = 'armhf' with self.assertRaises(DependencyError) as cm: live_build(root_dir, env) self.assertEqual(len(mock.call_args_list), 1) self.assertEqual(cm.exception.name, 'qemu-arm-static')
def test_live_build(self): with ExitStack() as resources: tmpdir = resources.enter_context(TemporaryDirectory()) root_dir = os.path.join(tmpdir, 'root_dir') mock = LiveBuildMocker(root_dir) resources.enter_context(LogCapture()) resources.enter_context( patch('ubuntu_image.helpers.run', mock.run)) env = OrderedDict() env['PROJECT'] = 'ubuntu-server' env['SUITE'] = 'xenial' env['ARCH'] = 'amd64' live_build(root_dir, env) self.assertEqual(len(mock.call_args_list), 3) self.assertEqual( mock.call_args_list[1], ['sudo', 'PROJECT=ubuntu-server', 'SUITE=xenial', 'ARCH=amd64', 'lb', 'config']) self.assertEqual( mock.call_args_list[2], ['sudo', 'PROJECT=ubuntu-server', 'SUITE=xenial', 'ARCH=amd64', 'lb', 'build'])