Skip to content

Commit

Permalink
Merge pull request #104 from Smarteon/listener
Browse files Browse the repository at this point in the history
Introduce local end socket closed event
  • Loading branch information
PetrZufan authored Oct 27, 2020
2 parents 52b73ff + 02fa0d6 commit 41c8a44
Show file tree
Hide file tree
Showing 5 changed files with 44 additions and 11 deletions.
8 changes: 6 additions & 2 deletions src/main/java/cz/smarteon/loxone/LoxoneWebSocket.java
Original file line number Diff line number Diff line change
Expand Up @@ -379,9 +379,13 @@ void connectionOpened() {

}

void connectionClosed(int code) {
void connectionClosed(int code, boolean remote) {
if (webSocketListener != null) {
webSocketListener.webSocketRemoteClosed(code);
if (remote) {
webSocketListener.webSocketRemoteClosed(code);
} else {
webSocketListener.webSocketLocalClosed(code);
}
}
}

Expand Down
13 changes: 9 additions & 4 deletions src/main/java/cz/smarteon/loxone/LoxoneWebSocketListener.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,15 @@ public interface LoxoneWebSocketListener {
void webSocketOpened();

/**
* Loxone web socket has been closed.
* Loxone web socket has been closed by remote end.
* @param code the code returned by the socket when the connection is closed
*/
default void webSocketRemoteClosed(int code){

}
default void webSocketRemoteClosed(int code) {}

/**
* Loxone web socket has been closed by local end. This is mostly the situation indicating
* {@link LoxoneWebSocket#close()} has been called.
* @param code the code returned by the socket when the connection is closed
*/
default void webSocketLocalClosed(int code) {}
}
Original file line number Diff line number Diff line change
Expand Up @@ -127,8 +127,8 @@ public void onClose(int code, String reason, boolean remote) {
if (keepAliveFuture != null) {
keepAliveFuture.cancel(true);
}
ws.connectionClosed(code, remote);
if (remote) {
ws.connectionClosed(code);
ws.autoRestart();
}
}
Expand Down
10 changes: 8 additions & 2 deletions src/test/groovy/cz/smarteon/loxone/LoxoneWebSocketTest.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -88,12 +88,18 @@ class LoxoneWebSocketTest extends Specification {

when:
loxoneWebSocket.setWebSocketListener(listener)
loxoneWebSocket.connectionClosed(1000)
loxoneWebSocket.connectionClosed(1000, remote)
sleep(10) // wait for another thread execution

then:
loxoneWebSocket.getWebSocketListener() == listener
1 * listener.webSocketRemoteClosed(1000)
if (remote)
1 * listener.webSocketRemoteClosed(1000)
else
1 * listener.webSocketLocalClosed(1000)

where:
remote << [true, false]
}

def "should close properly"() {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,19 +1,37 @@
package cz.smarteon.loxone

import spock.lang.Specification
import spock.lang.Subject

import java.nio.ByteBuffer

class LoxoneWebsocketClientTest extends Specification {

LoxoneWebsocketClient client
@Subject LoxoneWebsocketClient client
LoxoneWebSocket webSocket

void setup() {
client = new LoxoneWebsocketClient(Mock(LoxoneWebSocket), URI.create(''))
webSocket = Mock(LoxoneWebSocket)
client = new LoxoneWebsocketClient(webSocket, URI.create(''))
}

def "should parse binary message"() {
expect:
client.onMessage(ByteBuffer.wrap([0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0] as byte[]))
}

def "should handle onClose"() {
when:
client.onClose(1000, 'some reason', remote)

then:
1 * webSocket.wsClosed()
1 * webSocket.connectionClosed(1000, remote)
if (remote) {
1 * webSocket.autoRestart()
}

where:
remote << [true, false]
}
}

0 comments on commit 41c8a44

Please sign in to comment.