chiark / gitweb /
bus: add test for bloom filter prefix match
authorLennart Poettering <lennart@poettering.net>
Sun, 19 May 2013 22:36:50 +0000 (00:36 +0200)
committerLennart Poettering <lennart@poettering.net>
Mon, 20 May 2013 08:13:38 +0000 (10:13 +0200)
src/libsystemd-bus/bus-bloom.c
src/libsystemd-bus/bus-control.c
src/libsystemd-bus/bus-kernel.c
src/libsystemd-bus/test-bus-kernel-bloom.c

index cb65e47..04bee85 100644 (file)
@@ -49,6 +49,8 @@ void bloom_add_data(uint64_t filter[BLOOM_SIZE/8], const void *data, size_t n) {
 
         for (k = 0; k < ELEMENTSOF(hash); k++)
                 set_bit(filter, hash[k] & 511);
+
+        /* log_debug("bloom: adding <%.*s>", (int) n, (char*) data); */
 }
 
 void bloom_add_pair(uint64_t filter[BLOOM_SIZE/8], const char *a, const char *b) {
index 66f7130..cb8618e 100644 (file)
@@ -406,8 +406,10 @@ int bus_add_match_internal(
                                 break;
 
                         case BUS_MATCH_PATH_NAMESPACE:
-                                bloom_add_pair(bloom, "path-slash-prefix", c->value_str);
-                                using_bloom = true;
+                                if (!streq(c->value_str, "/")) {
+                                        bloom_add_pair(bloom, "path-slash-prefix", c->value_str);
+                                        using_bloom = true;
+                                }
                                 break;
 
                         case BUS_MATCH_ARG...BUS_MATCH_ARG_LAST: {
index 33c25a4..19d274b 100644 (file)
@@ -141,6 +141,7 @@ static int bus_message_setup_bloom(sd_bus_message *m, void *bloom) {
                 bloom_add_pair(bloom, "member", m->member);
         if (m->path) {
                 bloom_add_pair(bloom, "path", m->path);
+                bloom_add_pair(bloom, "path-slash-prefix", m->path);
                 bloom_add_prefixes(bloom, "path-slash-prefix", m->path, '/');
         }
 
index 02d9a98..5445d34 100644 (file)
@@ -68,9 +68,11 @@ static void test_one(
         r = sd_bus_start(b);
         assert_se(r >= 0);
 
+        log_debug("match");
         r = sd_bus_add_match(b, match, NULL, NULL);
         assert_se(r >= 0);
 
+        log_debug("signal");
         r = sd_bus_emit_signal(a, path, interface, member, "s", arg0);
         assert_se(r >= 0);
 
@@ -95,5 +97,16 @@ int main(int argc, char *argv[]) {
         test_one("/foo/bar/waldo", "waldo.com", "Piep", "foobar", "path='/foo/bar/waldo',interface='waldo.com',member='Piep',arg0='foobar'", true);
         test_one("/foo/bar/waldo", "waldo.com", "Piep", "foobar", "path='/foo/bar/waldo',interface='waldo.com',member='Piep',arg0='foobar2'", false);
 
+        test_one("/foo/bar/waldo", "waldo.com", "Piep", "foobar", "path='/foo/bar/waldo'", true);
+        test_one("/foo/bar/waldo", "waldo.com", "Piep", "foobar", "path='/foo/bar'", false);
+        test_one("/foo/bar/waldo", "waldo.com", "Piep", "foobar", "path='/foo'", false);
+        test_one("/foo/bar/waldo", "waldo.com", "Piep", "foobar", "path='/'", false);
+        test_one("/foo/bar/waldo", "waldo.com", "Piep", "foobar", "path='/foo/bar/waldo/quux'", false);
+        test_one("/foo/bar/waldo", "waldo.com", "Piep", "foobar", "path_namespace='/foo/bar/waldo'", true);
+        test_one("/foo/bar/waldo", "waldo.com", "Piep", "foobar", "path_namespace='/foo/bar'", true);
+        test_one("/foo/bar/waldo", "waldo.com", "Piep", "foobar", "path_namespace='/foo'", true);
+        test_one("/foo/bar/waldo", "waldo.com", "Piep", "foobar", "path_namespace='/'", true);
+        test_one("/foo/bar/waldo", "waldo.com", "Piep", "foobar", "path_namespace='/quux'", false);
+
         return 0;
 }