示例#1
0
    def test_db_remove(self):
        tmp_db = self._make_tmp_db_path()
        db = DB(tmp_db)
        self.assertFalse(db.has_package('foo'))
        files = package_files(FCL([('f1', 'c1'), ('f2', 'c2')]),
                              FCL([('e1', 'ec1'), ('e2', 'ec2')]), 'f_chk',
                              'ef_chk')
        reqs = None
        new_entry = PE('foo', '1.2.3', 1, 0, [], {}, files)
        db.add_package(new_entry)
        self.assertTrue(db.has_package('foo'))
        self.assertEqual(['foo'], db.list_all())
        self.assertEqual(PE('foo', '1.2.3', 1, 0, [], {}, files),
                         db.find_package('foo'))

        db.remove_package('foo')
        self.assertFalse(db.has_package('foo'))
        self.assertEqual([], db.list_all())
        self.assertEqual(None, db.find_package('foo'))

        del db
        recreated_db = DB(tmp_db)
        self.assertFalse(recreated_db.has_package('foo'))
        self.assertEqual([], recreated_db.list_all())
        self.assertEqual(None, recreated_db.find_package('foo'))
示例#2
0
    def test_package_files(self):
        db = DB(self._make_tmp_db_path())
        db.add_package(
            PE(
                'p1', '1', 0, 0, [], {},
                package_files(FCL([('p1/f1', 'c1a'), ('p1/f2', 'c1b')]),
                              FCL([('p1/e1a', 'ec1a'), ('p1/e2b', 'ec1b')]),
                              'f_chk', 'ef_chk')))
        db.add_package(
            PE(
                'p2', '1', 0, 0, [], {},
                package_files(FCL([('p2/f1', 'c2a'), ('p2/f2', 'c2b')]),
                              FCL([('p2/e2a', 'ec2a'), ('p2/e2b', 'ec2b')]),
                              'f_chk', 'ef_chk')))
        db.add_package(
            PE(
                'p3', '1', 0, 0, [], {},
                package_files(FCL([('p3/f1', 'c3a'), ('p3/f2', 'c3b')]),
                              FCL([('p3/e3a', 'ec3a'), ('p3/e2b', 'ec3b')]),
                              'f_chk', 'ef_chk')))
        db.add_package(
            PE(
                'p4', '1', 0, 0, [], {},
                package_files(FCL([('p4/f1', 'c4a'), ('p4/f2', 'c4b')]),
                              FCL([('p4/e4a', 'ec4a'), ('p4/e2b', 'ec4b')]),
                              'f_chk', 'ef_chk')))
        db.add_package(
            PE(
                'p5', '1', 0, 0, [], {},
                package_files(FCL([('p5/f1', 'c5a'), ('p5/f2', 'c5b')]),
                              FCL([('p5/e5a', 'ec5a'), ('p5/e2b', 'ec5b')]),
                              'f_chk', 'ef_chk')))
        db.add_package(
            PE(
                'p6', '1', 0, 0, [], {},
                package_files(FCL([('p6/f1', 'c6a'), ('p6/f2', 'c6b')]),
                              FCL([('p6/e6a', 'ec6a'), ('p6/e2b', 'ec6b')]),
                              'f_chk', 'ef_chk')))
        self.assertEqual(set(['p1/f1', 'p1/f2']), db.files('p1'))
        self.assertEqual(set(['p1/e1a', 'p1/e2b']), db.env_files('p1'))

        self.assertEqual(set(['p2/f1', 'p2/f2']), db.files('p2'))
        self.assertEqual(set(['p2/e2a', 'p2/e2b']), db.env_files('p2'))

        self.assertEqual(set(['p3/f1', 'p3/f2']), db.files('p3'))
        self.assertEqual(set(['p3/e3a', 'p3/e2b']), db.env_files('p3'))

        self.assertEqual(set(['p4/f1', 'p4/f2']), db.files('p4'))
        self.assertEqual(set(['p4/e4a', 'p4/e2b']), db.env_files('p4'))

        self.assertEqual(set(['p5/f1', 'p5/f2']), db.files('p5'))
        self.assertEqual(set(['p5/e5a', 'p5/e2b']), db.env_files('p5'))

        self.assertEqual(set(['p6/f1', 'p6/f2']), db.files('p6'))
        self.assertEqual(set(['p6/e6a', 'p6/e2b']), db.env_files('p6'))
