blob: a373fe841cee9565ff2edc56a4037769361c0532 [file]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to you under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
* implied. See the License for the specific language governing
* permissions and limitations under the License.
*/
#include "Compiler.hh"
#include "DataFile.hh"
#include "Generic.hh"
#include "ValidSchema.hh"
#include <boost/test/included/unit_test.hpp>
#include <boost/test/unit_test.hpp>
#include <filesystem>
using avro::DataFileReader;
using avro::DataFileWriter;
using avro::GenericDatum;
using avro::GenericReader;
using avro::validatingDecoder;
void testCommonSchema(const std::filesystem::path &dir_path) {
const std::filesystem::path &schemaFile = dir_path / "schema.json";
std::ifstream in(schemaFile.c_str());
avro::ValidSchema schema;
avro::compileJsonSchema(in, schema);
const std::filesystem::path &dataFile = dir_path / "data.avro";
GenericDatum datum(schema);
const std::filesystem::path &outputDataFile = dir_path / "data_out.avro";
DataFileReader<GenericDatum> reader(dataFile.string().c_str());
DataFileWriter<GenericDatum> writer(outputDataFile.string().c_str(), schema);
while (reader.read(datum)) {
datum.value<avro::GenericRecord>();
writer.write(datum);
}
writer.close();
reader.close();
GenericDatum datumOrig(schema);
GenericDatum datumNew(schema);
DataFileReader<GenericDatum> readerOrig(dataFile.string().c_str());
DataFileReader<GenericDatum> readerNew(outputDataFile.string().c_str());
while (readerOrig.read(datumOrig)) {
BOOST_CHECK(readerNew.read(datumNew));
avro::GenericRecord &rec1 = datumOrig.value<avro::GenericRecord>();
avro::GenericRecord &rec2 = datumNew.value<avro::GenericRecord>();
BOOST_CHECK_EQUAL(rec1.fieldCount(), rec2.fieldCount());
}
BOOST_CHECK(!readerNew.read(datumNew));
readerNew.close();
readerOrig.close();
std::filesystem::remove(outputDataFile);
}
void testCommonsSchemas() {
const std::filesystem::path commons_schemas{"../../share/test/data/schemas"};
if (!std::filesystem::exists(commons_schemas)) {
std::cout << "\nWarn: Can't access share test folder '../../share/test/data/schemas'\n"
<< std::endl;
return;
}
for (auto const &dir_entry : std::filesystem::directory_iterator{commons_schemas}) {
if (std::filesystem::is_directory(dir_entry)) {
testCommonSchema(dir_entry.path());
}
}
}
boost::unit_test::test_suite *
init_unit_test_suite(int /*argc*/, char * /*argv*/[]) {
using namespace boost::unit_test;
auto *ts = BOOST_TEST_SUITE("Avro C++ unit tests for commons schemas");
ts->add(BOOST_TEST_CASE(&testCommonsSchemas));
return ts;
}