py2 and py3
diff --git a/test/runjsontests.py b/test/runjsontests.py
index 62e5600..7243063 100644
--- a/test/runjsontests.py
+++ b/test/runjsontests.py
@@ -1,12 +1,30 @@
from __future__ import print_function
+from __future__ import unicode_literals
+from io import open
+from glob import glob
import sys
import os
import os.path
-from glob import glob
import optparse
VALGRIND_CMD = 'valgrind --tool=memcheck --leak-check=yes --undef-value-errors=yes '
+def getStatusOutput(cmd):
+ """
+ Return int, unicode (for both Python 2 and 3).
+ Note: os.popen().close() would return None for 0.
+ """
+ pipe = os.popen(cmd)
+ process_output = pipe.read()
+ try:
+ # We have been using os.popen(). When we read() the result
+ # we get 'str' (bytes) in py2, and 'str' (unicode) in py3.
+ # Ugh! There must be a better way to handle this.
+ process_output = process_output.decode('utf-8')
+ except AttributeError:
+ pass # python3
+ status = pipe.close()
+ return status, process_output
def compareOutputs( expected, actual, message ):
expected = expected.strip().replace('\r','').split('\n')
actual = actual.strip().replace('\r','').split('\n')
@@ -54,21 +72,20 @@
is_json_checker_test = (input_path in test_jsonchecker) or expect_failure
print('TESTING:', input_path, end=' ')
options = is_json_checker_test and '--json-checker' or ''
- pipe = os.popen( '%s%s %s "%s"' % (
+ cmd = '%s%s %s "%s"' % (
valgrind_path, jsontest_executable_path, options,
- input_path) )
- process_output = pipe.read()
- status = pipe.close()
+ input_path)
+ status, process_output = getStatusOutput(cmd)
if is_json_checker_test:
if expect_failure:
- if status is None:
+ if not status:
print('FAILED')
failed_tests.append( (input_path, 'Parsing should have failed:\n%s' %
safeReadFile(input_path)) )
else:
print('OK')
else:
- if status is not None:
+ if status:
print('FAILED')
failed_tests.append( (input_path, 'Parsing failed:\n' + process_output) )
else: