def test_install_packages_error(self): '''install_packages() with errors''' # sources.list with invalid format self._setup_foonux_config() with open(os.path.join(self.configdir, 'Foonux 1.2', 'sources.list'), 'w') as f: f.write('bogus format') try: impl.install_packages(self.rootdir, self.configdir, 'Foonux 1.2', [('tzdata', None)], False, self.cachedir) self.fail('install_packages() unexpectedly succeeded with broken sources.list') except SystemError as e: self.assertTrue('bogus' in str(e)) self.assertFalse('Exception' in str(e)) # sources.list with wrong server with open(os.path.join(self.configdir, 'Foonux 1.2', 'sources.list'), 'w') as f: f.write('deb http://archive.ubuntu.com/nosuchdistro/ lucid main\n') try: impl.install_packages(self.rootdir, self.configdir, 'Foonux 1.2', [('tzdata', None)], False, self.cachedir) self.fail('install_packages() unexpectedly succeeded with broken server URL') except SystemError as e: self.assertTrue('nosuchdistro' in str(e), str(e)) self.assertTrue('index files failed to download' in str(e))
def test_install_packages_error(self): '''install_packages() with errors''' # sources.list with invalid format self._setup_foonux_config() with open(os.path.join(self.configdir, 'Foonux 1.2', 'sources.list'), 'w') as f: f.write('bogus format') try: impl.install_packages(self.rootdir, self.configdir, 'Foonux 1.2', [('tzdata', None)], False, self.cachedir) self.fail( 'install_packages() unexpectedly succeeded with broken sources.list' ) except SystemError as e: self.assertTrue('bogus' in str(e)) self.assertFalse('Exception' in str(e)) # sources.list with wrong server with open(os.path.join(self.configdir, 'Foonux 1.2', 'sources.list'), 'w') as f: f.write( 'deb http://archive.ubuntu.com/nosuchdistro/ precise main\n') try: impl.install_packages(self.rootdir, self.configdir, 'Foonux 1.2', [('tzdata', None)], False, self.cachedir) self.fail( 'install_packages() unexpectedly succeeded with broken server URL' ) except SystemError as e: self.assertTrue('nosuchdistro' in str(e), str(e)) self.assertTrue('index files failed to download' in str(e))
def test_install_packages_armhf(self): '''install_packages() for foreign architecture armhf''' self._setup_foonux_config() obsolete = impl.install_packages(self.rootdir, self.configdir, 'Foonux 1.2', [ ('coreutils', '8.13-3ubuntu3'), ('libc6', '2.15-0ubuntu9'), ], False, self.cachedir, architecture='armhf') self.assertEqual( obsolete, 'libc6 version 2.15-0ubuntu9 required, but 2.15-0ubuntu10 is available\n' ) self.assertTrue( os.path.exists(os.path.join(self.rootdir, 'usr/bin/stat'))) self.assert_elf_arch(os.path.join(self.rootdir, 'usr/bin/stat'), 'armhf') self.assertTrue( os.path.exists( os.path.join(self.rootdir, 'usr/share/doc/libc6/copyright'))) # caches packages cache = os.listdir( os.path.join(self.cachedir, 'Foonux 1.2', 'apt', 'var', 'cache', 'apt', 'archives')) self.assertTrue('coreutils_8.13-3ubuntu3_armhf.deb' in cache, cache) self.assertTrue('libc6_2.15-0ubuntu10_armhf.deb' in cache, cache)
def test_install_packages_unversioned(self): '''install_packages() without versions and no cache''' self._setup_foonux_config() obsolete = impl.install_packages(self.rootdir, self.configdir, 'Foonux 1.2', [('coreutils', None), ('tzdata', None), ], False, None) self.assertEqual(obsolete, '') self.assertTrue(os.path.exists(os.path.join(self.rootdir, 'usr/bin/stat'))) self.assert_elf_arch(os.path.join(self.rootdir, 'usr/bin/stat'), impl.get_system_architecture()) self.assertTrue(os.path.exists(os.path.join(self.rootdir, 'usr/lib/debug/usr/bin/stat'))) self.assertTrue(os.path.exists(os.path.join(self.rootdir, 'usr/share/zoneinfo/zone.tab'))) # does not clobber config dir self.assertEqual(os.listdir(self.configdir), ['Foonux 1.2']) self.assertEqual(sorted(os.listdir(os.path.join(self.configdir, 'Foonux 1.2'))), ['armhf', 'codename', 'sources.list']) self.assertEqual(os.listdir(os.path.join(self.configdir, 'Foonux 1.2', 'armhf')), ['sources.list']) # no cache self.assertEqual(os.listdir(self.cachedir), [])
def test_install_packages_system(self): '''install_packages() with system configuration''' # trigger an unrelated package query here to get the cache set up, # reproducing an install failure when the internal caches are not # reset properly impl.get_version('dash') self._setup_foonux_config() result = impl.install_packages(self.rootdir, None, None, [ ('coreutils', impl.get_version('coreutils')), ('tzdata', '1.1'), ], False, self.cachedir) self.assertTrue( os.path.exists(os.path.join(self.rootdir, 'usr/bin/stat'))) self.assertTrue( os.path.exists( os.path.join(self.rootdir, 'usr/share/zoneinfo/zone.tab'))) # complains about obsolete packages self.assertGreaterEqual(len(result.splitlines()), 1) self.assertTrue('tzdata' in result) self.assertTrue('1.1' in result) # caches packages cache = os.listdir( os.path.join(self.cachedir, 'system', 'apt', 'var', 'cache', 'apt', 'archives')) cache_names = [p.split('_')[0] for p in cache] self.assertTrue('coreutils' in cache_names) self.assertEqual('coreutils-dbgsym' in cache_names, self.has_dbgsym) self.assertTrue('tzdata' in cache_names) # works with relative paths and existing cache os.unlink(os.path.join(self.rootdir, 'usr/bin/stat')) os.unlink(os.path.join(self.rootdir, 'packages.txt')) orig_cwd = os.getcwd() try: os.chdir(self.workdir) impl.install_packages('root', None, None, [('coreutils', None)], False, 'cache') finally: os.chdir(orig_cwd) self.assertTrue( os.path.exists(os.path.join(self.rootdir, 'usr/bin/stat')))
def test_install_packages_system(self): '''install_packages() with system configuration''' # trigger an unrelated package query here to get the cache set up, # reproducing an install failure when the internal caches are not # reset properly impl.get_version('dash') self._setup_foonux_config() result = impl.install_packages(self.rootdir, None, None, [('coreutils', impl.get_version('coreutils')), ('tzdata', '1.1'), ], False, self.cachedir) self.assertTrue(os.path.exists(os.path.join(self.rootdir, 'usr/bin/stat'))) self.assertTrue(os.path.exists(os.path.join(self.rootdir, 'usr/share/zoneinfo/zone.tab'))) # complains about obsolete packages self.assertEqual(len(result.splitlines()), 1) self.assertTrue('tzdata' in result) self.assertTrue('1.1' in result) # caches packages cache = os.listdir(os.path.join(self.cachedir, 'system', 'apt', 'var', 'cache', 'apt', 'archives')) cache_names = [p.split('_')[0] for p in cache] self.assertTrue('coreutils' in cache_names) self.assertEqual('coreutils-dbgsym' in cache_names, self.has_dbgsym) self.assertTrue('tzdata' in cache_names) # works with relative paths and existing cache os.unlink(os.path.join(self.rootdir, 'usr/bin/stat')) orig_cwd = os.getcwd() try: os.chdir(self.workdir) impl.install_packages('root', None, None, [('coreutils', None)], False, 'cache') finally: os.chdir(orig_cwd) self.assertTrue(os.path.exists(os.path.join(self.rootdir, 'usr/bin/stat')))
def test_install_packages_permanent_sandbox_repack(self): self._setup_foonux_config() apache_bin_path = os.path.join(self.rootdir, 'usr/sbin/apache2') impl.install_packages(self.rootdir, self.configdir, 'Foonux 1.2', [('apache2-mpm-worker', None)], False, self.cachedir, permanent_rootdir=True) self.assertTrue( os.readlink(apache_bin_path).endswith('mpm-worker/apache2')) impl.install_packages(self.rootdir, self.configdir, 'Foonux 1.2', [('apache2-mpm-event', None)], False, self.cachedir, permanent_rootdir=True) self.assertTrue( os.readlink(apache_bin_path).endswith('mpm-event/apache2'), 'should have installed mpm-event, but have mpm-worker.') impl.install_packages(self.rootdir, self.configdir, 'Foonux 1.2', [('apache2-mpm-worker', None)], False, self.cachedir, permanent_rootdir=True) self.assertTrue( os.readlink(apache_bin_path).endswith('mpm-worker/apache2'), 'should have installed mpm-worker, but have mpm-event.')
def test_install_packages_unversioned(self): '''install_packages() without versions and no cache''' self._setup_foonux_config() impl.install_packages(self.rootdir, self.configdir, 'Foonux 1.2', [('coreutils', None), ('tzdata', None), ], False, None) self.assertTrue(os.path.exists(os.path.join(self.rootdir, 'usr/bin/stat'))) self.assertTrue(os.path.exists(os.path.join(self.rootdir, 'usr/lib/debug/usr/bin/stat'))) self.assertTrue(os.path.exists(os.path.join(self.rootdir, 'usr/share/zoneinfo/zone.tab'))) # does not clobber config dir self.assertEqual(os.listdir(self.configdir), ['Foonux 1.2']) self.assertEqual(os.listdir(os.path.join(self.configdir, 'Foonux 1.2')), ['sources.list']) # no cache self.assertEqual(os.listdir(self.cachedir), [])
def test_install_packages_unversioned(self): '''install_packages() without versions and no cache''' self._setup_foonux_config() obsolete = impl.install_packages(self.rootdir, self.configdir, 'Foonux 1.2', [ ('coreutils', None), ('tzdata', None), ], False, None) self.assertEqual(obsolete, '') self.assertTrue( os.path.exists(os.path.join(self.rootdir, 'usr/bin/stat'))) self.assert_elf_arch(os.path.join(self.rootdir, 'usr/bin/stat'), impl.get_system_architecture()) self.assertTrue( os.path.exists( os.path.join(self.rootdir, 'usr/lib/debug/usr/bin/stat'))) self.assertTrue( os.path.exists( os.path.join(self.rootdir, 'usr/share/zoneinfo/zone.tab'))) # does not clobber config dir self.assertEqual(os.listdir(self.configdir), ['Foonux 1.2']) self.assertEqual( sorted(os.listdir(os.path.join(self.configdir, 'Foonux 1.2'))), ['armhf', 'codename', 'sources.list']) self.assertEqual( os.listdir(os.path.join(self.configdir, 'Foonux 1.2', 'armhf')), ['sources.list']) # no cache self.assertEqual(os.listdir(self.cachedir), []) # keeps track of package versions with open(os.path.join(self.rootdir, 'packages.txt')) as f: pkglist = f.read().splitlines() self.assertIn('coreutils 8.13-3ubuntu3', pkglist) self.assertIn('coreutils-dbgsym 8.13-3ubuntu3', pkglist) self.assertIn('tzdata 2012b-1', pkglist) self.assertEqual(len(pkglist), 3, str(pkglist))
def test_install_packages_permanent_sandbox_repack(self): self._setup_foonux_config() apache_bin_path = os.path.join(self.rootdir, 'usr/sbin/apache2') impl.install_packages(self.rootdir, self.configdir, 'Foonux 1.2', [('apache2-mpm-worker', None)], False, self.cachedir, permanent_rootdir=True) self.assertTrue(os.readlink(apache_bin_path).endswith('mpm-worker/apache2')) impl.install_packages(self.rootdir, self.configdir, 'Foonux 1.2', [('apache2-mpm-event', None)], False, self.cachedir, permanent_rootdir=True) self.assertTrue(os.readlink(apache_bin_path).endswith('mpm-event/apache2'), 'should have installed mpm-event, but have mpm-worker.') impl.install_packages(self.rootdir, self.configdir, 'Foonux 1.2', [('apache2-mpm-worker', None)], False, self.cachedir, permanent_rootdir=True) self.assertTrue(os.readlink(apache_bin_path).endswith('mpm-worker/apache2'), 'should have installed mpm-worker, but have mpm-event.')
def test_install_packages_armhf(self): '''install_packages() for foreign architecture armhf''' self._setup_foonux_config() obsolete = impl.install_packages(self.rootdir, self.configdir, 'Foonux 1.2', [('coreutils', '8.13-3ubuntu3'), ('libc6', '2.15-0ubuntu9'), ], False, self.cachedir, architecture='armhf') self.assertEqual(obsolete, 'libc6 version 2.15-0ubuntu9 required, but 2.15-0ubuntu10 is available\n') self.assertTrue(os.path.exists(os.path.join(self.rootdir, 'usr/bin/stat'))) self.assert_elf_arch(os.path.join(self.rootdir, 'usr/bin/stat'), 'armhf') self.assertTrue(os.path.exists(os.path.join(self.rootdir, 'usr/share/doc/libc6/copyright'))) # caches packages cache = os.listdir(os.path.join(self.cachedir, 'Foonux 1.2', 'apt', 'var', 'cache', 'apt', 'archives')) self.assertTrue('coreutils_8.13-3ubuntu3_armhf.deb' in cache, cache) self.assertTrue('libc6_2.15-0ubuntu10_armhf.deb' in cache, cache)
def test_install_packages_permanent_sandbox(self): '''install_packages() with a permanent sandbox''' self._setup_foonux_config() zonetab = os.path.join(self.rootdir, 'usr/share/zoneinfo/zone.tab') impl.install_packages(self.rootdir, self.configdir, 'Foonux 1.2', [('tzdata', None)], False, self.cachedir, permanent_rootdir=True) # This will now be using a Cache with our rootdir. archives = apt_pkg.config.find_dir('Dir::Cache::archives') tzdata = glob.glob(os.path.join(archives, 'tzdata*.deb')) if not tzdata: self.fail('tzdata was not downloaded') tzdata_written = os.path.getctime(tzdata[0]) zonetab_written = os.path.getctime(zonetab) impl.install_packages(self.rootdir, self.configdir, 'Foonux 1.2', [('coreutils', None), ('tzdata', None)], False, self.cachedir, permanent_rootdir=True) if not glob.glob(os.path.join(archives, 'coreutils*.deb')): self.fail('coreutils was not downloaded.') self.assertEqual(os.path.getctime(tzdata[0]), tzdata_written, 'tzdata downloaded twice.') self.assertEqual(zonetab_written, os.path.getctime(zonetab), 'zonetab written twice.') self.assertTrue(os.path.exists( os.path.join(self.rootdir, 'usr/bin/stat'))) # Prevent packages from downloading. apt_pkg.config.set('Acquire::http::Proxy', 'http://nonexistent') self.assertRaises(SystemExit, impl.install_packages, self.rootdir, self.configdir, 'Foonux 1.2', [('libc6', None)], False, self.cachedir, permanent_rootdir=True) # These packages exist, so attempting to install them should not fail. impl.install_packages(self.rootdir, self.configdir, 'Foonux 1.2', [('coreutils', None), ('tzdata', None)], False, self.cachedir, permanent_rootdir=True) apt_pkg.config.set('Acquire::http::Proxy', '')
def test_install_packages_versioned(self): '''install_packages() with versions and with cache''' self._setup_foonux_config(updates=True) obsolete = impl.install_packages( self.rootdir, self.configdir, 'Foonux 1.2', [ ('coreutils', '8.13-3ubuntu3'), # should not come from updates ('libc6', '2.15-0ubuntu10'), ('tzdata', None), # should come from -updates, > 2012b-1 ], False, self.cachedir) def sandbox_ver(pkg): with gzip.open( os.path.join(self.rootdir, 'usr/share/doc', pkg, 'changelog.Debian.gz')) as f: return f.readline().decode().split()[1][1:-1] self.assertEqual(obsolete, '') # packages get installed self.assertTrue( os.path.exists(os.path.join(self.rootdir, 'usr/bin/stat'))) self.assert_elf_arch(os.path.join(self.rootdir, 'usr/bin/stat'), impl.get_system_architecture()) self.assertTrue( os.path.exists( os.path.join(self.rootdir, 'usr/lib/debug/usr/bin/stat'))) self.assertTrue( os.path.exists( os.path.join(self.rootdir, 'usr/share/zoneinfo/zone.tab'))) self.assertTrue( os.path.exists( os.path.join(self.rootdir, 'usr/share/doc/libc6/copyright'))) # their versions are as expected self.assertEqual(sandbox_ver('coreutils'), '8.13-3ubuntu3') self.assertEqual(sandbox_ver('libc6'), '2.15-0ubuntu10') self.assertEqual(sandbox_ver('libc6-dbg'), '2.15-0ubuntu10') self.assertGreater(sandbox_ver('tzdata'), '2012b-1') with open(os.path.join(self.rootdir, 'packages.txt')) as f: pkglist = f.read().splitlines() self.assertIn('coreutils 8.13-3ubuntu3', pkglist) self.assertIn('coreutils-dbgsym 8.13-3ubuntu3', pkglist) self.assertIn('libc6 2.15-0ubuntu10', pkglist) self.assertIn('libc6-dbg 2.15-0ubuntu10', pkglist) self.assertIn('tzdata ' + sandbox_ver('tzdata'), pkglist) self.assertEqual(len(pkglist), 5, str(pkglist)) # does not clobber config dir self.assertEqual(os.listdir(self.configdir), ['Foonux 1.2']) self.assertEqual( sorted(os.listdir(os.path.join(self.configdir, 'Foonux 1.2'))), ['armhf', 'codename', 'sources.list']) self.assertEqual( os.listdir(os.path.join(self.configdir, 'Foonux 1.2', 'armhf')), ['sources.list']) # caches packages, and their versions are as expected cache = os.listdir( os.path.join(self.cachedir, 'Foonux 1.2', 'apt', 'var', 'cache', 'apt', 'archives')) cache_versions = {} for p in cache: try: (name, ver) = p.split('_')[:2] cache_versions[name] = ver except ValueError: pass # not a .deb, ignore self.assertEqual(cache_versions['coreutils'], '8.13-3ubuntu3') self.assertEqual(cache_versions['coreutils-dbgsym'], '8.13-3ubuntu3') self.assertIn('tzdata', cache_versions) self.assertEqual(cache_versions['libc6'], '2.15-0ubuntu10') self.assertEqual(cache_versions['libc6-dbg'], '2.15-0ubuntu10') # installs cached packages os.unlink(os.path.join(self.rootdir, 'usr/bin/stat')) os.unlink(os.path.join(self.rootdir, 'packages.txt')) obsolete = impl.install_packages(self.rootdir, self.configdir, 'Foonux 1.2', [ ('coreutils', '8.13-3ubuntu3'), ], False, self.cachedir) self.assertEqual(obsolete, '') self.assertTrue( os.path.exists(os.path.join(self.rootdir, 'usr/bin/stat'))) # complains about obsolete packages result = impl.install_packages(self.rootdir, self.configdir, 'Foonux 1.2', [('gnome-common', '1.1')]) self.assertEqual(len(result.splitlines()), 1) self.assertTrue('gnome-common' in result) self.assertTrue('1.1' in result) # ... but installs the current version anyway self.assertTrue( os.path.exists( os.path.join(self.rootdir, 'usr/bin/gnome-autogen.sh'))) self.assertGreaterEqual(sandbox_ver('gnome-common'), '3.1.0-0ubuntu1') # does not crash on nonexisting packages result = impl.install_packages(self.rootdir, self.configdir, 'Foonux 1.2', [('buggerbogger', None)]) self.assertEqual(len(result.splitlines()), 1) self.assertTrue('buggerbogger' in result) self.assertTrue('not exist' in result) # can interleave with other operations dpkg = subprocess.Popen(['dpkg-query', '-Wf${Version}', 'dash'], stdout=subprocess.PIPE) dash_version = dpkg.communicate()[0].decode() self.assertEqual(dpkg.returncode, 0) self.assertEqual(impl.get_version('dash'), dash_version) self.assertRaises(ValueError, impl.get_available_version, 'buggerbogger') # still installs packages after above operations os.unlink(os.path.join(self.rootdir, 'usr/bin/stat')) os.unlink(os.path.join(self.rootdir, 'packages.txt')) impl.install_packages(self.rootdir, self.configdir, 'Foonux 1.2', [ ('coreutils', '8.13-3ubuntu3'), ('dpkg', None), ], False, self.cachedir) self.assertTrue( os.path.exists(os.path.join(self.rootdir, 'usr/bin/stat'))) self.assertTrue( os.path.exists(os.path.join(self.rootdir, 'usr/bin/dpkg')))
def test_install_packages_versioned(self): '''install_packages() with versions and with cache''' self._setup_foonux_config() impl.install_packages(self.rootdir, self.configdir, 'Foonux 1.2', [('coreutils', '7.4-2ubuntu2'), ('libc6', '2.11.1-0ubuntu7'), ('tzdata', '2010i-1'), ], False, self.cachedir) self.assertTrue(os.path.exists(os.path.join(self.rootdir, 'usr/bin/stat'))) self.assertTrue(os.path.exists(os.path.join(self.rootdir, 'usr/lib/debug/usr/bin/stat'))) self.assertTrue(os.path.exists(os.path.join(self.rootdir, 'usr/share/zoneinfo/zone.tab'))) self.assertTrue(os.path.exists(os.path.join(self.rootdir, 'usr/share/doc/libc6/copyright'))) # does not clobber config dir self.assertEqual(os.listdir(self.configdir), ['Foonux 1.2']) self.assertEqual(os.listdir(os.path.join(self.configdir, 'Foonux 1.2')), ['sources.list']) # caches packages cache = os.listdir(os.path.join(self.cachedir, 'Foonux 1.2', 'apt', 'var', 'cache', 'apt', 'archives')) cache_names = [p.split('_')[0] for p in cache] self.assertTrue('coreutils' in cache_names) self.assertTrue('coreutils-dbgsym' in cache_names) self.assertTrue('tzdata' in cache_names) self.assertTrue('libc6' in cache_names) self.assertTrue('libc6-dbg' in cache_names) # installs cached packages os.unlink(os.path.join(self.rootdir, 'usr/bin/stat')) impl.install_packages(self.rootdir, self.configdir, 'Foonux 1.2', [('coreutils', '7.4-2ubuntu2'), ], False, self.cachedir) self.assertTrue(os.path.exists(os.path.join(self.rootdir, 'usr/bin/stat'))) # complains about obsolete packages result = impl.install_packages(self.rootdir, self.configdir, 'Foonux 1.2', [('gnome-common', '1.1')]) self.assertEqual(len(result.splitlines()), 1) self.assertTrue('gnome-common' in result) self.assertTrue('1.1' in result) # ... but installs the current version anyway self.assertTrue(os.path.exists(os.path.join(self.rootdir, 'usr/bin/gnome-autogen.sh'))) # does not crash on nonexisting packages result = impl.install_packages(self.rootdir, self.configdir, 'Foonux 1.2', [('buggerbogger', None)]) self.assertEqual(len(result.splitlines()), 1) self.assertTrue('buggerbogger' in result) self.assertTrue('not exist' in result) # can interleave with other operations dpkg = subprocess.Popen(['dpkg-query', '-Wf${Version}', 'dash'], stdout=subprocess.PIPE) coreutils_version = dpkg.communicate()[0].decode() self.assertEqual(dpkg.returncode, 0) self.assertEqual(impl.get_version('dash'), coreutils_version) self.assertRaises(ValueError, impl.get_available_version, 'buggerbogger') # still installs packages after above operations os.unlink(os.path.join(self.rootdir, 'usr/bin/stat')) impl.install_packages(self.rootdir, self.configdir, 'Foonux 1.2', [('coreutils', '7.4-2ubuntu2'), ('dpkg', None), ], False, self.cachedir) self.assertTrue(os.path.exists(os.path.join(self.rootdir, 'usr/bin/stat'))) self.assertTrue(os.path.exists(os.path.join(self.rootdir, 'usr/bin/dpkg')))
def test_install_packages_versioned(self): '''install_packages() with versions and with cache''' self._setup_foonux_config() obsolete = impl.install_packages(self.rootdir, self.configdir, 'Foonux 1.2', [('coreutils', '8.13-3ubuntu3'), ('libc6', '2.15-0ubuntu10'), ('tzdata', '2012b-1'), ], False, self.cachedir) self.assertEqual(obsolete, '') self.assertTrue(os.path.exists(os.path.join(self.rootdir, 'usr/bin/stat'))) self.assert_elf_arch(os.path.join(self.rootdir, 'usr/bin/stat'), impl.get_system_architecture()) self.assertTrue(os.path.exists(os.path.join(self.rootdir, 'usr/lib/debug/usr/bin/stat'))) self.assertTrue(os.path.exists(os.path.join(self.rootdir, 'usr/share/zoneinfo/zone.tab'))) self.assertTrue(os.path.exists(os.path.join(self.rootdir, 'usr/share/doc/libc6/copyright'))) # does not clobber config dir self.assertEqual(os.listdir(self.configdir), ['Foonux 1.2']) self.assertEqual(sorted(os.listdir(os.path.join(self.configdir, 'Foonux 1.2'))), ['armhf', 'codename', 'sources.list']) self.assertEqual(os.listdir(os.path.join(self.configdir, 'Foonux 1.2', 'armhf')), ['sources.list']) # caches packages cache = os.listdir(os.path.join(self.cachedir, 'Foonux 1.2', 'apt', 'var', 'cache', 'apt', 'archives')) cache_names = [p.split('_')[0] for p in cache] self.assertTrue('coreutils' in cache_names) self.assertTrue('coreutils-dbgsym' in cache_names) self.assertTrue('tzdata' in cache_names) self.assertTrue('libc6' in cache_names) self.assertTrue('libc6-dbg' in cache_names) # installs cached packages os.unlink(os.path.join(self.rootdir, 'usr/bin/stat')) obsolete = impl.install_packages(self.rootdir, self.configdir, 'Foonux 1.2', [('coreutils', '8.13-3ubuntu3'), ], False, self.cachedir) self.assertEqual(obsolete, '') self.assertTrue(os.path.exists( os.path.join(self.rootdir, 'usr/bin/stat'))) # complains about obsolete packages result = impl.install_packages(self.rootdir, self.configdir, 'Foonux 1.2', [('gnome-common', '1.1')]) self.assertEqual(len(result.splitlines()), 1) self.assertTrue('gnome-common' in result) self.assertTrue('1.1' in result) # ... but installs the current version anyway self.assertTrue(os.path.exists( os.path.join(self.rootdir, 'usr/bin/gnome-autogen.sh'))) # does not crash on nonexisting packages result = impl.install_packages(self.rootdir, self.configdir, 'Foonux 1.2', [('buggerbogger', None)]) self.assertEqual(len(result.splitlines()), 1) self.assertTrue('buggerbogger' in result) self.assertTrue('not exist' in result) # can interleave with other operations dpkg = subprocess.Popen(['dpkg-query', '-Wf${Version}', 'dash'], stdout=subprocess.PIPE) coreutils_version = dpkg.communicate()[0].decode() self.assertEqual(dpkg.returncode, 0) self.assertEqual(impl.get_version('dash'), coreutils_version) self.assertRaises(ValueError, impl.get_available_version, 'buggerbogger') # still installs packages after above operations os.unlink(os.path.join(self.rootdir, 'usr/bin/stat')) impl.install_packages(self.rootdir, self.configdir, 'Foonux 1.2', [('coreutils', '8.13-3ubuntu3'), ('dpkg', None), ], False, self.cachedir) self.assertTrue(os.path.exists(os.path.join(self.rootdir, 'usr/bin/stat'))) self.assertTrue(os.path.exists(os.path.join(self.rootdir, 'usr/bin/dpkg')))