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 example.binarylight.SwitchPower;
19 import org.fourthline.cling.controlpoint.SubscriptionCallback;
20 import org.fourthline.cling.mock.MockRouter;
21 import org.fourthline.cling.mock.MockUpnpService;
22 import org.fourthline.cling.model.UnsupportedDataException;
23 import org.fourthline.cling.model.gena.CancelReason;
24 import org.fourthline.cling.model.gena.GENASubscription;
25 import org.fourthline.cling.model.gena.RemoteGENASubscription;
26 import org.fourthline.cling.model.message.StreamResponseMessage;
27 import org.fourthline.cling.model.message.UpnpResponse;
28 import org.fourthline.cling.model.message.header.SubscriptionIdHeader;
29 import org.fourthline.cling.model.message.header.TimeoutHeader;
30 import org.fourthline.cling.model.message.header.UpnpHeader;
31 import org.fourthline.cling.model.meta.LocalDevice;
32 import org.fourthline.cling.model.meta.LocalService;
33 import org.fourthline.cling.model.state.StateVariableValue;
34 import org.fourthline.cling.model.types.BooleanDatatype;
35 import org.fourthline.cling.model.types.Datatype;
36 import org.seamless.util.Reflections;
37 import org.testng.annotations.Test;
38
39 import java.util.ArrayList;
40 import java.util.List;
41 import java.util.Map;
42
43 import static org.testng.Assert.*;
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 public class EventSubscriptionTest {
95
96 @Test
97 public void subscriptionLifecycle() throws Exception {
98
99 MockUpnpService upnpService = createMockUpnpService();
100
101 final List<Boolean> testAssertions = new ArrayList<>();
102
103
104 LocalDevice device = BinaryLightSampleData.createDevice(SwitchPower.class);
105 upnpService.getRegistry().addDevice(device);
106
107 LocalService service = device.getServices()[0];
108
109 SubscriptionCallback callback = new SubscriptionCallback(service, 600) {
110
111 @Override
112 public void established(GENASubscription sub) {
113 System.out.println("Established: " + sub.getSubscriptionId());
114 testAssertions.add(true);
115 }
116
117 @Override
118 protected void failed(GENASubscription subscription,
119 UpnpResponse responseStatus,
120 Exception exception,
121 String defaultMsg) {
122 System.err.println(defaultMsg);
123 testAssertions.add(false);
124 }
125
126 @Override
127 public void ended(GENASubscription sub,
128 CancelReason reason,
129 UpnpResponse response) {
130 assertNull(reason);
131 assertNotNull(sub);
132 assertNull(response);
133 testAssertions.add(true);
134 }
135
136 @Override
137 public void eventReceived(GENASubscription sub) {
138
139 System.out.println("Event: " + sub.getCurrentSequence().getValue());
140
141 Map<String, StateVariableValue> values = sub.getCurrentValues();
142 StateVariableValue status = values.get("Status");
143
144 assertEquals(status.getDatatype().getClass(), BooleanDatatype.class);
145 assertEquals(status.getDatatype().getBuiltin(), Datatype.Builtin.BOOLEAN);
146
147 System.out.println("Status is: " + status.toString());
148
149 if (sub.getCurrentSequence().getValue() == 0) {
150 assertEquals(sub.getCurrentValues().get("Status").toString(), "0");
151 testAssertions.add(true);
152 } else if (sub.getCurrentSequence().getValue() == 1) {
153 assertEquals(sub.getCurrentValues().get("Status").toString(), "1");
154 testAssertions.add(true);
155 } else {
156 testAssertions.add(false);
157 }
158 }
159
160 @Override
161 public void eventsMissed(GENASubscription sub, int numberOfMissedEvents) {
162 System.out.println("Missed events: " + numberOfMissedEvents);
163 testAssertions.add(false);
164 }
165
166 @Override
167 protected void invalidMessage(RemoteGENASubscription sub,
168 UnsupportedDataException ex) {
169
170 }
171 };
172
173 upnpService.getControlPoint().execute(callback);
174
175
176 Object serviceImpl = service.getManager().getImplementation();
177 Reflections.set(Reflections.getField(serviceImpl.getClass(), "status"), serviceImpl, true);
178 service.getManager().getPropertyChangeSupport().firePropertyChange("Status", false, true);
179
180 assertEquals(callback.getSubscription().getCurrentSequence().getValue(), Long.valueOf(2));
181 assert callback.getSubscription().getSubscriptionId().startsWith("uuid:");
182
183
184 assertEquals(callback.getSubscription().getActualDurationSeconds(), Integer.MAX_VALUE);
185
186 callback.end();
187
188 assertEquals(testAssertions.size(), 4);
189 for (Boolean testAssertion : testAssertions) {
190 assert testAssertion;
191 }
192
193 assertEquals(upnpService.getRouter().getSentStreamRequestMessages().size(), 0);
194 }
195
196 protected MockUpnpService createMockUpnpService() {
197 return new MockUpnpService() {
198 @Override
199 protected MockRouter createRouter() {
200 return new MockRouter(getConfiguration(), getProtocolFactory()) {
201 @Override
202 public StreamResponseMessage[] getStreamResponseMessages() {
203 return new StreamResponseMessage[]{
204 createSubscribeResponseMessage(),
205 createUnsubscribeResponseMessage()
206 };
207 }
208 };
209 }
210 };
211 }
212
213 protected StreamResponseMessage createSubscribeResponseMessage() {
214 StreamResponseMessage msg = new StreamResponseMessage(new UpnpResponse(UpnpResponse.Status.OK));
215 msg.getHeaders().add(
216 UpnpHeader.Type.SID, new SubscriptionIdHeader("uuid:1234")
217 );
218 msg.getHeaders().add(
219 UpnpHeader.Type.TIMEOUT, new TimeoutHeader(180)
220 );
221 return msg;
222 }
223
224 protected StreamResponseMessage createUnsubscribeResponseMessage() {
225 return new StreamResponseMessage(new UpnpResponse(UpnpResponse.Status.OK));
226 }
227
228
229 }