示例#3
0
    def test_packages_with_files(self):
        db = DB(self._make_tmp_db_path())
        db.add_package(
            PE(
                'p1', '1', 0, 0, [], {},
                package_files(FCL([('p1/f1', 'c1'), ('p1/f2', 'c2')]),
                              FCL([('e1', 'ec1'), ('e2', 'ec2')]), 'f_chk',
                              'ef_chk')))
        db.add_package(
            PE(
                'p2', '1', 0, 0, [], {},
                package_files(FCL([('p2/f1', 'c1'), ('p2/f2', 'c2')]),
                              FCL([('e1', 'ec1'), ('e2', 'ec2')]), 'f_chk',
                              'ef_chk')))
        db.add_package(
            PE(
                'p3', '1', 0, 0, [], {},
                package_files(FCL([('p3/f1', 'c1'), ('p3/f2', 'c2')]),
                              FCL([('e1', 'ec1'), ('e2', 'ec2')]), 'f_chk',
                              'ef_chk')))
        db.add_package(
            PE(
                'p4', '1', 0, 0, [], {},
                package_files(FCL([('p4/f1', 'c1'), ('p4/f2', 'c2')]),
                              FCL([('e1', 'ec1'), ('e2', 'ec2')]), 'f_chk',
                              'ef_chk')))
        db.add_package(
            PE(
                'p5', '1', 0, 0, [], {},
                package_files(FCL([('p5/f1', 'c1'), ('p5/f2', 'c2')]),
                              FCL([('e1', 'ec1'), ('e2', 'ec2')]), 'f_chk',
                              'ef_chk')))
        db.add_package(
            PE(
                'p6', '1', 0, 0, [], {},
                package_files(FCL([('p6/f1', 'c1'), ('p6/f2', 'c2')]),
                              FCL([('e1', 'ec1'), ('e2', 'ec2')]), 'f_chk',
                              'ef_chk')))

        self.assertEqual([], db.packages_with_files(['notthere']))
        self.assertEqual(['p1'], db.packages_with_files(['p1/f2']))
        self.assertEqual(['p1', 'p2'],
                         db.packages_with_files(['p1/f2', 'p2/f1']))
        self.assertEqual(['p1', 'p2', 'p6'],
                         db.packages_with_files(['p1/f2', 'p2/f1', 'p6/f1']))
示例#4
0
    def test_db_add(self):
        tmp_db = self._make_tmp_db_path()
        db = DB(tmp_db)
        self.assertFalse(db.has_package('foo'))
        files = package_files(FCL([('f1', 'c1'), ('f2', 'c2')]),
                              FCL([('e1', 'ec1'), ('e2', 'ec2')]), 'f_chk',
                              'ef_chk')
        reqs = None
        new_entry = PE('foo', '1.2.3', 1, 0, [], {}, files)
        db.add_package(new_entry)
        self.assertTrue(db.has_package('foo'))
        self.assertEqual(['foo'], db.list_all())
        self.assertEqual(['foo-1.2.3-1'], db.list_all(include_version=True))
        self.assertEqual([PD.parse('foo-1.2.3-1')], db.descriptors())
        self.assertEqual(PE('foo', '1.2.3', 1, 0, [], {}, files),
                         db.find_package('foo'))

        del db
        recreated_db = DB(tmp_db)
        self.assertTrue(recreated_db.has_package('foo'))
        self.assertEqual(['foo'], recreated_db.list_all())
        actual_package = recreated_db.find_package('foo')
        expected_package = PE('foo', '1.2.3', 1, 0, [], {}, files)
        self.assertEqual(expected_package, actual_package)
