Line Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
#include "catch.hpp"
#include <stdio.h>
#include <string>
#include <algorithm>

#include "FWCore/SharedMemory/interface/WriteBuffer.h"
#include "FWCore/SharedMemory/interface/ReadBuffer.h"

using namespace edm::shared_memory;

TEST_CASE("test Read/WriteBuffers", "[Buffers]") {
  BufferInfo bufferInfo = {0, 0};

  std::string const uniqueName = "BufferTest" + std::to_string(getpid());

  WriteBuffer writeBuffer(uniqueName, &bufferInfo);

  ReadBuffer readBuffer(uniqueName, &bufferInfo);

  SECTION("First") {
    std::array<char, 4> dummy = {{'t', 'e', 's', 't'}};

    writeBuffer.copyToBuffer(dummy.data(), dummy.size());

    REQUIRE(readBuffer.bufferIdentifier() == 1);
    {
      auto b = readBuffer.buffer();
      REQUIRE(b.second == dummy.size());
      REQUIRE(std::equal(b.first, b.first + b.second, dummy.cbegin(), dummy.cend()));
    }

    SECTION("Smaller") {
      dummy[0] = 'm';

      writeBuffer.copyToBuffer(dummy.data(), dummy.size() - 1);

      REQUIRE(readBuffer.bufferIdentifier() == 1);
      {
        auto b = readBuffer.buffer();
        //the second argument is the buffer capacity, not the last length sent
        REQUIRE(b.second == dummy.size());
        REQUIRE(std::equal(b.first, b.first + b.second - 1, dummy.cbegin(), dummy.cbegin() + dummy.size() - 1));
      }

      SECTION("Larger") {
        std::array<char, 6> dummy = {{'l', 'a', 'r', 'g', 'e', 'r'}};
        writeBuffer.copyToBuffer(dummy.data(), dummy.size());

        REQUIRE(readBuffer.bufferIdentifier() == 2);
        {
          auto b = readBuffer.buffer();
          REQUIRE(b.second == dummy.size());
          REQUIRE(std::equal(b.first, b.first + b.second, dummy.cbegin(), dummy.cend()));
        }

        SECTION("Largest") {
          //this should go back to buffer0
          std::array<char, 7> dummy = {{'l', 'a', 'r', 'g', 'e', 's', 't'}};
          writeBuffer.copyToBuffer(dummy.data(), dummy.size());

          REQUIRE(readBuffer.bufferIdentifier() == 3);
          {
            auto b = readBuffer.buffer();
            REQUIRE(b.second == dummy.size());
            REQUIRE(std::equal(b.first, b.first + b.second, dummy.cbegin(), dummy.cend()));
          }
        }
      }
    }
  }
}