import pytest
import socket
import conftest
import os
import time
import signal
class TestSageTiming:
r"""
These tests are to validate the test framework. They do not
run sage_server.
"""
def test_basic_timing(self):
start = time.time()
result = os.system('sleep 1')
assert result == 0
tick = time.time()
elapsed = tick - start
assert 1.0 == pytest.approx(elapsed, abs = 0.1)
def test_load_sage(self):
start = time.time()
result = os.system("echo '2+2' | sage -python")
assert result == 0
tick = time.time()
elapsed = tick - start
print("elapsed 1: %s"%elapsed)
start = time.time()
result = os.system("echo '2+2' | sage -python")
assert result == 0
tick = time.time()
elapsed = tick - start
print("elapsed 2: %s"%elapsed)
assert elapsed < 2.0
def test_import_sage_server(self):
start = time.time()
code = ';'.join([
"import sys",
"sys.path.extend(['/cocalc/lib/python2.7/site-packages/'])",
"from smc_sagews import sage_server"
])
result = os.system("echo \"{}\" | sage -python".format(code))
assert result == 0
tick = time.time()
elapsed = tick - start
print("elapsed %s"%elapsed)
assert elapsed < 20.0
class TestStartSageServer:
def test_2plus2_timing(self, test_id):
import sys
os.system("smc-sage-server stop")
start = time.time()
os.system("smc-sage-server start")
print("sage_server start time %s sec"%(time.time() - start))
time.sleep(0.5)
host, port = conftest.get_sage_server_info()
print("host %s port %s"%(host, port))
for attempt in range(10):
attempt += 1
print("attempt %s"%attempt)
try:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((host, port))
break
except:
print(sys.exc_info()[0])
pass
time.sleep(0.5)
else:
pytest.fail("Could not connect to sage_server at port %s"%port)
print("connected to socket")
conftest.client_unlock_connection(sock)
print("socket unlocked")
conn = conftest.ConnectionJSON(sock)
c_ack = conn._recv(1)
assert c_ack == 'y',"expect ack for token, got %s"%c_ack
msg = conftest.message.start_session()
msg['type'] = 'sage'
conn.send_json(msg)
print("start_session sent")
typ, mesg = conn.recv()
assert typ == 'json'
pid = mesg['pid']
print("sage_server PID = %s" % pid)
code = "2+2\n"
output = "4\n"
m = conftest.message.execute_code(code = code, id = test_id)
m['preparse'] = True
conn.send_json(m)
typ, mesg = conn.recv()
assert typ == 'json'
assert mesg['id'] == test_id
assert mesg['stdout'] == output
elapsed = time.time() - start
conn.send_json(conftest.message.terminate_session())
print("\nExiting Sage client.")
for loop_count in range(6):
try:
os.kill(pid, 0)
except OSError:
pass
time.sleep(0.5)
else:
print("sending sigterm to %s"%pid)
os.kill(pid, signal.SIGTERM)
print("elapsed 2+2 %s"%elapsed)
assert elapsed < 12.0
return