tests/run-tests.py
changeset 39253 c496e8c14b9e
parent 39119 1f987f7c832b
child 39288 a235ee4cfc1c
equal deleted inserted replaced
39252:9a81f126f9fa 39253:c496e8c14b9e
    62 import sysconfig
    62 import sysconfig
    63 import tempfile
    63 import tempfile
    64 import threading
    64 import threading
    65 import time
    65 import time
    66 import unittest
    66 import unittest
       
    67 import uuid
    67 import xml.dom.minidom as minidom
    68 import xml.dom.minidom as minidom
    68 
    69 
    69 try:
    70 try:
    70     import Queue as queue
    71     import Queue as queue
    71 except ImportError:
    72 except ImportError:
  1068         env["HGUSER"]   = "test"
  1069         env["HGUSER"]   = "test"
  1069         env["HGENCODING"] = "ascii"
  1070         env["HGENCODING"] = "ascii"
  1070         env["HGENCODINGMODE"] = "strict"
  1071         env["HGENCODINGMODE"] = "strict"
  1071         env["HGHOSTNAME"] = "test-hostname"
  1072         env["HGHOSTNAME"] = "test-hostname"
  1072         env['HGIPV6'] = str(int(self._useipv6))
  1073         env['HGIPV6'] = str(int(self._useipv6))
       
  1074         if 'HGCATAPULTSERVERPIPE' not in env:
       
  1075             env['HGCATAPULTSERVERPIPE'] = '/dev/null'
  1073 
  1076 
  1074         extraextensions = []
  1077         extraextensions = []
  1075         for opt in self._extraconfigopts:
  1078         for opt in self._extraconfigopts:
  1076             section, key = opt.encode('utf-8').split(b'.', 1)
  1079             section, key = opt.encode('utf-8').split(b'.', 1)
  1077             if section != 'extensions':
  1080             if section != 'extensions':
  1342         def addsalt(line, inpython):
  1345         def addsalt(line, inpython):
  1343             if inpython:
  1346             if inpython:
  1344                 script.append(b'%s %d 0\n' % (salt, line))
  1347                 script.append(b'%s %d 0\n' % (salt, line))
  1345             else:
  1348             else:
  1346                 script.append(b'echo %s %d $?\n' % (salt, line))
  1349                 script.append(b'echo %s %d $?\n' % (salt, line))
       
  1350         active = []
       
  1351         session = str(uuid.uuid4())
       
  1352         if PYTHON3:
       
  1353             session = session.encode('ascii')
       
  1354         def toggletrace(cmd):
       
  1355             quoted = shellquote(cmd.strip()).replace(b'\\', b'\\\\')
       
  1356             if active:
       
  1357                 script.append(
       
  1358                     b'echo END %s %s >> "$HGCATAPULTSERVERPIPE"\n' % (
       
  1359                         session, active[0]))
       
  1360             script.append(
       
  1361                 b'echo START %s %s >> "$HGCATAPULTSERVERPIPE"\n' % (
       
  1362                     session, quoted))
       
  1363             active[0:] = [quoted]
  1347 
  1364 
  1348         script = []
  1365         script = []
  1349 
  1366 
  1350         # After we run the shell script, we re-unify the script output
  1367         # After we run the shell script, we re-unify the script output
  1351         # with non-active parts of the source, with synchronization by our
  1368         # with non-active parts of the source, with synchronization by our
  1369             script.append(b'set -x\n')
  1386             script.append(b'set -x\n')
  1370         if self._hgcommand != b'hg':
  1387         if self._hgcommand != b'hg':
  1371             script.append(b'alias hg="%s"\n' % self._hgcommand)
  1388             script.append(b'alias hg="%s"\n' % self._hgcommand)
  1372         if os.getenv('MSYSTEM'):
  1389         if os.getenv('MSYSTEM'):
  1373             script.append(b'alias pwd="pwd -W"\n')
  1390             script.append(b'alias pwd="pwd -W"\n')
       
  1391 
       
  1392         if os.getenv('HGCATAPULTSERVERPIPE'):
       
  1393             # Kludge: use a while loop to keep the pipe from getting
       
  1394             # closed by our echo commands. The still-running file gets
       
  1395             # reaped at the end of the script, which causes the while
       
  1396             # loop to exit and closes the pipe. Sigh.
       
  1397             script.append(
       
  1398                 b'rtendtracing() {\n'
       
  1399                 b'  echo END %(session)s %(name)s >> $HGCATAPULTSERVERPIPE\n'
       
  1400                 b'  rm -f "$TESTTMP/.still-running"\n'
       
  1401                 b'}\n'
       
  1402                 b'trap "rtendtracing" 0\n'
       
  1403                 b'touch "$TESTTMP/.still-running"\n'
       
  1404                 b'while [ -f "$TESTTMP/.still-running" ]; do sleep 1; done '
       
  1405                 b'> $HGCATAPULTSERVERPIPE &\n'
       
  1406                 b'HGCATAPULTSESSION=%(session)s ; export HGCATAPULTSESSION\n'
       
  1407                 b'echo START %(session)s %(name)s >> $HGCATAPULTSERVERPIPE\n'
       
  1408                 % {
       
  1409                     'name': self.name,
       
  1410                     'session': session,
       
  1411                 }
       
  1412             )
       
  1413 
  1374         if self._case:
  1414         if self._case:
  1375             casestr = b'#'.join(self._case)
  1415             casestr = b'#'.join(self._case)
  1376             if isinstance(self._case, str):
  1416             if isinstance(self._case, str):
  1377                 quoted = shellquote(casestr)
  1417                 quoted = shellquote(casestr)
  1378             else:
  1418             else:
  1434                     inpython = False
  1474                     inpython = False
  1435                 after.setdefault(pos, []).append(l)
  1475                 after.setdefault(pos, []).append(l)
  1436                 prepos = pos
  1476                 prepos = pos
  1437                 pos = n
  1477                 pos = n
  1438                 addsalt(n, False)
  1478                 addsalt(n, False)
  1439                 cmd = l[4:].split()
  1479                 rawcmd = l[4:]
       
  1480                 cmd = rawcmd.split()
       
  1481                 toggletrace(rawcmd)
  1440                 if len(cmd) == 2 and cmd[0] == b'cd':
  1482                 if len(cmd) == 2 and cmd[0] == b'cd':
  1441                     l = b'  $ cd %s || exit 1\n' % cmd[1]
  1483                     l = b'  $ cd %s || exit 1\n' % cmd[1]
  1442                 script.append(l[4:])
  1484                 script.append(rawcmd)
  1443             elif l.startswith(b'  > '): # continuations
  1485             elif l.startswith(b'  > '): # continuations
  1444                 after.setdefault(prepos, []).append(l)
  1486                 after.setdefault(prepos, []).append(l)
  1445                 script.append(l[4:])
  1487                 script.append(l[4:])
  1446             elif l.startswith(b'  '): # results
  1488             elif l.startswith(b'  '): # results
  1447                 # Queue up a list of expected results.
  1489                 # Queue up a list of expected results.
  1456         if inpython:
  1498         if inpython:
  1457             script.append(b'EOF\n')
  1499             script.append(b'EOF\n')
  1458         if skipping is not None:
  1500         if skipping is not None:
  1459             after.setdefault(pos, []).append('  !!! missing #endif\n')
  1501             after.setdefault(pos, []).append('  !!! missing #endif\n')
  1460         addsalt(n + 1, False)
  1502         addsalt(n + 1, False)
  1461 
       
  1462         return salt, script, after, expected
  1503         return salt, script, after, expected
  1463 
  1504 
  1464     def _processoutput(self, exitcode, output, salt, after, expected):
  1505     def _processoutput(self, exitcode, output, salt, after, expected):
  1465         # Merge the script output back into a unified test.
  1506         # Merge the script output back into a unified test.
  1466         warnonly = 1 # 1: not yet; 2: yes; 3: for sure not
  1507         warnonly = 1 # 1: not yet; 2: yes; 3: for sure not