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