-
Notifications
You must be signed in to change notification settings - Fork 82
/
minimaltest.py
106 lines (92 loc) · 2.93 KB
/
minimaltest.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#! /usr/bin/env python3
""" minimaltest.py - the simplest test of jobe. Runs a C program using a Jobe
server on localhost. Mainly for use by Docker's HEALTHCHECK.
Prints just a "Passed minimal test" message if test passes.
If test fails, prints some diagnostic info and exits with return code 1.
"""
from urllib.error import HTTPError
import json
import sys
import http.client
JOBE_SERVER = 'localhost'
C_CODE = """
#include <stdio.h>
int main() {
printf("Hello world\\n");
}
"""
# =============================================================
def run_test(language, code, filename):
"""Execute the given code in the given language.
Return the result object.
"""
runspec = {
'language_id': language,
'sourcefilename': filename,
'sourcecode': code,
}
resource = '/jobe/index.php/restapi/runs/'
data = json.dumps({ 'run_spec' : runspec })
result = {}
content = ''
headers = {"Content-type": "application/json; charset=utf-8",
"Accept": "application/json"}
try:
connect = http.client.HTTPConnection(JOBE_SERVER)
# print("POST data:\n", data)
connect.request('POST', resource, data, headers)
response = connect.getresponse()
if response.status != 204:
content = response.read().decode('utf8')
if content:
result = json.loads(content)
connect.close()
except (HTTPError, ValueError) as e:
print("\n***************** HTTP ERROR ******************\n")
if response:
print(' Response:', response.status, response.reason, content)
else:
print(e)
return result
def display_result(ro):
'''Display the given result object'''
if not isinstance(ro, dict) or 'outcome' not in ro:
print("Bad result object", ro)
return
outcomes = {
0: 'Successful run',
11: 'Compile error',
12: 'Runtime error',
13: 'Time limit exceeded',
15: 'Successful run',
17: 'Memory limit exceeded',
19: 'Illegal system call',
20: 'Internal error, please report',
21: 'Server overload'}
code = ro['outcome']
print("{}".format(outcomes[code]))
print()
if ro['cmpinfo']:
print("Compiler output:")
print(ro['cmpinfo'])
print()
else:
if ro['stdout']:
print("Output:")
print(ro['stdout'])
else:
print("No output")
if ro['stderr']:
print()
print("Error output:")
print(ro['stderr'])
def main():
'''Demo of a C program run'''
result = run_test('c', C_CODE, 'test.c')
if not isinstance(result, dict) or result.get('outcome', 20) not in [0, 15]:
print("Failed minimal test")
display_result(result) # Diagnostic info if you can find a way to read it
sys.exit(1)
else:
print("Passed minimal test")
main()