674d978903c8ac3d992f272554fd64268a06513e
[barrelfish] / usr / tests / dist2test / d2trigger.c
1 /**
2  * \file
3  * \brief Test RPC calls with triggers in octopus
4  */
5
6 /*
7  * Copyright (c) 2011, ETH Zurich.
8  * All rights reserved.
9  *
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.
13  */
14
15 #include <stdio.h>
16 #include <string.h>
17 #include <stdlib.h>
18 #include <assert.h>
19
20 #include <barrelfish/barrelfish.h>
21 #include <barrelfish/deferred.h>
22
23 #include <skb/skb.h>
24 #include <octopus/octopus.h>
25
26 #include "common.h"
27
28 static void trigger_handler(octopus_mode_t m, char* record, void* state)
29 {
30     size_t* received = (size_t*) state;
31     *received = *received + 1;
32     debug_printf("trigger_handler got: %s\n", record);
33
34     assert(m & DIST_ON_DEL);
35     assert(m & DIST_REMOVED);
36     free(record);
37 }
38
39 static void persistent_trigger(octopus_mode_t m, char* record, void* state) {
40     size_t* received = (size_t*) state;
41     *received = *received + 1;
42
43     if (m & DIST_ON_SET) {
44         debug_printf("persistent_trigger ON SET: %s\n", record);
45     }
46     if (m & DIST_ON_DEL) {
47         debug_printf("persistent_trigger ON DEL: %s\n", record);
48     }
49     if (m & DIST_REMOVED) {
50         debug_printf("persistent trigger CLEANUP: %s\n", record);
51         assert(record == NULL);
52     }
53
54     free(record);
55 }
56
57 int main(int argc, char *argv[])
58 {
59     oct_init();
60     errval_t err = SYS_ERR_OK;
61     octopus_trigger_id_t tid;
62     size_t received = 0;
63
64     err = oct_set("obj1 { attr: 1 }");
65     ASSERT_ERR_OK(err);
66     err = oct_set("obj2 { attr: 2 }");
67     ASSERT_ERR_OK(err);
68     err = oct_set("obj3 { attr: 3 }");
69     ASSERT_ERR_OK(err);
70
71     struct octopus_thc_client_binding_t* c = oct_get_thc_client();
72
73     octopus_trigger_t record_deleted = oct_mktrigger(SYS_ERR_OK,
74             octopus_BINDING_EVENT, DIST_ON_DEL, trigger_handler, &received);
75
76     errval_t error_code = SYS_ERR_OK;
77     char* output = NULL;
78     err = c->call_seq.get(c, "r'^obj.$' { attr: 3 } ", record_deleted, &output,
79             &tid, &error_code);
80     ASSERT_ERR_OK(err);
81     ASSERT_ERR_OK(error_code);
82     ASSERT_STRING(output, "obj3 { attr: 3 }");
83     debug_printf("tid is: %lu\n", tid);
84     free(output);
85
86     oct_del("obj3");
87     while (received != 1) {
88         messages_wait_and_handle_next();
89     }
90
91     received = 0;
92     tid = 0;
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);
96     output = NULL;
97     err = c->call_seq.get(c, "obj2", ptrigger, &output,
98             &tid, &error_code);
99     ASSERT_ERR_OK(err);
100     ASSERT_ERR_OK(error_code);
101     debug_printf("tid is: %lu\n", tid);
102     ASSERT_STRING(output, "obj2 { attr: 2 }");
103
104     oct_del("obj2");
105     while (received != 1) {
106         messages_wait_and_handle_next();
107     }
108
109     received = 0;
110     oct_set("obj2 { attr: 'asdf' }");
111     while (received != 1) {
112         messages_wait_and_handle_next();
113     }
114
115     received = 0;
116     err = oct_remove_trigger(tid);
117     DEBUG_ERR(err, "remove trigger");
118     ASSERT_ERR_OK(err);
119     while (received != 1) {
120         messages_wait_and_handle_next();
121     }
122
123     printf("d2trigger SUCCESS!\n");
124     return EXIT_SUCCESS;
125 }