3 * \brief Test RPC calls with triggers in octopus
7 * Copyright (c) 2011, ETH Zurich.
10 * This file is distributed under the terms in the attached LICENSE file.
11 * If you do not find this file, copies can be found by writing to:
12 * ETH Zurich D-INFK, Haldeneggsteig 4, CH-8092 Zurich. Attn: Systems Group.
20 #include <barrelfish/barrelfish.h>
21 #include <barrelfish/deferred.h>
24 #include <octopus/octopus.h>
28 static void trigger_handler(octopus_mode_t m, char* record, void* state)
30 size_t* received = (size_t*) state;
31 *received = *received + 1;
32 debug_printf("trigger_handler got: %s\n", record);
34 assert(m & DIST_ON_DEL);
35 assert(m & DIST_REMOVED);
39 static void persistent_trigger(octopus_mode_t m, char* record, void* state) {
40 size_t* received = (size_t*) state;
41 *received = *received + 1;
43 if (m & DIST_ON_SET) {
44 debug_printf("persistent_trigger ON SET: %s\n", record);
46 if (m & DIST_ON_DEL) {
47 debug_printf("persistent_trigger ON DEL: %s\n", record);
49 if (m & DIST_REMOVED) {
50 debug_printf("persistent trigger CLEANUP: %s\n", record);
51 assert(record == NULL);
57 int main(int argc, char *argv[])
60 errval_t err = SYS_ERR_OK;
61 octopus_trigger_id_t tid;
64 err = oct_set("obj1 { attr: 1 }");
66 err = oct_set("obj2 { attr: 2 }");
68 err = oct_set("obj3 { attr: 3 }");
71 struct octopus_thc_client_binding_t* c = oct_get_thc_client();
73 octopus_trigger_t record_deleted = oct_mktrigger(SYS_ERR_OK,
74 octopus_BINDING_EVENT, DIST_ON_DEL, trigger_handler, &received);
76 errval_t error_code = SYS_ERR_OK;
78 err = c->call_seq.get(c, "r'^obj.$' { attr: 3 } ", record_deleted, &output,
81 ASSERT_ERR_OK(error_code);
82 ASSERT_STRING(output, "obj3 { attr: 3 }");
83 debug_printf("tid is: %lu\n", tid);
87 while (received != 1) {
88 messages_wait_and_handle_next();
93 octopus_mode_t m = DIST_ON_SET | DIST_ON_DEL | DIST_PERSIST;
94 octopus_trigger_t ptrigger = oct_mktrigger(SYS_ERR_OK,
95 octopus_BINDING_EVENT, m, persistent_trigger, &received);
97 err = c->call_seq.get(c, "obj2", ptrigger, &output,
100 ASSERT_ERR_OK(error_code);
101 debug_printf("tid is: %lu\n", tid);
102 ASSERT_STRING(output, "obj2 { attr: 2 }");
105 while (received != 1) {
106 messages_wait_and_handle_next();
110 oct_set("obj2 { attr: 'asdf' }");
111 while (received != 1) {
112 messages_wait_and_handle_next();
116 err = oct_remove_trigger(tid);
117 DEBUG_ERR(err, "remove trigger");
119 while (received != 1) {
120 messages_wait_and_handle_next();
123 printf("d2trigger SUCCESS!\n");