]> git.basschouten.com Git - openhab-addons.git/blob
68db121b64908b4177ed5c3f128d39eeceebad85
[openhab-addons.git] /
1 /**
2  * Copyright (c) 2010-2022 Contributors to the openHAB project
3  *
4  * See the NOTICE file(s) distributed with this work for additional
5  * information.
6  *
7  * This program and the accompanying materials are made available under the
8  * terms of the Eclipse Public License 2.0 which is available at
9  * http://www.eclipse.org/legal/epl-2.0
10  *
11  * SPDX-License-Identifier: EPL-2.0
12  */
13 package org.openhab.binding.wemo.internal.handler.test;
14
15 import static org.hamcrest.CoreMatchers.*;
16 import static org.hamcrest.MatcherAssert.assertThat;
17 import static org.junit.jupiter.api.Assertions.*;
18 import static org.mockito.ArgumentMatchers.any;
19 import static org.mockito.Mockito.*;
20
21 import java.io.IOException;
22 import java.net.MalformedURLException;
23 import java.net.URISyntaxException;
24 import java.util.List;
25
26 import org.junit.jupiter.api.AfterEach;
27 import org.junit.jupiter.api.BeforeEach;
28 import org.junit.jupiter.api.Test;
29 import org.jupnp.model.ValidationException;
30 import org.mockito.ArgumentCaptor;
31 import org.openhab.binding.wemo.internal.WemoBindingConstants;
32 import org.openhab.binding.wemo.internal.handler.WemoMakerHandler;
33 import org.openhab.binding.wemo.internal.test.GenericWemoOSGiTest;
34 import org.openhab.core.library.types.OnOffType;
35 import org.openhab.core.thing.ChannelUID;
36 import org.openhab.core.thing.Thing;
37 import org.openhab.core.thing.ThingStatus;
38 import org.openhab.core.thing.ThingTypeUID;
39 import org.openhab.core.thing.binding.ThingHandler;
40 import org.openhab.core.types.Command;
41 import org.openhab.core.types.RefreshType;
42
43 /**
44  * Tests for {@link WemoMakerHandler}.
45  *
46  * @author Svilen Valkanov - Initial contribution
47  * @author Stefan Triller - Ported Tests from Groovy to Java
48  */
49 public class WemoMakerHandlerOSGiTest extends GenericWemoOSGiTest {
50
51     // Specific Thing information
52     private static final String DEFAULT_TEST_CHANNEL = WemoBindingConstants.CHANNEL_RELAY;
53     private static final String DEFAULT_TEST_CHANNEL_TYPE = "Switch";
54     private static final ThingTypeUID THING_TYPE_UID = WemoBindingConstants.THING_TYPE_MAKER;
55
56     // Specific UpnP service information
57     private static final String MODEL = THING_TYPE_UID.getId();
58     private static final String BASIC_EVENT_SERVICE_ID = "basicevent";
59     private static final String SERVICE_NUMBER = "1";
60
61     @BeforeEach
62     public void setUp() throws IOException {
63         setUpServices();
64     }
65
66     @AfterEach
67     public void tearDown() {
68         removeThing();
69     }
70
71     @Test
72     public void assertThatThingHandlesOnOffCommandCorrectly()
73             throws MalformedURLException, URISyntaxException, ValidationException {
74         Command command = OnOffType.OFF;
75
76         Thing thing = createThing(THING_TYPE_UID, DEFAULT_TEST_CHANNEL, DEFAULT_TEST_CHANNEL_TYPE);
77
78         waitForAssert(() -> {
79             assertThat(thing.getStatus(), is(ThingStatus.ONLINE));
80         });
81
82         // The Device is registered as UPnP Device after the initialization, this will ensure that the polling job will
83         // not start
84         addUpnpDevice(BASIC_EVENT_SERVICE_ID, SERVICE_NUMBER, MODEL);
85
86         ChannelUID channelUID = new ChannelUID(thing.getUID(), DEFAULT_TEST_CHANNEL);
87         ThingHandler handler = thing.getHandler();
88         assertNotNull(handler);
89         handler.handleCommand(channelUID, command);
90
91         ArgumentCaptor<String> captur = ArgumentCaptor.forClass(String.class);
92         verify(mockCaller, atLeastOnce()).executeCall(any(), any(), captur.capture());
93
94         List<String> results = captur.getAllValues();
95         boolean found = false;
96         for (String result : results) {
97             // Binary state 0 is equivalent to OFF
98             if (result.contains("<BinaryState>0</BinaryState>")) {
99                 found = true;
100                 break;
101             }
102         }
103         assertTrue(found);
104     }
105
106     @Test
107     public void assertThatThingHandlesREFRESHCommand()
108             throws MalformedURLException, URISyntaxException, ValidationException {
109         Command command = RefreshType.REFRESH;
110
111         Thing thing = createThing(THING_TYPE_UID, DEFAULT_TEST_CHANNEL, DEFAULT_TEST_CHANNEL_TYPE);
112
113         waitForAssert(() -> {
114             assertThat(thing.getStatus(), is(ThingStatus.ONLINE));
115         });
116
117         // The Device is registered as UPnP Device after the initialization, this will ensure that the polling job will
118         // not start
119         addUpnpDevice(BASIC_EVENT_SERVICE_ID, SERVICE_NUMBER, MODEL);
120
121         ChannelUID channelUID = new ChannelUID(thing.getUID(), DEFAULT_TEST_CHANNEL);
122         ThingHandler handler = thing.getHandler();
123         assertNotNull(handler);
124         handler.handleCommand(channelUID, command);
125
126         ArgumentCaptor<String> captur = ArgumentCaptor.forClass(String.class);
127         verify(mockCaller, atLeastOnce()).executeCall(any(), any(), captur.capture());
128
129         List<String> results = captur.getAllValues();
130         boolean found = false;
131         for (String result : results) {
132             if (result.contains("<u:GetAttributes xmlns:u=\"urn:Belkin:service:deviceevent:1\"></u:GetAttributes>")) {
133                 found = true;
134                 break;
135             }
136         }
137         assertTrue(found);
138     }
139
140     private void removeThing() {
141         if (thing != null) {
142             Thing removedThing = thingRegistry.remove(thing.getUID());
143             assertThat(removedThing, is(notNullValue()));
144         }
145
146         waitForAssert(() -> {
147             assertThat(thing.getStatus(), is(ThingStatus.UNINITIALIZED));
148         });
149     }
150 }