Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Avatar for KuCalc : devops.
Download
50640 views
1
# test_sagews_timing.py
2
# tests of sage worksheet that measure test duration
3
4
# at present I don't see a pytest api feature for this
5
# other than --duration flag which is experimental and
6
# for profiling only
7
import pytest
8
import socket
9
import conftest
10
import os
11
import time
12
import signal
13
14
class TestSageTiming:
15
r"""
16
These tests are to validate the test framework. They do not
17
run sage_server.
18
"""
19
def test_basic_timing(self):
20
start = time.time()
21
result = os.system('sleep 1')
22
assert result == 0
23
tick = time.time()
24
elapsed = tick - start
25
assert 1.0 == pytest.approx(elapsed, abs = 0.1)
26
27
def test_load_sage(self):
28
start = time.time()
29
# maybe put first load into fixture
30
result = os.system("echo '2+2' | sage -python")
31
assert result == 0
32
tick = time.time()
33
elapsed = tick - start
34
print("elapsed 1: %s"%elapsed)
35
# second load after things are cached
36
start = time.time()
37
result = os.system("echo '2+2' | sage -python")
38
assert result == 0
39
tick = time.time()
40
elapsed = tick - start
41
print("elapsed 2: %s"%elapsed)
42
assert elapsed < 2.0
43
44
def test_import_sage_server(self):
45
start = time.time()
46
code = ';'.join([
47
"import sys",
48
"sys.path.extend(['/cocalc/lib/python2.7/site-packages/'])",
49
"from smc_sagews import sage_server"
50
])
51
result = os.system("echo \"{}\" | sage -python".format(code))
52
assert result == 0
53
tick = time.time()
54
elapsed = tick - start
55
print("elapsed %s"%elapsed)
56
assert elapsed < 20.0
57
58
class TestStartSageServer:
59
def test_2plus2_timing(self, test_id):
60
import sys
61
62
# if sage_server is running, stop it
63
os.system("smc-sage-server stop")
64
65
# start the clock
66
start = time.time()
67
68
# start a new sage_server process
69
os.system("smc-sage-server start")
70
print("sage_server start time %s sec"%(time.time() - start))
71
# add pause here because sometimes the log file isn't ready immediately
72
time.sleep(0.5)
73
74
# setup connection to sage_server TCP listener
75
host, port = conftest.get_sage_server_info()
76
print("host %s port %s"%(host, port))
77
78
# multiple tries at connecting because there's a delay between
79
# writing the port number and listening on the socket for connections
80
for attempt in range(10):
81
attempt += 1
82
print("attempt %s"%attempt)
83
try:
84
85
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
86
sock.connect((host, port))
87
break
88
except:
89
print(sys.exc_info()[0])
90
pass
91
time.sleep(0.5)
92
else:
93
pytest.fail("Could not connect to sage_server at port %s"%port)
94
print("connected to socket")
95
96
# unlock
97
conftest.client_unlock_connection(sock)
98
print("socket unlocked")
99
conn = conftest.ConnectionJSON(sock)
100
c_ack = conn._recv(1)
101
assert c_ack == 'y',"expect ack for token, got %s"%c_ack
102
103
# start session
104
msg = conftest.message.start_session()
105
msg['type'] = 'sage'
106
conn.send_json(msg)
107
print("start_session sent")
108
typ, mesg = conn.recv()
109
assert typ == 'json'
110
pid = mesg['pid']
111
print("sage_server PID = %s" % pid)
112
113
code = "2+2\n"
114
output = "4\n"
115
116
m = conftest.message.execute_code(code = code, id = test_id)
117
m['preparse'] = True
118
119
# send block of code to be executed
120
conn.send_json(m)
121
122
# check stdout
123
typ, mesg = conn.recv()
124
assert typ == 'json'
125
assert mesg['id'] == test_id
126
assert mesg['stdout'] == output
127
elapsed = time.time() - start
128
129
# teardown connection
130
conn.send_json(conftest.message.terminate_session())
131
print("\nExiting Sage client.")
132
# wait 3 sec for process to die, then kill it
133
for loop_count in range(6):
134
try:
135
os.kill(pid, 0)
136
except OSError:
137
pass
138
time.sleep(0.5)
139
else:
140
print("sending sigterm to %s"%pid)
141
os.kill(pid, signal.SIGTERM)
142
143
# check timing
144
print("elapsed 2+2 %s"%elapsed)
145
assert elapsed < 12.0
146
147
return
148
149