163 lines
5.9 KiB
Python
163 lines
5.9 KiB
Python
import socket
|
|
import json
|
|
import threading
|
|
import time
|
|
import random
|
|
|
|
def send_request(sock, request):
|
|
"""Send a request and get response"""
|
|
request_str = json.dumps(request) + '\n'
|
|
sock.sendall(request_str.encode())
|
|
|
|
response = sock.recv(1024).decode()
|
|
try:
|
|
return json.loads(response.strip())
|
|
except json.JSONDecodeError:
|
|
return response.strip()
|
|
|
|
def batch_test_client():
|
|
"""Run a test with 50 problems in quick succession"""
|
|
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
|
|
try:
|
|
sock.connect(('localhost', 40000))
|
|
print("Batch Test: Connected")
|
|
|
|
# Generate 50 test cases with known prime and non-prime numbers
|
|
test_numbers = (
|
|
# Known primes
|
|
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47] +
|
|
# Non-primes
|
|
[4, 6, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21, 22, 24, 25] +
|
|
# Edge cases
|
|
[0, 1, -1, 1.5, 2.0] +
|
|
# Larger numbers
|
|
[97, 100, 121, 169, 289, 361, 529, 841, 961, 1001] +
|
|
# Random numbers to complete 50
|
|
[random.randint(1000, 10000) for _ in range(5)]
|
|
)
|
|
|
|
success_count = 0
|
|
start_time = time.time()
|
|
|
|
for i, number in enumerate(test_numbers):
|
|
request = {"method": "isPrime", "number": number}
|
|
|
|
try:
|
|
response = send_request(sock, request)
|
|
expected_prime = (
|
|
isinstance(number, int) and
|
|
number > 1 and
|
|
all(number % i != 0 for i in range(2, int(number ** 0.5) + 1))
|
|
)
|
|
expected = {"method": "isPrime", "prime": expected_prime}
|
|
|
|
if response == expected:
|
|
success_count += 1
|
|
print(f"✓ Test {i+1}/50: {number} -> {response['prime']}")
|
|
else:
|
|
print(f"✗ Test {i+1}/50: {number} Expected: {expected}, Got: {response}")
|
|
|
|
except Exception as e:
|
|
print(f"Error on test {i+1}/50 with number {number}: {e}")
|
|
break
|
|
|
|
end_time = time.time()
|
|
duration = end_time - start_time
|
|
|
|
print(f"\nBatch Test Results:")
|
|
print(f"Total tests: 50")
|
|
print(f"Successful: {success_count}")
|
|
print(f"Failed: {50 - success_count}")
|
|
print(f"Time taken: {duration:.2f} seconds")
|
|
print(f"Average time per request: {(duration/50)*1000:.2f} ms")
|
|
|
|
except ConnectionRefusedError:
|
|
print("Batch Test: Connection failed! Is the server running?")
|
|
|
|
def test_client(test_cases, client_id):
|
|
"""Run a series of test cases"""
|
|
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
|
|
try:
|
|
sock.connect(('localhost', 40000))
|
|
print(f"Client {client_id}: Connected")
|
|
|
|
for i, test in enumerate(test_cases):
|
|
request = test['request']
|
|
expected = test['expected']
|
|
desc = test.get('desc', 'No description')
|
|
|
|
print(f"\nClient {client_id}: Test {i + 1} - {desc}")
|
|
print(f"Request: {request}")
|
|
|
|
try:
|
|
response = send_request(sock, request)
|
|
print(f"Response: {response}")
|
|
|
|
if test.get('should_disconnect', False):
|
|
try:
|
|
send_request(sock, {"method": "isPrime", "number": 2})
|
|
print("ERROR: Server didn't disconnect when it should have")
|
|
except:
|
|
print("SUCCESS: Server correctly disconnected")
|
|
break
|
|
|
|
if response == expected:
|
|
print("SUCCESS: Response matches expected")
|
|
else:
|
|
print(f"FAILURE: Expected {expected}, got {response}")
|
|
|
|
except Exception as e:
|
|
print(f"Error during test: {e}")
|
|
if test.get('should_disconnect', False):
|
|
print("SUCCESS: Expected disconnect occurred")
|
|
else:
|
|
print("FAILURE: Unexpected error")
|
|
break
|
|
|
|
except ConnectionRefusedError:
|
|
print(f"Client {client_id}: Connection failed! Is the server running?")
|
|
|
|
def run_all_tests():
|
|
print("Starting Prime Time Server tests...")
|
|
|
|
# Test 1: Basic functionality
|
|
print("\nTest 1: Single client with valid requests")
|
|
test_client([{
|
|
'desc': "Basic prime test",
|
|
'request': {"method": "isPrime", "number": 7},
|
|
'expected': {"method": "isPrime", "prime": True}
|
|
}], 0)
|
|
|
|
time.sleep(1)
|
|
|
|
# Test 2: Malformed request
|
|
print("\nTest 2: Single client with malformed request")
|
|
test_client([{
|
|
'desc': "Malformed request test",
|
|
'request': {"method": "wrong", "number": 7},
|
|
'expected': "malformed",
|
|
'should_disconnect': True
|
|
}], 0)
|
|
|
|
time.sleep(1)
|
|
|
|
# Test 3: Batch test with 50 problems
|
|
print("\nTest 3: Batch test with 50 problems")
|
|
batch_test_client()
|
|
|
|
time.sleep(1)
|
|
|
|
# Test 4: Multiple parallel clients
|
|
print("\nTest 4: Multiple parallel clients")
|
|
threads = []
|
|
for i in range(5):
|
|
thread = threading.Thread(target=batch_test_client)
|
|
threads.append(thread)
|
|
thread.start()
|
|
time.sleep(0.1)
|
|
|
|
for thread in threads:
|
|
thread.join()
|
|
|
|
if __name__ == "__main__":
|
|
run_all_tests() |