1  # This script is used by test_misc.
       2  
       3  import _imp
       4  import _testinternalcapi
       5  import json
       6  import os
       7  import sys
       8  
       9  
      10  def import_singlephase():
      11      assert '_testsinglephase' not in sys.modules
      12      try:
      13          import _testsinglephase
      14      except ImportError:
      15          sys.modules.pop('_testsinglephase', None)
      16          return False
      17      else:
      18          del sys.modules['_testsinglephase']
      19          return True
      20  
      21  
      22  def check_singlephase(override):
      23      # Check using the default setting.
      24      settings_initial = _testinternalcapi.get_interp_settings()
      25      allowed_initial = import_singlephase()
      26      assert(_testinternalcapi.get_interp_settings() == settings_initial)
      27  
      28      # Apply the override and check.
      29      override_initial = _imp._override_multi_interp_extensions_check(override)
      30      settings_after = _testinternalcapi.get_interp_settings()
      31      allowed_after = import_singlephase()
      32  
      33      # Apply the override again and check.
      34      noop = {}
      35      override_after = _imp._override_multi_interp_extensions_check(override)
      36      settings_noop = _testinternalcapi.get_interp_settings()
      37      if settings_noop != settings_after:
      38          noop['settings_noop'] = settings_noop
      39      allowed_noop = import_singlephase()
      40      if allowed_noop != allowed_after:
      41          noop['allowed_noop'] = allowed_noop
      42  
      43      # Restore the original setting and check.
      44      override_noop = _imp._override_multi_interp_extensions_check(override_initial)
      45      if override_noop != override_after:
      46          noop['override_noop'] = override_noop
      47      settings_restored = _testinternalcapi.get_interp_settings()
      48      allowed_restored = import_singlephase()
      49  
      50      # Restore the original setting again.
      51      override_restored = _imp._override_multi_interp_extensions_check(override_initial)
      52      assert(_testinternalcapi.get_interp_settings() == settings_restored)
      53  
      54      return dict({
      55          'requested': override,
      56          'override__initial': override_initial,
      57          'override_after': override_after,
      58          'override_restored': override_restored,
      59          'settings__initial': settings_initial,
      60          'settings_after': settings_after,
      61          'settings_restored': settings_restored,
      62          'allowed__initial': allowed_initial,
      63          'allowed_after': allowed_after,
      64          'allowed_restored': allowed_restored,
      65      }, **noop)
      66  
      67  
      68  def run_singlephase_check(override, outfd):
      69      with os.fdopen(outfd, 'w') as outfile:
      70          sys.stdout = outfile
      71          sys.stderr = outfile
      72          try:
      73              results = check_singlephase(override)
      74              json.dump(results, outfile)
      75          finally:
      76              sys.stdout = sys.__stdout__
      77              sys.stderr = sys.__stderr__