blob: 4aa4753fc2a6db445b06db5c6acab516d436b955 [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
Berker Peksagbdb83152017-11-23 15:47:30 +03004from test.support import TESTFN, 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():
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
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
Tzu-ping Chung2de576e2019-02-03 01:13:23 +080045 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 Peksag4864a612017-11-24 12:53:58 +030068 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 Peksag19fb1342017-11-24 18:11:18 +030079 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öwisf8d887e2011-03-27 21:05:51 +020086
87class 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 Chung2de576e2019-02-03 01:13:23 +0800118 self.assertEqual(
Martin v. Löwisf8d887e2011-03-27 21:05:51 +0200119 msilib.make_id(".s\x82o?*+rt"), "_.s_o___rt")
120
121
Martin v. Löwisf8d887e2011-03-27 21:05:51 +0200122if __name__ == '__main__':
Zachary Ware38c707e2015-04-13 15:00:43 -0500123 unittest.main()