示例#5
0
class test_package_db_entry(unit_test):

    TEST_REQUIREMENTS = RL.parse('foo >= 1.2.3-1 bar >= 6.6.6-1')
    TEST_FILES = package_files(FCL([
        ('f1', 'fchk1'),
        ('f2', 'fchk2'),
    ]), FCL([
        ('e1', 'echk1'),
        ('e2', 'echk2'),
    ]), 'files_chk', 'env_files_chk')
    TEST_PROPERTIES = {'p1': 'v1', 'p2': 6}

    TEST_ENTRY = PE('kiwi', '6.7.8', 2, 0, TEST_REQUIREMENTS, TEST_PROPERTIES,
                    TEST_FILES)

    def test_descriptor(self):
        self.assertEqual(
            package_descriptor('kiwi', '6.7.8-2', self.TEST_PROPERTIES,
                               self.TEST_REQUIREMENTS),
            self.TEST_ENTRY.descriptor)

    def test_to_json(self):
        self.maxDiff = None
        expected_json = '''\
{
  "_format_version": 2, 
  "epoch": 0, 
  "files": {
    "env_files": [
      [
        "e1", 
        "echk1"
      ], 
      [
        "e2", 
        "echk2"
      ]
    ], 
    "env_files_checksum": "env_files_chk", 
    "files": [
      [
        "f1", 
        "fchk1"
      ], 
      [
        "f2", 
        "fchk2"
      ]
    ], 
    "files_checksum": "files_chk"
  }, 
  "name": "kiwi", 
  "properties": {
    "p1": "v1", 
    "p2": 6
  }, 
  "requirements": [
    "foo >= 1.2.3-1", 
    "bar >= 6.6.6-1"
  ], 
  "revision": 2, 
  "version": "6.7.8"
}'''
        self.assertMultiLineEqual(expected_json, self.TEST_ENTRY.to_json())

    def test_parse_json_v2(self):
        json = '''\
{
  "_format_version": 2, 
  "epoch": 0, 
  "files": {
    "env_files": [
      [
        "e1", 
        "echk1"
      ], 
      [
        "e2", 
        "echk2"
      ]
    ], 
    "env_files_checksum": "env_files_chk", 
    "files": [
      [
        "f1", 
        "fchk1"
      ], 
      [
        "f2", 
        "fchk2"
      ]
    ], 
    "files_checksum": "files_chk"
  }, 
  "name": "kiwi", 
  "properties": {
    "p1": "v1", 
    "p2": 6
  }, 
  "requirements": [
    "foo >= 1.2.3-1", 
    "bar >= 6.6.6-1"
  ], 
  "revision": 2, 
  "version": "6.7.8"
}'''
        actual_entry = PE.parse_json(json)
        self.maxDiff = None
        self.assertEqual(self.TEST_ENTRY, actual_entry)

    def test_to_simple_dict(self):
        expected = {
            '_format_version': 2,
            'epoch': 0,
            'files': {
                'env_files': [['e1', 'echk1'], ['e2', 'echk2']],
                'env_files_checksum': 'env_files_chk',
                'files': [['f1', 'fchk1'], ['f2', 'fchk2']],
                'files_checksum': 'files_chk'
            },
            'name': 'kiwi',
            'properties': {
                'p1': 'v1',
                'p2': 6
            },
            'requirements': ['foo >= 1.2.3-1', 'bar >= 6.6.6-1'],
            'revision': 2,
            'version': '6.7.8',
        }
        self.assertEqual(expected, self.TEST_ENTRY.to_simple_dict())
