Skip to content

Commit 0f76a25

Browse files
WIP: Basic tests sending a buffer of chars
1 parent 00f6902 commit 0f76a25

File tree

2 files changed

+85
-0
lines changed

2 files changed

+85
-0
lines changed

testing/adios2/engine/bp/CMakeLists.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,10 @@ bp5agg_gtest_add_tests(ReadMultithreaded MPI_NONE)
255255
bp5agg_gtest_add_tests(NewFileAppendMode MPI_NONE)
256256
bp5agg_gtest_add_tests(StepsFileGlobalArray MPI_ALLOW)
257257

258+
if(ADIOS2_HAVE_MPI)
259+
gtest_add_tests_helper(CharBufferMPI MPI_ONLY BP Send.Receive CharBuf)
260+
endif()
261+
258262
# Only a single test is enough, pick the latest engine
259263
gtest_add_tests_helper(AccuracyDefaults MPI_NONE BP Engine.BP. .BP5
260264
WORKING_DIRECTORY ${BP5_DIR} EXTRA_ARGS "BP5"
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
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

Comments
 (0)