mirror of
https://github.com/paulscherrerinstitute/sf_daq_broker.git
synced 2026-05-09 05:52:03 +02:00
149 lines
5.7 KiB
Python
149 lines
5.7 KiB
Python
import unittest
|
|
|
|
from multiprocessing import Process
|
|
import json
|
|
from time import sleep
|
|
|
|
import os
|
|
import requests
|
|
from bsread import source, PULL
|
|
|
|
from sf_daq_broker import config, broker
|
|
|
|
|
|
class TestBroker(unittest.TestCase):
|
|
TEST_AUDIT_FILE = "ignore_output.txt"
|
|
|
|
def setUp(self):
|
|
config.DEFAULT_AUDIT_FILENAME = TestBroker.TEST_AUDIT_FILE
|
|
|
|
self.channels = ["Channel1", "Channel2", "Channel3"]
|
|
self.stream_output_port = 10000
|
|
self.rest_port = 11000
|
|
|
|
self.broker_process = Process(target=broker.start_server, args=(self.channels,
|
|
self.stream_output_port,
|
|
100,
|
|
self.rest_port))
|
|
|
|
self.broker_process.start()
|
|
sleep(1)
|
|
|
|
def tearDown(self):
|
|
self.broker_process.terminate()
|
|
|
|
try:
|
|
os.remove(TestBroker.TEST_AUDIT_FILE)
|
|
except:
|
|
pass
|
|
|
|
sleep(1)
|
|
|
|
def test_normal_interaction(self):
|
|
start_pulse_id = 100
|
|
stop_pulse_id = 200
|
|
|
|
parameters = {"general/created": "test",
|
|
"general/user": "tester",
|
|
"general/process": "test_process",
|
|
"general/instrument": "mac",
|
|
"output_file": "test.h5"}
|
|
|
|
with source(host="localhost", port=self.stream_output_port, mode=PULL, receive_timeout=500) as input_stream:
|
|
|
|
status = requests.get("http://localhost:%d/status" % self.rest_port).json()["status"]
|
|
self.assertEqual(status, "stopped")
|
|
|
|
message = input_stream.receive()
|
|
self.assertIsNone(message)
|
|
|
|
requests.post("http://localhost:%d/parameters" % self.rest_port, json=parameters)
|
|
|
|
message = input_stream.receive()
|
|
self.assertIsNone(message)
|
|
|
|
status = requests.get("http://localhost:%d/status" % self.rest_port).json()["status"]
|
|
self.assertEqual(status, "configured")
|
|
|
|
requests.put("http://localhost:%d/start_pulse_id/%d" % (self.rest_port, start_pulse_id))
|
|
|
|
message = input_stream.receive()
|
|
self.assertIsNone(message)
|
|
|
|
status = requests.get("http://localhost:%d/status" % self.rest_port).json()["status"]
|
|
self.assertEqual(status, "receiving")
|
|
|
|
requests.put("http://localhost:%d/stop_pulse_id/%d" % (self.rest_port, stop_pulse_id))
|
|
|
|
message = input_stream.receive()
|
|
self.assertIsNotNone(message)
|
|
|
|
status = requests.get("http://localhost:%d/status" % self.rest_port).json()["status"]
|
|
self.assertEqual(status, "stopped")
|
|
|
|
self.assertTrue("data_api_request" in message.data.data)
|
|
self.assertTrue("parameters" in message.data.data)
|
|
|
|
received_data_api_request = json.loads(message.data.data["data_api_request"].value)
|
|
received_parameters = json.loads(message.data.data["parameters"].value)
|
|
|
|
self.assertDictEqual(received_parameters, parameters)
|
|
self.assertEqual(received_data_api_request["range"]["startPulseId"], start_pulse_id)
|
|
self.assertEqual(received_data_api_request["range"]["endPulseId"], stop_pulse_id)
|
|
|
|
start_pulse_id = 1000
|
|
stop_pulse_id = 1100
|
|
parameters = {"general/created": "test2",
|
|
"general/user": "tester2",
|
|
"general/process": "test_process2",
|
|
"general/instrument": "mac2",
|
|
"output_file": "test2.h5"}
|
|
|
|
message = input_stream.receive()
|
|
self.assertIsNone(message)
|
|
|
|
requests.post("http://localhost:%d/parameters" % self.rest_port, json=parameters)
|
|
|
|
message = input_stream.receive()
|
|
self.assertIsNone(message)
|
|
|
|
status = requests.get("http://localhost:%d/status" % self.rest_port).json()["status"]
|
|
self.assertEqual(status, "configured")
|
|
|
|
requests.put("http://localhost:%d/start_pulse_id/%d" % (self.rest_port, start_pulse_id))
|
|
|
|
message = input_stream.receive()
|
|
self.assertIsNone(message)
|
|
|
|
status = requests.get("http://localhost:%d/status" % self.rest_port).json()["status"]
|
|
self.assertEqual(status, "receiving")
|
|
|
|
requests.put("http://localhost:%d/stop_pulse_id/%d" % (self.rest_port, stop_pulse_id))
|
|
|
|
message = input_stream.receive()
|
|
self.assertIsNotNone(message)
|
|
|
|
status = requests.get("http://localhost:%d/status" % self.rest_port).json()["status"]
|
|
self.assertEqual(status, "stopped")
|
|
|
|
self.assertTrue("data_api_request" in message.data.data)
|
|
self.assertTrue("parameters" in message.data.data)
|
|
|
|
received_data_api_request = json.loads(message.data.data["data_api_request"].value)
|
|
received_parameters = json.loads(message.data.data["parameters"].value)
|
|
|
|
self.assertDictEqual(received_parameters, parameters)
|
|
self.assertEqual(received_data_api_request["range"]["startPulseId"], start_pulse_id)
|
|
self.assertEqual(received_data_api_request["range"]["endPulseId"], stop_pulse_id)
|
|
|
|
statistics = requests.get("http://localhost:%d/statistics" % self.rest_port).json()["statistics"]
|
|
self.assertEqual(statistics["n_processed_requests"], 2)
|
|
|
|
statistics_parameters = json.loads(statistics["last_sent_write_request"]["parameters"])
|
|
self.assertDictEqual(statistics_parameters, parameters)
|
|
|
|
with open(TestBroker.TEST_AUDIT_FILE) as input_file:
|
|
lines = input_file.readlines()
|
|
|
|
self.assertEqual(len(lines), 2)
|