|  | 
|  | 1 | +/* | 
|  | 2 | + * Distributed under the OSI-approved Apache License, Version 2.0.  See | 
|  | 3 | + * accompanying file Copyright.txt for details. | 
|  | 4 | + */ | 
|  | 5 | + | 
|  | 6 | +#include <adios2.h> | 
|  | 7 | +#include <adios2/helper/adiosCommMPI.h> | 
|  | 8 | +#include <gtest/gtest.h> | 
|  | 9 | +#include <mpi.h> | 
|  | 10 | + | 
|  | 11 | +using namespace adios2; | 
|  | 12 | + | 
|  | 13 | +namespace | 
|  | 14 | +{ | 
|  | 15 | +int worldRank, worldSize; | 
|  | 16 | +} | 
|  | 17 | + | 
|  | 18 | +class CharBufferMPITest : public ::testing::Test | 
|  | 19 | +{ | 
|  | 20 | +public: | 
|  | 21 | +    CharBufferMPITest() = default; | 
|  | 22 | +}; | 
|  | 23 | + | 
|  | 24 | +TEST_F(CharBufferMPITest, TestSendReceiveCharBuffer) | 
|  | 25 | +{ | 
|  | 26 | +    helper::Comm comm = adios2::helper::CommWithMPI(MPI_COMM_WORLD); | 
|  | 27 | + | 
|  | 28 | +    int sendToRank = worldRank >= worldSize - 1 ? 0 : worldRank + 1; | 
|  | 29 | +    int recvFromRank = worldRank <= 0 ? worldSize - 1 : worldRank - 1; | 
|  | 30 | + | 
|  | 31 | +    std::vector<char> sendBuffer = {1, 2, 3}; | 
|  | 32 | + | 
|  | 33 | +    comm.Isend(sendBuffer.data(), sendBuffer.size(), sendToRank, 0); | 
|  | 34 | + | 
|  | 35 | +    std::vector<char> recvBuffer; | 
|  | 36 | +    recvBuffer.resize(sendBuffer.size()); | 
|  | 37 | + | 
|  | 38 | +    comm.Recv(recvBuffer.data(), recvBuffer.size(), recvFromRank, 0); | 
|  | 39 | + | 
|  | 40 | +    ASSERT_EQ(recvBuffer.size(), sendBuffer.size()); | 
|  | 41 | + | 
|  | 42 | +    for (size_t i = 0; i < recvBuffer.size(); ++i) | 
|  | 43 | +    { | 
|  | 44 | +        ASSERT_EQ(static_cast<int>(recvBuffer[i]), static_cast<int>(sendBuffer[i])); | 
|  | 45 | +    } | 
|  | 46 | +} | 
|  | 47 | + | 
|  | 48 | +TEST_F(CharBufferMPITest, TestSendReceiveCharBufferNoHelper) | 
|  | 49 | +{ | 
|  | 50 | +    int sendToRank = worldRank >= worldSize - 1 ? 0 : worldRank + 1; | 
|  | 51 | +    int recvFromRank = worldRank <= 0 ? worldSize - 1 : worldRank - 1; | 
|  | 52 | +    constexpr int count = 3; | 
|  | 53 | + | 
|  | 54 | +    // Send the buffer of chars (non-blocking) | 
|  | 55 | +    MPI_Request request = MPI_REQUEST_NULL; | 
|  | 56 | +    char sendBuffer[count] = {1, 2, 3}; | 
|  | 57 | +    MPI_Isend(&sendBuffer, count, MPI_CHAR, sendToRank, 0, MPI_COMM_WORLD, &request); | 
|  | 58 | + | 
|  | 59 | +    // Receive the buffer of chars (blocking) | 
|  | 60 | +    MPI_Status status; | 
|  | 61 | +    char recvBuffer[count]; | 
|  | 62 | +    MPI_Recv(&recvBuffer, count, MPI_CHAR, recvFromRank, 0, MPI_COMM_WORLD, &status); | 
|  | 63 | + | 
|  | 64 | +    for (int i = 0; i < count; ++i) | 
|  | 65 | +    { | 
|  | 66 | +        ASSERT_EQ(static_cast<int>(recvBuffer[i]), static_cast<int>(sendBuffer[i])); | 
|  | 67 | +    } | 
|  | 68 | +} | 
|  | 69 | + | 
|  | 70 | +int main(int argc, char **argv) | 
|  | 71 | +{ | 
|  | 72 | +    MPI_Init(&argc, &argv); | 
|  | 73 | +    MPI_Comm_rank(MPI_COMM_WORLD, &worldRank); | 
|  | 74 | +    MPI_Comm_size(MPI_COMM_WORLD, &worldSize); | 
|  | 75 | +    ::testing::InitGoogleTest(&argc, argv); | 
|  | 76 | + | 
|  | 77 | +    int result = RUN_ALL_TESTS(); | 
|  | 78 | + | 
|  | 79 | +    MPI_Finalize(); | 
|  | 80 | +    return result; | 
|  | 81 | +} | 
0 commit comments