blob: 6d89ca4b77321eb0d29a7967449463f8e186d1fb [file] [log] [blame]
Martin v. Löwisf8d887e2011-03-27 21:05:51 +02001""" Test suite for the code in msilib """
Berker Peksag4864a612017-11-24 12:53:58 +03002import os.path
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
Berker Peksag4864a612017-11-24 12:53:58 +030045 def test_database_open_failed(self):
46 with self.assertRaises(msilib.MSIError) as cm:
47 msilib.OpenDatabase('non-existent.msi', msilib.MSIDBOPEN_READONLY)
48 self.assertEqual(str(cm.exception), 'open failed')
49
50 def test_database_create_failed(self):
51 db_path = os.path.join(TESTFN, 'test.msi')
52 with self.assertRaises(msilib.MSIError) as cm:
53 msilib.OpenDatabase(db_path, msilib.MSIDBOPEN_CREATE)
54 self.assertEqual(str(cm.exception), 'create failed')
55
Berker Peksag19fb1342017-11-24 18:11:18 +030056 def test_get_property_vt_empty(self):
57 db, db_path = init_database()
58 summary = db.GetSummaryInformation(0)
59 self.assertIsNone(summary.GetProperty(msilib.PID_SECURITY))
60 db.Close()
61 self.addCleanup(unlink, db_path)
62
Martin v. Löwisf8d887e2011-03-27 21:05:51 +020063
64class Test_make_id(unittest.TestCase):
65 #http://msdn.microsoft.com/en-us/library/aa369212(v=vs.85).aspx
66 """The Identifier data type is a text string. Identifiers may contain the
67 ASCII characters A-Z (a-z), digits, underscores (_), or periods (.).
68 However, every identifier must begin with either a letter or an
69 underscore.
70 """
71
72 def test_is_no_change_required(self):
73 self.assertEqual(
74 msilib.make_id("short"), "short")
75 self.assertEqual(
76 msilib.make_id("nochangerequired"), "nochangerequired")
77 self.assertEqual(
78 msilib.make_id("one.dot"), "one.dot")
79 self.assertEqual(
80 msilib.make_id("_"), "_")
81 self.assertEqual(
82 msilib.make_id("a"), "a")
83 #self.assertEqual(
84 # msilib.make_id(""), "")
85
86 def test_invalid_first_char(self):
87 self.assertEqual(
88 msilib.make_id("9.short"), "_9.short")
89 self.assertEqual(
90 msilib.make_id(".short"), "_.short")
91
92 def test_invalid_any_char(self):
93 self.assertEqual(
94 msilib.make_id(".s\x82ort"), "_.s_ort")
95 self.assertEqual (
96 msilib.make_id(".s\x82o?*+rt"), "_.s_o___rt")
97
98
Martin v. Löwisf8d887e2011-03-27 21:05:51 +020099if __name__ == '__main__':
Zachary Ware38c707e2015-04-13 15:00:43 -0500100 unittest.main()