test_msilib.py 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. """ Test suite for the code in msilib """
  2. import os
  3. import unittest
  4. from test.support.import_helper import import_module
  5. from test.support.os_helper import TESTFN, unlink
  6. import warnings
  7. with warnings.catch_warnings():
  8. warnings.simplefilter("ignore", DeprecationWarning)
  9. msilib = import_module('msilib')
  10. import msilib.schema
  11. def init_database():
  12. path = TESTFN + '.msi'
  13. db = msilib.init_database(
  14. path,
  15. msilib.schema,
  16. 'Python Tests',
  17. 'product_code',
  18. '1.0',
  19. 'PSF',
  20. )
  21. return db, path
  22. class MsiDatabaseTestCase(unittest.TestCase):
  23. def test_view_fetch_returns_none(self):
  24. db, db_path = init_database()
  25. properties = []
  26. view = db.OpenView('SELECT Property, Value FROM Property')
  27. view.Execute(None)
  28. while True:
  29. record = view.Fetch()
  30. if record is None:
  31. break
  32. properties.append(record.GetString(1))
  33. view.Close()
  34. db.Close()
  35. self.assertEqual(
  36. properties,
  37. [
  38. 'ProductName', 'ProductCode', 'ProductVersion',
  39. 'Manufacturer', 'ProductLanguage',
  40. ]
  41. )
  42. self.addCleanup(unlink, db_path)
  43. def test_view_non_ascii(self):
  44. db, db_path = init_database()
  45. view = db.OpenView("SELECT 'ß-розпад' FROM Property")
  46. view.Execute(None)
  47. record = view.Fetch()
  48. self.assertEqual(record.GetString(1), 'ß-розпад')
  49. view.Close()
  50. db.Close()
  51. self.addCleanup(unlink, db_path)
  52. def test_summaryinfo_getproperty_issue1104(self):
  53. db, db_path = init_database()
  54. try:
  55. sum_info = db.GetSummaryInformation(99)
  56. title = sum_info.GetProperty(msilib.PID_TITLE)
  57. self.assertEqual(title, b"Installation Database")
  58. sum_info.SetProperty(msilib.PID_TITLE, "a" * 999)
  59. title = sum_info.GetProperty(msilib.PID_TITLE)
  60. self.assertEqual(title, b"a" * 999)
  61. sum_info.SetProperty(msilib.PID_TITLE, "a" * 1000)
  62. title = sum_info.GetProperty(msilib.PID_TITLE)
  63. self.assertEqual(title, b"a" * 1000)
  64. sum_info.SetProperty(msilib.PID_TITLE, "a" * 1001)
  65. title = sum_info.GetProperty(msilib.PID_TITLE)
  66. self.assertEqual(title, b"a" * 1001)
  67. finally:
  68. db = None
  69. sum_info = None
  70. os.unlink(db_path)
  71. def test_database_open_failed(self):
  72. with self.assertRaises(msilib.MSIError) as cm:
  73. msilib.OpenDatabase('non-existent.msi', msilib.MSIDBOPEN_READONLY)
  74. self.assertEqual(str(cm.exception), 'open failed')
  75. def test_database_create_failed(self):
  76. db_path = os.path.join(TESTFN, 'test.msi')
  77. with self.assertRaises(msilib.MSIError) as cm:
  78. msilib.OpenDatabase(db_path, msilib.MSIDBOPEN_CREATE)
  79. self.assertEqual(str(cm.exception), 'create failed')
  80. def test_get_property_vt_empty(self):
  81. db, db_path = init_database()
  82. summary = db.GetSummaryInformation(0)
  83. self.assertIsNone(summary.GetProperty(msilib.PID_SECURITY))
  84. db.Close()
  85. self.addCleanup(unlink, db_path)
  86. def test_directory_start_component_keyfile(self):
  87. db, db_path = init_database()
  88. self.addCleanup(unlink, db_path)
  89. self.addCleanup(db.Close)
  90. self.addCleanup(msilib._directories.clear)
  91. feature = msilib.Feature(db, 0, 'Feature', 'A feature', 'Python')
  92. cab = msilib.CAB('CAB')
  93. dir = msilib.Directory(db, cab, None, TESTFN, 'TARGETDIR',
  94. 'SourceDir', 0)
  95. dir.start_component(None, feature, None, 'keyfile')
  96. def test_getproperty_uninitialized_var(self):
  97. db, db_path = init_database()
  98. self.addCleanup(unlink, db_path)
  99. self.addCleanup(db.Close)
  100. si = db.GetSummaryInformation(0)
  101. with self.assertRaises(msilib.MSIError):
  102. si.GetProperty(-1)
  103. def test_FCICreate(self):
  104. filepath = TESTFN + '.txt'
  105. cabpath = TESTFN + '.cab'
  106. self.addCleanup(unlink, filepath)
  107. with open(filepath, 'wb'):
  108. pass
  109. self.addCleanup(unlink, cabpath)
  110. msilib.FCICreate(cabpath, [(filepath, 'test.txt')])
  111. self.assertTrue(os.path.isfile(cabpath))
  112. class Test_make_id(unittest.TestCase):
  113. #http://msdn.microsoft.com/en-us/library/aa369212(v=vs.85).aspx
  114. """The Identifier data type is a text string. Identifiers may contain the
  115. ASCII characters A-Z (a-z), digits, underscores (_), or periods (.).
  116. However, every identifier must begin with either a letter or an
  117. underscore.
  118. """
  119. def test_is_no_change_required(self):
  120. self.assertEqual(
  121. msilib.make_id("short"), "short")
  122. self.assertEqual(
  123. msilib.make_id("nochangerequired"), "nochangerequired")
  124. self.assertEqual(
  125. msilib.make_id("one.dot"), "one.dot")
  126. self.assertEqual(
  127. msilib.make_id("_"), "_")
  128. self.assertEqual(
  129. msilib.make_id("a"), "a")
  130. #self.assertEqual(
  131. # msilib.make_id(""), "")
  132. def test_invalid_first_char(self):
  133. self.assertEqual(
  134. msilib.make_id("9.short"), "_9.short")
  135. self.assertEqual(
  136. msilib.make_id(".short"), "_.short")
  137. def test_invalid_any_char(self):
  138. self.assertEqual(
  139. msilib.make_id(".s\x82ort"), "_.s_ort")
  140. self.assertEqual(
  141. msilib.make_id(".s\x82o?*+rt"), "_.s_o___rt")
  142. if __name__ == '__main__':
  143. unittest.main()