[cpp-sp] branch main updated: Unit tests for ModuleConfig.
Scott Cantor
cantor.2 at osu.edu
Tue Jan 14 16:36:05 UTC 2025
This is an automated email from the git hooks/post-receive script.
scantor pushed a commit to branch main
in repository cpp-sp.
View the commit online:
http://git.shibboleth.net/view/?p=cpp-sp.git;a=commit;h=8b27e8f117a7d80c3890a4d603b8f8a561560574
The following commit(s) were added to refs/heads/main by this push:
new 8b27e8f1 Unit tests for ModuleConfig.
8b27e8f1 is described below
commit 8b27e8f117a7d80c3890a4d603b8f8a561560574
Author: Scott Cantor <cantor.2 at osu.edu>
AuthorDate: Tue Jan 14 11:36:00 2025 -0500
Unit tests for ModuleConfig.
---
shibsp/platform/iis/ModuleConfig.cpp | 19 ++--
shibsp/platform/iis/ModuleConfig.h | 8 +-
tests/Makefile.am | 1 +
tests/data/platform/iis/console-shibboleth.ini | 7 ++
tests/data/platform/iis/iis-bad.ini | 5 +
tests/data/platform/iis/iis-bad.xml | 3 +
tests/data/platform/iis/iis.ini | 16 ++++
tests/data/platform/iis/iis.xml | 17 ++++
tests/platform/iis/ModuleConfigTests.cpp | 125 +++++++++++++++++++++++++
9 files changed, 192 insertions(+), 9 deletions(-)
diff --git a/shibsp/platform/iis/ModuleConfig.cpp b/shibsp/platform/iis/ModuleConfig.cpp
index 9cd77447..bce7903b 100644
--- a/shibsp/platform/iis/ModuleConfig.cpp
+++ b/shibsp/platform/iis/ModuleConfig.cpp
@@ -92,7 +92,7 @@ ModuleConfigImpl::ModuleConfigImpl(unique_ptr<ptree> pt, bool xml)
load(global.get());
}
else {
- m_log.warn("IIS configuration missing [global] section, using defaults");
+ m_log.info("IIS configuration missing [global] section, using defaults");
}
// Sites are in children of the root of the tree.
doSites(*m_root);
@@ -117,7 +117,10 @@ void ModuleConfigImpl::doSites(ptree& parent)
string aliases;
for (const auto& alias : child.second) {
if (alias.first == "Alias" && !alias.second.get_value<string>().empty()) {
- aliases += alias.second.get_value<string>() + ' ';
+ if (!aliases.empty()) {
+ aliases += ' ';
+ }
+ aliases += alias.second.get_value<string>();
}
}
if (!aliases.empty()) {
@@ -157,12 +160,14 @@ const PropertySet* ModuleConfigImpl::getSiteConfig(const char* id) const
return nullptr;
}
-unique_ptr<ModuleConfig> ModuleConfig::newModuleConfig()
+unique_ptr<ModuleConfig> ModuleConfig::newModuleConfig(const char* path)
{
- static const char IIS_CONFIG_PATH_PROP_PATH[] = "IISConfigPath";
-
- string path(AgentConfig::getConfig().getAgent().getString(IIS_CONFIG_PATH_PROP_PATH, "iis-config.ini"));
- AgentConfig::getConfig().getPathResolver().resolve(path, PathResolver::SHIBSP_CFG_FILE);
+ string resolved_path(path ? path : "");
+ if (!path) {
+ static const char IIS_CONFIG_PATH_PROP_PATH[] = "IISConfigPath";
+ resolved_path = AgentConfig::getConfig().getAgent().getString(IIS_CONFIG_PATH_PROP_PATH, "iis-config.ini");
+ }
+ AgentConfig::getConfig().getPathResolver().resolve(resolved_path, PathResolver::SHIBSP_CFG_FILE);
unique_ptr<ptree> config_root(new ptree());
diff --git a/shibsp/platform/iis/ModuleConfig.h b/shibsp/platform/iis/ModuleConfig.h
index f64a460e..b290f169 100644
--- a/shibsp/platform/iis/ModuleConfig.h
+++ b/shibsp/platform/iis/ModuleConfig.h
@@ -34,14 +34,18 @@ namespace shibsp {
* @param id site ID
* @return site configuration expressed as a PropertySet
*/
- const PropertySet* getSiteConfig(const char* id) const;
+ virtual const PropertySet* getSiteConfig(const char* id) const=0;
/**
* Create and return an instance of this class for use.
*
* <p>The underlying agent library must be initialized before calling this method.</p>
+ * <p>The path will be derived from the IISConfigPath global agent property if not supplied.</p>
+ * <p>Paths must end in ".ini" or ".xml" and will be parsed accordingly.</p>
+ *
+ * @param path optional path to config file to load
*/
- static std::unique_ptr<ModuleConfig> newModuleConfig();
+ static std::unique_ptr<ModuleConfig> newModuleConfig(const char* path=nullptr);
};
};
};
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 9ea04263..0e857985 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -14,6 +14,7 @@ shibsptest_SOURCES = \
AgentConfigTests.cpp \
impl/XMLAccessControlTests.cpp \
impl/XMLRequestMapperTests.cpp \
+ platform/iis/ModuleConfigTests.cpp \
util/PropertyTreeTests.cpp \
util/BoostPropertySetTests.cpp \
util/ReloadableXMLFileTests.cpp
diff --git a/tests/data/platform/iis/console-shibboleth.ini b/tests/data/platform/iis/console-shibboleth.ini
new file mode 100644
index 00000000..7b976b9e
--- /dev/null
+++ b/tests/data/platform/iis/console-shibboleth.ini
@@ -0,0 +1,7 @@
+[logging]
+type = console
+defaultLevel = INFO
+
+[logging-categories]
+Shibboleth.AgentConfig = WARN
+Shibboleth.IIS = DEBUG
diff --git a/tests/data/platform/iis/iis-bad.ini b/tests/data/platform/iis/iis-bad.ini
new file mode 100644
index 00000000..94cff93b
--- /dev/null
+++ b/tests/data/platform/iis/iis-bad.ini
@@ -0,0 +1,5 @@
+[global]
+foo = bar
+
+[site1
+foo = bar
\ No newline at end of file
diff --git a/tests/data/platform/iis/iis-bad.xml b/tests/data/platform/iis/iis-bad.xml
new file mode 100644
index 00000000..96060550
--- /dev/null
+++ b/tests/data/platform/iis/iis-bad.xml
@@ -0,0 +1,3 @@
+<ISAPI>
+ <Site>
+</ISAPI>
\ No newline at end of file
diff --git a/tests/data/platform/iis/iis.ini b/tests/data/platform/iis/iis.ini
new file mode 100644
index 00000000..dea68adf
--- /dev/null
+++ b/tests/data/platform/iis/iis.ini
@@ -0,0 +1,16 @@
+[bad]
+; no name property
+foo = bar
+
+[1]
+name = sp.example.org
+
+[2]
+name = sp2.example.org
+scheme = https
+port = 443
+
+[3]
+name = sp3.example.org
+aliases = alt.example.org alt2.example.org
+
diff --git a/tests/data/platform/iis/iis.xml b/tests/data/platform/iis/iis.xml
new file mode 100644
index 00000000..027b4eb1
--- /dev/null
+++ b/tests/data/platform/iis/iis.xml
@@ -0,0 +1,17 @@
+<IIS useHeaders="true" useVariables="false">
+
+ <Site id="bad" />
+
+ <Site id="1" name="sp.example.org" />
+
+ <Site id="2" name="sp2.example.org" scheme="https" port="443" />
+
+ <Site id="3" name="sp3.example.org">
+ <Alias>alt.example.org</Alias>
+ <Alias>alt2.example.org</Alias>
+ </Site>
+
+ <Roles roleAttributes="foo bar" />
+
+</IIS>
+
diff --git a/tests/platform/iis/ModuleConfigTests.cpp b/tests/platform/iis/ModuleConfigTests.cpp
new file mode 100644
index 00000000..0f609997
--- /dev/null
+++ b/tests/platform/iis/ModuleConfigTests.cpp
@@ -0,0 +1,125 @@
+/*
+ * Licensed 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.
+ */
+
+/**
+ * platform/iis/ModuleConfigTests.cpp
+ *
+ * Unit tests for IIS ModuleConfig class.
+ */
+
+#include "exceptions.h"
+#include "AgentConfig.h"
+#include "platform/iis/ModuleConfig.h"
+
+#include <memory>
+
+#include <boost/property_tree/ini_parser.hpp>
+#include <boost/property_tree/xml_parser.hpp>
+#include <boost/test/unit_test.hpp>
+
+using namespace shibsp::iis;
+using namespace shibsp;
+using namespace boost::property_tree;
+using namespace std;
+
+#define DATA_PATH "./data/platform/iis/"
+
+namespace {
+
+class exceptionCheck {
+public:
+ exceptionCheck(const string& msg) : m_msg(msg) {}
+ bool check_message(const exception& e) {
+ cout << e.what() << endl;
+ return m_msg.compare(e.what()) == 0;
+ }
+private:
+ string m_msg;
+};
+
+struct ModuleConfigFixture
+{
+ ModuleConfigFixture() : data_path(DATA_PATH) {
+ AgentConfig::getConfig().init(nullptr, (data_path + "./console-shibboleth.ini").c_str(), true);
+ }
+ ~ModuleConfigFixture() {
+ AgentConfig::getConfig().term();
+ }
+
+ string data_path;
+};
+
+BOOST_FIXTURE_TEST_CASE(ModuleConfigTest_ini_invalid, ModuleConfigFixture)
+{
+ exceptionCheck checker(data_path + "iis-bad.ini(4): unmatched '['");
+ BOOST_CHECK_EXCEPTION(ModuleConfig::newModuleConfig(string(data_path + "iis-bad.ini").c_str()),
+ ini_parser_error, checker.check_message);
+}
+
+BOOST_FIXTURE_TEST_CASE(ModuleConfigTest_xml_invalid, ModuleConfigFixture)
+{
+ exceptionCheck checker(data_path + "iis-bad.xml(3): unexpected end of data");
+ BOOST_CHECK_EXCEPTION(ModuleConfig::newModuleConfig(string(data_path + "iis-bad.xml").c_str()),
+ xml_parser_error, checker.check_message);
+}
+
+void validateSites(const ModuleConfig* config)
+{
+ // Bad site should be absent.
+ BOOST_CHECK_EQUAL(config->getSiteConfig("bad"), nullptr);
+
+ const PropertySet* one = config->getSiteConfig("1");
+ BOOST_CHECK(one);
+ BOOST_CHECK_EQUAL(one->getString("name"), "sp.example.org");
+ BOOST_CHECK_EQUAL(one->getString("scheme"), nullptr);
+ BOOST_CHECK_EQUAL(one->getUnsignedInt("port", 0), 0);
+ BOOST_CHECK_EQUAL(one->getString("aliases"), nullptr);
+
+ const PropertySet* two = config->getSiteConfig("2");
+ BOOST_CHECK(two);
+ BOOST_CHECK_EQUAL(two->getString("name"), "sp2.example.org");
+ BOOST_CHECK_EQUAL(two->getString("scheme"), "https");
+ BOOST_CHECK_EQUAL(two->getUnsignedInt("port", 0), 443);
+ BOOST_CHECK_EQUAL(two->getString("aliases"), nullptr);
+
+ const PropertySet* three = config->getSiteConfig("3");
+ BOOST_CHECK(three);
+ BOOST_CHECK_EQUAL(three->getString("name"), "sp3.example.org");
+ BOOST_CHECK_EQUAL(three->getString("scheme"), nullptr);
+ BOOST_CHECK_EQUAL(three->getUnsignedInt("port", 0), 0);
+ BOOST_CHECK_EQUAL(three->getString("aliases"), "alt.example.org alt2.example.org");
+}
+
+BOOST_FIXTURE_TEST_CASE(ModuleConfigTest_ini, ModuleConfigFixture)
+{
+ unique_ptr<ModuleConfig> config(ModuleConfig::newModuleConfig(string(data_path + "iis.ini").c_str()));
+
+ BOOST_CHECK(config->getBool("useVariables", true));
+
+ validateSites(config.get());
+}
+
+BOOST_FIXTURE_TEST_CASE(ModuleConfigTest_xml, ModuleConfigFixture)
+{
+ unique_ptr<ModuleConfig> config(ModuleConfig::newModuleConfig(string(data_path + "iis.xml").c_str()));
+
+ BOOST_CHECK(!config->getBool("useVariables", true));
+ BOOST_CHECK(config->getBool("useHeaders", false));
+ BOOST_CHECK_EQUAL(config->getString("authenticatedRole"), nullptr);
+ BOOST_CHECK_EQUAL(config->getString("roleAttributes"), "foo bar");
+
+ validateSites(config.get());
+}
+
+};
\ No newline at end of file
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.
More information about the commits
mailing list