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