]> granicus.if.org Git - icinga2/commitdiff
Add Utility::ParseVersion() and unit tests
authorMichael Friedrich <michael.friedrich@icinga.com>
Wed, 14 Aug 2019 09:22:55 +0000 (11:22 +0200)
committerMichael Friedrich <michael.friedrich@icinga.com>
Wed, 14 Aug 2019 09:22:55 +0000 (11:22 +0200)
This now uses a regex to extract the short version
similar to how Icinga Web 2 does it.

Additional unit tests prove the rule.

lib/base/utility.cpp
lib/base/utility.hpp
test/CMakeLists.txt
test/base-utility.cpp

index c946a0d44949022fd8e3241b0232bb25fef0792a..1add7616c6109ef03d12af0bc288865dc28f10cb 100644 (file)
@@ -20,6 +20,7 @@
 #include <boost/algorithm/string/replace.hpp>
 #include <boost/uuid/uuid_io.hpp>
 #include <boost/uuid/uuid_generators.hpp>
+#include <boost/regex.hpp>
 #include <ios>
 #include <fstream>
 #include <iostream>
@@ -1172,6 +1173,26 @@ unsigned long Utility::SDBM(const String& str, size_t len)
        return hash;
 }
 
+String Utility::ParseVersion(const String& v)
+{
+       /*
+        * 2.11.0-0.rc1.1
+        * v2.10.5
+        * r2.10.3
+        * v2.11.0-rc1-58-g7c1f716da
+        */
+       boost::regex pattern("^[vr]?(2\\.\\d+\\.\\d+).*$");
+       boost::smatch result;
+
+       if (boost::regex_search(v.GetData(), result, pattern)) {
+               String res(result[1].first, result[1].second);
+               return res;
+       }
+
+       // Couldn't not extract anything, return unparsed version
+       return v;
+}
+
 int Utility::CompareVersion(const String& v1, const String& v2)
 {
        std::vector<String> tokensv1 = v1.Split(".");
index 2c1b0cdc3a81fe2b8a692c7f4bf56114584c74c4..4505dc918a5dca8d32395cc88c576322cd6206b2 100644 (file)
@@ -100,6 +100,7 @@ public:
 
        static unsigned long SDBM(const String& str, size_t len = String::NPos);
 
+       static String ParseVersion(const String& v);
        static int CompareVersion(const String& v1, const String& v2);
 
        static int Random();
index 3d5ed9b7c9e9d71289ee787c818a0d5ab86570dd..6c84fd1f2f864a328e0ef17c82b433d1fa32ec59 100644 (file)
@@ -108,6 +108,7 @@ add_boost_test(base
     base_type/assign
     base_type/byname
     base_type/instantiate
+    base_utility/parse_version
     base_utility/comparepasswords_works
     base_utility/comparepasswords_issafe
     base_utility/validateutf8
index a73c320086c5a3528e00277077221dab07e4d386..bf9b8429e3f0b0caadc56111eef1543244e31540 100644 (file)
@@ -8,6 +8,16 @@ using namespace icinga;
 
 BOOST_AUTO_TEST_SUITE(base_utility)
 
+BOOST_AUTO_TEST_CASE(parse_version)
+{
+       BOOST_CHECK(Utility::ParseVersion("2.11.0-0.rc1.1") == "2.11.0");
+       BOOST_CHECK(Utility::ParseVersion("v2.10.5") == "2.10.5");
+       BOOST_CHECK(Utility::ParseVersion("r2.11.1") == "2.11.1");
+       BOOST_CHECK(Utility::ParseVersion("v2.11.0-rc1-58-g7c1f716da") == "2.11.0");
+
+       BOOST_CHECK(Utility::ParseVersion("v2.11butactually3.0") == "v2.11butactually3.0");
+}
+
 BOOST_AUTO_TEST_CASE(comparepasswords_works)
 {
        BOOST_CHECK(Utility::ComparePasswords("", ""));