blob: 153a8ac05e5609460ae0ae05019bfb27b6cb4982 [file] [log] [blame]
Martin v. Löwisf8d887e2011-03-27 21:05:51 +02001""" Test suite for the code in msilib """
Tzu-ping Chung2de576e2019-02-03 01:13:23 +08002import os
Martin v. Löwisf8d887e2011-03-27 21:05:51 +02003import unittest
Serhiy Storchaka55939b12020-06-25 11:37:12 +03004from test.support import TESTFN, FS_NONASCII, import_module, unlink
Martin v. Löwisf8d887e2011-03-27 21:05:51 +02005msilib = import_module('msilib')
Berker Peksagbdb83152017-11-23 15:47:30 +03006import msilib.schema
7
8
9def init_database():
Serhiy Storchaka55939b12020-06-25 11:37:12 +030010 path = TESTFN + (FS_NONASCII or '') + '.msi'
Berker Peksagbdb83152017-11-23 15:47:30 +030011 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
22class 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
Serhiy Storchaka55939b12020-06-25 11:37:12 +030045 def test_view_non_ascii(self):
46 db, db_path = init_database()
47 view = db.OpenView("SELECT 'ß-розпад' FROM Property")
48 view.Execute(None)
49 record = view.Fetch()
50 self.assertEqual(record.GetString(1), 'ß-розпад')
51 view.Close()
52 db.Close()
53 self.addCleanup(unlink, db_path)
54
Tzu-ping Chung2de576e2019-02-03 01:13:23 +080055 def test_summaryinfo_getproperty_issue1104(self):
56 db, db_path = init_database()
57 try:
58 sum_info = db.GetSummaryInformation(99)
59 title = sum_info.GetProperty(msilib.PID_TITLE)
60 self.assertEqual(title, b"Installation Database")
61
62 sum_info.SetProperty(msilib.PID_TITLE, "a" * 999)
63 title = sum_info.GetProperty(msilib.PID_TITLE)
64 self.assertEqual(title, b"a" * 999)
65
66 sum_info.SetProperty(msilib.PID_TITLE, "a" * 1000)
67 title = sum_info.GetProperty(msilib.PID_TITLE)
68 self.assertEqual(title, b"a" * 1000)
69
70 sum_info.SetProperty(msilib.PID_TITLE, "a" * 1001)
71 title = sum_info.GetProperty(msilib.PID_TITLE)
72 self.assertEqual(title, b"a" * 1001)
73 finally:
74 db = None
75 sum_info = None
76 os.unlink(db_path)
77
Berker Peksag4864a612017-11-24 12:53:58 +030078 def test_database_open_failed(self):
79 with self.assertRaises(msilib.MSIError) as cm:
80 msilib.OpenDatabase('non-existent.msi', msilib.MSIDBOPEN_READONLY)
81 self.assertEqual(str(cm.exception), 'open failed')
82
83 def test_database_create_failed(self):
84 db_path = os.path.join(TESTFN, 'test.msi')
85 with self.assertRaises(msilib.MSIError) as cm:
86 msilib.OpenDatabase(db_path, msilib.MSIDBOPEN_CREATE)
87 self.assertEqual(str(cm.exception), 'create failed')
88
Berker Peksag19fb1342017-11-24 18:11:18 +030089 def test_get_property_vt_empty(self):
90 db, db_path = init_database()
91 summary = db.GetSummaryInformation(0)
92 self.assertIsNone(summary.GetProperty(msilib.PID_SECURITY))
93 db.Close()
94 self.addCleanup(unlink, db_path)
95
Zackery Spytzc8d5bf62019-05-31 10:43:13 -060096 def test_directory_start_component_keyfile(self):
97 db, db_path = init_database()
Zackery Spytz549e55a2019-05-31 18:16:20 -060098 self.addCleanup(unlink, db_path)
Zackery Spytzc8d5bf62019-05-31 10:43:13 -060099 self.addCleanup(db.Close)
Pablo Galindoc0295db2019-06-02 21:36:21 +0100100 self.addCleanup(msilib._directories.clear)
Zackery Spytzc8d5bf62019-05-31 10:43:13 -0600101 feature = msilib.Feature(db, 0, 'Feature', 'A feature', 'Python')
102 cab = msilib.CAB('CAB')
103 dir = msilib.Directory(db, cab, None, TESTFN, 'TARGETDIR',
104 'SourceDir', 0)
105 dir.start_component(None, feature, None, 'keyfile')
106
Zackery Spytz549e55a2019-05-31 18:16:20 -0600107 def test_getproperty_uninitialized_var(self):
108 db, db_path = init_database()
109 self.addCleanup(unlink, db_path)
110 self.addCleanup(db.Close)
111 si = db.GetSummaryInformation(0)
112 with self.assertRaises(msilib.MSIError):
113 si.GetProperty(-1)
114
Martin v. Löwisf8d887e2011-03-27 21:05:51 +0200115
116class Test_make_id(unittest.TestCase):
117 #http://msdn.microsoft.com/en-us/library/aa369212(v=vs.85).aspx
118 """The Identifier data type is a text string. Identifiers may contain the
119 ASCII characters A-Z (a-z), digits, underscores (_), or periods (.).
120 However, every identifier must begin with either a letter or an
121 underscore.
122 """
123
124 def test_is_no_change_required(self):
125 self.assertEqual(
126 msilib.make_id("short"), "short")
127 self.assertEqual(
128 msilib.make_id("nochangerequired"), "nochangerequired")
129 self.assertEqual(
130 msilib.make_id("one.dot"), "one.dot")
131 self.assertEqual(
132 msilib.make_id("_"), "_")
133 self.assertEqual(
134 msilib.make_id("a"), "a")
135 #self.assertEqual(
136 # msilib.make_id(""), "")
137
138 def test_invalid_first_char(self):
139 self.assertEqual(
140 msilib.make_id("9.short"), "_9.short")
141 self.assertEqual(
142 msilib.make_id(".short"), "_.short")
143
144 def test_invalid_any_char(self):
145 self.assertEqual(
146 msilib.make_id(".s\x82ort"), "_.s_ort")
Tzu-ping Chung2de576e2019-02-03 01:13:23 +0800147 self.assertEqual(
Martin v. Löwisf8d887e2011-03-27 21:05:51 +0200148 msilib.make_id(".s\x82o?*+rt"), "_.s_o___rt")
149
150
Martin v. Löwisf8d887e2011-03-27 21:05:51 +0200151if __name__ == '__main__':
Zachary Ware38c707e2015-04-13 15:00:43 -0500152 unittest.main()