-
Notifications
You must be signed in to change notification settings - Fork 10
Expand file tree
/
Copy pathtest-DataStorage.cpp
More file actions
258 lines (214 loc) · 11.3 KB
/
test-DataStorage.cpp
File metadata and controls
258 lines (214 loc) · 11.3 KB
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
// NOLINTBEGIN(cert-err58-cpp,cppcoreguidelines-avoid-do-while,readability-function-cognitive-complexity,cppcoreguidelines-avoid-non-const-global-variables,cppcoreguidelines-avoid-c-arrays,modernize-avoid-c-arrays)
#include <memory>
#include <utility>
#include <variant>
#include <boost/uuid/random_generator.hpp>
#include <boost/uuid/uuid.hpp>
#include <catch2/catch_template_test_macros.hpp>
#include <catch2/catch_test_macros.hpp>
#include "../../src/spider/core/Data.hpp"
#include "../../src/spider/core/Driver.hpp"
#include "../../src/spider/core/Error.hpp"
#include "../../src/spider/core/KeyValueData.hpp"
#include "../../src/spider/core/Task.hpp"
#include "../../src/spider/core/TaskGraph.hpp"
#include "../../src/spider/storage/DataStorage.hpp"
#include "../../src/spider/storage/MetadataStorage.hpp"
#include "../../src/spider/storage/StorageConnection.hpp"
#include "../../src/spider/storage/StorageFactory.hpp"
#include "../utils/CoreDataUtils.hpp"
#include "StorageTestHelper.hpp"
namespace {
TEMPLATE_LIST_TEST_CASE(
"Add, get and remove data",
"[storage]",
spider::test::StorageFactoryTypeList
) {
std::unique_ptr<spider::core::StorageFactory> storage_factory
= spider::test::create_storage_factory<TestType>();
std::unique_ptr<spider::core::MetadataStorage> metadata_storage
= storage_factory->provide_metadata_storage();
std::unique_ptr<spider::core::DataStorage> data_storage
= storage_factory->provide_data_storage();
std::variant<std::unique_ptr<spider::core::StorageConnection>, spider::core::StorageErr>
conn_result = storage_factory->provide_storage_connection();
REQUIRE(std::holds_alternative<std::unique_ptr<spider::core::StorageConnection>>(conn_result));
auto conn = std::move(std::get<std::unique_ptr<spider::core::StorageConnection>>(conn_result));
// Add driver and data
spider::core::Data data{"value"};
boost::uuids::random_generator gen;
boost::uuids::uuid const driver_id = gen();
REQUIRE(metadata_storage->add_driver(*conn, spider::core::Driver{driver_id}).success());
REQUIRE(data_storage->add_driver_data(*conn, driver_id, data).success());
// Add data with same id again should fail
spider::core::Data const data_same_id{data.get_id(), "value2"};
REQUIRE(spider::core::StorageErrType::DuplicateKeyErr
== data_storage->add_driver_data(*conn, driver_id, data_same_id).type);
// Get data should match
spider::core::Data result{"temp"};
REQUIRE(data_storage->get_data(*conn, data.get_id(), &result).success());
REQUIRE(spider::test::data_equal(data, result));
// Set data persisted should succeed
data.set_persisted(false);
REQUIRE(data_storage->set_data_persisted(*conn, data).success());
// Get data should match
REQUIRE(data_storage->get_data(*conn, data.get_id(), &result).success());
REQUIRE(spider::test::data_equal(data, result));
// Remove data should succeed
REQUIRE(data_storage->remove_data(*conn, data.get_id()).success());
// Get data should fail
REQUIRE(spider::core::StorageErrType::KeyNotFoundErr
== data_storage->get_data(*conn, data.get_id(), &result).type);
}
TEMPLATE_LIST_TEST_CASE(
"Add and get driver key value data",
"[storage]",
spider::test::StorageFactoryTypeList
) {
std::unique_ptr<spider::core::StorageFactory> storage_factory
= spider::test::create_storage_factory<TestType>();
std::unique_ptr<spider::core::MetadataStorage> metadata_storage
= storage_factory->provide_metadata_storage();
std::unique_ptr<spider::core::DataStorage> data_storage
= storage_factory->provide_data_storage();
std::variant<std::unique_ptr<spider::core::StorageConnection>, spider::core::StorageErr>
conn_result = storage_factory->provide_storage_connection();
REQUIRE(std::holds_alternative<std::unique_ptr<spider::core::StorageConnection>>(conn_result));
auto conn = std::move(std::get<std::unique_ptr<spider::core::StorageConnection>>(conn_result));
// Add driver
boost::uuids::random_generator gen;
boost::uuids::uuid const driver_id = gen();
REQUIRE(metadata_storage->add_driver(*conn, spider::core::Driver{driver_id}).success());
// Add data
spider::core::KeyValueData const data{"key", "value", driver_id};
REQUIRE(data_storage->add_client_kv_data(*conn, data).success());
// Add data with same key and id again should fail
spider::core::KeyValueData const data_same_key{"key", "value2", driver_id};
REQUIRE(spider::core::StorageErrType::DuplicateKeyErr
== data_storage->add_client_kv_data(*conn, data_same_key).type);
// Get data should match
std::string value;
auto err = data_storage->get_client_kv_data(*conn, driver_id, "key", &value);
REQUIRE(data_storage->get_client_kv_data(*conn, driver_id, "key", &value).success());
REQUIRE(data.get_value() == value);
}
TEMPLATE_LIST_TEST_CASE(
"Add and get task key value data",
"[storage]",
spider::test::StorageFactoryTypeList
) {
std::unique_ptr<spider::core::StorageFactory> storage_factory
= spider::test::create_storage_factory<TestType>();
std::unique_ptr<spider::core::MetadataStorage> metadata_storage
= storage_factory->provide_metadata_storage();
std::unique_ptr<spider::core::DataStorage> data_storage
= storage_factory->provide_data_storage();
std::variant<std::unique_ptr<spider::core::StorageConnection>, spider::core::StorageErr>
conn_result = storage_factory->provide_storage_connection();
REQUIRE(std::holds_alternative<std::unique_ptr<spider::core::StorageConnection>>(conn_result));
auto conn = std::move(std::get<std::unique_ptr<spider::core::StorageConnection>>(conn_result));
// Add task
boost::uuids::random_generator gen;
spider::core::Task const task{"func"};
spider::core::TaskGraph graph;
graph.add_task(task);
graph.add_input_task(task.get_id());
graph.add_output_task(task.get_id());
boost::uuids::uuid const job_id = gen();
REQUIRE(metadata_storage->add_job(*conn, job_id, gen(), graph).success());
// Add data
spider::core::KeyValueData const data{"key", "value", task.get_id()};
REQUIRE(data_storage->add_task_kv_data(*conn, data).success());
// Add data with same key and id again should fail
spider::core::KeyValueData const data_same_key{"key", "value2", task.get_id()};
REQUIRE(spider::core::StorageErrType::DuplicateKeyErr
== data_storage->add_task_kv_data(*conn, data_same_key).type);
// Get data should match
std::string value;
REQUIRE(data_storage->get_task_kv_data(*conn, task.get_id(), "key", &value).success());
REQUIRE(data.get_value() == value);
// Clean up
REQUIRE(metadata_storage->remove_job(*conn, job_id).success());
}
TEMPLATE_LIST_TEST_CASE(
"Add and remove task reference for task",
"[storage]",
spider::test::StorageFactoryTypeList
) {
std::unique_ptr<spider::core::StorageFactory> storage_factory
= spider::test::create_storage_factory<TestType>();
std::unique_ptr<spider::core::MetadataStorage> metadata_storage
= storage_factory->provide_metadata_storage();
std::unique_ptr<spider::core::DataStorage> data_storage
= storage_factory->provide_data_storage();
std::variant<std::unique_ptr<spider::core::StorageConnection>, spider::core::StorageErr>
conn_result = storage_factory->provide_storage_connection();
REQUIRE(std::holds_alternative<std::unique_ptr<spider::core::StorageConnection>>(conn_result));
auto conn = std::move(std::get<std::unique_ptr<spider::core::StorageConnection>>(conn_result));
boost::uuids::random_generator gen;
// Add task reference without data and task should fail.
REQUIRE(!data_storage->add_task_reference(*conn, gen(), gen()).success());
// Add task
spider::core::Task const task{"func"};
spider::core::Task const task_2{"func"};
spider::core::TaskGraph graph;
graph.add_task(task);
graph.add_task(task_2);
graph.add_dependency(task.get_id(), task_2.get_id());
graph.add_input_task(task.get_id());
graph.add_output_task(task_2.get_id());
boost::uuids::uuid const job_id = gen();
REQUIRE(metadata_storage->add_job(*conn, job_id, gen(), graph).success());
// Add task reference without data should fail.
REQUIRE(!data_storage->add_task_reference(*conn, gen(), task.get_id()).success());
// Add data
spider::core::Data const data{"value"};
REQUIRE(data_storage->add_task_data(*conn, task.get_id(), data).success());
// Add task reference
REQUIRE(data_storage->add_task_reference(*conn, data.get_id(), task_2.get_id()).success());
// Remove task reference
REQUIRE(data_storage->remove_task_reference(*conn, data.get_id(), task_2.get_id()).success());
// Remove job
REQUIRE(metadata_storage->remove_job(*conn, job_id).success());
// Clean up
REQUIRE(data_storage->remove_dangling_data(*conn).success());
// Get data should fail
spider::core::Data res{"temp"};
REQUIRE(spider::core::StorageErrType::KeyNotFoundErr
== data_storage->get_data(*conn, data.get_id(), &res).type);
}
TEMPLATE_LIST_TEST_CASE(
"Add and remove data reference for driver",
"[storage]",
spider::test::StorageFactoryTypeList
) {
std::unique_ptr<spider::core::StorageFactory> storage_factory
= spider::test::create_storage_factory<TestType>();
std::unique_ptr<spider::core::MetadataStorage> metadata_storage
= storage_factory->provide_metadata_storage();
std::unique_ptr<spider::core::DataStorage> data_storage
= storage_factory->provide_data_storage();
std::variant<std::unique_ptr<spider::core::StorageConnection>, spider::core::StorageErr>
conn_result = storage_factory->provide_storage_connection();
REQUIRE(std::holds_alternative<std::unique_ptr<spider::core::StorageConnection>>(conn_result));
auto conn = std::move(std::get<std::unique_ptr<spider::core::StorageConnection>>(conn_result));
boost::uuids::random_generator gen;
// Add driver reference without data and driver should fail
REQUIRE(!data_storage->add_driver_reference(*conn, gen(), gen()).success());
// Add driver
boost::uuids::uuid const driver_id = gen();
boost::uuids::uuid const driver_id_2 = gen();
REQUIRE(metadata_storage->add_driver(*conn, spider::core::Driver{driver_id}).success());
REQUIRE(metadata_storage->add_driver(*conn, spider::core::Driver{driver_id_2}).success());
// Add driver reference without data should fail
REQUIRE(!data_storage->add_driver_reference(*conn, gen(), driver_id).success());
// Add data
spider::core::Data const data{"value"};
REQUIRE(data_storage->add_driver_data(*conn, driver_id, data).success());
// Add driver reference
REQUIRE(data_storage->add_driver_reference(*conn, data.get_id(), driver_id_2).success());
// Remove driver reference
REQUIRE(data_storage->remove_driver_reference(*conn, data.get_id(), driver_id_2).success());
}
} // namespace
// NOLINTEND(cert-err58-cpp,cppcoreguidelines-avoid-do-while,readability-function-cognitive-complexity,cppcoreguidelines-avoid-non-const-global-variables,cppcoreguidelines-avoid-c-arrays,modernize-avoid-c-arrays)