90106f21b3facf9f421cf9bebd41d44a09881139
[profile/ivi/automotive-message-broker.git] / plugins / websocketsink / test / test.js
1 /*
2  * Copyright (c) 2012, Intel Corporation.
3  *
4  * This program is licensed under the terms and conditions of the
5  * Apache License, version 2.0.  The full text of the Apache License is at
6  * http://www.apache.org/licenses/LICENSE-2.0
7  *
8  */
9
10 /* --------------------------- utility code ------------------------------- */
11
12 var PRINT = {
13     logElement: null,
14     init: function(log_id) {
15         this.logElement = document.getElementById(log_id);
16     },
17
18     scrollToBottom: function() {
19         this.logElement.scrollTop = this.logElement.scrollHeight;
20     },
21
22     clear: function() {
23         this.logElement.innerHTML = "";
24     },
25
26     pass: function(msg) {
27         this.logElement.innerHTML += "<div class='PassClass'>PASS: " + msg + "</div>";
28         this.scrollToBottom();
29     },
30
31     fail: function(msg) {
32         this.logElement.innerHTML += "<div class='FailClass'>FAIL: " + msg + "</div>";
33         this.scrollToBottom();
34     },
35
36     log: function(msg) {
37         this.logElement.innerHTML += "<div class='LogClass'> " + msg + "</div>";
38         this.scrollToBottom();
39     },
40 }
41
42 /* ----------------------------- test code --------------------------------- */
43
44 var vehicleEventType = new VehicleEventType();
45 var selected = [];
46
47 function getTypes(event) {
48     var types = window.vehicle.getSupportedEventTypes(event, false,
49         function(data) {
50             if (data && data.length > 1) {
51                 PRINT.pass(event + " is a set of " + data.length + " events:");
52                 for (i in data) {
53                     PRINT.log(data[i]);
54                 }
55             } else if (data && data.length > 0) {
56                 PRINT.pass(event + " is a single event:");
57                 for (i in data) {
58                     PRINT.log(data[i]);
59                 }
60             } else {
61                 PRINT.fail(event + " unexcepted empty data field");
62             }
63         },
64         function(msg) {
65             PRINT.fail(((event === "") ? "all events" : event) + ":<br>" + msg);
66         }
67     );
68 }
69
70 function updateInput(input, value) {
71     input.value = value;
72     input.className = "change";
73     input.addEventListener('webkitTransitionEnd', function callback(e) {
74         e.target.removeEventListener('webkitTransitionEnd', callback, false);
75         e.target.className = "";
76     }, false);
77 }
78
79 function getValue(eventlist) {
80     var zoneList =  getZone(eventlist);
81     var types = window.vehicle.get(eventlist, zoneList,
82         function(data) {
83             if (data) {
84                 PRINT.pass("values received:");
85                 if (eventlist.length > 1 && !! data.length && data.length > 0) {
86                     var list = [];
87                     for (var i = 0; i < data.length; i++) {
88                         list[i] = data[i].property;
89                         //list[i] = data[i].name; ???
90                         PRINT.log(data[i].property + ": " + data[i].value + ", zone: " + data[i].zone);
91                         //PRINT.log(data[i].name+": "+data[i].value); ???
92                     }
93
94                     var elements = document.getElementsByClassName('proptest');
95                     for (var i = 0; i < elements.length; i++) {
96                         var propinfo = elements[i].getElementsByClassName('propinfo')[0];
97                         var name = propinfo.innerHTML;
98                         var idx = list.indexOf(name);
99                         if (idx >= 0) {
100                             var zone = elements[i].getElementsByTagName('input')[1];
101                             updateInput(zone, zone.value);
102                             var input = elements[i].getElementsByTagName('input')[0];
103                             updateInput(input, data[idx].value);
104                         }
105                     }
106                 } else {
107                     PRINT.log(JSON.stringify(data));
108                     var elements = document.getElementsByClassName('proptest');
109                     for (var i = 0; i < elements.length; i++) {
110                         var propinfo = elements[i].getElementsByClassName('propinfo')[0];
111                         if (data.property == propinfo.innerHTML) {
112                             var zone = elements[i].getElementsByTagName('input')[1];
113                             updateInput(zone, zone.value);
114                             var input = elements[i].getElementsByTagName('input')[0];
115                             updateInput(input, data.value);
116                         }
117                     }
118                 }
119             } else {
120                 PRINT.fail("no values retrieved for " + eventlist);
121             }
122         },
123         function(msg) {
124             PRINT.fail(msg);
125         }
126     );
127 }
128
129 function setValue(eventlist) {
130     var zoneList =  getZone(eventlist);
131     var elements = document.getElementsByClassName('proptest');
132     var i, valuelist = [] ;
133
134     /* initialize the value list */
135     for (i = 0; i < eventlist.length; i++) {
136         valuelist[i] = 0;
137     }
138
139     for (var i = 0; i < elements.length; i++) {
140         var propinfo = elements[i].getElementsByClassName('propinfo')[0];
141         var name = propinfo.innerHTML;
142         var idx = eventlist.indexOf(name);
143         if (idx >= 0) {
144
145             var input = elements[i].getElementsByTagName('input')[0];
146             valuelist[idx] = input.value;
147         }
148     }
149
150     var types = window.vehicle.set(eventlist, valuelist, zoneList, 
151         function(msg) {
152             PRINT.pass("Set success for: " + JSON.stringify(msg));
153         },
154         function(msg) {
155             PRINT.fail("Set error: " + JSON.stringify(msg));
156         }
157     );
158 }
159
160 function eventListener(e) {
161         PRINT.log(e.name + " update: " + JSON.stringify(e.value));
162     var elements = document.getElementsByClassName('proptest');
163     for (var i = 0; i < elements.length; i++) {
164         var propinfo = elements[i].getElementsByClassName('propinfo')[0];
165         var name = propinfo.innerHTML;
166         if (name === e.name) {
167             var input = elements[i].getElementsByTagName('input')[0];
168             updateInput(input, e.value.value);
169             var zone = elements[i].getElementsByTagName('input')[1];
170             updateInput(zone, e.value.zone);
171         }
172     }
173 }
174
175 function subscribe(eventlist) {
176    var zoneList =  getZone(eventlist);
177     window.vehicle.subscribe(eventlist, zoneList,
178         function(data) {
179             PRINT.pass("Subscribe success for: " + data);
180             for (var i = 0; i < data.length; i++) {
181                 var sub = data[i] + "_subscribe";
182                 var unsub = data[i] + "_unsubscribe";
183                 //                document.getElementById(sub).className = "testbutton subscribe disable"
184                 //                document.getElementById(unsub).className = "testbutton unsubscribe";
185                 document.addEventListener(data[i], eventListener, false);
186             }
187         },
188         function(msg) {
189             PRINT.fail("Subscribe failed for: " + msg);
190         }
191     );
192 }
193
194 function unsubscribe(eventlist, zoneList) {
195     zoneList =  getZone(eventlist);
196     /* kill the handers first, so even if the service fails to acknowledge */
197     /* we've stopped listening */
198     for (var i = 0; i < eventlist.length; i++) {
199         document.removeEventListener(eventlist[i], eventListener, false);
200     }
201     window.vehicle.unsubscribe(eventlist, zoneList,
202         function(data) {
203             PRINT.pass("Unsubscribe success for: " + data);
204             for (var i = 0; i < data.length; i++) {
205                 var sub = data[i] + "_subscribe";
206                 var unsub = data[i] + "_unsubscribe";
207                 //                document.getElementById(unsub).className = "testbutton unsubscribe disable";
208                 //                document.getElementById(sub).className = "testbutton subscribe";
209             }
210         },
211         function(msg) {
212             PRINT.fail("Unsubscribe failed for: " + msg);
213         }
214     );
215 }
216
217 function getZone(eventlist) {
218     var list = [];
219     if (eventlist.length > 1) {
220
221         // for (var i = 0; i < data.length; i++) {
222         //     list[i] = data[i].property;
223         //     //list[i] = data[i].name; ???
224         //     PRINT.log(data[i].property + ": " + data[i].value);
225         //     //PRINT.log(data[i].name+": "+data[i].value); ???
226         // }
227
228         var elements = document.getElementsByClassName('proptest');
229         for (var i = 0; i < elements.length; i++) {
230             var propinfo = elements[i].getElementsByClassName('propinfo')[0];
231             var name = propinfo.innerHTML;
232             var idx = eventlist.indexOf(name);
233             if (idx >= 0) {
234                 var zone = elements[i].getElementsByTagName('input')[1];
235                 list.push(zone.value);
236             }
237         }
238     } else {
239         var elements = document.getElementsByClassName('proptest');
240         for (var i = 0; i < elements.length; i++) {
241             var propinfo = elements[i].getElementsByClassName('propinfo')[0];
242             if (eventlist[0] == propinfo.innerHTML) {
243                 var zone = elements[i].getElementsByTagName('input')[1];
244                 list.push(zone.value);
245             }
246         }
247     }
248     return list.join();
249 }
250
251 function select(elem) {
252     var name = elem.innerHTML;
253     if (!vehicleEventType.isValid(name))
254         return;
255
256     var idx = selected.indexOf(name);
257     if (elem.className == "propinfo") {
258         if (idx < 0) {
259             selected[selected.length] = name;
260         }
261         elem.className = "propinfo select";
262     } else if (elem.className == "propinfo select") {
263         if (idx >= 0) {
264             selected.splice(idx, 1);
265         }
266         elem.className = "propinfo";
267     }
268 }
269
270 function start(msg) {
271     if (window.vehicle && window.vehicle.getSupportedEventTypes) {
272         PRINT.pass("vehicle interface online " + msg);
273     } else {
274         PRINT.fail("vehicle interface not found");
275         return;
276     }
277
278     var tester = document.getElementById("tester");
279     var part = ['<div class="proptest"><div class="propinfo" onclick=select(this)>',
280         '</div><div class="buttons"><div class="testbutton types" onclick=getTypes("',
281         '")></div><div id="',
282         '_subscribe" class="testbutton subscribe" onclick=subscribe(["',
283         '"])></div><div id="',
284         '_unsubscribe" class="testbutton unsubscribe" onclick=unsubscribe(["',
285         '"])></div><div class="testbutton get" onclick=getValue(["',
286         '"])></div><div class="testbutton set" onclick=setValue(["',
287         '"])></div><input class = "Textvalue" type="text" value="0" placeholder="Value" /><div class = "smallText"> Zone: </div><input class = "zone" type="text" value="0" placeholder="Zone"/></div></div>'
288     ];
289     var events = vehicleEventType.event;
290
291     /* apply on all selected events */
292     var html = '<div class="proptest"><div class="propinfo unselectable">apply on all selected events' +
293         '</div><div class="buttons">' +
294         '<div class="testbutton subscribe" onclick=subscribe(selected)></div>' +
295         '<div class="testbutton unsubscribe" onclick=unsubscribe(selected)></div>' +
296         '<div class="testbutton get" onclick=getValue(selected)></div>' +
297         '<div class="testbutton set" onclick=setValue(selected)></div></div></div>';
298
299     /* all events */
300     html += '<div class="proptest"><div class="propinfo unselectable">all events';
301     html +=     '</div><div class="buttons"><div class="testbutton types" onclick=getTypes("' ;
302     html +=     '")></div><div class="testbutton subscribe" onclick=\"subscribe([\'' ;
303     html +=     events.join("','") ;
304     html +=     '\'])\"></div><div class="testbutton unsubscribe" onclick= \"unsubscribe([\'' ;
305     html +=     events.join("','");
306     html +=     '\'])\"></div><div class="testbutton get" onclick=\"getValue([\'' ;
307     html +=     events.join("','");
308     html +=     '\'])\"></div></div></div>';
309
310     /* events */
311     for (var i = 0; i < events.length; i++) {
312         var piece = "";
313         for (var j = 0; j < part.length - 1; j++) {
314             piece += part[j] + events[i];
315         }
316         html += piece + part[j];
317     }
318     tester.innerHTML = html;
319 }
320
321 function error(msg) {
322     PRINT.fail(msg);
323 }
324
325 function init(url, protocol) {
326     PRINT.init("result");
327     window.vehicle = new Vehicle(start, error, url, protocol);
328 }