11 #include "eckit/testing/Test.h"
12 #include "eckit/io/FileHandle.h"
13 #include "eckit/io/MemoryHandle.h"
14 #include "eckit/io/MultiHandle.h"
25 using namespace eckit::testing;
30 CASE(
"ODBs concatenated in a file are valid (columns change)") {
32 SETUP(
"Write multiple ODBs, then concatenate them together") {
42 writer->setNumberOfColumns(3);
48 for (
size_t i = 1;
i <= 2;
i++) {
65 writer->setNumberOfColumns(3);
71 for (
size_t i = 1;
i <= 2;
i++) {
72 (*writer)[0] =
i * 10;
73 (*writer)[1] =
i * 100;
74 (*writer)[2] =
i * 1000;
88 writer->setNumberOfColumns(4);
95 for (
size_t i = 1;
i <= 2;
i++) {
96 (*writer)[0] =
i * 10;
97 (*writer)[1] =
i * 1000;
98 (*writer)[2] =
i * 100;
113 writer->setNumberOfColumns(2);
118 for (
size_t i = 1;
i <= 2;
i++) {
119 (*writer)[0] =
i * 5;
120 (*writer)[1] =
i * 7;
126 TemporaryODB1 tmpODB1;
127 TemporaryODB2 tmpODB2;
128 TemporaryODB3 tmpODB3;
129 TemporaryODB4 tmpODB4;
136 std::vector<eckit::DataHandle*> readHandles;
137 readHandles.push_back(
new eckit::FileHandle(tmpODB1.path()));
138 readHandles.push_back(
new eckit::FileHandle(tmpODB2.path()));
139 readHandles.push_back(
new eckit::FileHandle(tmpODB3.path()));
140 readHandles.push_back(
new eckit::FileHandle(tmpODB4.path()));
142 eckit::MultiHandle aggregateHandle(readHandles);
143 eckit::FileHandle out_handle(combinedFile.
path());
144 aggregateHandle.openForRead();
145 aggregateHandle.saveInto(out_handle);
149 SECTION(
"The data in the concatenated files is correct") {
154 EXPECT(it->
columns().size() == 3);
155 EXPECT(it->
columns()[0]->name() ==
"x");
156 EXPECT(it->
columns()[1]->name() ==
"y");
157 EXPECT(it->
columns()[2]->name() ==
"z");
160 for (
size_t i = 1;
i < 3;
i++) {
161 for (
size_t j = 0; j < 3; j++) { EXPECT((*it)[j] ==
i); }
167 EXPECT(it->
columns().size() == 3);
168 EXPECT(it->
columns()[0]->name() ==
"x");
169 EXPECT(it->
columns()[1]->name() ==
"y");
170 EXPECT(it->
columns()[2]->name() ==
"v");
174 for (
size_t i = 1;
i < 3;
i++) {
175 EXPECT((*it)[0] == 10 *
i);
176 EXPECT((*it)[1] == 100 *
i);
177 EXPECT((*it)[2] == 1000 *
i);
183 EXPECT(it->
columns().size() == 4);
184 EXPECT(it->
columns()[0]->name() ==
"x");
185 EXPECT(it->
columns()[1]->name() ==
"v");
186 EXPECT(it->
columns()[2]->name() ==
"y");
187 EXPECT(it->
columns()[3]->name() ==
"z");
190 for (
size_t i = 1;
i < 3;
i++) {
191 EXPECT((*it)[0] == 10 *
i);
192 EXPECT((*it)[1] == 1000 *
i);
193 EXPECT((*it)[2] == 100 *
i);
199 EXPECT(it->
columns().size() == 2);
200 EXPECT(it->
columns()[0]->name() ==
"x");
201 EXPECT(it->
columns()[1]->name() ==
"v");
204 for (
size_t i = 1;
i < 3;
i++) {
205 EXPECT((*it)[0] == 5 *
i);
206 EXPECT((*it)[1] == 7 *
i);
211 SECTION(
"A copy of the concatenated file is identical") {
229 CASE(
"If corrupt data follows a valid ODB this should not be treated as a new ODB") {
235 eckit::Buffer buf(4096);
237 eckit::MemoryHandle writeDH(buf);
243 writer->setNumberOfColumns(3);
249 for (
size_t i = 1;
i <= 2;
i++) {
259 const uint32_t invalid_data = 0xBAADF00D;
260 writeDH.write(&invalid_data,
sizeof(invalid_data));
264 eckit::MemoryHandle readDH(buf);
265 readDH.openForRead();
270 EXPECT(
static_cast<long>(it->
data()[0]) == 1);
271 EXPECT(
static_cast<long>(it->
data()[1]) == 1);
272 EXPECT(
static_cast<long>(it->
data()[2]) == 1);
275 EXPECT(
static_cast<long>(it->
data()[0]) == 2);
276 EXPECT(
static_cast<long>(it->
data()[1]) == 2);
277 EXPECT(
static_cast<long>(it->
data()[2]) == 2);
285 CASE(
"If a corrupted ODB (with no row data following the header) then report an error") {
291 eckit::Buffer buf(4096);
293 eckit::MemoryHandle writeDH(buf);
299 writer->setNumberOfColumns(3);
305 for (
size_t i = 1;
i <= 2;
i++) {
316 writeDH.write(buf.data(), 322 - 80);
320 eckit::MemoryHandle readDH(buf.data(),
static_cast<size_t>(writeDH.position()));
321 readDH.openForRead();
326 EXPECT(
static_cast<long>(it->
data()[0]) == 1);
327 EXPECT(
static_cast<long>(it->
data()[1]) == 1);
328 EXPECT(
static_cast<long>(it->
data()[2]) == 1);
331 EXPECT(
static_cast<long>(it->
data()[0]) == 2);
332 EXPECT(
static_cast<long>(it->
data()[1]) == 2);
333 EXPECT(
static_cast<long>(it->
data()[2]) == 2);
338 EXPECT_THROWS_AS(++it, eckit::SeriousBug);
344 int main(
int argc,
char* argv[]) {
345 return run_tests(argc, argv);
const eckit::PathName & path() const
const iterator end() const
unsigned long pass1(T b, const T e)
const core::MetaData & columns() const
iterator begin(bool openDataHandle=true)
int main(int argc, char *argv[])
CASE("ODBs concatenated in a file are valid (columns change)")