示例#6
0
class test_artifact_db(unit_test):

    TEST_FILES = package_files(FCL([
        ('f1', 'fchk1'),
        ('f2', 'fchk2'),
    ]), FCL([
        ('e1', 'echk1'),
        ('e2', 'echk2'),
    ]), 'files_chk', 'env_files_chk')

    TEST_FILES2 = package_files(FCL([
        ('g1', 'gchk1'),
        ('g2', 'gchk2'),
    ]), FCL([
        ('h1', 'hchk1'),
        ('h2', 'hchk2'),
    ]), 'files2_chk', 'env_files2_chk')

    DEBUG = unit_test.DEBUG
    #DEBUG = True

    LINUX_BT = build_target('linux', 'ubuntu', '18', ('x86_64', ), 'release')
    MACOS_BT = build_target('macos', '', '10.13', ('x86_64', ), 'release')

    def _make_tmp_db_path(self):
        tmp_dir = temp_file.make_temp_dir(delete=not self.DEBUG)
        f = path.join(tmp_dir, 'db.sqlite')
        if self.DEBUG:
            self.spew('_make_tmp_db_path() => %s' % (f))
        return f

    def test_db_create_empty(self):
        tmp_db = self._make_tmp_db_path()
        db = DB(tmp_db)
        self.assertEqual([], db.list_all_by_descriptor())

    def test_db_recreate_empty(self):
        tmp_db = self._make_tmp_db_path()
        db = DB(tmp_db)
        self.assertEqual([], db.list_all_by_descriptor())
        del db
        recreated_db = DB(tmp_db)
        self.assertEqual([], recreated_db.list_all_by_descriptor())

    def test_add(self):
        tmp_db = self._make_tmp_db_path()
        db = DB(tmp_db)
        e = PM('foo-1.2.3.tar.gz', 'foo', '1.2.3', 1, 0, 'macos', 'release',
               ('x86_64', ), '', '', [], {}, self.TEST_FILES)
        adesc = e.artifact_descriptor
        self.assertFalse(db.has_artifact(adesc))
        db.add_artifact(e)
        self.assertTrue(db.has_artifact(adesc))

    def test_add_duplicate(self):
        tmp_db = self._make_tmp_db_path()
        db = DB(tmp_db)
        e = PM('foo-1.2.3.tar.gz', 'foo', '1.2.3', 1, 0, 'macos', 'release',
               ('x86_64', ), '', '', [], {}, self.TEST_FILES)
        adesc = e.artifact_descriptor
        self.assertFalse(db.has_artifact(adesc))
        db.add_artifact(e)
        self.assertTrue(db.has_artifact(adesc))
        with self.assertRaises(AlreadyInstalledError) as context:
            db.add_artifact(e)

    def test_remove(self):
        tmp_db = self._make_tmp_db_path()
        db = DB(tmp_db)
        e = PM('foo-1.2.3.tar.gz', 'foo', '1.2.3', 1, 0, 'macos', 'release',
               ('x86_64', ), '', '', [], {}, self.TEST_FILES)
        adesc = e.artifact_descriptor
        self.assertFalse(db.has_artifact(adesc))
        db.add_artifact(e)
        self.assertTrue(db.has_artifact(adesc))
        db.remove_artifact(adesc)
        self.assertFalse(db.has_artifact(adesc))

    def test_readd(self):
        tmp_db = self._make_tmp_db_path()
        db = DB(tmp_db)
        e = PM('foo-1.2.3.tar.gz', 'foo', '1.2.3', 1, 0, 'macos', 'release',
               ('x86_64', ), '', '', [], {}, self.TEST_FILES)
        adesc = e.artifact_descriptor
        self.assertFalse(db.has_artifact(adesc))
        db.add_artifact(e)
        self.assertTrue(db.has_artifact(adesc))
        db.remove_artifact(adesc)
        self.assertFalse(db.has_artifact(adesc))
        db.add_artifact(e)
        self.assertTrue(db.has_artifact(adesc))
        db.remove_artifact(adesc)
        self.assertFalse(db.has_artifact(adesc))

    def test_remove_not_installed(self):
        tmp_db = self._make_tmp_db_path()
        db = DB(tmp_db)
        e = PM('foo-1.2.3.tar.gz', 'foo', '1.2.3', 1, 0, 'macos', 'release',
               ('x86_64', ), '', '', [], {}, self.TEST_FILES)
        adesc = e.artifact_descriptor
        self.assertFalse(db.has_artifact(adesc))
        with self.assertRaises(NotInstalledError) as context:
            db.remove_artifact(adesc)

    def test_replace(self):
        tmp_db = self._make_tmp_db_path()
        db = DB(tmp_db)
        e1 = PM('foo-1.2.3.tar.gz', 'foo', '1.2.3', 1, 0, 'macos', 'release',
                ('x86_64', ), '', '', [], {}, self.TEST_FILES)
        e2 = PM('foo-1.2.3.tar.gz', 'foo', '1.2.3', 1, 0, 'macos', 'release',
                ('x86_64', ), '', '', [], {}, self.TEST_FILES2)
        self.assertFalse(db.has_artifact(e1.artifact_descriptor))
        db.add_artifact(e1)
        self.assertTrue(db.has_artifact(e1.artifact_descriptor))
        self.assertEqual([e1.artifact_descriptor], db.list_all_by_descriptor())
        db.replace_artifact(e2)
        self.assertEqual([e2.artifact_descriptor], db.list_all_by_descriptor())

    def test_replace_not_installed(self):
        tmp_db = self._make_tmp_db_path()
        db = DB(tmp_db)
        e1 = PM('foo-1.2.3.tar.gz', 'foo', '1.2.3', 1, 0, 'macos', 'release',
                ('x86_64', ), '', '', [], {}, self.TEST_FILES)
        e2 = PM('foo-1.2.3.tar.gz', 'foo', '1.2.3', 1, 0, 'macos', 'release',
                ('x86_64', ), '', '', [], {}, self.TEST_FILES2)
        self.assertFalse(db.has_artifact(e1.artifact_descriptor))
        with self.assertRaises(NotInstalledError) as context:
            db.replace_artifact(e2)

    def test_find(self):
        tmp_db = self._make_tmp_db_path()
        db = DB(tmp_db)
        e = PM('foo-1.2.3.tar.gz', 'foo', '1.2.3', 1, 0, 'macos', 'release',
               ('x86_64', ), '', '', [], {}, self.TEST_FILES)
        adesc = e.artifact_descriptor
        self.assertEqual(None, db.find_artifact(adesc))
        db.add_artifact(e)
        r = db.find_artifact(adesc)
        print('R: %s' % (str(r)))
        self.assertEqual(e, r)
        db.remove_artifact(adesc)
        self.assertEqual(None, db.find_artifact(adesc))

    def test_get(self):
        tmp_db = self._make_tmp_db_path()
        db = DB(tmp_db)
        e = PM('foo-1.2.3.tar.gz', 'foo', '1.2.3', 1, 0, 'macos', 'release',
               ('x86_64', ), '', '', [], {}, self.TEST_FILES)
        adesc = e.artifact_descriptor
        with self.assertRaises(NotInstalledError) as context:
            db.get_artifact(adesc)
            db.add_artifact(e)
            self.assertEqual(e, db.get_artifact(adesc))
            db.remove_artifact(adesc)
        with self.assertRaises(NotInstalledError) as context:
            db.get_artifact(adesc)

    def test_list_all_by_descriptor(self):
        tmp_db = self._make_tmp_db_path()
        db = DB(tmp_db)
        e1 = PM('foo-1.2.3.tar.gz', 'foo', '1.2.3', 1, 0, 'macos', 'release',
                ('x86_64', ), '', '', [], {}, self.TEST_FILES)
        e2 = PM('bar-5.6.7.tar.gz', 'bar', '5.6.7', 1, 0, 'linux', 'release',
                ('x86_64', ), '', '', [], {}, self.TEST_FILES2)
        db.add_artifact(e1)
        self.assertEqual([e1.artifact_descriptor], db.list_all_by_descriptor())
        db.add_artifact(e2)
        self.assertEqual([e2.artifact_descriptor, e1.artifact_descriptor],
                         db.list_all_by_descriptor())

    def test_list_all_by_descriptor_with_build_target(self):
        tmp_db = self._make_tmp_db_path()
        db = DB(tmp_db)
        e1 = PM('foo-1.2.3.tar.gz', 'foo', '1.2.3', 1, 0, 'macos', 'release',
                ('x86_64', ), '', '', [], {}, self.TEST_FILES)
        e2 = PM('bar-5.6.7.tar.gz', 'bar', '5.6.7', 1, 0, 'linux', 'release',
                ('x86_64', ), '', '', [], {}, self.TEST_FILES2)
        db.add_artifact(e1)
        db.add_artifact(e2)
        self.assertEqual([e2.artifact_descriptor],
                         db.list_all_by_descriptor(build_target=self.LINUX_BT))
        self.assertEqual([e1.artifact_descriptor],
                         db.list_all_by_descriptor(build_target=self.MACOS_BT))

    def test_list_all_by_metadata(self):
        tmp_db = self._make_tmp_db_path()
        db = DB(tmp_db)
        e1 = PM('foo-1.2.3.tar.gz', 'foo', '1.2.3', 1, 0, 'macos', 'release',
                ('x86_64', ), '', '', [], {}, self.TEST_FILES)
        e2 = PM('bar-5.6.7.tar.gz', 'bar', '5.6.7', 1, 0, 'linux', 'release',
                ('x86_64', ), '', '', [], {}, self.TEST_FILES2)
        db.add_artifact(e1)
        self.assertEqual([e1], db.list_all_by_metadata())
        db.add_artifact(e2)
        self.assertEqual([e2, e1], db.list_all_by_metadata())

    def test_list_all_by_metadata_with_build_target(self):
        tmp_db = self._make_tmp_db_path()
        db = DB(tmp_db)
        e1 = PM('foo-1.2.3.tar.gz', 'foo', '1.2.3', 1, 0, 'macos', 'release',
                ('x86_64', ), '', '', [], {}, self.TEST_FILES)
        e2 = PM('bar-5.6.7.tar.gz', 'bar', '5.6.7', 1, 0, 'linux', 'release',
                ('x86_64', ), '', '', [], {}, self.TEST_FILES2)
        db.add_artifact(e1)
        db.add_artifact(e2)
        self.assertEqual([e2],
                         db.list_all_by_metadata(build_target=self.LINUX_BT))
        self.assertEqual([e1],
                         db.list_all_by_metadata(build_target=self.MACOS_BT))

    def test_list_all_by_package_descriptor(self):
        tmp_db = self._make_tmp_db_path()
        db = DB(tmp_db)
        e1 = PM('foo-1.2.3.tar.gz', 'foo', '1.2.3', 1, 0, 'macos', 'release',
                ('x86_64', ), '', '', [], {}, self.TEST_FILES)
        e2 = PM('bar-5.6.7.tar.gz', 'bar', '5.6.7', 1, 0, 'linux', 'release',
                ('x86_64', ), '', '', [], {}, self.TEST_FILES2)
        pd1 = PD('foo', '1.2.3-1')
        pd2 = PD('bar', '5.6.7-1')
        db.add_artifact(e1)
        self.assertEqual([pd1], db.list_all_by_package_descriptor())
        db.add_artifact(e2)
        self.assertEqual([pd2, pd1], db.list_all_by_package_descriptor())

    def test_list_all_by_package_descriptor_with_build_target(self):
        tmp_db = self._make_tmp_db_path()
        db = DB(tmp_db)
        e1 = PM('foo-1.2.3.tar.gz', 'foo', '1.2.3', 1, 0, 'macos', 'release',
                ('x86_64', ), '', '', [], {}, self.TEST_FILES)
        e2 = PM('bar-5.6.7.tar.gz', 'bar', '5.6.7', 1, 0, 'linux', 'release',
                ('x86_64', ), '', '', [], {}, self.TEST_FILES2)
        pd1 = PD('foo', '1.2.3-1')
        pd2 = PD('bar', '5.6.7-1')
        db.add_artifact(e1)
        db.add_artifact(e2)
        self.assertEqual(
            [pd2],
            db.list_all_by_package_descriptor(build_target=self.LINUX_BT))
        self.assertEqual(
            [pd1],
            db.list_all_by_package_descriptor(build_target=self.MACOS_BT))
