This is an automated email from the ASF dual-hosted git repository.

pnoltes pushed a commit to branch feature/674-use-properties-type-in-filter
in repository https://gitbox.apache.org/repos/asf/celix.git


The following commit(s) were added to 
refs/heads/feature/674-use-properties-type-in-filter by this push:
     new abd4da92 Add additional null argument test for filter
abd4da92 is described below

commit abd4da92805876f7ab65a781a46a37e31d2632ce
Author: Pepijn Noltes <[email protected]>
AuthorDate: Fri Dec 1 16:32:03 2023 +0100

    Add additional null argument test for filter
---
 libs/utils/gtest/src/FilterTestSuite.cc | 41 ++++++++++++++++++---------------
 libs/utils/include/celix_filter.h       |  3 ++-
 libs/utils/src/filter.c                 |  4 ++--
 3 files changed, 27 insertions(+), 21 deletions(-)

diff --git a/libs/utils/gtest/src/FilterTestSuite.cc 
b/libs/utils/gtest/src/FilterTestSuite.cc
index ac54f006..d6cad19e 100644
--- a/libs/utils/gtest/src/FilterTestSuite.cc
+++ b/libs/utils/gtest/src/FilterTestSuite.cc
@@ -146,38 +146,29 @@ TEST_F(FilterTestSuite, MiscInvalidCreateTest) {
 }
 
 TEST_F(FilterTestSuite, MatchEqualTest) {
-    char* str;
     celix_filter_t* filter;
     celix_properties_t* props = celix_properties_create();
-    char* key = celix_utils_strdup("test_attr1");
-    char* val = celix_utils_strdup("attr1");
-    char* key2 = celix_utils_strdup("test_attr2");
-    char* val2 = celix_utils_strdup("attr2");
+    const char* key = "test_attr1";
+    const char* val = "attr1";
+    const char* key2 = "test_attr2";
+    const char* val2 = "attr2";
     celix_properties_set(props, key, val);
     celix_properties_set(props, key2, val2);
+
     // test AND
-    str = 
celix_utils_strdup("(&(test_attr1=attr1)(|(test_attr2=attr2)(!(test_attr3=attr3))))");
-    filter = celix_filter_create(str);
+    filter = 
celix_filter_create("(&(test_attr1=attr1)(|(test_attr2=attr2)(!(test_attr3=attr3))))");
     bool result = celix_filter_match(filter, props);
     ASSERT_TRUE(result);
+    celix_filter_destroy(filter);
 
     // test AND false
-    celix_filter_destroy(filter);
-    free(str);
-    str = celix_utils_strdup("(test_attr1=attr1)(test_attr1=attr2))");
-    filter = celix_filter_create(str);
-    ASSERT_TRUE(filter == nullptr);
+    filter = celix_filter_create("(&(test_attr1=attr1)(test_attr1=attr2))");
     result = celix_filter_match(filter, props);
     ASSERT_FALSE(result);
+    celix_filter_destroy(filter);
 
     // cleanup
     celix_properties_destroy(props);
-    celix_filter_destroy(filter);
-    free(str);
-    free(key);
-    free(key2);
-    free(val);
-    free(val2);
 }
 
 TEST_F(FilterTestSuite, MatchTest) {
@@ -315,6 +306,20 @@ TEST_F(FilterTestSuite, MatchTest) {
     celix_filter_destroy(filter);
 }
 
+TEST_F(FilterTestSuite, MatchWithNullTest) {
+    //match with null filter, should return true
+    EXPECT_TRUE(celix_filter_match(nullptr, nullptr));
+
+    //match with null properties with a valid match all filter, should return 
true
+    celix_autoptr(celix_filter_t) filter1 = celix_filter_create("(|)");
+    EXPECT_TRUE(celix_filter_match(filter1, nullptr));
+
+    //match with null properties, should return false if an attribute is needed
+    celix_autoptr(celix_filter_t) filter2 = 
celix_filter_create("(test_attr1=attr1)");
+    EXPECT_FALSE(celix_filter_match(filter2, nullptr));
+}
+
+
 TEST_F(FilterTestSuite, MatchRecursionTest) {
     auto* str = 
"(&(test_attr1=attr1)(|(&(test_attr2=attr2)(!(&(test_attr1=attr1)(test_attr3=attr3))))(test_attr3=attr3)))";
     auto* filter = celix_filter_create(str);
diff --git a/libs/utils/include/celix_filter.h 
b/libs/utils/include/celix_filter.h
index 1cdb8eb7..cbe54492 100644
--- a/libs/utils/include/celix_filter.h
+++ b/libs/utils/include/celix_filter.h
@@ -133,7 +133,8 @@ CELIX_DEFINE_AUTOPTR_CLEANUP_FUNC(celix_filter_t, 
celix_filter_destroy)
  * @brief Check whether the provided filter matches the provided properties.
  * @param[in] filter The filter.
  * @param[in] props The properties.
- * @return True if the filter matches the properties, false otherwise. If 
filter or props is NULL false is returned.
+ * @return True if the filter matches the properties, false otherwise. If 
filter is NULL always returns true and
+ *         if props is NULL, the result is the same as if an empty properties 
set was provided.
  */
 CELIX_UTILS_EXPORT bool celix_filter_match(const celix_filter_t* filter, const 
celix_properties_t* props);
 
diff --git a/libs/utils/src/filter.c b/libs/utils/src/filter.c
index cdc0a600..ab0469c8 100644
--- a/libs/utils/src/filter.c
+++ b/libs/utils/src/filter.c
@@ -789,8 +789,8 @@ void celix_filter_destroy(celix_filter_t* filter) {
 }
 
 bool celix_filter_match(const celix_filter_t* filter, const 
celix_properties_t* properties) {
-    if (!filter || !properties) {
-        return false; // matching on null filter or property is always false
+    if (!filter) {
+        return true; // if filter is NULL, it matches
     }
 
     if (filter->operand == CELIX_FILTER_OPERAND_PRESENT) {

Reply via email to