summaryrefslogtreecommitdiffstats
path: root/vpp-common/vpp-translate-utils/src/test/java/io/fd/honeycomb/translate/vpp
diff options
context:
space:
mode:
Diffstat (limited to 'vpp-common/vpp-translate-utils/src/test/java/io/fd/honeycomb/translate/vpp')
-rw-r--r--vpp-common/vpp-translate-utils/src/test/java/io/fd/honeycomb/translate/vpp/util/AddressTranslatorTest.java20
-rw-r--r--vpp-common/vpp-translate-utils/src/test/java/io/fd/honeycomb/translate/vpp/util/ByteDataTranslatorTest.java39
-rw-r--r--vpp-common/vpp-translate-utils/src/test/java/io/fd/honeycomb/translate/vpp/util/Ipv4TranslatorTest.java33
-rw-r--r--vpp-common/vpp-translate-utils/src/test/java/io/fd/honeycomb/translate/vpp/util/Ipv6TranslatorTest.java40
-rw-r--r--vpp-common/vpp-translate-utils/src/test/java/io/fd/honeycomb/translate/vpp/util/JvppReplyConsumerTest.java60
-rw-r--r--vpp-common/vpp-translate-utils/src/test/java/io/fd/honeycomb/translate/vpp/util/MacTranslatorTest.java73
-rw-r--r--vpp-common/vpp-translate-utils/src/test/java/io/fd/honeycomb/translate/vpp/util/VppStatusListenerTest.java37
-rw-r--r--vpp-common/vpp-translate-utils/src/test/java/io/fd/honeycomb/translate/vpp/util/cache/DumpCacheManagerTest.java147
8 files changed, 449 insertions, 0 deletions
diff --git a/vpp-common/vpp-translate-utils/src/test/java/io/fd/honeycomb/translate/vpp/util/AddressTranslatorTest.java b/vpp-common/vpp-translate-utils/src/test/java/io/fd/honeycomb/translate/vpp/util/AddressTranslatorTest.java
new file mode 100644
index 000000000..872ce8ccf
--- /dev/null
+++ b/vpp-common/vpp-translate-utils/src/test/java/io/fd/honeycomb/translate/vpp/util/AddressTranslatorTest.java
@@ -0,0 +1,20 @@
+package io.fd.honeycomb.translate.vpp.util;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6Address;
+
+public class AddressTranslatorTest implements AddressTranslator {
+
+ @Test
+ public void testRevertAddress() {
+ assertEquals("1.2.168.192",
+ reverseAddress(new IpAddress(new Ipv4Address("192.168.2.1"))).getIpv4Address().getValue());
+ assertEquals("3473:7003:2e8a::a385:b80d:120",
+ reverseAddress(new IpAddress(new Ipv6Address("2001:db8:85a3:0:0:8a2e:370:7334"))).getIpv6Address()
+ .getValue());
+ }
+} \ No newline at end of file
diff --git a/vpp-common/vpp-translate-utils/src/test/java/io/fd/honeycomb/translate/vpp/util/ByteDataTranslatorTest.java b/vpp-common/vpp-translate-utils/src/test/java/io/fd/honeycomb/translate/vpp/util/ByteDataTranslatorTest.java
new file mode 100644
index 000000000..4d4b1ee39
--- /dev/null
+++ b/vpp-common/vpp-translate-utils/src/test/java/io/fd/honeycomb/translate/vpp/util/ByteDataTranslatorTest.java
@@ -0,0 +1,39 @@
+package io.fd.honeycomb.translate.vpp.util;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+
+/**
+ * Created by jsrnicek on 23.9.2016.
+ */
+public class ByteDataTranslatorTest implements ByteDataTranslator {
+
+ @Test
+ public void testBooleanToByte() {
+ assertEquals(0, booleanToByte(null));
+ assertEquals(0, booleanToByte(false));
+ assertEquals(1, booleanToByte(true));
+ }
+
+ @Test
+ public void testByteToBoolean() {
+ assertEquals(Boolean.FALSE, byteToBoolean((byte) 0));
+ assertEquals(Boolean.TRUE, byteToBoolean((byte) 1));
+ }
+
+ @Test(expected = IllegalArgumentException.class)
+ public void testByteToBooleanFailed() {
+ byteToBoolean((byte) 123);
+ }
+
+ @Test
+ public void testToString() {
+ final byte[] expected = "test".getBytes();
+ final byte[] cString = new byte[expected.length + 10];
+ System.arraycopy(expected, 0, cString, 0, expected.length);
+ final String jString = toString(cString);
+ assertArrayEquals(expected, jString.getBytes());
+ }
+} \ No newline at end of file
diff --git a/vpp-common/vpp-translate-utils/src/test/java/io/fd/honeycomb/translate/vpp/util/Ipv4TranslatorTest.java b/vpp-common/vpp-translate-utils/src/test/java/io/fd/honeycomb/translate/vpp/util/Ipv4TranslatorTest.java
new file mode 100644
index 000000000..e2a929729
--- /dev/null
+++ b/vpp-common/vpp-translate-utils/src/test/java/io/fd/honeycomb/translate/vpp/util/Ipv4TranslatorTest.java
@@ -0,0 +1,33 @@
+package io.fd.honeycomb.translate.vpp.util;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4AddressNoZone;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Prefix;
+
+public class Ipv4TranslatorTest implements Ipv4Translator {
+
+ @Test
+ public void testIpv4NoZone() throws Exception {
+ final Ipv4AddressNoZone ipv4Addr = new Ipv4AddressNoZone("192.168.1.1");
+ byte[] bytes = ipv4AddressNoZoneToArray(ipv4Addr);
+ assertEquals((byte) 192, bytes[0]);
+ // Simulating the magic of VPP
+ bytes = reverseBytes(bytes);
+ final Ipv4AddressNoZone ipv4AddressNoZone = arrayToIpv4AddressNoZone(bytes);
+ assertEquals(ipv4Addr, ipv4AddressNoZone);
+ }
+
+ @Test
+ public void testIpv4AddressPrefixToArray() {
+ byte[] ip = ipv4AddressPrefixToArray(new Ipv4Prefix("192.168.2.1/24"));
+
+ assertEquals("1.2.168.192", arrayToIpv4AddressNoZone(ip).getValue());
+ }
+
+ @Test
+ public void testExtractPrefix() {
+ assertEquals(24, extractPrefix(new Ipv4Prefix("192.168.2.1/24")));
+ }
+} \ No newline at end of file
diff --git a/vpp-common/vpp-translate-utils/src/test/java/io/fd/honeycomb/translate/vpp/util/Ipv6TranslatorTest.java b/vpp-common/vpp-translate-utils/src/test/java/io/fd/honeycomb/translate/vpp/util/Ipv6TranslatorTest.java
new file mode 100644
index 000000000..0dbabd240
--- /dev/null
+++ b/vpp-common/vpp-translate-utils/src/test/java/io/fd/honeycomb/translate/vpp/util/Ipv6TranslatorTest.java
@@ -0,0 +1,40 @@
+package io.fd.honeycomb.translate.vpp.util;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6AddressNoZone;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6Prefix;
+
+public class Ipv6TranslatorTest implements Ipv6Translator {
+
+ @Test
+ public void testIpv6NoZone() {
+ final Ipv6AddressNoZone ipv6Addr = new Ipv6AddressNoZone("3ffe:1900:4545:3:200:f8ff:fe21:67cf");
+ byte[] bytes = ipv6AddressNoZoneToArray(ipv6Addr);
+ assertEquals((byte) 63, bytes[0]);
+
+ bytes = reverseBytes(bytes);
+ final Ipv6AddressNoZone ivp6AddressNoZone = arrayToIpv6AddressNoZone(bytes);
+ assertEquals(ipv6Addr, ivp6AddressNoZone);
+ }
+
+ @Test
+ public void testIpv6AddressPrefixToArray() {
+ byte[] ip = ipv6AddressPrefixToArray(new Ipv6Prefix("3ffe:1900:4545:3:200:f8ff:fe21:67cf/48"));
+
+ assertEquals("cf67:21fe:fff8:2:300:4545:19:fe3f", arrayToIpv6AddressNoZone(ip).getValue());
+ }
+
+ @Test
+ public void testIpv4AddressPrefixToArray() {
+ byte[] ip = ipv6AddressPrefixToArray(new Ipv6Prefix("2001:0db8:0a0b:12f0:0000:0000:0000:0001/128"));
+
+ assertEquals("100::f012:b0a:b80d:120", arrayToIpv6AddressNoZone(ip).getValue());
+ }
+
+ @Test
+ public void testExtractPrefix() {
+ assertEquals(48, extractPrefix(new Ipv6Prefix("3ffe:1900:4545:3:200:f8ff:fe21:67cf/48")));
+ }
+} \ No newline at end of file
diff --git a/vpp-common/vpp-translate-utils/src/test/java/io/fd/honeycomb/translate/vpp/util/JvppReplyConsumerTest.java b/vpp-common/vpp-translate-utils/src/test/java/io/fd/honeycomb/translate/vpp/util/JvppReplyConsumerTest.java
new file mode 100644
index 000000000..af05ffd8f
--- /dev/null
+++ b/vpp-common/vpp-translate-utils/src/test/java/io/fd/honeycomb/translate/vpp/util/JvppReplyConsumerTest.java
@@ -0,0 +1,60 @@
+package io.fd.honeycomb.translate.vpp.util;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+import static org.mockito.Matchers.anyLong;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+import org.junit.Test;
+import org.opendaylight.yangtools.yang.binding.DataContainer;
+import org.opendaylight.yangtools.yang.binding.DataObject;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.openvpp.jvpp.dto.JVppReply;
+
+public class JvppReplyConsumerTest implements JvppReplyConsumer {
+
+ private static class AnDataObject implements DataObject {
+ @Override
+ public Class<? extends DataContainer> getImplementedInterface() {
+ return null;
+ }
+ }
+
+ @Test
+ public void testGetReplyForWriteTimeout() throws Exception {
+ final Future<JVppReply<?>> future = mock(Future.class);
+ when(future.get(anyLong(), eq(TimeUnit.SECONDS))).thenThrow(TimeoutException.class);
+ final InstanceIdentifier<AnDataObject>
+ replyType = InstanceIdentifier.create(AnDataObject.class);
+ try {
+ getReplyForWrite(future, replyType);
+ } catch (WriteTimeoutException e) {
+ assertTrue(e.getCause() instanceof TimeoutException);
+ assertEquals(replyType, e.getFailedId());
+ return;
+ }
+ fail("WriteTimeoutException was expected");
+ }
+
+ @Test
+ public void testGetReplyForReadTimeout() throws Exception {
+ final Future<JVppReply<?>> future = mock(Future.class);
+ final InstanceIdentifier<AnDataObject> replyType =
+ InstanceIdentifier.create(AnDataObject.class);
+ when(future.get(anyLong(), eq(TimeUnit.SECONDS))).thenThrow(TimeoutException.class);
+ try {
+ getReplyForRead(future, replyType);
+ } catch (ReadTimeoutException e) {
+ assertTrue(e.getCause() instanceof TimeoutException);
+ assertEquals(replyType, e.getFailedId());
+ return;
+ }
+ fail("ReadTimeoutException was expected");
+ }
+} \ No newline at end of file
diff --git a/vpp-common/vpp-translate-utils/src/test/java/io/fd/honeycomb/translate/vpp/util/MacTranslatorTest.java b/vpp-common/vpp-translate-utils/src/test/java/io/fd/honeycomb/translate/vpp/util/MacTranslatorTest.java
new file mode 100644
index 000000000..e8a1e254e
--- /dev/null
+++ b/vpp-common/vpp-translate-utils/src/test/java/io/fd/honeycomb/translate/vpp/util/MacTranslatorTest.java
@@ -0,0 +1,73 @@
+package io.fd.honeycomb.translate.vpp.util;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+
+public class MacTranslatorTest implements MacTranslator {
+
+ @Test
+ public void testParseMac() throws Exception {
+ byte[] bytes = parseMac("00:fF:7f:15:5e:A9");
+ assertMac(bytes);
+ }
+
+ private void assertMac(final byte[] bytes) {
+ assertEquals(6, bytes.length);
+ assertEquals((byte) 0, bytes[0]);
+ assertEquals((byte) 255, bytes[1]);
+ assertEquals((byte) 127, bytes[2]);
+ assertEquals((byte) 21, bytes[3]);
+ assertEquals((byte) 94, bytes[4]);
+ assertEquals((byte) 169, bytes[5]);
+ }
+
+ @Test(expected = IllegalArgumentException.class)
+ public void testParseMacLonger() throws Exception {
+ byte[] bytes = parseMac("00:fF:7f:15:5e:A9:88:77");
+ assertMac(bytes);
+ }
+
+ @Test(expected = IllegalArgumentException.class)
+ public void testParseMacShorter() throws Exception {
+ parseMac("00:fF:7f");
+ }
+
+ @Test(expected = IllegalArgumentException.class)
+ public void testParseRandomString() throws Exception {
+ parseMac("random{}}@$*&*!");
+ }
+
+ @Test(expected = NumberFormatException.class)
+ public void testParseMacNumberFormatEx() throws Exception {
+ parseMac("00:XX:7f:15:5e:77\"");
+ }
+
+ @Test
+ public void testByteArrayToMacUnseparated() {
+ byte[] address = parseMac("aa:bb:cc:dd:ee:ff");
+
+ String converted = byteArrayToMacUnseparated(address);
+
+ assertEquals("aabbccddeeff", converted);
+ }
+
+ @Test
+ public void testByteArrayToMacSeparated() {
+ byte[] address = parseMac("aa:bb:cc:dd:ee:ff");
+
+ String converted = byteArrayToMacSeparated(address);
+
+ assertEquals("aa:bb:cc:dd:ee:ff", converted);
+ }
+
+ @Test(expected = IllegalArgumentException.class)
+ public void testByteArrayToMacUnseparatedIllegal() {
+ byteArrayToMacUnseparated(new byte[]{54, 26, 87, 32, 14});
+ }
+
+ @Test(expected = IllegalArgumentException.class)
+ public void testByteArrayToMacSeparatedIllegal() {
+ byteArrayToMacSeparated(new byte[]{54, 26, 87, 32, 14});
+ }
+} \ No newline at end of file
diff --git a/vpp-common/vpp-translate-utils/src/test/java/io/fd/honeycomb/translate/vpp/util/VppStatusListenerTest.java b/vpp-common/vpp-translate-utils/src/test/java/io/fd/honeycomb/translate/vpp/util/VppStatusListenerTest.java
new file mode 100644
index 000000000..93ee8ef06
--- /dev/null
+++ b/vpp-common/vpp-translate-utils/src/test/java/io/fd/honeycomb/translate/vpp/util/VppStatusListenerTest.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 2016 Cisco and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package io.fd.honeycomb.translate.vpp.util;
+
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.contrib.java.lang.system.ExpectedSystemExit;
+
+public class VppStatusListenerTest {
+
+ @Rule
+ public final ExpectedSystemExit exit = ExpectedSystemExit.none();
+
+ @Test
+ public void testOnKeepaliveFailure() throws Exception {
+ final VppStatusListener vppStatus = new VppStatusListener();
+ exit.expectSystemExitWithStatus(VppStatusListener.RESTART_ERROR_CODE);
+ exit.checkAssertionAfterwards(() -> assertTrue(vppStatus.isDown()));
+ vppStatus.onKeepaliveFailure();
+ }
+} \ No newline at end of file
diff --git a/vpp-common/vpp-translate-utils/src/test/java/io/fd/honeycomb/translate/vpp/util/cache/DumpCacheManagerTest.java b/vpp-common/vpp-translate-utils/src/test/java/io/fd/honeycomb/translate/vpp/util/cache/DumpCacheManagerTest.java
new file mode 100644
index 000000000..72924ac31
--- /dev/null
+++ b/vpp-common/vpp-translate-utils/src/test/java/io/fd/honeycomb/translate/vpp/util/cache/DumpCacheManagerTest.java
@@ -0,0 +1,147 @@
+/*
+ * Copyright (c) 2016 Cisco and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package io.fd.honeycomb.translate.vpp.util.cache;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Mockito.when;
+
+import com.google.common.base.Optional;
+import io.fd.honeycomb.translate.ModificationCache;
+import io.fd.honeycomb.translate.util.read.cache.DumpCacheManager;
+import io.fd.honeycomb.translate.util.read.cache.EntityDumpExecutor;
+import io.fd.honeycomb.translate.util.read.cache.EntityDumpNonEmptyCheck;
+import io.fd.honeycomb.translate.util.read.cache.EntityDumpPostProcessingFunction;
+import io.fd.honeycomb.translate.util.read.cache.exceptions.check.i.DumpEmptyException;
+import io.fd.honeycomb.translate.util.read.cache.exceptions.execution.DumpExecutionFailedException;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.openvpp.jvpp.core.dto.IpDetails;
+import org.openvpp.jvpp.core.dto.IpDetailsReplyDump;
+
+public class DumpCacheManagerTest {
+
+ private static final String KEY = "cacheKey";
+
+ @Mock
+ private EntityDumpExecutor<IpDetailsReplyDump, Void> executor;
+
+ private DumpCacheManager<IpDetailsReplyDump, Void> managerPositive;
+ private DumpCacheManager<IpDetailsReplyDump, Void> managerPositiveWithPostProcessing;
+ private DumpCacheManager<IpDetailsReplyDump, Void> managerNegative;
+ private ModificationCache cache;
+
+ @Before
+ public void init() {
+ MockitoAnnotations.initMocks(this);
+ managerPositive =
+ new DumpCacheManager.DumpCacheManagerBuilder<IpDetailsReplyDump, Void>()
+ .withExecutor(executor)
+ .withNonEmptyPredicate(createPositivePredicate())
+ .build();
+
+ managerPositiveWithPostProcessing = new DumpCacheManager.DumpCacheManagerBuilder<IpDetailsReplyDump, Void>()
+ .withExecutor(executor)
+ .withNonEmptyPredicate(createPositivePredicate())
+ .withPostProcessingFunction(createPostProcessor())
+ .build();
+
+ managerNegative =
+ new DumpCacheManager.DumpCacheManagerBuilder<IpDetailsReplyDump, Void>()
+ .withExecutor(executor)
+ .withNonEmptyPredicate(createNegativePredicate())
+ .build();
+
+ cache = new ModificationCache();
+ }
+
+ /**
+ * This test verify full dump-caching cycle
+ */
+ @Test
+ public void testCaching() throws DumpExecutionFailedException {
+
+
+ Optional<IpDetailsReplyDump> stage1Optional = managerNegative.getDump(KEY, cache, null);
+
+ //this is first call so instance should be from executor
+ assertEquals(false, stage1Optional.isPresent());
+ assertEquals(false, cache.containsKey(KEY));
+
+ //rebind executor with other data
+ IpDetailsReplyDump stage2LoadedDump = new IpDetailsReplyDump();
+ when(executor.executeDump(null)).thenReturn(stage2LoadedDump);
+
+ Optional<IpDetailsReplyDump> stage2Optional = managerPositive.getDump(KEY, cache, null);
+
+ assertEquals(true, stage2Optional.isPresent());
+ assertEquals(stage2LoadedDump, stage2Optional.get());
+
+ //rebind executor with other data
+ IpDetailsReplyDump stage3LoadedDump = new IpDetailsReplyDump();
+ when(executor.executeDump(null)).thenReturn(stage3LoadedDump);
+
+ Optional<IpDetailsReplyDump> stage3Optional = managerPositive.getDump(KEY, cache, null);
+ assertEquals(true, stage3Optional.isPresent());
+ //check if it returns instance cached from previous stage
+ assertEquals(stage2LoadedDump, stage3Optional.get());
+ }
+
+ @Test
+ public void testPostprocessing() throws DumpExecutionFailedException {
+ IpDetailsReplyDump dump = new IpDetailsReplyDump();
+ IpDetails details = new IpDetails();
+ details.swIfIndex = 2;
+ dump.ipDetails.add(details);
+
+ when(executor.executeDump(null)).thenReturn(dump);
+
+ Optional<IpDetailsReplyDump> optionalDump = managerPositiveWithPostProcessing.getDump(KEY, cache, null);
+
+ assertEquals(true, optionalDump.isPresent());
+ assertEquals(1, optionalDump.get().ipDetails.size());
+ assertEquals(7, optionalDump.get().ipDetails.get(0).swIfIndex);
+ }
+
+ private EntityDumpNonEmptyCheck<IpDetailsReplyDump> createNegativePredicate() {
+ return data -> {
+ throw new DumpEmptyException("Empty dump", new IllegalArgumentException());
+ };
+ }
+
+ private EntityDumpNonEmptyCheck<IpDetailsReplyDump> createPositivePredicate() {
+ return data -> {
+ //DO NOTHING
+ };
+ }
+
+ private EntityDumpPostProcessingFunction<IpDetailsReplyDump> createPostProcessor() {
+ return ipDetailsReplyDump -> {
+ IpDetailsReplyDump modified = new IpDetailsReplyDump();
+
+ for (IpDetails detail : ipDetailsReplyDump.ipDetails) {
+ IpDetails modifiedDetail = new IpDetails();
+ modifiedDetail.swIfIndex = detail.swIfIndex + 5;
+
+ modified.ipDetails.add(modifiedDetail);
+ }
+
+ return modified;
+ };
+ }
+} \ No newline at end of file