]> git.basschouten.com Git - openhab-addons.git/blob
f51defce96a2c710709bccb0451514545b05c489
[openhab-addons.git] /
1 /**
2  * Copyright (c) 2010-2020 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.onewire.internal;
14
15 import static org.hamcrest.CoreMatchers.is;
16 import static org.junit.Assert.*;
17 import static org.mockito.ArgumentMatchers.any;
18 import static org.mockito.ArgumentMatchers.eq;
19 import static org.mockito.Mockito.*;
20 import static org.mockito.MockitoAnnotations.initMocks;
21 import static org.openhab.binding.onewire.internal.OwBindingConstants.*;
22
23 import java.util.HashMap;
24 import java.util.Map;
25
26 import org.eclipse.jdt.annotation.NonNullByDefault;
27 import org.eclipse.jdt.annotation.Nullable;
28 import org.junit.After;
29 import org.junit.Assert;
30 import org.junit.Before;
31 import org.junit.Test;
32 import org.mockito.ArgumentCaptor;
33 import org.mockito.Mock;
34 import org.mockito.Mockito;
35 import org.openhab.binding.onewire.internal.handler.OwserverBridgeHandler;
36 import org.openhab.binding.onewire.internal.owserver.OwserverConnection;
37 import org.openhab.binding.onewire.internal.owserver.OwserverConnectionState;
38 import org.openhab.core.config.core.Configuration;
39 import org.openhab.core.test.java.JavaTest;
40 import org.openhab.core.thing.Bridge;
41 import org.openhab.core.thing.Thing;
42 import org.openhab.core.thing.ThingStatus;
43 import org.openhab.core.thing.ThingStatusInfo;
44 import org.openhab.core.thing.binding.ThingHandlerCallback;
45 import org.openhab.core.thing.binding.builder.BridgeBuilder;
46
47 /**
48  * Tests cases for {@link OwserverBridgeHandler}.
49  *
50  * @author Jan N. Klug - Initial contribution
51  */
52 @NonNullByDefault
53 public class OwserverBridgeHandlerTest extends JavaTest {
54
55     private static final String TEST_HOST = "foo.bar";
56     private static final int TEST_PORT = 4711;
57     Map<String, Object> bridgeProperties = new HashMap<>();
58
59     @Mock
60     @NonNullByDefault({})
61     private OwserverConnection owserverConnection;
62
63     @Mock
64     @NonNullByDefault({})
65     private ThingHandlerCallback thingHandlerCallback;
66
67     private @Nullable OwserverBridgeHandler bridgeHandler;
68     private @Nullable Bridge bridge;
69
70     @Before
71     public void setup() {
72         bridgeProperties.put(CONFIG_ADDRESS, TEST_HOST);
73         bridgeProperties.put(CONFIG_PORT, TEST_PORT);
74
75         initMocks(this);
76
77         bridge = BridgeBuilder.create(THING_TYPE_OWSERVER, "owserver").withLabel("owserver")
78                 .withConfiguration(new Configuration(bridgeProperties)).build();
79
80         doAnswer(answer -> {
81             ((Thing) answer.getArgument(0)).setStatusInfo(answer.getArgument(1));
82             return null;
83         }).when(thingHandlerCallback).statusUpdated(any(), any());
84
85         final Bridge bridge = this.bridge;
86
87         if (bridge == null) {
88             Assert.fail("bridge is null");
89             return;
90         }
91
92         final OwserverBridgeHandler bridgeHandler = new OwserverBridgeHandler(bridge, owserverConnection);
93         bridgeHandler.getThing().setHandler(bridgeHandler);
94         bridgeHandler.setCallback(thingHandlerCallback);
95         this.bridgeHandler = bridgeHandler;
96     }
97
98     @After
99     public void tearDown() {
100         final OwserverBridgeHandler bridgeHandler = this.bridgeHandler;
101         if (bridgeHandler != null) {
102             bridgeHandler.dispose();
103         }
104     }
105
106     @Test
107     public void testInitializationStartsConnectionWithOptions() {
108         final OwserverBridgeHandler bridgeHandler = this.bridgeHandler;
109         if (bridgeHandler == null) {
110             Assert.fail("bridgeHandler is null");
111             return;
112         }
113
114         bridgeHandler.initialize();
115
116         Mockito.verify(owserverConnection).setHost(TEST_HOST);
117         Mockito.verify(owserverConnection).setPort(TEST_PORT);
118
119         Mockito.verify(owserverConnection, timeout(5000)).start();
120     }
121
122     @Test
123     public void testInitializationReportsRefreshableOnSuccessfullConnection() {
124         final OwserverBridgeHandler bridgeHandler = this.bridgeHandler;
125         if (bridgeHandler == null) {
126             Assert.fail("bridgeHandler is null");
127             return;
128         }
129
130         Mockito.doAnswer(answer -> {
131             bridgeHandler.reportConnectionState(OwserverConnectionState.OPENED);
132             return null;
133         }).when(owserverConnection).start();
134
135         bridgeHandler.initialize();
136
137         ArgumentCaptor<ThingStatusInfo> statusCaptor = ArgumentCaptor.forClass(ThingStatusInfo.class);
138         waitForAssert(() -> {
139             verify(thingHandlerCallback, times(2)).statusUpdated(eq(bridge), statusCaptor.capture());
140         });
141         assertThat(statusCaptor.getAllValues().get(0).getStatus(), is(ThingStatus.UNKNOWN));
142         assertThat(statusCaptor.getAllValues().get(1).getStatus(), is(ThingStatus.ONLINE));
143
144         waitForAssert(() -> assertTrue(bridgeHandler.isRefreshable()));
145     }
146
147     @Test
148     public void testInitializationReportsNotRefreshableOnFailedConnection() {
149         final OwserverBridgeHandler bridgeHandler = this.bridgeHandler;
150         if (bridgeHandler == null) {
151             Assert.fail("bridgeHandler is null");
152             return;
153         }
154
155         Mockito.doAnswer(answer -> {
156             bridgeHandler.reportConnectionState(OwserverConnectionState.FAILED);
157             return null;
158         }).when(owserverConnection).start();
159
160         bridgeHandler.initialize();
161
162         ArgumentCaptor<ThingStatusInfo> statusCaptor = ArgumentCaptor.forClass(ThingStatusInfo.class);
163         waitForAssert(() -> {
164             verify(thingHandlerCallback, times(2)).statusUpdated(eq(bridge), statusCaptor.capture());
165         });
166         assertThat(statusCaptor.getAllValues().get(0).getStatus(), is(ThingStatus.UNKNOWN));
167         assertThat(statusCaptor.getAllValues().get(1).getStatus(), is(ThingStatus.OFFLINE));
168
169         waitForAssert(() -> assertFalse(bridgeHandler.isRefreshable()));
170     }
171 }