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)
Example #4
0
    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)
Example #12
0
    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')))
Example #15
0
    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')))