// Copyright (2019-2023) Paul Scherrer Institute #include #include #include "../writer/JFJochWriterService.h" #include "../writer/StreamWriter.h" #include "../writer/HDF5Objects.h" #include "../common/ZMQImagePusher.h" #include "../receiver/JFJochReceiverService.h" #include "../receiver/HLSSimulatedDevice.h" TEST_CASE("StreamWriterTest_ZMQ","[JFJochWriter]") { RegisterHDF5Filter(); Logger logger("test"); ZMQContext context; std::string zmq_addr = "inproc://#1"; grpc::ServerContext grpc_context; JFJochProtoBuf::Empty empty; DiffractionExperiment x(DetectorGeometry(2)); x.FilePrefix("subdir/JFJochWriterTest").NumTriggers(1).ImagesPerTrigger(5) .UseInternalPacketGenerator(true).Mode(DetectorMode::Raw).PedestalG0Frames(0); JFJochProtoBuf::ReceiverInput receiver_input; *receiver_input.mutable_jungfraujoch_settings() = x; JFModuleGainCalibration gain; std::vector> aq_devices; for (int i = 0; i < x.GetDataStreamsNum(); i++) { auto test = new HLSSimulatedDevice(i, 64); aq_devices.emplace_back(test); } std::vector tmp_devices; for (const auto &i: aq_devices) tmp_devices.emplace_back(i.get()); ZMQImagePusher pusher (context, {zmq_addr}); JFJochReceiverService fpga_receiver_service(tmp_devices, logger, pusher); ; JFJochProtoBuf::ReceiverOutput receiver_output; std::unique_ptr writer; REQUIRE(x.GetImageNum() == 5); REQUIRE_NOTHROW(writer = std::make_unique(context, logger, zmq_addr)); REQUIRE(fpga_receiver_service.Start(&grpc_context, &receiver_input, &empty).ok()); REQUIRE_NOTHROW(writer->Run()); REQUIRE(fpga_receiver_service.Stop(&grpc_context, &empty, &receiver_output).ok()); CHECK(receiver_output.images_sent() == 5); // HDF5 file can be opened std::unique_ptr file; REQUIRE_NOTHROW(file = std::make_unique("subdir/JFJochWriterTest_data_000.h5")); std::unique_ptr dataset; REQUIRE_NOTHROW(dataset = std::make_unique(*file, "/entry/data/data")); std::unique_ptr dataspace; REQUIRE_NOTHROW(dataspace = std::make_unique(*dataset)); REQUIRE(dataspace->GetNumOfDimensions() == 3); REQUIRE(dataspace->GetDimensions()[0] == 5); REQUIRE(dataspace->GetDimensions()[1] == RAW_MODULE_COLS); REQUIRE(dataspace->GetDimensions()[2] == 2*RAW_MODULE_LINES); REQUIRE(std::filesystem::remove("subdir/JFJochWriterTest_master.h5")); REQUIRE(std::filesystem::remove("subdir/JFJochWriterTest_data_000.h5")); REQUIRE(std::filesystem::remove("subdir")); } TEST_CASE("JFJochWriterServiceTest_ZMQ","[JFJochWriter]") { RegisterHDF5Filter(); Logger logger("test"); ZMQContext context; std::string zmq_addr = "inproc://#1"; JFJochWriterService writer(context, logger); grpc::ServerContext grpc_context; JFJochProtoBuf::Empty empty; DiffractionExperiment x(DetectorGeometry(2)); x.FilePrefix("JFJochWriterTest").NumTriggers(1).ImagesPerTrigger(5) .UseInternalPacketGenerator(true) .Mode(DetectorMode::Raw).PedestalG0Frames(0); JFJochProtoBuf::ReceiverInput receiver_input; *receiver_input.mutable_jungfraujoch_settings() = x; JFModuleGainCalibration empty_gain; std::vector> aq_devices; for (int i = 0; i < x.GetDataStreamsNum(); i++) { auto test = new HLSSimulatedDevice(i, 64); aq_devices.emplace_back(test); } std::vector tmp_devices; for (const auto &i: aq_devices) tmp_devices.emplace_back(i.get()); ZMQImagePusher pusher (context, {zmq_addr}); JFJochReceiverService fpga_receiver_service(tmp_devices, logger, pusher); JFJochProtoBuf::WriterInput writer_input; writer_input.set_zmq_receiver_address(zmq_addr); JFJochProtoBuf::ReceiverOutput receiver_output; JFJochProtoBuf::WriterOutput writer_output; REQUIRE(x.GetImageNum() == 5); REQUIRE(writer.Start(&grpc_context, &writer_input, &empty).ok()); REQUIRE(fpga_receiver_service.Start(&grpc_context, &receiver_input, &empty).ok()); REQUIRE(fpga_receiver_service.Stop(&grpc_context, &empty, &receiver_output).ok()); REQUIRE(writer.Stop(&grpc_context, &empty, &writer_output).ok()); REQUIRE(writer_output.nimages() == 5); //TODO: Check contest of HDF5 file }