2 * Copyright (c) 2010-2023 Contributors to the openHAB project
4 * See the NOTICE file(s) distributed with this work for additional
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
11 * SPDX-License-Identifier: EPL-2.0
13 package org.openhab.binding.onewire.internal;
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.*;
22 import java.util.HashMap;
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;
48 * Tests cases for {@link OwserverBridgeHandler}.
50 * @author Jan N. Klug - Initial contribution
52 @ExtendWith(MockitoExtension.class)
54 public class OwserverBridgeHandlerTest extends JavaTest {
56 private static final String TEST_HOST = "foo.bar";
57 private static final int TEST_PORT = 4711;
58 Map<String, Object> bridgeProperties = new HashMap<>();
60 private @Mock @NonNullByDefault({}) OwserverConnection owserverConnection;
61 private @Mock @NonNullByDefault({}) ThingHandlerCallback thingHandlerCallback;
63 private @Nullable OwserverBridgeHandler bridgeHandler;
64 private @Nullable Bridge bridge;
68 bridgeProperties.put(CONFIG_ADDRESS, TEST_HOST);
69 bridgeProperties.put(CONFIG_PORT, TEST_PORT);
71 bridge = BridgeBuilder.create(THING_TYPE_OWSERVER, "owserver").withLabel("owserver")
72 .withConfiguration(new Configuration(bridgeProperties)).build();
75 ((Thing) answer.getArgument(0)).setStatusInfo(answer.getArgument(1));
77 }).when(thingHandlerCallback).statusUpdated(any(), any());
79 final Bridge bridge = this.bridge;
82 fail("bridge is null");
86 final OwserverBridgeHandler bridgeHandler = new OwserverBridgeHandler(bridge, owserverConnection);
87 bridgeHandler.getThing().setHandler(bridgeHandler);
88 bridgeHandler.setCallback(thingHandlerCallback);
89 this.bridgeHandler = bridgeHandler;
93 public void tearDown() {
94 final OwserverBridgeHandler bridgeHandler = this.bridgeHandler;
95 if (bridgeHandler != null) {
96 bridgeHandler.dispose();
101 public void testInitializationStartsConnectionWithOptions() {
102 final OwserverBridgeHandler bridgeHandler = this.bridgeHandler;
103 if (bridgeHandler == null) {
104 fail("bridgeHandler is null");
108 bridgeHandler.initialize();
110 Mockito.verify(owserverConnection).setHost(TEST_HOST);
111 Mockito.verify(owserverConnection).setPort(TEST_PORT);
113 Mockito.verify(owserverConnection, timeout(5000)).start();
117 public void testInitializationReportsRefreshableOnSuccessfullConnection() {
118 final OwserverBridgeHandler bridgeHandler = this.bridgeHandler;
119 if (bridgeHandler == null) {
120 fail("bridgeHandler is null");
124 Mockito.doAnswer(answer -> {
125 bridgeHandler.reportConnectionState(OwserverConnectionState.OPENED);
127 }).when(owserverConnection).start();
129 bridgeHandler.initialize();
131 ArgumentCaptor<ThingStatusInfo> statusCaptor = ArgumentCaptor.forClass(ThingStatusInfo.class);
132 waitForAssert(() -> {
133 verify(thingHandlerCallback, times(2)).statusUpdated(eq(bridge), statusCaptor.capture());
135 assertThat(statusCaptor.getAllValues().get(0).getStatus(), is(ThingStatus.UNKNOWN));
136 assertThat(statusCaptor.getAllValues().get(1).getStatus(), is(ThingStatus.ONLINE));
138 waitForAssert(() -> assertTrue(bridgeHandler.isRefreshable()));
142 public void testInitializationReportsNotRefreshableOnFailedConnection() {
143 final OwserverBridgeHandler bridgeHandler = this.bridgeHandler;
144 if (bridgeHandler == null) {
145 fail("bridgeHandler is null");
149 Mockito.doAnswer(answer -> {
150 bridgeHandler.reportConnectionState(OwserverConnectionState.FAILED);
152 }).when(owserverConnection).start();
154 bridgeHandler.initialize();
156 ArgumentCaptor<ThingStatusInfo> statusCaptor = ArgumentCaptor.forClass(ThingStatusInfo.class);
157 waitForAssert(() -> {
158 verify(thingHandlerCallback, times(2)).statusUpdated(eq(bridge), statusCaptor.capture());
160 assertThat(statusCaptor.getAllValues().get(0).getStatus(), is(ThingStatus.UNKNOWN));
161 assertThat(statusCaptor.getAllValues().get(1).getStatus(), is(ThingStatus.OFFLINE));
163 waitForAssert(() -> assertFalse(bridgeHandler.isRefreshable()));