/******************************************************************************** * Copyright (C) 2017-2021 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH * * * * This software is distributed under the terms of the * * GNU Lesser General Public Licence (LGPL) version 3, * * copied verbatim in the file "LICENSE" * ********************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include #include #include namespace { using namespace std; using namespace fair::mq; void CheckOldOptionInterface(Channel& channel, const string& option) { int const expectedValue{500}; int value = expectedValue; channel.GetSocket().SetOption(option, &value, sizeof(value)); value = 0; size_t valueSize = sizeof(value); channel.GetSocket().GetOption(option, &value, &valueSize); ASSERT_EQ(value, expectedValue); } void RunOptionsTest(const string& transport) { fair::mq::ProgOptions config; config.SetProperty("session", tools::Uuid()); auto factory = TransportFactory::CreateTransportFactory(transport, tools::Uuid(), &config); Channel channel("Push", "push", factory); CheckOldOptionInterface(channel, "linger"); CheckOldOptionInterface(channel, "snd-hwm"); CheckOldOptionInterface(channel, "rcv-hwm"); CheckOldOptionInterface(channel, "snd-size"); CheckOldOptionInterface(channel, "rcv-size"); size_t const linger{300}; channel.GetSocket().SetLinger(linger); ASSERT_EQ(channel.GetSocket().GetLinger(), linger); size_t const bufSize{500}; channel.GetSocket().SetSndBufSize(bufSize); ASSERT_EQ(channel.GetSocket().GetSndBufSize(), bufSize); channel.GetSocket().SetRcvBufSize(bufSize); ASSERT_EQ(channel.GetSocket().GetRcvBufSize(), bufSize); size_t const kernelSize{8000}; channel.GetSocket().SetSndKernelSize(kernelSize); ASSERT_EQ(channel.GetSocket().GetSndKernelSize(), kernelSize); channel.GetSocket().SetRcvKernelSize(kernelSize); ASSERT_EQ(channel.GetSocket().GetRcvKernelSize(), kernelSize); } void ZeroingAndMlock(const string& transport) { ProgOptions config; config.SetProperty("session", tools::Uuid()); config.SetProperty("shm-segment-size", 16384); // NOLINT config.SetProperty("shm-zero-segment", true); config.SetProperty("shm-mlock-segment", true); auto factory = TransportFactory::CreateTransportFactory(transport, tools::Uuid(), &config); constexpr size_t size{10000}; auto outMsg(factory->CreateMessage(size)); array test{0}; ASSERT_EQ(memcmp(test.data(), outMsg->GetData(), outMsg->GetSize()), 0); } void ZeroingAndMlockOnCreation(const string& transport) { size_t session{fair::mq::tools::UuidHash()}; fair::mq::ProgOptions config; config.SetProperty("session", to_string(session)); config.SetProperty("shm-segment-size", 16384); // NOLINT config.SetProperty("shm-mlock-segment-on-creation", true); config.SetProperty("shm-zero-segment-on-creation", true); auto factory = FairMQTransportFactory::CreateTransportFactory(transport, fair::mq::tools::Uuid(), &config); constexpr size_t size{10000}; auto outMsg(factory->CreateMessage(size)); array test{0}; ASSERT_EQ(memcmp(test.data(), outMsg->GetData(), outMsg->GetSize()), 0); } TEST(Options, zeromq) // NOLINT { RunOptionsTest("zeromq"); } TEST(Options, shmem) // NOLINT { RunOptionsTest("shmem"); } TEST(ZeroingAndMlock, shmem) // NOLINT { ZeroingAndMlock("shmem"); } TEST(ZeroingAndMlockOnCreation, shmem) { ZeroingAndMlockOnCreation("shmem"); } } // namespace