Files
scylladb/test/boost/exception_container_test.cc
Avi Kivity f3eade2f62 treewide: relicense to ScyllaDB-Source-Available-1.0
Drop the AGPL license in favor of a source-available license.
See the blog post [1] for details.

[1] https://www.scylladb.com/2024/12/18/why-were-moving-to-a-source-available-license/
2024-12-18 17:45:13 +02:00

97 lines
2.9 KiB
C++

/*
* Copyright (C) 2022-present ScyllaDB
*/
/*
* SPDX-License-Identifier: LicenseRef-ScyllaDB-Source-Available-1.0
*/
#include "utils/exception_container.hh"
#include "test/lib/scylla_test_case.hh"
#include <seastar/core/sstring.hh>
using namespace seastar;
class foo_exception : public std::exception {
public:
const char* what() const noexcept override {
return "foo";
}
};
class bar_exception : public std::exception {
public:
const char* what() const noexcept override {
return "bar";
}
};
using foo_bar_container = utils::exception_container<foo_exception, bar_exception>;
static sstring foo_bar_what(const foo_bar_container& fbc) {
return fbc.accept([] (const auto& ex) { return ex.what(); });
}
SEASTAR_TEST_CASE(test_exception_container) {
auto empty = foo_bar_container();
auto foo = foo_bar_container(foo_exception());
auto bar = foo_bar_container(bar_exception());
BOOST_REQUIRE(empty.empty());
BOOST_REQUIRE(!foo.empty());
BOOST_REQUIRE(!bar.empty());
BOOST_REQUIRE(!empty);
BOOST_REQUIRE(foo);
BOOST_REQUIRE(bar);
BOOST_REQUIRE_EQUAL(foo_bar_what(empty), sstring("bad exception container access"));
BOOST_REQUIRE_EQUAL(foo_bar_what(foo), sstring("foo"));
BOOST_REQUIRE_EQUAL(foo_bar_what(bar), sstring("bar"));
BOOST_REQUIRE_THROW(empty.throw_me(), utils::bad_exception_container_access);
BOOST_REQUIRE_THROW(foo.throw_me(), foo_exception);
BOOST_REQUIRE_THROW(bar.throw_me(), bar_exception);
// Construct the futures outside BOOST_REQUIRE_THROW
// otherwise the checks would pass if as_exception_future throws
// and we don't want that
auto f_empty = empty.as_exception_future();
auto f_foo = foo.as_exception_future();
auto f_bar = bar.as_exception_future();
BOOST_REQUIRE_THROW(f_empty.get(), utils::bad_exception_container_access);
BOOST_REQUIRE_THROW(f_foo.get(), foo_exception);
BOOST_REQUIRE_THROW(f_bar.get(), bar_exception);
// Same reasoning as with as_exception_future
f_empty = std::move(empty).into_exception_future();
f_foo = std::move(foo).into_exception_future();
f_bar = std::move(bar).into_exception_future();
BOOST_REQUIRE_THROW(f_empty.get(), utils::bad_exception_container_access);
BOOST_REQUIRE_THROW(f_foo.get(), foo_exception);
BOOST_REQUIRE_THROW(f_bar.get(), bar_exception);
return make_ready_future<>();
}
SEASTAR_TEST_CASE(test_exception_container_empty_accept) {
auto empty = foo_bar_container();
struct visitor {
sstring operator()(const foo_exception&) {
return "had foo exception";
}
sstring operator()(const bar_exception&) {
return "had bar exception";
}
sstring operator()(const utils::bad_exception_container_access&) {
return "was empty";
}
};
BOOST_REQUIRE_EQUAL(empty.accept(visitor{}), "was empty");
return make_ready_future<>();
}