Martin v. Löwis | f8d887e | 2011-03-27 21:05:51 +0200 | [diff] [blame] | 1 | """ Test suite for the code in msilib """ |
Tzu-ping Chung | 2de576e | 2019-02-03 01:13:23 +0800 | [diff] [blame] | 2 | import os |
Martin v. Löwis | f8d887e | 2011-03-27 21:05:51 +0200 | [diff] [blame] | 3 | import unittest |
Berker Peksag | bdb8315 | 2017-11-23 15:47:30 +0300 | [diff] [blame] | 4 | from test.support import TESTFN, import_module, unlink |
Martin v. Löwis | f8d887e | 2011-03-27 21:05:51 +0200 | [diff] [blame] | 5 | msilib = import_module('msilib') |
Berker Peksag | bdb8315 | 2017-11-23 15:47:30 +0300 | [diff] [blame] | 6 | import msilib.schema |
| 7 | |
| 8 | |
| 9 | def init_database(): |
| 10 | path = TESTFN + '.msi' |
| 11 | db = msilib.init_database( |
| 12 | path, |
| 13 | msilib.schema, |
| 14 | 'Python Tests', |
| 15 | 'product_code', |
| 16 | '1.0', |
| 17 | 'PSF', |
| 18 | ) |
| 19 | return db, path |
| 20 | |
| 21 | |
| 22 | class MsiDatabaseTestCase(unittest.TestCase): |
| 23 | |
| 24 | def test_view_fetch_returns_none(self): |
| 25 | db, db_path = init_database() |
| 26 | properties = [] |
| 27 | view = db.OpenView('SELECT Property, Value FROM Property') |
| 28 | view.Execute(None) |
| 29 | while True: |
| 30 | record = view.Fetch() |
| 31 | if record is None: |
| 32 | break |
| 33 | properties.append(record.GetString(1)) |
| 34 | view.Close() |
| 35 | db.Close() |
| 36 | self.assertEqual( |
| 37 | properties, |
| 38 | [ |
| 39 | 'ProductName', 'ProductCode', 'ProductVersion', |
| 40 | 'Manufacturer', 'ProductLanguage', |
| 41 | ] |
| 42 | ) |
| 43 | self.addCleanup(unlink, db_path) |
| 44 | |
Tzu-ping Chung | 2de576e | 2019-02-03 01:13:23 +0800 | [diff] [blame] | 45 | def test_summaryinfo_getproperty_issue1104(self): |
| 46 | db, db_path = init_database() |
| 47 | try: |
| 48 | sum_info = db.GetSummaryInformation(99) |
| 49 | title = sum_info.GetProperty(msilib.PID_TITLE) |
| 50 | self.assertEqual(title, b"Installation Database") |
| 51 | |
| 52 | sum_info.SetProperty(msilib.PID_TITLE, "a" * 999) |
| 53 | title = sum_info.GetProperty(msilib.PID_TITLE) |
| 54 | self.assertEqual(title, b"a" * 999) |
| 55 | |
| 56 | sum_info.SetProperty(msilib.PID_TITLE, "a" * 1000) |
| 57 | title = sum_info.GetProperty(msilib.PID_TITLE) |
| 58 | self.assertEqual(title, b"a" * 1000) |
| 59 | |
| 60 | sum_info.SetProperty(msilib.PID_TITLE, "a" * 1001) |
| 61 | title = sum_info.GetProperty(msilib.PID_TITLE) |
| 62 | self.assertEqual(title, b"a" * 1001) |
| 63 | finally: |
| 64 | db = None |
| 65 | sum_info = None |
| 66 | os.unlink(db_path) |
| 67 | |
Berker Peksag | 4864a61 | 2017-11-24 12:53:58 +0300 | [diff] [blame] | 68 | def test_database_open_failed(self): |
| 69 | with self.assertRaises(msilib.MSIError) as cm: |
| 70 | msilib.OpenDatabase('non-existent.msi', msilib.MSIDBOPEN_READONLY) |
| 71 | self.assertEqual(str(cm.exception), 'open failed') |
| 72 | |
| 73 | def test_database_create_failed(self): |
| 74 | db_path = os.path.join(TESTFN, 'test.msi') |
| 75 | with self.assertRaises(msilib.MSIError) as cm: |
| 76 | msilib.OpenDatabase(db_path, msilib.MSIDBOPEN_CREATE) |
| 77 | self.assertEqual(str(cm.exception), 'create failed') |
| 78 | |
Berker Peksag | 19fb134 | 2017-11-24 18:11:18 +0300 | [diff] [blame] | 79 | def test_get_property_vt_empty(self): |
| 80 | db, db_path = init_database() |
| 81 | summary = db.GetSummaryInformation(0) |
| 82 | self.assertIsNone(summary.GetProperty(msilib.PID_SECURITY)) |
| 83 | db.Close() |
| 84 | self.addCleanup(unlink, db_path) |
| 85 | |
Martin v. Löwis | f8d887e | 2011-03-27 21:05:51 +0200 | [diff] [blame] | 86 | |
| 87 | class Test_make_id(unittest.TestCase): |
| 88 | #http://msdn.microsoft.com/en-us/library/aa369212(v=vs.85).aspx |
| 89 | """The Identifier data type is a text string. Identifiers may contain the |
| 90 | ASCII characters A-Z (a-z), digits, underscores (_), or periods (.). |
| 91 | However, every identifier must begin with either a letter or an |
| 92 | underscore. |
| 93 | """ |
| 94 | |
| 95 | def test_is_no_change_required(self): |
| 96 | self.assertEqual( |
| 97 | msilib.make_id("short"), "short") |
| 98 | self.assertEqual( |
| 99 | msilib.make_id("nochangerequired"), "nochangerequired") |
| 100 | self.assertEqual( |
| 101 | msilib.make_id("one.dot"), "one.dot") |
| 102 | self.assertEqual( |
| 103 | msilib.make_id("_"), "_") |
| 104 | self.assertEqual( |
| 105 | msilib.make_id("a"), "a") |
| 106 | #self.assertEqual( |
| 107 | # msilib.make_id(""), "") |
| 108 | |
| 109 | def test_invalid_first_char(self): |
| 110 | self.assertEqual( |
| 111 | msilib.make_id("9.short"), "_9.short") |
| 112 | self.assertEqual( |
| 113 | msilib.make_id(".short"), "_.short") |
| 114 | |
| 115 | def test_invalid_any_char(self): |
| 116 | self.assertEqual( |
| 117 | msilib.make_id(".s\x82ort"), "_.s_ort") |
Tzu-ping Chung | 2de576e | 2019-02-03 01:13:23 +0800 | [diff] [blame] | 118 | self.assertEqual( |
Martin v. Löwis | f8d887e | 2011-03-27 21:05:51 +0200 | [diff] [blame] | 119 | msilib.make_id(".s\x82o?*+rt"), "_.s_o___rt") |
| 120 | |
| 121 | |
Martin v. Löwis | f8d887e | 2011-03-27 21:05:51 +0200 | [diff] [blame] | 122 | if __name__ == '__main__': |
Zachary Ware | 38c707e | 2015-04-13 15:00:43 -0500 | [diff] [blame] | 123 | unittest.main() |