blob: 22bc23cd553821c562c42cec204e652a0a6c9307 [file] [log] [blame]
/**
* 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
*
* http://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.
*/
#define CUSTOM_EXTENSION_INIT
#include <filesystem>
#include "unit/TestBase.h"
#include "unit/Catch.h"
#include "agent/agent_version.h"
#include "core/extension/Utils.h"
#include "unit/TestUtils.h"
using namespace std::literals;
namespace {
#if defined(WIN32)
const std::string extension_file = "extension.dll";
#elif defined(__APPLE__)
const std::string extension_file = "libextension.dylib";
#else
const std::string extension_file = "libextension.so";
#endif
struct Fixture : public TestController {
Fixture() {
extension_ = createTempDirectory() / extension_file;
}
std::filesystem::path extension_;
};
const std::shared_ptr<logging::Logger> logger{core::logging::LoggerFactory<Fixture>::getLogger()};
} // namespace
TEST_CASE_METHOD(Fixture, "Could load extension with matching build id") {
std::ofstream{extension_} << "__EXTENSION_BUILD_IDENTIFIER_BEGIN__"
<< minifi::AgentBuild::BUILD_IDENTIFIER << "__EXTENSION_BUILD_IDENTIFIER_END__";
auto lib = minifi::core::extension::internal::asDynamicLibrary(extension_);
REQUIRE(lib);
REQUIRE(lib->verify(logger));
}
TEST_CASE_METHOD(Fixture, "Can't load extension if the build id begin marker is missing") {
std::ofstream{extension_} << "__MISSING_BEGIN__"
<< minifi::AgentBuild::BUILD_IDENTIFIER << "__EXTENSION_BUILD_IDENTIFIER_END__";
auto lib = minifi::core::extension::internal::asDynamicLibrary(extension_);
REQUIRE(lib);
REQUIRE_FALSE(lib->verify(logger));
}
TEST_CASE_METHOD(Fixture, "Can't load extension if the build id end marker is missing") {
std::ofstream{extension_} << "__EXTENSION_BUILD_IDENTIFIER_BEGIN__"
<< minifi::AgentBuild::BUILD_IDENTIFIER << "__MISSING_END__";
auto lib = minifi::core::extension::internal::asDynamicLibrary(extension_);
REQUIRE(lib);
REQUIRE_FALSE(lib->verify(logger));
}
TEST_CASE_METHOD(Fixture, "Can't load extension if the build id does not match") {
std::ofstream{extension_} << "__EXTENSION_BUILD_IDENTIFIER_BEGIN__"
<< "not the build id" << "__EXTENSION_BUILD_IDENTIFIER_END__";
auto lib = minifi::core::extension::internal::asDynamicLibrary(extension_);
REQUIRE(lib);
REQUIRE_FALSE(lib->verify(logger));
}
TEST_CASE_METHOD(Fixture, "Can't load extension if the file does not exist") {
auto lib = minifi::core::extension::internal::asDynamicLibrary(extension_);
REQUIRE(lib);
REQUIRE_THROWS_AS(lib->verify(logger), std::runtime_error);
}
TEST_CASE_METHOD(Fixture, "Can't load extension if the file has zero length") {
std::ofstream{extension_}; // NOLINT(bugprone-unused-raii)
auto lib = minifi::core::extension::internal::asDynamicLibrary(extension_);
REQUIRE(lib);
REQUIRE_FALSE(lib->verify(logger));
}