| """ Test suite for the code in msilib """ | |
| import os | |
| import unittest | |
| from test.support import TESTFN, import_module, unlink | |
| msilib = import_module('msilib') | |
| import msilib.schema | |
| def init_database(): | |
| path = TESTFN + '.msi' | |
| db = msilib.init_database( | |
| path, | |
| msilib.schema, | |
| 'Python Tests', | |
| 'product_code', | |
| '1.0', | |
| 'PSF', | |
| ) | |
| return db, path | |
| class MsiDatabaseTestCase(unittest.TestCase): | |
| def test_view_fetch_returns_none(self): | |
| db, db_path = init_database() | |
| properties = [] | |
| view = db.OpenView('SELECT Property, Value FROM Property') | |
| view.Execute(None) | |
| while True: | |
| record = view.Fetch() | |
| if record is None: | |
| break | |
| properties.append(record.GetString(1)) | |
| view.Close() | |
| db.Close() | |
| self.assertEqual( | |
| properties, | |
| [ | |
| 'ProductName', 'ProductCode', 'ProductVersion', | |
| 'Manufacturer', 'ProductLanguage', | |
| ] | |
| ) | |
| self.addCleanup(unlink, db_path) | |
| def test_view_non_ascii(self): | |
| db, db_path = init_database() | |
| view = db.OpenView("SELECT 'ß-розпад' FROM Property") | |
| view.Execute(None) | |
| record = view.Fetch() | |
| self.assertEqual(record.GetString(1), 'ß-розпад') | |
| view.Close() | |
| db.Close() | |
| self.addCleanup(unlink, db_path) | |
| def test_summaryinfo_getproperty_issue1104(self): | |
| db, db_path = init_database() | |
| try: | |
| sum_info = db.GetSummaryInformation(99) | |
| title = sum_info.GetProperty(msilib.PID_TITLE) | |
| self.assertEqual(title, b"Installation Database") | |
| sum_info.SetProperty(msilib.PID_TITLE, "a" * 999) | |
| title = sum_info.GetProperty(msilib.PID_TITLE) | |
| self.assertEqual(title, b"a" * 999) | |
| sum_info.SetProperty(msilib.PID_TITLE, "a" * 1000) | |
| title = sum_info.GetProperty(msilib.PID_TITLE) | |
| self.assertEqual(title, b"a" * 1000) | |
| sum_info.SetProperty(msilib.PID_TITLE, "a" * 1001) | |
| title = sum_info.GetProperty(msilib.PID_TITLE) | |
| self.assertEqual(title, b"a" * 1001) | |
| finally: | |
| db = None | |
| sum_info = None | |
| os.unlink(db_path) | |
| def test_database_open_failed(self): | |
| with self.assertRaises(msilib.MSIError) as cm: | |
| msilib.OpenDatabase('non-existent.msi', msilib.MSIDBOPEN_READONLY) | |
| self.assertEqual(str(cm.exception), 'open failed') | |
| def test_database_create_failed(self): | |
| db_path = os.path.join(TESTFN, 'test.msi') | |
| with self.assertRaises(msilib.MSIError) as cm: | |
| msilib.OpenDatabase(db_path, msilib.MSIDBOPEN_CREATE) | |
| self.assertEqual(str(cm.exception), 'create failed') | |
| def test_get_property_vt_empty(self): | |
| db, db_path = init_database() | |
| summary = db.GetSummaryInformation(0) | |
| self.assertIsNone(summary.GetProperty(msilib.PID_SECURITY)) | |
| db.Close() | |
| self.addCleanup(unlink, db_path) | |
| def test_directory_start_component_keyfile(self): | |
| db, db_path = init_database() | |
| self.addCleanup(unlink, db_path) | |
| self.addCleanup(db.Close) | |
| self.addCleanup(msilib._directories.clear) | |
| feature = msilib.Feature(db, 0, 'Feature', 'A feature', 'Python') | |
| cab = msilib.CAB('CAB') | |
| dir = msilib.Directory(db, cab, None, TESTFN, 'TARGETDIR', | |
| 'SourceDir', 0) | |
| dir.start_component(None, feature, None, 'keyfile') | |
| def test_getproperty_uninitialized_var(self): | |
| db, db_path = init_database() | |
| self.addCleanup(unlink, db_path) | |
| self.addCleanup(db.Close) | |
| si = db.GetSummaryInformation(0) | |
| with self.assertRaises(msilib.MSIError): | |
| si.GetProperty(-1) | |
| class Test_make_id(unittest.TestCase): | |
| #http://msdn.microsoft.com/en-us/library/aa369212(v=vs.85).aspx | |
| """The Identifier data type is a text string. Identifiers may contain the | |
| ASCII characters A-Z (a-z), digits, underscores (_), or periods (.). | |
| However, every identifier must begin with either a letter or an | |
| underscore. | |
| """ | |
| def test_is_no_change_required(self): | |
| self.assertEqual( | |
| msilib.make_id("short"), "short") | |
| self.assertEqual( | |
| msilib.make_id("nochangerequired"), "nochangerequired") | |
| self.assertEqual( | |
| msilib.make_id("one.dot"), "one.dot") | |
| self.assertEqual( | |
| msilib.make_id("_"), "_") | |
| self.assertEqual( | |
| msilib.make_id("a"), "a") | |
| #self.assertEqual( | |
| # msilib.make_id(""), "") | |
| def test_invalid_first_char(self): | |
| self.assertEqual( | |
| msilib.make_id("9.short"), "_9.short") | |
| self.assertEqual( | |
| msilib.make_id(".short"), "_.short") | |
| def test_invalid_any_char(self): | |
| self.assertEqual( | |
| msilib.make_id(".s\x82ort"), "_.s_ort") | |
| self.assertEqual( | |
| msilib.make_id(".s\x82o?*+rt"), "_.s_o___rt") | |
| if __name__ == '__main__': | |
| unittest.main() |