17db96d56Sopenharmony_ci""" Test suite for the code in msilib """
27db96d56Sopenharmony_ciimport os
37db96d56Sopenharmony_ciimport unittest
47db96d56Sopenharmony_cifrom test.support.import_helper import import_module
57db96d56Sopenharmony_cifrom test.support.os_helper import TESTFN, unlink
67db96d56Sopenharmony_ciimport warnings
77db96d56Sopenharmony_ciwith warnings.catch_warnings():
87db96d56Sopenharmony_ci    warnings.simplefilter("ignore", DeprecationWarning)
97db96d56Sopenharmony_ci    msilib = import_module('msilib')
107db96d56Sopenharmony_ciimport msilib.schema
117db96d56Sopenharmony_ci
127db96d56Sopenharmony_ci
137db96d56Sopenharmony_cidef init_database():
147db96d56Sopenharmony_ci    path = TESTFN + '.msi'
157db96d56Sopenharmony_ci    db = msilib.init_database(
167db96d56Sopenharmony_ci        path,
177db96d56Sopenharmony_ci        msilib.schema,
187db96d56Sopenharmony_ci        'Python Tests',
197db96d56Sopenharmony_ci        'product_code',
207db96d56Sopenharmony_ci        '1.0',
217db96d56Sopenharmony_ci        'PSF',
227db96d56Sopenharmony_ci    )
237db96d56Sopenharmony_ci    return db, path
247db96d56Sopenharmony_ci
257db96d56Sopenharmony_ci
267db96d56Sopenharmony_ciclass MsiDatabaseTestCase(unittest.TestCase):
277db96d56Sopenharmony_ci
287db96d56Sopenharmony_ci    def test_view_fetch_returns_none(self):
297db96d56Sopenharmony_ci        db, db_path = init_database()
307db96d56Sopenharmony_ci        properties = []
317db96d56Sopenharmony_ci        view = db.OpenView('SELECT Property, Value FROM Property')
327db96d56Sopenharmony_ci        view.Execute(None)
337db96d56Sopenharmony_ci        while True:
347db96d56Sopenharmony_ci            record = view.Fetch()
357db96d56Sopenharmony_ci            if record is None:
367db96d56Sopenharmony_ci                break
377db96d56Sopenharmony_ci            properties.append(record.GetString(1))
387db96d56Sopenharmony_ci        view.Close()
397db96d56Sopenharmony_ci        db.Close()
407db96d56Sopenharmony_ci        self.assertEqual(
417db96d56Sopenharmony_ci            properties,
427db96d56Sopenharmony_ci            [
437db96d56Sopenharmony_ci                'ProductName', 'ProductCode', 'ProductVersion',
447db96d56Sopenharmony_ci                'Manufacturer', 'ProductLanguage',
457db96d56Sopenharmony_ci            ]
467db96d56Sopenharmony_ci        )
477db96d56Sopenharmony_ci        self.addCleanup(unlink, db_path)
487db96d56Sopenharmony_ci
497db96d56Sopenharmony_ci    def test_view_non_ascii(self):
507db96d56Sopenharmony_ci        db, db_path = init_database()
517db96d56Sopenharmony_ci        view = db.OpenView("SELECT 'ß-розпад' FROM Property")
527db96d56Sopenharmony_ci        view.Execute(None)
537db96d56Sopenharmony_ci        record = view.Fetch()
547db96d56Sopenharmony_ci        self.assertEqual(record.GetString(1), 'ß-розпад')
557db96d56Sopenharmony_ci        view.Close()
567db96d56Sopenharmony_ci        db.Close()
577db96d56Sopenharmony_ci        self.addCleanup(unlink, db_path)
587db96d56Sopenharmony_ci
597db96d56Sopenharmony_ci    def test_summaryinfo_getproperty_issue1104(self):
607db96d56Sopenharmony_ci        db, db_path = init_database()
617db96d56Sopenharmony_ci        try:
627db96d56Sopenharmony_ci            sum_info = db.GetSummaryInformation(99)
637db96d56Sopenharmony_ci            title = sum_info.GetProperty(msilib.PID_TITLE)
647db96d56Sopenharmony_ci            self.assertEqual(title, b"Installation Database")
657db96d56Sopenharmony_ci
667db96d56Sopenharmony_ci            sum_info.SetProperty(msilib.PID_TITLE, "a" * 999)
677db96d56Sopenharmony_ci            title = sum_info.GetProperty(msilib.PID_TITLE)
687db96d56Sopenharmony_ci            self.assertEqual(title, b"a" * 999)
697db96d56Sopenharmony_ci
707db96d56Sopenharmony_ci            sum_info.SetProperty(msilib.PID_TITLE, "a" * 1000)
717db96d56Sopenharmony_ci            title = sum_info.GetProperty(msilib.PID_TITLE)
727db96d56Sopenharmony_ci            self.assertEqual(title, b"a" * 1000)
737db96d56Sopenharmony_ci
747db96d56Sopenharmony_ci            sum_info.SetProperty(msilib.PID_TITLE, "a" * 1001)
757db96d56Sopenharmony_ci            title = sum_info.GetProperty(msilib.PID_TITLE)
767db96d56Sopenharmony_ci            self.assertEqual(title, b"a" * 1001)
777db96d56Sopenharmony_ci        finally:
787db96d56Sopenharmony_ci            db = None
797db96d56Sopenharmony_ci            sum_info = None
807db96d56Sopenharmony_ci            os.unlink(db_path)
817db96d56Sopenharmony_ci
827db96d56Sopenharmony_ci    def test_database_open_failed(self):
837db96d56Sopenharmony_ci        with self.assertRaises(msilib.MSIError) as cm:
847db96d56Sopenharmony_ci            msilib.OpenDatabase('non-existent.msi', msilib.MSIDBOPEN_READONLY)
857db96d56Sopenharmony_ci        self.assertEqual(str(cm.exception), 'open failed')
867db96d56Sopenharmony_ci
877db96d56Sopenharmony_ci    def test_database_create_failed(self):
887db96d56Sopenharmony_ci        db_path = os.path.join(TESTFN, 'test.msi')
897db96d56Sopenharmony_ci        with self.assertRaises(msilib.MSIError) as cm:
907db96d56Sopenharmony_ci            msilib.OpenDatabase(db_path, msilib.MSIDBOPEN_CREATE)
917db96d56Sopenharmony_ci        self.assertEqual(str(cm.exception), 'create failed')
927db96d56Sopenharmony_ci
937db96d56Sopenharmony_ci    def test_get_property_vt_empty(self):
947db96d56Sopenharmony_ci        db, db_path = init_database()
957db96d56Sopenharmony_ci        summary = db.GetSummaryInformation(0)
967db96d56Sopenharmony_ci        self.assertIsNone(summary.GetProperty(msilib.PID_SECURITY))
977db96d56Sopenharmony_ci        db.Close()
987db96d56Sopenharmony_ci        self.addCleanup(unlink, db_path)
997db96d56Sopenharmony_ci
1007db96d56Sopenharmony_ci    def test_directory_start_component_keyfile(self):
1017db96d56Sopenharmony_ci        db, db_path = init_database()
1027db96d56Sopenharmony_ci        self.addCleanup(unlink, db_path)
1037db96d56Sopenharmony_ci        self.addCleanup(db.Close)
1047db96d56Sopenharmony_ci        self.addCleanup(msilib._directories.clear)
1057db96d56Sopenharmony_ci        feature = msilib.Feature(db, 0, 'Feature', 'A feature', 'Python')
1067db96d56Sopenharmony_ci        cab = msilib.CAB('CAB')
1077db96d56Sopenharmony_ci        dir = msilib.Directory(db, cab, None, TESTFN, 'TARGETDIR',
1087db96d56Sopenharmony_ci                               'SourceDir', 0)
1097db96d56Sopenharmony_ci        dir.start_component(None, feature, None, 'keyfile')
1107db96d56Sopenharmony_ci
1117db96d56Sopenharmony_ci    def test_getproperty_uninitialized_var(self):
1127db96d56Sopenharmony_ci        db, db_path = init_database()
1137db96d56Sopenharmony_ci        self.addCleanup(unlink, db_path)
1147db96d56Sopenharmony_ci        self.addCleanup(db.Close)
1157db96d56Sopenharmony_ci        si = db.GetSummaryInformation(0)
1167db96d56Sopenharmony_ci        with self.assertRaises(msilib.MSIError):
1177db96d56Sopenharmony_ci            si.GetProperty(-1)
1187db96d56Sopenharmony_ci
1197db96d56Sopenharmony_ci    def test_FCICreate(self):
1207db96d56Sopenharmony_ci        filepath = TESTFN + '.txt'
1217db96d56Sopenharmony_ci        cabpath = TESTFN + '.cab'
1227db96d56Sopenharmony_ci        self.addCleanup(unlink, filepath)
1237db96d56Sopenharmony_ci        with open(filepath, 'wb'):
1247db96d56Sopenharmony_ci            pass
1257db96d56Sopenharmony_ci        self.addCleanup(unlink, cabpath)
1267db96d56Sopenharmony_ci        msilib.FCICreate(cabpath, [(filepath, 'test.txt')])
1277db96d56Sopenharmony_ci        self.assertTrue(os.path.isfile(cabpath))
1287db96d56Sopenharmony_ci
1297db96d56Sopenharmony_ci
1307db96d56Sopenharmony_ciclass Test_make_id(unittest.TestCase):
1317db96d56Sopenharmony_ci    #http://msdn.microsoft.com/en-us/library/aa369212(v=vs.85).aspx
1327db96d56Sopenharmony_ci    """The Identifier data type is a text string. Identifiers may contain the
1337db96d56Sopenharmony_ci    ASCII characters A-Z (a-z), digits, underscores (_), or periods (.).
1347db96d56Sopenharmony_ci    However, every identifier must begin with either a letter or an
1357db96d56Sopenharmony_ci    underscore.
1367db96d56Sopenharmony_ci    """
1377db96d56Sopenharmony_ci
1387db96d56Sopenharmony_ci    def test_is_no_change_required(self):
1397db96d56Sopenharmony_ci        self.assertEqual(
1407db96d56Sopenharmony_ci            msilib.make_id("short"), "short")
1417db96d56Sopenharmony_ci        self.assertEqual(
1427db96d56Sopenharmony_ci            msilib.make_id("nochangerequired"), "nochangerequired")
1437db96d56Sopenharmony_ci        self.assertEqual(
1447db96d56Sopenharmony_ci            msilib.make_id("one.dot"), "one.dot")
1457db96d56Sopenharmony_ci        self.assertEqual(
1467db96d56Sopenharmony_ci            msilib.make_id("_"), "_")
1477db96d56Sopenharmony_ci        self.assertEqual(
1487db96d56Sopenharmony_ci            msilib.make_id("a"), "a")
1497db96d56Sopenharmony_ci        #self.assertEqual(
1507db96d56Sopenharmony_ci        #    msilib.make_id(""), "")
1517db96d56Sopenharmony_ci
1527db96d56Sopenharmony_ci    def test_invalid_first_char(self):
1537db96d56Sopenharmony_ci        self.assertEqual(
1547db96d56Sopenharmony_ci            msilib.make_id("9.short"), "_9.short")
1557db96d56Sopenharmony_ci        self.assertEqual(
1567db96d56Sopenharmony_ci            msilib.make_id(".short"), "_.short")
1577db96d56Sopenharmony_ci
1587db96d56Sopenharmony_ci    def test_invalid_any_char(self):
1597db96d56Sopenharmony_ci        self.assertEqual(
1607db96d56Sopenharmony_ci            msilib.make_id(".s\x82ort"), "_.s_ort")
1617db96d56Sopenharmony_ci        self.assertEqual(
1627db96d56Sopenharmony_ci            msilib.make_id(".s\x82o?*+rt"), "_.s_o___rt")
1637db96d56Sopenharmony_ci
1647db96d56Sopenharmony_ci
1657db96d56Sopenharmony_ciif __name__ == '__main__':
1667db96d56Sopenharmony_ci    unittest.main()
167