示例#7
0
class unit_test_packages(object):

  __test__ = False

  FILES = package_files([], [])
  TEST_PACKAGES = {
    'water-1.0.0-0': PM('', 'water', '1.0.0', 0, 0, 'macos', 'release', 'x86_64', '', '', None, {}, FILES),
    'water-1.0.0-1': PM('', 'water', '1.0.0', 1, 0, 'macos', 'release', 'x86_64', '', '', None, {}, FILES),
    'water-1.0.0-2': PM('', 'water', '1.0.0', 2, 0, 'macos', 'release', 'x86_64', '', '', None, {}, FILES),
    'fiber-1.0.0-0': PM('', 'fiber', '1.0.0', 0, 0, 'macos', 'release', 'x86_64', '', '', None, {}, FILES),
    'citrus-1.0.0-0': PM('', 'citrus', '1.0.0', 2, 0, 'macos', 'release', 'x86_64', '', '', None, {}, FILES),
    'fructose-3.4.5-6': PM('', 'fructose', '3.4.5', 6, 0, 'macos', 'release', 'x86_64', '', '', None, {}, FILES),
    'mercury-1.2.8-0': PM('', 'mercury', '1.2.8', 0, 0, 'macos', 'release', 'x86_64', '', '', None, {}, FILES),
    'mercury-1.2.8-1': PM('', 'mercury', '1.2.8', 1, 0, 'macos', 'release', 'x86_64', '', '', None, {}, FILES),
    'mercury-1.2.9-0': PM('', 'mercury', '1.2.9', 0, 0, 'macos', 'release', 'x86_64', '', '', None, {}, FILES),
    'mercury_conflict-3.2.1-0': PM('', 'mercury_conflict', '3.2.1', 0, 0, 'macos', 'release', 'x86_64', '', '', None, {}, FILES),
    'arsenic-1.2.9-0': PM('', 'arsenic', '1.2.9', 0, 0, 'macos', 'release', 'x86_64', '', '', None, {}, FILES),
    'arsenic-1.2.9-1': PM('', 'arsenic', '1.2.9', 1, 0, 'macos', 'release', 'x86_64', '', '', None, {}, FILES),
    'arsenic-1.2.10-0': PM('', 'arsenic', '1.2.10', 0, 0, 'macos', 'release', 'x86_64', '', '', None, {}, FILES),
    'apple-1.2.3-1': PM('', 'apple', '1.2.3', 1, 0, 'macos', 'release', 'x86_64', '', '', 'fruit >= 1.0.0', {}, FILES),
    'fruit-1.0.0-0': PM('', 'fruit', '1.0.0', 0, 0, 'macos', 'release', 'x86_64', '', '', 'fructose >= 3.4.5-6 fiber >= 1.0.0-0 water >= 1.0.0-0', {}, FILES),
    'pear-1.2.3-1': PM('', 'pear', '1.2.3', 1, 0, 'macos', 'release', 'x86_64', '', '', 'fruit >= 1.0.0', {}, FILES),
    'orange-6.5.4-3': PM('', 'orange', '6.5.4', 3, 0, 'macos', 'release', 'x86_64', '', '', 'fruit >= 1.0.0-0 citrus >= 1.0.0-0', {}, FILES),
    'orange_juice-1.4.5-0': PM('', 'orange_juice', '1.4.5', 0, 0, 'macos', 'release', 'x86_64', '', '', 'orange >= 6.5.4-3', {}, FILES),
    'pear_juice-6.6.6-0': PM('', 'pear_juice', '6.6.6', 0, 0, 'macos', 'release', 'x86_64', '', '', 'pear >= 1.2.3-1', {}, FILES),
    'smoothie-1.0.0-0': PM('', 'smoothie', '1.0.0', 0, 0, 'macos', 'release', 'x86_64', '', '', 'orange >= 6.5.4-3 pear >= 1.2.3-1 apple >= 1.2.3-1', {}, FILES),
   }
  
  def __init__(self, desc, pm, system, level, distro, distro_version, debug = False):
    self.desc = desc
    self.pm = PM(pm.filename,
                 pm.name,
                 pm.version,
                 pm.revision,
                 pm.epoch,
                 system,
                 level,
                 pm.arch,
                 distro,
                 distro_version,
                 pm.requirements,
                 pm.properties,
                 pm.files)
    self.system = system
    self.level = level
    self.debug = debug

  def create_package(self, root_dir):
    package = self.make_test_package(self.pm, debug = self.debug)
    artifact_path = package.metadata.package_descriptor.artifact_path(package.metadata.build_target, False)
    target_path = path.join(root_dir, artifact_path)
    file_util.rename(package.tarball, target_path)
    if self.debug:
      print(('DEBUG: test_package.create_package() package=%s' % (target_path)))
    return target_path

  test_package = namedtuple('test_package', 'tarball,metadata')

  @classmethod
  def make_test_package(clazz, pm, debug = False):
    pkg_config_pc_contnet = clazz.make_pkg_config_pc_content(pm.name, pm.build_version)
    script_content = '#!/bin/bash\necho %s-%s\nexit 0\n' % (pm.name, pm.build_version)
    name = pm.name.replace('_conflict', '')
    items = [
      clazz.make_temp_item(name, pm.version, '_foo.txt', 'docs'),
      clazz.make_temp_item(name, pm.version, '_bar.txt', 'docs'),
      clazz.make_temp_item(name, pm.version, '_script.sh', 'bin', content = script_content, mode = 0o755),
      temp_item('lib/pkgconfig/%s.pc' % (name), content = pkg_config_pc_contnet)
    ]
    tmp_stage_dir = temp_file.make_temp_dir(delete = not debug)
    tmp_stage_files_dir = path.join(tmp_stage_dir, 'files')
    temp_file.write_temp_files(tmp_stage_files_dir, items)
    tmp_tarball = temp_file.make_temp_file(prefix = pm.package_descriptor.full_name, suffix = '.tar.gz', delete = not debug)
    package.create_package(tmp_tarball, pm.package_descriptor, pm.build_target, tmp_stage_dir)
    return clazz.test_package(tmp_tarball, pm)

  _PKG_CONFIG_PC_TEMPLATE = '''
prefix=${REBUILD_PACKAGE_PREFIX}
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/include

Name: @NAME@
Description: @NAME@
Version: @VERSION@
Libs: -L${libdir} @LIBS@
Libs.private: @LIBS_PRIVATE@
Cflags: -I${includedir}
'''
  
  @classmethod
  def make_pkg_config_pc_content(clazz, name, version):
    replacemetns = {
      '@NAME@': name,
      '@VERSION@': version.upstream_version,
      '@LIBS@': '-l%s' % (name),
      '@LIBS_PRIVATE@': '-lpriv',
    }
    return string_util.replace(clazz._PKG_CONFIG_PC_TEMPLATE, replacemetns)

  @classmethod
  def make_temp_item(clazz, name, version, suffix, location, content = None, mode = None):
    filename = '%s/%s%s' % (location, name, suffix)
    if not content:
      content = 'package=%s-%s\nfilename=%s' % (name, version, filename)
    return temp_item(filename, content = content, mode = mode)
    
  @classmethod
  def make_simple_tarball(clazz, desc, templates, debug = False):
    tmp_dir = temp_file.make_temp_dir(delete = not debug)
    pm = templates[desc]
    tp = clazz(desc, pm, 'macos', 'release', '', '10.10', debug = debug)
    return tp.create_package(tmp_dir)

  @classmethod
  def make_test_packages(clazz, packages, root_dir, debug = False):
    for system in [ 'macos', 'linux' ]:
      for level in [ 'release', 'debug' ]:
        for desc, pm in packages.items():
          if system == 'linux':
            distro = 'ubuntu'
            distro_version = '18'
          else:
            distro = ''
            distro_version = '10.10'
          tp = clazz(desc, pm, system, level, distro, distro_version, debug = debug)
          tp.create_package(root_dir)

  @classmethod
  def publish_artifacts(clazz, am):
    artifacts = file_find.find_fnmatch(am.root_dir, [ '*.tar.gz' ], relative = False)
    for artifact in artifacts:
      tmp_artifact = temp_file.make_temp_file()
      file_util.copy(artifact, tmp_artifact)
      file_util.remove(artifact)
      p = package(tmp_artifact)
      am.publish(tmp_artifact, p.metadata.build_target, False)
          
  @classmethod
  def make_water(clazz, debug = False):
    return clazz.make_simple_tarball('water-1.0.0-0', clazz.TEST_PACKAGES, debug = debug)

  @classmethod
  def make_fiber(clazz, debug = False):
    return clazz.make_simple_tarball('fiber-1.0.0-0', clazz.TEST_PACKAGES, debug = debug)

  @classmethod
  def make_apple(clazz, debug = False):
    return clazz.make_simple_tarball('apple-1.2.3-1', clazz.TEST_PACKAGES, debug = debug)

  @classmethod
  def make_fruit(clazz, debug = False):
    return clazz.make_simple_tarball('fruit-1.0.0-0', clazz.TEST_PACKAGES, debug = debug)

  @classmethod
  def make_orange(clazz, debug = False):
    return clazz.make_simple_tarball('orange-6.5.4-3', clazz.TEST_PACKAGES, debug = debug)

  @classmethod
  def make_fructose(clazz, debug = False):
    return clazz.make_simple_tarball('fructose-3.4.5-6', clazz.TEST_PACKAGES, debug = debug)

  @classmethod
  def make_mercury(clazz, debug = False):
    return clazz.make_simple_tarball('mercury-1.2.8-0', clazz.TEST_PACKAGES, debug = debug)

  @classmethod
  def make_mercury_conflict(clazz, debug = False):
    return clazz.make_simple_tarball('mercury_conflict-3.2.1-0', clazz.TEST_PACKAGES, debug = debug)

  @classmethod
  def make_arsenic(clazz, debug = False):
    return clazz.make_simple_tarball('arsenic-1.2.9-0', clazz.TEST_PACKAGES, debug = debug)

  _TEST_PACKAGE_RECIPES='''