19
19
#include < numeric>
20
20
#include < tuple>
21
21
22
- using testParams = std::tuple<umf_memory_pool_ops_t *, void *,
23
- umf_memory_provider_ops_t *, void *>;
22
+ class MemoryAccessor {
23
+ public:
24
+ virtual void fill (void *ptr, size_t size, const void *pattern,
25
+ size_t pattern_size) = 0;
26
+ virtual void copy (void *dst_ptr, void *src_ptr, size_t size) = 0;
27
+ };
28
+
29
+ class HostMemoryAccessor : public MemoryAccessor {
30
+ public:
31
+ void fill (void *ptr, size_t size, const void *pattern,
32
+ size_t pattern_size) override {
33
+ assert (ptr != nullptr );
34
+ assert (pattern != nullptr );
35
+ assert (pattern_size > 0 );
36
+ while (size) {
37
+ size_t copy_size = std::min (size, pattern_size);
38
+ std::memcpy (ptr, pattern, copy_size);
39
+ ptr = static_cast <char *>(ptr) + copy_size;
40
+ size -= copy_size;
41
+ }
42
+ }
43
+
44
+ void copy (void *dst_ptr, void *src_ptr, size_t size) override {
45
+ std::memcpy (dst_ptr, src_ptr, size);
46
+ }
47
+ };
24
48
25
- struct umfIpcTest : umf_test::test, ::testing::WithParamInterface<testParams> {
49
+ using ipcTestParams =
50
+ std::tuple<umf_memory_pool_ops_t *, void *, umf_memory_provider_ops_t *,
51
+ void *, MemoryAccessor *>;
52
+
53
+ struct umfIpcTest : umf_test::test,
54
+ ::testing::WithParamInterface<ipcTestParams> {
26
55
umfIpcTest () : pool(nullptr , nullptr ) {}
27
56
void SetUp () override {
28
57
test::SetUp ();
@@ -36,7 +65,7 @@ struct umfIpcTest : umf_test::test, ::testing::WithParamInterface<testParams> {
36
65
// from memoryPool.hpp
37
66
umf_memory_provider_handle_t hProvider;
38
67
umf_memory_pool_handle_t hPool;
39
- auto [pool_ops, pool_params, provider_ops, provider_params] =
68
+ auto [pool_ops, pool_params, provider_ops, provider_params, accessor ] =
40
69
this ->GetParam ();
41
70
42
71
auto ret =
@@ -63,6 +92,8 @@ struct umfIpcTest : umf_test::test, ::testing::WithParamInterface<testParams> {
63
92
UMF_POOL_CREATE_FLAG_OWN_PROVIDER, &hPool);
64
93
EXPECT_EQ (ret, UMF_RESULT_SUCCESS);
65
94
95
+ memAccessor = accessor;
96
+
66
97
return umf::pool_unique_handle_t (hPool, &umfPoolDestroy);
67
98
}
68
99
@@ -78,14 +109,17 @@ struct umfIpcTest : umf_test::test, ::testing::WithParamInterface<testParams> {
78
109
umf::pool_unique_handle_t pool;
79
110
static constexpr int NTHREADS = 10 ;
80
111
stats_type stat;
112
+ MemoryAccessor *memAccessor = nullptr ;
81
113
};
82
114
83
115
TEST_P (umfIpcTest, BasicFlow) {
84
116
constexpr size_t SIZE = 100 ;
117
+ std::vector<int > expected_data (SIZE);
85
118
int *ptr = (int *)umfPoolMalloc (pool.get (), SIZE * sizeof (int ));
86
119
EXPECT_NE (ptr, nullptr );
87
120
88
- std::iota (ptr, ptr + SIZE, 0 );
121
+ std::iota (expected_data.begin (), expected_data.end (), 0 );
122
+ memAccessor->copy (ptr, expected_data.data (), SIZE * sizeof (int ));
89
123
90
124
umf_ipc_handle_t ipcHandleFull = nullptr ;
91
125
size_t handleFullSize = 0 ;
@@ -105,16 +139,20 @@ TEST_P(umfIpcTest, BasicFlow) {
105
139
ret = umfOpenIPCHandle (pool.get (), ipcHandleHalf, &halfArray);
106
140
ASSERT_EQ (ret, UMF_RESULT_SUCCESS);
107
141
108
- for (int i = 0 ; i < (int )SIZE; ++i) {
109
- ASSERT_EQ (reinterpret_cast <int *>(fullArray)[i], i);
110
- }
142
+ std::vector<int > actual_data (SIZE);
143
+ memAccessor->copy (actual_data.data (), fullArray, SIZE * sizeof (int ));
144
+ ASSERT_TRUE (std::equal (expected_data.begin (), expected_data.end (),
145
+ actual_data.begin ()));
146
+
111
147
// Close fullArray before reading halfArray
112
148
ret = umfCloseIPCHandle (fullArray);
113
149
EXPECT_EQ (ret, UMF_RESULT_SUCCESS);
114
150
115
- for (int i = 0 ; i < (int )SIZE / 2 ; ++i) {
116
- ASSERT_EQ (reinterpret_cast <int *>(halfArray)[i], i + SIZE / 2 );
117
- }
151
+ actual_data.resize (SIZE / 2 );
152
+ memAccessor->copy (actual_data.data (), halfArray, SIZE / 2 * sizeof (int ));
153
+ ASSERT_TRUE (std::equal (expected_data.begin () + SIZE / 2 ,
154
+ expected_data.end (), actual_data.begin ()));
155
+
118
156
ret = umfCloseIPCHandle (halfArray);
119
157
EXPECT_EQ (ret, UMF_RESULT_SUCCESS);
120
158
0 commit comments