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