1   
2   
3   
4   
5   
6   
7   
8   
9   
10  
11  
12  
13  
14  
15  package example.controlpoint;
16  
17  import example.binarylight.BinaryLightSampleData;
18  import org.fourthline.cling.binding.LocalServiceBinder;
19  import org.fourthline.cling.binding.annotations.AnnotationLocalServiceBinder;
20  import org.fourthline.cling.binding.annotations.UpnpAction;
21  import org.fourthline.cling.binding.annotations.UpnpInputArgument;
22  import org.fourthline.cling.binding.annotations.UpnpOutputArgument;
23  import org.fourthline.cling.binding.annotations.UpnpStateVariable;
24  import org.fourthline.cling.controlpoint.ActionCallback;
25  import org.fourthline.cling.mock.MockUpnpService;
26  import org.fourthline.cling.model.DefaultServiceManager;
27  import org.fourthline.cling.model.action.ActionArgumentValue;
28  import org.fourthline.cling.model.action.ActionInvocation;
29  import org.fourthline.cling.model.message.UpnpResponse;
30  import org.fourthline.cling.model.meta.Action;
31  import org.fourthline.cling.model.meta.LocalDevice;
32  import org.fourthline.cling.model.meta.LocalService;
33  import org.fourthline.cling.model.meta.Service;
34  import org.fourthline.cling.model.types.BooleanDatatype;
35  import org.fourthline.cling.model.types.Datatype;
36  import org.fourthline.cling.model.types.UDAServiceId;
37  import org.fourthline.cling.model.types.UDAServiceType;
38  import org.testng.annotations.DataProvider;
39  import org.testng.annotations.Test;
40  
41  import static org.testng.Assert.assertEquals;
42  
43  
44  
45  
46  
47  
48  
49  
50  
51  
52  
53  
54  
55  
56  
57  
58  
59  
60  
61  
62  
63  
64  
65  
66  
67  
68  
69  
70  
71  
72  
73  
74  
75  
76  
77  
78  
79  
80  
81  
82  
83  
84  
85  
86  
87  
88  
89  
90  
91  
92  
93  
94  
95  
96  
97  
98  
99  
100 
101 
102 
103 
104 
105 
106 
107 
108 
109 
110 
111 public class ActionInvocationTest {
112 
113     protected LocalService bindService(Class<?> clazz) throws Exception {
114         LocalServiceBinder binder = new AnnotationLocalServiceBinder();
115         
116         LocalService svc = binder.read(
117                 clazz,
118                 new UDAServiceId("SwitchPower"),
119                 new UDAServiceType("SwitchPower", 1),
120                 true,
121                 new Class[]{MyString.class}
122         );
123         svc.setManager(
124                 new DefaultServiceManager(svc, clazz)
125         );
126         return svc;
127     }
128 
129     @DataProvider(name = "devices")
130     public Object[][] getDevices() throws Exception {
131         return new LocalDevice[][]{
132                 {BinaryLightSampleData.createDevice(bindService(TestServiceOne.class))},
133                 {BinaryLightSampleData.createDevice(bindService(TestServiceTwo.class))},
134                 {BinaryLightSampleData.createDevice(bindService(TestServiceThree.class))},
135         };
136     }
137 
138     @Test(dataProvider = "devices")
139     public void invokeActions(LocalDevice device) throws Exception {
140 
141         MockUpnpService upnpService = new MockUpnpService();
142 
143         Service service = device.findService(new UDAServiceId("SwitchPower")); 
144         Action getStatusAction = service.getAction("GetStatus");               
145 
146         final boolean[] tests = new boolean[3];
147 
148         ActionInvocation getStatusInvocation = new ActionInvocation(getStatusAction);   
149 
150         ActionCallback getStatusCallback = new ActionCallback(getStatusInvocation) {
151 
152             @Override
153             public void success(ActionInvocation invocation) {
154                 ActionArgumentValue status  = invocation.getOutput("ResultStatus");
155 
156                 assert status != null;
157 
158                 assertEquals(status.getArgument().getName(), "ResultStatus");
159 
160                 assertEquals(status.getDatatype().getClass(), BooleanDatatype.class);
161                 assertEquals(status.getDatatype().getBuiltin(), Datatype.Builtin.BOOLEAN);
162 
163                 assertEquals((Boolean) status.getValue(), Boolean.valueOf(false));
164                 assertEquals(status.toString(), "0"); 
165                 tests[0] = true; 
166             }
167 
168             @Override
169             public void failure(ActionInvocation invocation,
170                                 UpnpResponse operation,
171                                 String defaultMsg) {
172                 System.err.println(defaultMsg);
173             }
174         };
175 
176         upnpService.getControlPoint().execute(getStatusCallback);                       
177 
178 
179         Action action = service.getAction("SetTarget");                                 
180 
181         ActionInvocation setTargetInvocation = new ActionInvocation(action);
182 
183         setTargetInvocation.setInput("NewTargetValue", true); 
184 
185         
186         
187         
188         
189         
190         
191         
192         
193 
194         ActionCallback setTargetCallback = new ActionCallback(setTargetInvocation) {
195 
196             @Override
197             public void success(ActionInvocation invocation) {
198                 ActionArgumentValue[] output = invocation.getOutput();
199                 assertEquals(output.length, 0);
200                 tests[1] = true; 
201             }
202 
203             @Override
204             public void failure(ActionInvocation invocation,
205                                 UpnpResponse operation,
206                                 String defaultMsg) {
207                 System.err.println(defaultMsg);
208             }
209         };
210 
211         upnpService.getControlPoint().execute(setTargetCallback);                       
212 
213         getStatusInvocation = new ActionInvocation(getStatusAction);
214         new ActionCallback.Default(getStatusInvocation, upnpService.getControlPoint()).run(); 
215         ActionArgumentValue status  = getStatusInvocation.getOutput("ResultStatus");
216         if (Boolean.valueOf(true).equals(status.getValue())) {
217             tests[2] = true;
218         }
219 
220         for (boolean test : tests) {
221             assertEquals(test, true);
222         }
223 
224 
225         LocalService svc = (LocalService) service;
226 
227         ActionInvocation getTargetInvocation = new ActionInvocation(svc.getAction("GetTarget"));
228         svc.getExecutor(getTargetInvocation.getAction()).execute(getTargetInvocation);
229         assertEquals(getTargetInvocation.getFailure(), null);
230         assertEquals(getTargetInvocation.getOutput().length, 1);
231         assertEquals(getTargetInvocation.getOutput()[0].toString(), "1");
232 
233         ActionInvocation setMyStringInvocation = new ActionInvocation(svc.getAction("SetMyString"));
234         setMyStringInvocation.setInput("MyString", "foo");
235         svc.getExecutor(setMyStringInvocation.getAction()).execute(setMyStringInvocation);
236         assertEquals(setMyStringInvocation.getFailure(), null);
237         assertEquals(setMyStringInvocation.getOutput().length, 0);
238 
239         ActionInvocation getMyStringInvocation = new ActionInvocation(svc.getAction("GetMyString"));
240         svc.getExecutor(getMyStringInvocation.getAction()).execute(getMyStringInvocation);
241         assertEquals(getTargetInvocation.getFailure(), null);
242         assertEquals(getMyStringInvocation.getOutput().length, 1);
243         assertEquals(getMyStringInvocation.getOutput()[0].toString(), "foo");
244 
245     }
246 
247     @Test(dataProvider = "devices")
248     public void invokeActionsWithAlias(LocalDevice device) throws Exception {
249 
250         MockUpnpService upnpService = new MockUpnpService();
251 
252         Service service = device.findService(new UDAServiceId("SwitchPower"));
253         Action getStatusAction = service.getAction("GetStatus");
254 
255         final boolean[] tests = new boolean[1];
256 
257         Action action = service.getAction("SetTarget");
258         ActionInvocation setTargetInvocation = new ActionInvocation(action);
259         setTargetInvocation.setInput("NewTargetValue1", true);
260         ActionCallback setTargetCallback = new ActionCallback(setTargetInvocation) {
261 
262             @Override
263             public void success(ActionInvocation invocation) {
264                 ActionArgumentValue[] output = invocation.getOutput();
265                 assertEquals(output.length, 0);
266                 tests[0] = true;
267             }
268 
269             @Override
270             public void failure(ActionInvocation invocation,
271                                 UpnpResponse operation,
272                                 String defaultMsg) {
273                 System.err.println(defaultMsg);
274             }
275         };
276         upnpService.getControlPoint().execute(setTargetCallback);
277 
278         for (boolean test : tests) {
279             assertEquals(test, true);
280         }
281 
282         LocalService svc = (LocalService) service;
283 
284         ActionInvocation getTargetInvocation = new ActionInvocation(svc.getAction("GetTarget"));
285         svc.getExecutor(getTargetInvocation.getAction()).execute(getTargetInvocation);
286         assertEquals(getTargetInvocation.getFailure(), null);
287         assertEquals(getTargetInvocation.getOutput().length, 1);
288         assertEquals(getTargetInvocation.getOutput()[0].toString(), "1");
289 
290         ActionInvocation setMyStringInvocation = new ActionInvocation(svc.getAction("SetMyString"));
291         setMyStringInvocation.setInput("MyString1", "foo");
292         svc.getExecutor(setMyStringInvocation.getAction()).execute(setMyStringInvocation);
293         assertEquals(setMyStringInvocation.getFailure(), null);
294         assertEquals(setMyStringInvocation.getOutput().length, 0);
295 
296         ActionInvocation getMyStringInvocation = new ActionInvocation(svc.getAction("GetMyString"));
297         svc.getExecutor(getMyStringInvocation.getAction()).execute(getMyStringInvocation);
298         assertEquals(getTargetInvocation.getFailure(), null);
299         assertEquals(getMyStringInvocation.getOutput().length, 1);
300         assertEquals(getMyStringInvocation.getOutput()[0].toString(), "foo");
301 
302     }
303 
304     
305 
306     public static class TestServiceOne {
307 
308         @UpnpStateVariable(sendEvents = false)
309         private boolean target = false;
310 
311         @UpnpStateVariable
312         private boolean status = false;
313 
314         @UpnpStateVariable(sendEvents = false)
315         private MyString myString;
316 
317         @UpnpAction
318         public void setTarget(@UpnpInputArgument(name = "NewTargetValue", aliases ={"NewTargetValue1"}) boolean newTargetValue) {
319             target = newTargetValue;
320             status = newTargetValue;
321         }
322 
323         @UpnpAction(out = @UpnpOutputArgument(name = "RetTargetValue"))
324         public boolean getTarget() {
325             return target;
326         }
327 
328         @UpnpAction(name = "GetStatus", out = @UpnpOutputArgument(name = "ResultStatus", getterName = "getStatus"))
329         public void dummyStatus() {
330             
331         }
332 
333         public boolean getStatus() {
334             return status;
335         }
336 
337         @UpnpAction
338         public void setMyString(@UpnpInputArgument(name = "MyString", aliases ={"MyString1"}) MyString myString) {
339             this.myString = myString;
340         }
341 
342         @UpnpAction(name = "GetMyString", out = @UpnpOutputArgument(name = "MyString", getterName = "getMyString"))
343         public void getMyStringDummy() {
344         }
345 
346         public MyString getMyString() {
347             return myString;
348         }
349     }
350 
351     public static class TestServiceTwo {
352 
353         @UpnpStateVariable(sendEvents = false)
354         private boolean target = false;
355 
356         @UpnpStateVariable
357         private boolean status = false;
358 
359         @UpnpStateVariable(sendEvents = false)
360         private MyString myString;
361 
362         @UpnpAction
363         public void setTarget(@UpnpInputArgument(name = "NewTargetValue", aliases ={"NewTargetValue1"}) boolean newTargetValue) {
364             target = newTargetValue;
365             status = newTargetValue;
366         }
367 
368         @UpnpAction(out = @UpnpOutputArgument(name = "RetTargetValue"))
369         public boolean getTarget() {
370             return target;
371         }
372 
373         @UpnpAction(name = "GetStatus", out = @UpnpOutputArgument(name = "ResultStatus", getterName = "getStatus"))
374         public StatusHolder dummyStatus() {
375             return new StatusHolder(status);
376         }
377 
378         @UpnpAction
379         public void setMyString(@UpnpInputArgument(name = "MyString", aliases ={"MyString1"}) MyString myString) {
380             this.myString = myString;
381         }
382 
383         @UpnpAction(out = @UpnpOutputArgument(name = "MyString", getterName = "getMyString"))
384         public MyStringHolder getMyString() {
385             return new MyStringHolder(myString);
386         }
387 
388         public class StatusHolder {
389             boolean st;
390 
391             public StatusHolder(boolean st) {
392                 this.st = st;
393             }
394 
395             public boolean getStatus() {
396                 return st;
397             }
398         }
399 
400         public class MyStringHolder {
401             MyString myString;
402 
403             public MyStringHolder(MyString myString) {
404                 this.myString = myString;
405             }
406 
407             public MyString getMyString() {
408                 return myString;
409             }
410         }
411 
412     }
413 
414     public static class TestServiceThree {
415 
416         @UpnpStateVariable(sendEvents = false)
417         private boolean target = false;
418 
419         @UpnpStateVariable
420         private boolean status = false;
421 
422         @UpnpStateVariable(sendEvents = false)
423         private MyString myString;
424 
425         @UpnpAction
426         public void setTarget(@UpnpInputArgument(name = "NewTargetValue", aliases ={"NewTargetValue1"}) boolean newTargetValue) {
427             target = newTargetValue;
428             status = newTargetValue;
429         }
430 
431         @UpnpAction(out = @UpnpOutputArgument(name = "RetTargetValue"))
432         public boolean getTarget() {
433             return target;
434         }
435 
436         @UpnpAction(out = @UpnpOutputArgument(name = "ResultStatus"))
437         public boolean getStatus() {
438             return status;
439         }
440 
441         @UpnpAction
442         public void setMyString(@UpnpInputArgument(name = "MyString", aliases ={"MyString1"}) MyString myString) {
443             this.myString = myString;
444         }
445 
446         @UpnpAction(out = @UpnpOutputArgument(name = "MyString"))
447         public MyString getMyString() {
448             return myString;
449         }
450     }
451 
452     public static class MyString {
453         private String s;
454 
455         public MyString(String s) {
456             this.s = s;
457         }
458 
459         public String getS() {
460             return s;
461         }
462 
463         @Override
464         public String toString() {
465             return s;
466         }
467     }
468 
469 }