object web, etc
[cilux] / src / drivers / ot / test / teston.c
1
2 /* -------------------------------------------------------------------------- */
3
4 #include <kernelapi.h>
5 #include <notification.h>
6
7 /* -------------------------------------------------------------------------- */
8
9 static int  handles_object(char* uid);
10 static void view_event(n_object* o, n_object* v);
11 static void cast_event(n_object* o, n_object* c);
12 static void sync_object(n_object* o);
13
14 static void start_tests(void);
15 static void view_event_1(n_object* o, n_object* v);
16 static void view_event_2(n_object* o, n_object* v);
17 static void view_event_3(n_object* o, n_object* v);
18 static void cast_event_1(n_object* o, n_object* c);
19 static void cast_event_2(n_object* o, n_object* c);
20 static void cast_event_3(n_object* o, n_object* c);
21
22 static void test_state(n_object* o, char* os, char* uid, char* cont);
23
24 /* -------------------------------------------------------------------------- */
25
26 EXPORT int teston_module_loaded(void)
27 {
28     n_register_driver("teston", handles_object, view_event, cast_event, sync_object);
29
30     k_log_out("Test ON Driver initialised");
31
32     start_tests();
33
34     return 1;
35 }
36
37 EXPORT int teston_module_event(void* data)
38 {
39     n_dispatch((n_event*)data);
40     return 1;
41 }
42
43 EXPORT int teston_module_tick(void)
44 {
45     return 1;
46 }
47
48 /* -------------------------------------------------------------------------- */
49
50 int handles_object(char* uid)
51 {
52     return 1;
53 }
54
55 void sync_object(n_object* o)
56 {
57 }
58
59 /* -------------------------------------------------------------------------- */
60
61 void view_event(n_object* o, n_object* v)
62 {
63     if(n_uid_is(o, "11111-4141a")) view_event_1(o,v);
64     if(n_uid_is(o, "22222-ef990")) view_event_2(o,v);
65     if(n_uid_is(o, "33333-18bbc")) view_event_3(o,v);
66     k_assert(0, "No match to UID in view_event");
67 }
68
69 void cast_event(n_object* o, n_object* c)
70 {
71     if(n_uid_is(o, "11111-4141a")) cast_event_1(o,c);
72     if(n_uid_is(o, "22222-ef990")) cast_event_2(o,c);
73     if(n_uid_is(o, "33333-18bbc")) cast_event_3(o,c);
74     k_assert(0, "No match to UID in cast_event");
75 }
76
77 /* -------------------------------------------------------------------------- */
78
79 /*
80  - object.create .update .commit .rollback (auto inc version #?)
81  - object.view - may return empty so wait for ..
82  - viewstate(object) - state asked for /or/ object is subscribing
83  */
84 void start_tests(void)
85 {
86     k_log_out("Creating o1 ------------------");
87     char* o11111s = "UID: 11111-4141a\n"
88                     "\n"
89                     "Cost: £111\n";
90     n_object* o11111 = n_object_new(o11111s);
91     test_state(o11111, o11111s, "11111-4141a", "£111");
92     k_log_out("Committing o1");
93     n_commit(o11111);
94
95     k_log_out("Creating o2 ------------------");
96     char* o22222s = "UID: 22222-ef990\n"
97                     "Open: - UID: 11111-4141a\n"
98                     "        quiet\n"
99                     "\n"
100                     "Cost: £222\n";
101     n_object* o22222 = n_object_new(o22222s);
102     test_state(o22222, o22222s, "22222-ef990", "£222");
103
104     k_log_out("o1 views o2 ------------------");
105     n_object* o2 = n_view(o11111, "22222-ef990");  /* creates Cast:/shell o2 and sends View event to o2 */
106     k_assert(!o2, "Object 2 has not been committed yet, but Object 1 can view it:\n%s\n", n_to_string(o2));
107     n_commit(o11111); /* ?? commit View (i.e. header change set) */
108
109     n_commit(o22222); /* merges with shell and sends Cast event to o1 */
110
111     k_log_out("o1 views o2 ------------------");
112     o2 = n_view(o11111, "22222-ef990"); /* quiet, so no View event to o2, satisfiable now so no Cast event to o1 */
113     k_assert(o2!=0, "Object 2 has been committed, but can't be viewed by Object 1");
114     test_state(o2, o22222s, "22222-ef990", "£222");
115
116     k_log_out("o2 views o3 ------------------");
117     n_object* o3 = n_view(o22222, "33333-18bbc"); /* creats Cast:/shell o3 and sends View event to o3 */
118     k_assert(!o3, "Object 3 has not been created yet, but Object 2 can view it:\n%s", n_to_string(o3));
119     n_commit(o22222); /* ?? commit View (i.e. header change set) */
120 }
121
122 /* -------------------------------------------------------------------------- */
123
124 void view_event_1(n_object* o, n_object* v)
125 {
126 }
127
128 void cast_event_1(n_object* o, n_object* c)
129 {
130     k_log_out("o1 is cast o2 ------------------");
131     test_state(c, 0, "22222-ef990", "£222");
132     k_assert(!strcmp(n_header(o, "View:1:UID"), "22222-ef990"), "o1 <-Cast- o2: o1 first View UID not o2" );
133     k_assert(!strcmp(n_header(c, "Cast:1:UID"), "11111-4141a"), "o1 <-Cast- o2: o2 first Cast UID not o1" );
134     k_assert(!strcmp(n_header(c, "Open:1:UID"), "11111-4141a"), "o1 <-Cast- o2: o2 first Open UID not o1" );
135 }
136
137 /* -------------------------------------------------------------------------- */
138
139 void view_event_2(n_object* o, n_object* v)
140 {
141     if(n_uid_is(v, "11111-4141a")){
142         k_log_out("o2 gets view from o1 ------------------");
143         test_state(v, 0, "11111-4141a", "£111");
144         k_assert(!strcmp(n_header(v, "View:1:UID"), "22222-ef990"), "o1 -View-> o2: o1 first View UID not o2" );
145         k_assert(!strcmp(n_header(o, "Cast:1:UID"), "11111-4141a"), "o1 -View-> o2: o2 first Cast UID not o1" );
146         k_assert(!strcmp(n_header(o, "Open:1:UID"), "11111-4141a"), "o1 -View-> o2: o2 first Open UID not o1" );
147     }
148     else
149     if(n_uid_is(v, "11111-4141a")){
150         k_log_out("o2 gets view from o3 ------------------");
151         test_state(v, 0, "33333-18bbc", "£333");
152         k_assert(!strcmp(n_header(v, "View:1:UID"), "22222-ef990"), "o3 -View-> o2: o3 first View UID not o2" );
153         k_assert(!strcmp(n_header(o, "Cast:2:UID"), "33333-18bbc"), "o3 -View-> o2: o2 second Cast UID not o3" );
154         k_assert(       !n_header(o, "Open:2:UID"),                 "o3 -View-> o2: o2 has an Open" );
155
156         k_log_out("o2 opens to o3 ------------------");
157         n_open(o, "33333-18bbc", "quiet");
158         k_log_out("Committing o2");
159         n_commit(o);
160         k_assert(!strcmp(n_header(o, "Open:2:UID"), "33333-18bbc"), "o2 second Open UID not o3" );
161         k_assert(!strcmp(n_header(o, "Open:2:quiet"), ""),          "o2 second Open not quiet" );
162     }
163     else{
164         k_assert(0, "o2 got view but not from o1 or o3");
165     }
166 }
167
168 void cast_event_2(n_object* o, n_object* c)
169 {
170     k_log_out("o2 is cast o3 ------------------");
171     test_state(c, 0, "33333-18bbc", "£333");
172     k_assert(!strcmp(n_header(o, "View:1:UID"), "33333-18bbc"), "o2 <-Cast- o3: o2 first View UID not o3" );
173     k_assert(!strcmp(n_header(c, "Cast:1:UID"), "22222-ef990"), "o2 <-Cast- o3: o3 first Cast UID not o2" );
174     k_assert(!strcmp(n_header(c, "Open:1:UID"), "22222-ef990"), "o2 <-Cast- o3: o3 first Open UID not o2" );
175 }
176
177 /* -------------------------------------------------------------------------- */
178
179 void view_event_3(n_object* o, n_object* v)
180 {
181     k_log_out("o3 gets view from o2 ------------------");
182     test_state(v, 0, "22222-ef990", "£222");
183     k_assert(!strcmp(n_header(v, "View:1:UID"), "33333-18bbc"), "o2 -View-> o3: o2 first View UID not o3" );
184     k_assert(!strcmp(n_header(o, "Cast:1:UID"), "22222-ef990"), "o2 -View-> o3: o3 first Cast UID not o2" );
185     k_assert(       !n_header(o, "Open:1:UID"),                 "o2 -View-> o3: o3 has an Open" );
186
187     k_log_out("Creating o3 ------------------");
188     char* o33333s = "UID: 33333-18bbc\n"
189                     "Open: - UID: 22222-ef990\n"
190                     "        quiet\n"
191                     "\n"
192                     "Cost: £333\n";
193     n_object* o33333 = n_object_new(o33333s);
194     test_state(o33333, o33333s, "33333-18bbc", "£333");
195     k_assert(!strcmp(n_header(o33333, "Open:1:UID"), "22222-ef990"), "o3 first Open not o2" );
196     k_assert(!strcmp(n_header(o33333, "Open:1:quiet"), ""),          "o3 first Open not quiet" );
197
198     k_log_out("Committing o3");
199     n_commit(o33333);
200
201     k_assert(!strcmp(n_header(o, "Cast:1:UID"), "22222-ef990"), "o3 first Cast UID not o2" );
202     k_assert(!strcmp(n_header(o, "Open:1:UID"), "22222-ef990"), "o3 first Open not o2" );
203     k_assert(!strcmp(n_header(o, "Open:1:quiet"), ""),          "o3 first Open not quiet" );
204
205     k_log_out("o3 views o2 ------------------");
206     n_object* o2 = n_view(o, "22222-ef990");
207     k_assert(!o2, "o2 is not Open to o3, but o3 can view it:\n%s\n", n_to_string(o2));
208
209     k_log_out("Committing o3");
210     n_commit(o);
211 }
212
213 void cast_event_3(n_object* o, n_object* c)
214 {
215     k_log_out("o3 is cast o2 ------------------");
216     test_state(c, 0, "22222-ef990", "£222");
217     k_assert(!strcmp(n_header(o, "View:1:UID"), "22222-ef990"), "o3 <-Cast- o2: o3 first View UID not o2" );
218     k_assert(!strcmp(n_header(c, "Cast:2:UID"), "33333-18bbc"), "o3 <-Cast- o2: o2 second Cast UID not o3" );
219     k_assert(!strcmp(n_header(c, "Open:2:UID"), "33333-18bbc"), "o3 <-Cast- o2: o2 second Open UID not o3" );
220 }
221
222 /* -------------------------------------------------------------------------- */
223
224 void test_state(n_object* o, char* os, char* uid, char* cont)
225 {
226     char* c;
227
228     k_log_out("Checking %s", uid);
229
230     if(os){
231     c=n_to_string(o);
232     k_assert(c && !strcmp(c, os), "To-string was\n%s", c? c: "null");
233     }
234
235     c=n_uid(o);
236     k_assert(c && !strcmp(c, uid), "UID was %s in n_uid",  c? c: "null");
237
238     c=n_header(o, "UID");
239     k_assert(c && !strcmp(c, uid), "UID was %s in n_header",  c? c: "null");
240
241     c=k_hashtable_get(n_headers(o), "UID");
242     k_assert(c && !strcmp(c, uid), "UID was %s in hash get",  c? c: "null");
243
244     c=k_hashtable_get(n_content(o), "Cost");
245     k_assert(c && !strcmp(c, cont), "Content was %s", c? c: "null");
246
247     if(os){
248     c=n_to_string(o);
249     k_assert(c && !strcmp(c, os), "To-string was\n%s", c? c: "null");
250     }
251 }
252
253 /* -------------------------------------------------------------------------- */
254
255
256