153 lines
5.0 KiB
Python
153 lines
5.0 KiB
Python
|
""" 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()
|