]> git.basschouten.com Git - openhab-addons.git/blob
60693d45426b70027e8aa545674f1a43e12544d9
[openhab-addons.git] /
1 /**
2  * Copyright (c) 2010-2021 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.network.internal;
14
15 import static org.hamcrest.CoreMatchers.is;
16 import static org.hamcrest.MatcherAssert.assertThat;
17 import static org.junit.jupiter.api.Assertions.assertThrows;
18 import static org.openhab.binding.network.internal.WakeOnLanPacketSender.*;
19
20 import java.io.IOException;
21 import java.net.DatagramPacket;
22 import java.net.DatagramSocket;
23 import java.util.Arrays;
24
25 import org.junit.jupiter.api.Assertions;
26 import org.junit.jupiter.api.Test;
27 import org.junit.jupiter.api.Timeout;
28 import org.openhab.core.util.HexUtils;
29
30 /**
31  * Tests cases for {@link WakeOnLanPacketSender}.
32  *
33  * @author Wouter Born - Initial contribution
34  */
35 @Timeout(value = 10)
36 public class WakeOnLanPacketSenderTest {
37
38     private void assertValidMagicPacket(byte[] macBytes, byte[] packet) {
39         byte[] prefix = new byte[PREFIX_BYTE_SIZE];
40         Arrays.fill(prefix, (byte) 0xff);
41
42         assertThat(Arrays.copyOfRange(packet, 0, PREFIX_BYTE_SIZE), is(prefix));
43
44         for (int i = PREFIX_BYTE_SIZE; i < MAGIC_PACKET_BYTE_SIZE; i += MAC_BYTE_SIZE) {
45             assertThat(Arrays.copyOfRange(packet, i, i + MAC_BYTE_SIZE), is(macBytes));
46         }
47     }
48
49     @Test
50     public void sendWithColonSeparatedMacAddress() {
51         byte[] actualPacket = new byte[MAGIC_PACKET_BYTE_SIZE];
52
53         WakeOnLanPacketSender sender = new WakeOnLanPacketSender("6f:70:65:6e:48:41",
54                 bytes -> System.arraycopy(bytes, 0, actualPacket, 0, bytes.length));
55
56         sender.sendWakeOnLanPacketViaMac();
57
58         assertValidMagicPacket(HexUtils.hexToBytes("6f:70:65:6e:48:41", ":"), actualPacket);
59     }
60
61     @Test
62     public void sendWithHyphenSeparatedMacAddress() {
63         byte[] actualPacket = new byte[MAGIC_PACKET_BYTE_SIZE];
64
65         WakeOnLanPacketSender sender = new WakeOnLanPacketSender("6F-70-65-6E-48-41",
66                 bytes -> System.arraycopy(bytes, 0, actualPacket, 0, bytes.length));
67
68         sender.sendWakeOnLanPacketViaMac();
69
70         assertValidMagicPacket(HexUtils.hexToBytes("6F-70-65-6E-48-41", "-"), actualPacket);
71     }
72
73     @Test
74     public void sendWithNoSeparatedMacAddress() {
75         byte[] actualPacket = new byte[MAGIC_PACKET_BYTE_SIZE];
76
77         WakeOnLanPacketSender sender = new WakeOnLanPacketSender("6f70656e4841",
78                 bytes -> System.arraycopy(bytes, 0, actualPacket, 0, bytes.length));
79
80         sender.sendWakeOnLanPacketViaMac();
81
82         assertValidMagicPacket(HexUtils.hexToBytes("6f70656e4841"), actualPacket);
83     }
84
85     @Test
86     public void sendWithHostnameAndPort() throws IOException, InterruptedException {
87         sendWOLTest("127.0.0.1", 4444);
88     }
89
90     @Test
91     public void sendWithHostnameAndPortNull() throws IOException, InterruptedException {
92         sendWOLTest("127.0.0.1", null);
93     }
94
95     @Test
96     public void sendWithHostnameNullAndPortNull() {
97         assertThrows(IllegalStateException.class, () -> sendWOLTest(null, null));
98     }
99
100     @Test
101     public void sendWithHostnameNull() {
102         assertThrows(IllegalStateException.class, () -> sendWOLTest(null, 4444));
103     }
104
105     private void sendWOLTest(String hostname, Integer port) throws InterruptedException, IOException {
106         DatagramSocket socket = new DatagramSocket(4444);
107
108         byte[] buf = new byte[256];
109         DatagramPacket datagramPacket = new DatagramPacket(buf, buf.length);
110
111         while (socket.isClosed()) {
112             Thread.sleep(100);
113         }
114
115         try {
116             WakeOnLanPacketSender sender = new WakeOnLanPacketSender("6f70656e4841", hostname, port);
117             sender.sendWakeOnLanPacketViaIp();
118
119             // This Test is only applicable for IP Requests
120             if (hostname != null && port != null) {
121                 socket.receive(datagramPacket);
122             }
123
124             Assertions.assertTrue(datagramPacket.getData().length > 0);
125         } finally {
126             socket.close();
127         }
128     }
129
130     @Test
131     public void sendWithEmptyMacAddressThrowsException() {
132         assertThrows(IllegalStateException.class, () -> new WakeOnLanPacketSender("").sendWakeOnLanPacketViaMac());
133     }
134
135     @Test
136     public void sendWithTooShortMacAddressThrowsException() {
137         assertThrows(IllegalStateException.class,
138                 () -> new WakeOnLanPacketSender("6f:70:65:6e:48").sendWakeOnLanPacketViaMac());
139     }
140
141     @Test
142     public void sendWithTooLongMacAddressThrowsException() {
143         assertThrows(IllegalStateException.class,
144                 () -> new WakeOnLanPacketSender("6f:70:65:6e:48:41:42").sendWakeOnLanPacketViaMac());
145     }
146
147     @Test
148     public void sendWithUnsupportedSeparatorInMacAddressThrowsException() {
149         assertThrows(IllegalStateException.class,
150                 () -> new WakeOnLanPacketSender("6f=70=65=6e=48=41").sendWakeOnLanPacketViaMac());
151     }
152 }