From 497745ad31c90545b288e2845049e0ce474bcbe2 Mon Sep 17 00:00:00 2001
From: gcontini <1121667+gcontini@users.noreply.github.com>
Date: 周六, 19 10月 2019 10:10:45 +0800
Subject: [PATCH] Merge branch 'feature/code_review_and_refactor' into develop

---
 test/library/LicenseLocator_test.cpp |  217 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 217 insertions(+), 0 deletions(-)

diff --git a/test/library/LicenseLocator_test.cpp b/test/library/LicenseLocator_test.cpp
new file mode 100644
index 0000000..cf532b2
--- /dev/null
+++ b/test/library/LicenseLocator_test.cpp
@@ -0,0 +1,217 @@
+#define BOOST_TEST_MODULE "test_license_locator"
+
+#include <iostream>
+#include <iterator>
+
+#include <fstream>
+#include <string>
+#include <vector>
+
+#include <boost/filesystem.hpp>
+#include <boost/optional.hpp>
+#include <boost/test/unit_test.hpp>
+#include <stdlib.h>
+#include <cstdio>
+
+#include <build_properties.h>
+
+#include "../../src/library/os/os.h"
+#include "../../src/library/base/EventRegistry.h"
+#include "../../src/library/locate/ApplicationFolder.hpp"
+#include "../../src/library/locate/EnvironmentVarLocation.hpp"
+#include "../../src/library/locate/ExternalDefinition.hpp"
+
+#define MOCK_LICENSE PROJECT_TEST_SRC_DIR "/library/test_reader.ini"
+
+namespace test {
+using namespace license::locate;
+using namespace std;
+using namespace boost::filesystem;
+
+static boost::optional<path> find_file(const path& dir_path, const path& file_name) {
+	const recursive_directory_iterator end;
+	const auto it = find_if(recursive_directory_iterator(dir_path), end,
+		[&file_name](const directory_entry& e) {
+			return e.path().filename() == file_name;
+		});
+	return it == end ? boost::optional<path>() : it->path();
+}
+
+
+/*****************************************************************************
+ * Application Folder tests
+ *****************************************************************************/
+BOOST_AUTO_TEST_CASE( read_license_near_module ) {
+	const string testExeFolder = PROJECT_BINARY_DIR "/test/library";
+	bool exeFileFound = false;
+	string referenceExeFileName;
+	string referenceLicenseFileName;
+	//Verify we're pointing the correct executable, in windows isn't clear where it's built
+#ifdef _WIN32
+	boost::optional<path> exeLocation(find_file(path(testExeFolder), path(BOOST_TEST_MODULE ".exe")));
+	exeFileFound = exeLocation.has_value();
+	if (exeFileFound) {
+		referenceExeFileName = exeLocation.get().string();
+		referenceLicenseFileName = referenceExeFileName.replace(referenceExeFileName.find(BOOST_TEST_MODULE ".exe"),
+			string(BOOST_TEST_MODULE ".exe").size(), BOOST_TEST_MODULE ".lic");
+	}
+#else
+	referenceExeFileName = testExeFolder + "/" + BOOST_TEST_MODULE;
+	std::ifstream f(referenceExeFileName.c_str());
+	exeFileFound = f.good();
+	referenceLicenseFileName = testExeFolder + "/" + BOOST_TEST_MODULE ".lic";
+#endif
+	BOOST_WARN_MESSAGE(!exeFileFound, "File [" + referenceExeFileName + "] NOT found");
+	if (exeFileFound) {
+		//copy test license near module
+		std::ifstream src(MOCK_LICENSE, std::ios::binary);
+		std::ofstream dst(referenceLicenseFileName, std::ios::binary);
+		dst << src.rdbuf();
+		dst.close();
+
+		license::EventRegistry registry;
+		ApplicationFolder applicationFolder;
+		vector<string> licenseInfos = applicationFolder.license_locations(registry);
+		BOOST_CHECK(registry.isGood());
+		BOOST_REQUIRE_EQUAL(1, licenseInfos.size());
+		string currentLocation = licenseInfos[0];
+		BOOST_CHECK_MESSAGE(equivalent(path(referenceLicenseFileName),path(currentLocation)),
+			"file " +currentLocation + "found at expected location");
+		string licenseRealContent = applicationFolder.retrieve_license_content(
+			currentLocation);
+		src.seekg(0, ios::beg);
+		std::string referenceContent((std::istreambuf_iterator<char>(src)),
+			std::istreambuf_iterator<char>());
+		BOOST_CHECK_MESSAGE(referenceContent.compare(licenseRealContent) == 0,
+			"File content is same");
+		remove(referenceLicenseFileName.c_str());
+	}
+}
+
+/*****************************************************************************
+ * External_Definition tests
+ *****************************************************************************/
+
+BOOST_AUTO_TEST_CASE( external_definition ) {
+	//an application can define multiple license locations separated by ';'
+	const char *applicationDefinedString =
+	MOCK_LICENSE ";/this/one/doesnt/exist";
+
+	//read test license
+	std::ifstream src(MOCK_LICENSE, std::ios::binary);
+	std::string referenceContent((std::istreambuf_iterator<char>(src)),
+			std::istreambuf_iterator<char>());
+	license::EventRegistry registry;
+	const LicenseLocation licLocation({applicationDefinedString,nullptr});
+	ExternalDefinition externalDefinition(&licLocation);
+	vector<string> licenseInfos = externalDefinition.license_locations(registry);
+	BOOST_CHECK(registry.isGood());
+	BOOST_CHECK_EQUAL(1, licenseInfos.size());
+	string currentLocation = licenseInfos[0];
+	BOOST_CHECK_MESSAGE(string(MOCK_LICENSE).compare(currentLocation) == 0,
+			"file found at expected location");
+	string licenseRealContent = externalDefinition.retrieve_license_content(
+			currentLocation);
+	BOOST_CHECK_MESSAGE(referenceContent.compare(licenseRealContent) == 0,
+			"File content is same");
+}
+
+/**
+ * The license file doesn't exist. Check that the locator reports the right error
+ */
+BOOST_AUTO_TEST_CASE( external_definition_not_found ) {
+	const char *applicationDefinedString = PROJECT_TEST_SRC_DIR "/this/file/doesnt/exist";
+	license::EventRegistry registry;
+	const LicenseLocation licLocation({applicationDefinedString,nullptr});
+	ExternalDefinition externalDefinition(&licLocation);
+	vector<string> licenseInfos = externalDefinition.license_locations(registry);
+
+	BOOST_CHECK_MESSAGE(registry.isGood(),
+			"No fatal error for now, only warnings");
+	registry.turnWarningsIntoErrors();
+	BOOST_REQUIRE_MESSAGE(!registry.isGood(), "Error detected");
+	BOOST_CHECK_EQUAL(0, licenseInfos.size());
+	BOOST_CHECK_MESSAGE(
+			registry.getLastFailure()->event_type == LICENSE_FILE_NOT_FOUND,
+			"Error detected");
+
+}
+
+/*****************************************************************************
+ * EnvironmentVarLocation tests
+ *****************************************************************************/
+BOOST_AUTO_TEST_CASE( environment_var_location ) {
+	//an application can define multiple license locations separated by ';'
+	const char *environment_variable_value =
+	MOCK_LICENSE ";/this/one/doesnt/exist";
+#ifdef _WIN32
+	_putenv_s(LICENSE_LOCATION_ENV_VAR, environment_variable_value);
+#else
+	setenv(LICENSE_LOCATION_ENV_VAR, environment_variable_value, 1);
+#endif
+	//read test license
+	std::ifstream src(MOCK_LICENSE, std::ios::binary);
+	std::string referenceContent((std::istreambuf_iterator<char>(src)),
+			std::istreambuf_iterator<char>());
+	license::EventRegistry registry;
+
+	EnvironmentVarLocation envVarLocationStrategy;
+	vector<string> licenseInfos = envVarLocationStrategy.license_locations(
+			registry);
+	BOOST_CHECK(registry.isGood());
+	BOOST_CHECK_EQUAL(1, licenseInfos.size());
+	string currentLocation = licenseInfos[0];
+	BOOST_CHECK_MESSAGE(string(MOCK_LICENSE).compare(currentLocation) == 0,
+			"file found at expected location");
+	string licenseRealContent = envVarLocationStrategy.retrieve_license_content(
+			currentLocation);
+	BOOST_CHECK_MESSAGE(referenceContent.compare(licenseRealContent) == 0,
+			"File content is same");
+	UNSETENV(LICENSE_LOCATION_ENV_VAR);
+}
+
+/**
+ * The license file doesn't exist. Check that the locator reports the right error
+ */
+BOOST_AUTO_TEST_CASE( environment_var_location_not_found ) {
+	const char *environment_variable_value =
+	PROJECT_TEST_SRC_DIR "/this/file/doesnt/exist";
+    SETENV(LICENSE_LOCATION_ENV_VAR, environment_variable_value);
+
+	license::EventRegistry registry;
+	EnvironmentVarLocation envVarLocationStrategy;
+	vector<string> licenseInfos = envVarLocationStrategy.license_locations(
+			registry);
+	BOOST_CHECK_MESSAGE(registry.isGood(),
+			"No fatal error for now, only warnings");
+	registry.turnWarningsIntoErrors();
+	BOOST_REQUIRE_MESSAGE(!registry.isGood(), "Error detected");
+	BOOST_CHECK_EQUAL(0, licenseInfos.size());
+	BOOST_CHECK_MESSAGE(
+			registry.getLastFailure()->event_type == LICENSE_FILE_NOT_FOUND,
+			"Error detected");
+	UNSETENV(LICENSE_LOCATION_ENV_VAR);
+}
+
+/**
+ * The license file doesn't exist. Check that the locator reports the right error
+ */
+BOOST_AUTO_TEST_CASE( environment_var_location_not_defined ) {
+	UNSETENV(LICENSE_LOCATION_ENV_VAR);
+	license::EventRegistry registry;
+	EnvironmentVarLocation environmentVarLocation;
+	vector<string> licenseInfos = environmentVarLocation.license_locations(
+			registry);
+
+	BOOST_CHECK_MESSAGE(registry.isGood(),
+			"No fatal error for now, only warnings");
+	registry.turnWarningsIntoErrors();
+	BOOST_REQUIRE_MESSAGE(!registry.isGood(), "Error detected");
+	BOOST_CHECK_EQUAL(0, licenseInfos.size());
+	BOOST_CHECK_MESSAGE(
+			registry.getLastFailure()->event_type
+					== ENVIRONMENT_VARIABLE_NOT_DEFINED, "Error detected");
+
+}
+
+}  //namespace test

--
Gitblit v1.9.1