[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