(root)/
libxml2-2.12.3/
check-xinclude-test-suite.py
       1  #!/usr/bin/env python3
       2  import sys
       3  import time
       4  import os
       5  sys.path.insert(0, "python")
       6  import libxml2
       7  
       8  #
       9  # the testsuite description
      10  #
      11  DIR="xinclude-test-suite"
      12  CONF="testdescr.xml"
      13  LOG="check-xinclude-test-suite.log"
      14  
      15  log = open(LOG, "w")
      16  
      17  os.chdir(DIR)
      18  
      19  test_nr = 0
      20  test_succeed = 0
      21  test_failed = 0
      22  test_error = 0
      23  #
      24  # Error and warning handlers
      25  #
      26  error_nr = 0
      27  error_msg = ''
      28  
      29  def errorHandler(ctx, str):
      30      global error_nr
      31      global error_msg
      32  
      33      if str.find("error:") >= 0:
      34          error_nr = error_nr + 1
      35      if len(error_msg) < 300:
      36          if len(error_msg) == 0 or error_msg[-1] == '\n':
      37              error_msg = error_msg + "   >>" + str
      38          else:
      39              error_msg = error_msg + str
      40  
      41  libxml2.registerErrorHandler(errorHandler, None)
      42  
      43  def testXInclude(filename, id):
      44      global error_nr
      45      global error_msg
      46      global log
      47  
      48      error_nr = 0
      49      error_msg = ''
      50  
      51      print("testXInclude(%s, %s)" % (filename, id))
      52      return 1
      53  
      54  def runTest(test, basedir):
      55      global test_nr
      56      global test_failed
      57      global test_error
      58      global test_succeed
      59      global error_msg
      60      global log
      61  
      62      fatal_error = 0
      63      uri = test.prop('href')
      64      id = test.prop('id')
      65      type = test.prop('type')
      66      if uri is None:
      67          print("Test without ID:", uri)
      68          return -1
      69      if id is None:
      70          print("Test without URI:", id)
      71          return -1
      72      if type is None:
      73          print("Test without URI:", id)
      74          return -1
      75      if basedir != None:
      76          URI = basedir + "/" + uri
      77      else:
      78          URI = uri
      79      if os.access(URI, os.R_OK) == 0:
      80          print("Test %s missing: base %s uri %s" % (URI, basedir, uri))
      81          return -1
      82  
      83      expected = None
      84      outputfile = None
      85      diff = None
      86      if type != 'error':
      87          output = test.xpathEval('string(output)')
      88          if output == 'No output file.':
      89              output = None
      90          if output == '':
      91              output = None
      92          if output != None:
      93              if basedir != None:
      94                  output = basedir + "/" + output
      95              if os.access(output, os.R_OK) == 0:
      96                  print("Result for %s missing: %s" % (id, output))
      97                  output = None
      98              else:
      99                  try:
     100                      f = open(output)
     101                      expected = f.read()
     102                      outputfile = output
     103                  except:
     104                      print("Result for %s unreadable: %s" % (id, output))
     105  
     106      try:
     107          # print("testing %s" % (URI))
     108          doc = libxml2.parseFile(URI)
     109      except:
     110          doc = None
     111      if doc != None:
     112          res = doc.xincludeProcess()
     113          if res >= 0 and expected != None:
     114              result = doc.serialize()
     115              if result != expected:
     116                  print("Result for %s differs" % (id))
     117                  open("xinclude.res", "w").write(result)
     118                  diff = os.popen("diff %s xinclude.res" % outputfile).read()
     119  
     120          doc.freeDoc()
     121      else:
     122          print("Failed to parse %s" % (URI))
     123          res = -1
     124  
     125  
     126  
     127      test_nr = test_nr + 1
     128      if type == 'success':
     129          if res > 0:
     130              test_succeed = test_succeed + 1
     131          elif res == 0:
     132              test_failed = test_failed + 1
     133              print("Test %s: no substitution done ???" % (id))
     134          elif res < 0:
     135              test_error = test_error + 1
     136              print("Test %s: failed valid XInclude processing" % (id))
     137      elif type == 'error':
     138          if res > 0:
     139              test_error = test_error + 1
     140              print("Test %s: failed to detect invalid XInclude processing" % (id))
     141          elif res == 0:
     142              test_failed = test_failed + 1
     143              print("Test %s: Invalid but no substitution done" % (id))
     144          elif res < 0:
     145              test_succeed = test_succeed + 1
     146      elif type == 'optional':
     147          if res > 0:
     148              test_succeed = test_succeed + 1
     149          else:
     150              print("Test %s: failed optional test" % (id))
     151  
     152      # Log the ontext
     153      if res != 1:
     154          log.write("Test ID %s\n" % (id))
     155          log.write("   File: %s\n" % (URI))
     156          content = test.content.strip()
     157          while content[-1] == '\n':
     158              content = content[0:-1]
     159          log.write("   %s:%s\n\n" % (type, content))
     160          if error_msg != '':
     161              log.write("   ----\n%s   ----\n" % (error_msg))
     162              error_msg = ''
     163          log.write("\n")
     164      if diff != None:
     165          log.write("diff from test %s:\n" %(id))
     166          log.write("   -----------\n%s\n   -----------\n" % (diff));
     167  
     168      return 0
     169  
     170  
     171  def runTestCases(case):
     172      creator = case.prop('creator')
     173      if creator != None:
     174          print("=>", creator)
     175      base = case.getBase(None)
     176      basedir = case.prop('basedir')
     177      if basedir != None:
     178          base = libxml2.buildURI(basedir, base)
     179      test = case.children
     180      while test != None:
     181          if test.name == 'testcase':
     182              runTest(test, base)
     183          if test.name == 'testcases':
     184              runTestCases(test)
     185          test = test.next
     186  
     187  conf = libxml2.parseFile(CONF)
     188  if conf is None:
     189      print("Unable to load %s" % CONF)
     190      sys.exit(1)
     191  
     192  testsuite = conf.getRootElement()
     193  if testsuite.name != 'testsuite':
     194      print("Expecting TESTSUITE root element: aborting")
     195      sys.exit(1)
     196  
     197  profile = testsuite.prop('PROFILE')
     198  if profile != None:
     199      print(profile)
     200  
     201  start = time.time()
     202  
     203  case = testsuite.children
     204  while case != None:
     205      if case.name == 'testcases':
     206          old_test_nr = test_nr
     207          old_test_succeed = test_succeed
     208          old_test_failed = test_failed
     209          old_test_error = test_error
     210          runTestCases(case)
     211          print("   Ran %d tests: %d succeeded, %d failed and %d generated an error" % (
     212                 test_nr - old_test_nr, test_succeed - old_test_succeed,
     213                 test_failed - old_test_failed, test_error - old_test_error))
     214      case = case.next
     215  
     216  conf.freeDoc()
     217  log.close()
     218  
     219  print("Ran %d tests: %d succeeded, %d failed and %d generated an error in %.2f s." % (
     220        test_nr, test_succeed, test_failed, test_error, time.time() - start))