public static final byte PADDING = 8;
/** OpenFlow v1.0 wire protocol number */
public static final byte OF10_VERSION_ID = 0x01;
- /** OpenFlow v1.0 wire protocol number */
+ /** OpenFlow v1.3 wire protocol number */
public static final byte OF13_VERSION_ID = 0x04;
/** Index of length in Openflow header */
public static final int OFHEADER_LENGTH_INDEX = 2;
};
/** expiring cache for future rpcResponses */
- private final Cache<RpcResponseKey, ResponseExpectedRpcListener<?>> responseCache;
+ private Cache<RpcResponseKey, ResponseExpectedRpcListener<?>> responseCache;
private final ChannelOutboundQueue output;
private final Channel channel;
}).start();
}
-
@Override
public void setConnectionReadyListener(
final ConnectionReadyListener connectionReadyListener) {
public InetSocketAddress getRemoteAddress() {
return (InetSocketAddress) channel.remoteAddress();
}
-}
+
+ /**
+ * Used only for testing purposes
+ * @param cache
+ */
+ public void setResponseCache(Cache<RpcResponseKey, ResponseExpectedRpcListener<?>> cache) {
+ this.responseCache = cache;
+ }
+}
\ No newline at end of file
public void messageToBuffer(short version, ByteBuf out, DataObject message) {
OFSerializer<DataObject> serializer = registry.getSerializer(
new MessageTypeKey<>(version, message.getImplementedInterface()));
- if (serializer != null) {
- serializer.serialize(message, out);
- }
+ serializer.serialize(message, out);
}
/**
--- /dev/null
+/*\r
+ * Copyright (c) 2014 Pantheon Technologies s.r.o. and others. All rights reserved.\r
+ *\r
+ * This program and the accompanying materials are made available under the\r
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
+ * and is available at http://www.eclipse.org/legal/epl-v10.html\r
+ */\r
+\r
+package org.opendaylight.openflowjava.protocol.impl.connection;\r
+\r
+import static org.mockito.Matchers.any;\r
+import static org.mockito.Mockito.times;\r
+import static org.mockito.Mockito.verify;\r
+import static org.mockito.Mockito.when;\r
+import io.netty.channel.ChannelPipeline;\r
+import io.netty.channel.socket.SocketChannel;\r
+\r
+import java.net.InetSocketAddress;\r
+import java.util.concurrent.TimeUnit;\r
+\r
+import org.junit.Assert;\r
+import org.junit.Before;\r
+import org.junit.Test;\r
+import org.mockito.Mock;\r
+import org.mockito.MockitoAnnotations;\r
+import org.opendaylight.openflowjava.protocol.api.connection.ConnectionReadyListener;\r
+import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.BarrierInput;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.BarrierInputBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.BarrierOutput;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.BarrierOutputBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.EchoRequestMessage;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.EchoRequestMessageBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ErrorMessage;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ErrorMessageBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ExperimenterMessage;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ExperimenterMessageBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FlowRemovedMessage;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FlowRemovedMessageBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.HelloMessage;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.HelloMessageBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartReplyMessage;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartReplyMessageBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OpenflowProtocolListener;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PacketInMessage;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PacketInMessageBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PortStatusMessage;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PortStatusMessageBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.system.rev130927.DisconnectEvent;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.system.rev130927.DisconnectEventBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.system.rev130927.SwitchIdleEvent;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.system.rev130927.SwitchIdleEventBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.system.rev130927.SystemNotificationsListener;\r
+import org.opendaylight.yangtools.yang.binding.DataObject;\r
+\r
+import com.google.common.cache.Cache;\r
+import com.google.common.cache.CacheBuilder;\r
+import com.google.common.cache.RemovalListener;\r
+import com.google.common.cache.RemovalNotification;\r
+\r
+/**\r
+ * @author michal.polkorab\r
+ *\r
+ */\r
+public class ConnectionAdapterImplTest {\r
+\r
+ private static final int RPC_RESPONSE_EXPIRATION = 1;\r
+ private static final RemovalListener<RpcResponseKey, ResponseExpectedRpcListener<?>> REMOVAL_LISTENER =\r
+ new RemovalListener<RpcResponseKey, ResponseExpectedRpcListener<?>>() {\r
+ @Override\r
+ public void onRemoval(\r
+ final RemovalNotification<RpcResponseKey, ResponseExpectedRpcListener<?>> notification) {\r
+ notification.getValue().discard();\r
+ }\r
+ };\r
+\r
+ @Mock SocketChannel channel;\r
+ @Mock ChannelPipeline pipeline;\r
+ @Mock OpenflowProtocolListener messageListener;\r
+ @Mock SystemNotificationsListener systemListener;\r
+ @Mock ConnectionReadyListener readyListener;\r
+ @Mock Cache<RpcResponseKey, ResponseExpectedRpcListener<?>> mockCache;\r
+\r
+ private ConnectionAdapterImpl adapter;\r
+ private Cache<RpcResponseKey, ResponseExpectedRpcListener<?>> cache;\r
+\r
+ /**\r
+ * Initializes ConnectionAdapter\r
+ */\r
+ @Before\r
+ public void setUp() {\r
+ MockitoAnnotations.initMocks(this);\r
+ when(channel.pipeline()).thenReturn(pipeline);\r
+ adapter = new ConnectionAdapterImpl(channel, InetSocketAddress.createUnresolved("10.0.0.1", 6653));\r
+ adapter.setMessageListener(messageListener);\r
+ adapter.setSystemListener(systemListener);\r
+ adapter.setConnectionReadyListener(readyListener);\r
+ cache = CacheBuilder.newBuilder().concurrencyLevel(1).expireAfterWrite(RPC_RESPONSE_EXPIRATION, TimeUnit.MINUTES)\r
+ .removalListener(REMOVAL_LISTENER).build();\r
+ adapter.setResponseCache(cache);\r
+ }\r
+\r
+ /**\r
+ * Tests {@link ConnectionAdapterImpl#consume(DataObject)} with notifications\r
+ */\r
+ @Test\r
+ public void testConsume() {\r
+ DataObject message = new EchoRequestMessageBuilder().build();\r
+ adapter.consume(message);\r
+ verify(messageListener, times(1)).onEchoRequestMessage((EchoRequestMessage) message);\r
+ message = new ErrorMessageBuilder().build();\r
+ adapter.consume(message);\r
+ verify(messageListener, times(1)).onErrorMessage((ErrorMessage) message);\r
+ message = new ExperimenterMessageBuilder().build();\r
+ adapter.consume(message);\r
+ verify(messageListener, times(1)).onExperimenterMessage((ExperimenterMessage) message);\r
+ message = new FlowRemovedMessageBuilder().build();\r
+ adapter.consume(message);\r
+ verify(messageListener, times(1)).onFlowRemovedMessage((FlowRemovedMessage) message);\r
+ message = new HelloMessageBuilder().build();\r
+ adapter.consume(message);\r
+ verify(messageListener, times(1)).onHelloMessage((HelloMessage) message);\r
+ message = new MultipartReplyMessageBuilder().build();\r
+ adapter.consume(message);\r
+ verify(messageListener, times(1)).onMultipartReplyMessage((MultipartReplyMessage) message);\r
+ message = new PacketInMessageBuilder().build();\r
+ adapter.consume(message);\r
+ verify(messageListener, times(1)).onPacketInMessage((PacketInMessage) message);\r
+ message = new PortStatusMessageBuilder().build();\r
+ adapter.consume(message);\r
+ verify(messageListener, times(1)).onPortStatusMessage((PortStatusMessage) message);\r
+ message = new SwitchIdleEventBuilder().build();\r
+ adapter.consume(message);\r
+ verify(systemListener, times(1)).onSwitchIdleEvent((SwitchIdleEvent) message);\r
+ message = new DisconnectEventBuilder().build();\r
+ adapter.consume(message);\r
+ verify(systemListener, times(1)).onDisconnectEvent((DisconnectEvent) message);\r
+ message = new EchoRequestMessageBuilder().build();\r
+ adapter.consume(message);\r
+ verify(messageListener, times(1)).onEchoRequestMessage((EchoRequestMessage) message);\r
+ }\r
+\r
+ /**\r
+ * Tests {@link ConnectionAdapterImpl#consume(DataObject)} with unexpected rpc\r
+ */\r
+ @Test\r
+ public void testConsume2() {\r
+ adapter.setResponseCache(mockCache);\r
+ BarrierOutputBuilder barrierBuilder = new BarrierOutputBuilder();\r
+ barrierBuilder.setXid(42L);\r
+ BarrierOutput barrier = barrierBuilder.build();\r
+ adapter.consume(barrier);\r
+ verify(mockCache, times(1)).getIfPresent(any(RpcResponseKey.class));\r
+ }\r
+\r
+ /**\r
+ * Tests {@link ConnectionAdapterImpl#consume(DataObject)} with expected rpc\r
+ */\r
+ @Test\r
+ public void testConsume3() {\r
+ BarrierInputBuilder inputBuilder = new BarrierInputBuilder();\r
+ inputBuilder.setVersion((short) EncodeConstants.OF13_VERSION_ID);\r
+ inputBuilder.setXid(42L);\r
+ BarrierInput barrierInput = inputBuilder.build();\r
+ RpcResponseKey key = new RpcResponseKey(42L, "org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.BarrierOutput");\r
+ ResponseExpectedRpcListener<OfHeader> listener = new ResponseExpectedRpcListener<>(barrierInput,\r
+ "failure", mockCache, key);\r
+ cache.put(key, listener);\r
+ BarrierOutputBuilder barrierBuilder = new BarrierOutputBuilder();\r
+ barrierBuilder.setXid(42L);\r
+ BarrierOutput barrierOutput = barrierBuilder.build();\r
+ adapter.consume(barrierOutput);\r
+ ResponseExpectedRpcListener<?> ifPresent = cache.getIfPresent(key);\r
+ Assert.assertNull("Listener was not discarded", ifPresent);\r
+ }\r
+}
\ No newline at end of file
package org.opendaylight.openflowjava.protocol.impl.connection;\r
\r
import static org.junit.Assert.fail;\r
+import static org.mockito.Mockito.times;\r
+import static org.mockito.Mockito.verify;\r
+import static org.mockito.Mockito.when;\r
+import io.netty.util.concurrent.Future;\r
\r
import java.util.Collections;\r
import java.util.concurrent.ExecutionException;\r
\r
import org.junit.Assert;\r
+import org.junit.Before;\r
import org.junit.Test;\r
+import org.mockito.Mock;\r
+import org.mockito.MockitoAnnotations;\r
import org.opendaylight.controller.sal.common.util.Rpcs;\r
import org.opendaylight.yangtools.yang.common.RpcError;\r
import org.opendaylight.yangtools.yang.common.RpcResult;\r
*/\r
public class SimpleRpcListenerTest {\r
\r
+ @Mock Future<Void> future;\r
+\r
+ /**\r
+ * Initializes mocks\r
+ */\r
+ @Before\r
+ public void startUp() {\r
+ MockitoAnnotations.initMocks(this);\r
+ }\r
+\r
/**\r
* Test SimpleRpcListener creation\r
*/\r
fail("Problem accessing result");\r
}\r
}\r
+\r
+ /**\r
+ * Test rpc success\r
+ */\r
+ @Test\r
+ public void testOperationComplete() {\r
+ when(future.isSuccess()).thenReturn(false);\r
+ SimpleRpcListener listener = new SimpleRpcListener("MESSAGE", "Failed to send message");\r
+ listener.operationComplete(future);\r
+ verify(future, times(1)).cause();\r
+ try {\r
+ Assert.assertEquals("Wrong result", 1, listener.getResult().get().getErrors().size());\r
+ } catch (InterruptedException | ExecutionException e) {\r
+ Assert.fail();\r
+ }\r
+ }\r
+\r
+ /**\r
+ * Test rpc success\r
+ */\r
+ @Test\r
+ public void testOperationComplete2() {\r
+ when(future.isSuccess()).thenReturn(true);\r
+ SimpleRpcListener listener = new SimpleRpcListener("MESSAGE", "Failed to send message");\r
+ listener.operationComplete(future);\r
+ verify(future, times(0)).cause();\r
+ try {\r
+ Assert.assertEquals("Wrong result", 0, listener.getResult().get().getErrors().size());\r
+ Assert.assertEquals("Wrong result", true, listener.getResult().get().isSuccessful());\r
+ } catch (InterruptedException | ExecutionException e) {\r
+ Assert.fail();\r
+ }\r
+ }\r
}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) 2014 Pantheon Technologies s.r.o. and others. All rights reserved.\r
+ *\r
+ * This program and the accompanying materials are made available under the\r
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
+ * and is available at http://www.eclipse.org/legal/epl-v10.html\r
+ */\r
+\r
+package org.opendaylight.openflowjava.protocol.impl.deserialization.match;\r
+\r
+import io.netty.buffer.ByteBuf;\r
+\r
+import org.junit.Assert;\r
+import org.junit.Test;\r
+import org.opendaylight.openflowjava.protocol.impl.util.BufferHelper;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MaskMatchEntry;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PseudoFieldMatchEntry;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.Ipv6ExthdrFlags;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv6Exthdr;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.OpenflowBasicClass;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.grouping.MatchEntries;\r
+\r
+/**\r
+ * @author michal.polkorab\r
+ *\r
+ */\r
+public class OxmIpv6ExtHdrDeserializerTest {\r
+\r
+ /**\r
+ * Tests {@link OxmIpv6ExtHdrDeserializer#deserialize(ByteBuf)}\r
+ */\r
+ @Test\r
+ public void test() {\r
+ ByteBuf buffer = BufferHelper.buildBuffer("80 00 4E 02 01 FF");\r
+\r
+ buffer.skipBytes(4); // skip XID\r
+ OxmIpv6ExtHdrDeserializer deserializer = new OxmIpv6ExtHdrDeserializer();\r
+ MatchEntries entry = deserializer.deserialize(buffer);\r
+\r
+ Assert.assertEquals("Wrong entry class", OpenflowBasicClass.class, entry.getOxmClass());\r
+ Assert.assertEquals("Wrong entry field", Ipv6Exthdr.class, entry.getOxmMatchField());\r
+ Assert.assertEquals("Wrong entry hasMask", false, entry.isHasMask());\r
+ Assert.assertEquals("Wrong entry value",\r
+ new Ipv6ExthdrFlags(true, true, true, true, true, true, true, true, true),\r
+ entry.getAugmentation(PseudoFieldMatchEntry.class).getPseudoField());\r
+ Assert.assertEquals("Wrong entry mask", null, entry.getAugmentation(MaskMatchEntry.class));\r
+ Assert.assertTrue("Unread data", buffer.readableBytes() == 0);\r
+ }\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) 2014 Pantheon Technologies s.r.o. and others. All rights reserved.\r
+ *\r
+ * This program and the accompanying materials are made available under the\r
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
+ * and is available at http://www.eclipse.org/legal/epl-v10.html\r
+ */\r
+\r
+package org.opendaylight.openflowjava.protocol.impl.deserialization.match;\r
+\r
+import io.netty.buffer.ByteBuf;\r
+\r
+import org.junit.Assert;\r
+import org.junit.Test;\r
+import org.opendaylight.openflowjava.protocol.impl.util.BufferHelper;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Ipv6FlabelMatchEntry;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv6Flabel;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.OpenflowBasicClass;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.grouping.MatchEntries;\r
+\r
+/**\r
+ * @author michal.polkorab\r
+ *\r
+ */\r
+public class OxmIpv6FlabelDeserializerTest {\r
+\r
+ /**\r
+ * Tests {@link OxmIpv6FlabelDeserializer#deserialize(ByteBuf)}\r
+ */\r
+ @Test\r
+ public void test() {\r
+ ByteBuf buffer = BufferHelper.buildBuffer("80 00 38 04 00 00 00 02");\r
+\r
+ buffer.skipBytes(4); // skip XID\r
+ OxmIpv6FlabelDeserializer deserializer = new OxmIpv6FlabelDeserializer();\r
+ MatchEntries entry = deserializer.deserialize(buffer);\r
+\r
+ Assert.assertEquals("Wrong entry class", OpenflowBasicClass.class, entry.getOxmClass());\r
+ Assert.assertEquals("Wrong entry field", Ipv6Flabel.class, entry.getOxmMatchField());\r
+ Assert.assertEquals("Wrong entry hasMask", false, entry.isHasMask());\r
+ Assert.assertEquals("Wrong entry value", 2, \r
+ entry.getAugmentation(Ipv6FlabelMatchEntry.class).getIpv6Flabel().getValue().intValue());\r
+ }\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) 2014 Pantheon Technologies s.r.o. and others. All rights reserved.\r
+ *\r
+ * This program and the accompanying materials are made available under the\r
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
+ * and is available at http://www.eclipse.org/legal/epl-v10.html\r
+ */\r
+\r
+package org.opendaylight.openflowjava.protocol.impl.deserialization.match;\r
+\r
+import io.netty.buffer.ByteBuf;\r
+\r
+import org.junit.Assert;\r
+import org.junit.Test;\r
+import org.opendaylight.openflowjava.protocol.impl.util.BufferHelper;\r
+import org.opendaylight.openflowjava.util.ByteBufUtils;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MetadataMatchEntry;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Metadata;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.OpenflowBasicClass;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.grouping.MatchEntries;\r
+\r
+/**\r
+ * @author michal.polkorab\r
+ *\r
+ */\r
+public class OxmMetadataDeserializerTest {\r
+\r
+ /**\r
+ * Tests {@link OxmMetadataDeserializer#deserialize(ByteBuf)}\r
+ */\r
+ @Test\r
+ public void test() {\r
+ ByteBuf buffer = BufferHelper.buildBuffer("80 00 04 08 00 00 00 00 00 00 00 03");\r
+\r
+ buffer.skipBytes(4); // skip XID\r
+ OxmMetadataDeserializer deserializer = new OxmMetadataDeserializer();\r
+ MatchEntries entry = deserializer.deserialize(buffer);\r
+\r
+ Assert.assertEquals("Wrong entry class", OpenflowBasicClass.class, entry.getOxmClass());\r
+ Assert.assertEquals("Wrong entry field", Metadata.class, entry.getOxmMatchField());\r
+ Assert.assertEquals("Wrong entry hasMask", false, entry.isHasMask());\r
+ Assert.assertArrayEquals("Wrong entry value", ByteBufUtils.hexStringToBytes("00 00 00 00 00 00 00 03"), \r
+ entry.getAugmentation(MetadataMatchEntry.class).getMetadata());\r
+ }\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) 2014 Pantheon Technologies s.r.o. and others. All rights reserved.\r
+ *\r
+ * This program and the accompanying materials are made available under the\r
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
+ * and is available at http://www.eclipse.org/legal/epl-v10.html\r
+ */\r
+\r
+package org.opendaylight.openflowjava.protocol.impl.deserialization.match;\r
+\r
+import io.netty.buffer.ByteBuf;\r
+\r
+import org.junit.Assert;\r
+import org.junit.Test;\r
+import org.opendaylight.openflowjava.protocol.impl.util.BufferHelper;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.BosMatchEntry;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.MplsBos;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.OpenflowBasicClass;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.grouping.MatchEntries;\r
+\r
+/**\r
+ * @author michal.polkorab\r
+ *\r
+ */\r
+public class OxmMplsBosDeserializerTest {\r
+\r
+ /**\r
+ * Tests {@link OxmMplsBosDeserializer#deserialize(ByteBuf)}\r
+ */\r
+ @Test\r
+ public void test() {\r
+ ByteBuf buffer = BufferHelper.buildBuffer("80 00 48 01 00");\r
+\r
+ buffer.skipBytes(4); // skip XID\r
+ OxmMplsBosDeserializer deserializer = new OxmMplsBosDeserializer();\r
+ MatchEntries entry = deserializer.deserialize(buffer);\r
+\r
+ Assert.assertEquals("Wrong entry class", OpenflowBasicClass.class, entry.getOxmClass());\r
+ Assert.assertEquals("Wrong entry field", MplsBos.class, entry.getOxmMatchField());\r
+ Assert.assertEquals("Wrong entry hasMask", false, entry.isHasMask());\r
+ Assert.assertEquals("Wrong entry value", false, entry.getAugmentation(BosMatchEntry.class).isBos());\r
+ }\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) 2014 Pantheon Technologies s.r.o. and others. All rights reserved.\r
+ *\r
+ * This program and the accompanying materials are made available under the\r
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
+ * and is available at http://www.eclipse.org/legal/epl-v10.html\r
+ */\r
+\r
+package org.opendaylight.openflowjava.protocol.impl.deserialization.match;\r
+\r
+import io.netty.buffer.ByteBuf;\r
+\r
+import org.junit.Assert;\r
+import org.junit.Test;\r
+import org.opendaylight.openflowjava.protocol.impl.util.BufferHelper;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.IsidMatchEntry;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.OpenflowBasicClass;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.PbbIsid;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.grouping.MatchEntries;\r
+\r
+/**\r
+ * @author michal.polkorab\r
+ *\r
+ */\r
+public class OxmPbbIsidDeserializerTest {\r
+\r
+ /**\r
+ * Tests {@link OxmPbbIsidDeserializer#deserialize(ByteBuf)}\r
+ */\r
+ @Test\r
+ public void test() {\r
+ ByteBuf buffer = BufferHelper.buildBuffer("80 00 4A 03 00 00 02");\r
+\r
+ buffer.skipBytes(4); // skip XID\r
+ OxmPbbIsidDeserializer deserializer = new OxmPbbIsidDeserializer();\r
+ MatchEntries entry = deserializer.deserialize(buffer);\r
+\r
+ Assert.assertEquals("Wrong entry class", OpenflowBasicClass.class, entry.getOxmClass());\r
+ Assert.assertEquals("Wrong entry field", PbbIsid.class, entry.getOxmMatchField());\r
+ Assert.assertEquals("Wrong entry hasMask", false, entry.isHasMask());\r
+ Assert.assertEquals("Wrong entry value", 2, entry.getAugmentation(IsidMatchEntry.class).getIsid().intValue());\r
+ }\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) 2014 Pantheon Technologies s.r.o. and others. All rights reserved.\r
+ *\r
+ * This program and the accompanying materials are made available under the\r
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
+ * and is available at http://www.eclipse.org/legal/epl-v10.html\r
+ */\r
+\r
+package org.opendaylight.openflowjava.protocol.impl.deserialization.match;\r
+\r
+import io.netty.buffer.ByteBuf;\r
+\r
+import org.junit.Assert;\r
+import org.junit.Test;\r
+import org.opendaylight.openflowjava.protocol.impl.util.BufferHelper;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.VlanVidMatchEntry;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.OpenflowBasicClass;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.VlanVid;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.grouping.MatchEntries;\r
+\r
+/**\r
+ * @author michal.polkorab\r
+ *\r
+ */\r
+public class OxmVlanVidDeserializerTest {\r
+\r
+ /**\r
+ * Tests {@link OxmVlanVidDeserializer#deserialize(ByteBuf)}\r
+ */\r
+ @Test\r
+ public void test() {\r
+ ByteBuf buffer = BufferHelper.buildBuffer("80 00 0C 02 20 0A");\r
+\r
+ buffer.skipBytes(4); // skip XID\r
+ OxmVlanVidDeserializer deserializer = new OxmVlanVidDeserializer();\r
+ MatchEntries entry = deserializer.deserialize(buffer);\r
+\r
+ Assert.assertEquals("Wrong entry class", OpenflowBasicClass.class, entry.getOxmClass());\r
+ Assert.assertEquals("Wrong entry field", VlanVid.class, entry.getOxmMatchField());\r
+ Assert.assertEquals("Wrong entry hasMask", false, entry.isHasMask());\r
+ Assert.assertEquals("Wrong entry value", 10,\r
+ entry.getAugmentation(VlanVidMatchEntry.class).getVlanVid().intValue());\r
+ Assert.assertEquals("Wrong entry value", false, \r
+ entry.getAugmentation(VlanVidMatchEntry.class).isCfiBit());\r
+ }\r
+}
\ No newline at end of file
import org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerRegistry;\r
import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;\r
import org.opendaylight.openflowjava.protocol.impl.deserialization.DeserializerRegistryImpl;\r
+import org.opendaylight.openflowjava.protocol.impl.deserialization.action.AbstractActionDeserializer;\r
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.EthertypeAction;\r
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.GroupIdAction;\r
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MaxLengthAction;\r
Assert.assertTrue("Unread data in message", message.readableBytes() == 0);\r
}\r
\r
+ /**\r
+ * Tests {@link AbstractActionDeserializer#deserializeHeader(ByteBuf)}\r
+ */\r
+ @Test\r
+ public void testDeserializeHeader() {\r
+ ByteBuf message = BufferHelper.buildBuffer("00 00 00 04 00 19 00 04");\r
+\r
+ message.skipBytes(4); // skip XID\r
+ CodeKeyMaker keyMaker = CodeKeyMakerFactory.createActionsKeyMaker(EncodeConstants.OF13_VERSION_ID);\r
+ List<Action> actions = ListDeserializer.deserializeHeaders(EncodeConstants.OF13_VERSION_ID,\r
+ message.readableBytes(), message, keyMaker, registry);\r
+\r
+ Assert.assertEquals("Wrong action type", "org.opendaylight.yang.gen.v1.urn.opendaylight."\r
+ + "openflow.common.action.rev130731.Output", actions.get(0).getType().getName());\r
+ Assert.assertEquals("Wrong action port", null, actions.get(0).getAugmentation(PortAction.class));\r
+ Assert.assertEquals("Wrong action max-length", null, actions.get(0).getAugmentation(MaxLengthAction.class));\r
+ Assert.assertEquals("Wrong action type", "org.opendaylight.yang.gen.v1.urn.opendaylight."\r
+ + "openflow.common.action.rev130731.SetField", actions.get(1).getType().getName());\r
+ Assert.assertEquals("Wrong action oxm field", null, actions.get(1).getAugmentation(OxmFieldsAction.class));\r
+ }\r
}\r
import org.junit.Before;\r
import org.junit.Test;\r
import org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerRegistry;\r
+import org.opendaylight.openflowjava.protocol.api.extensibility.HeaderDeserializer;\r
import org.opendaylight.openflowjava.protocol.api.extensibility.MessageCodeKey;\r
import org.opendaylight.openflowjava.protocol.api.extensibility.OFDeserializer;\r
import org.opendaylight.openflowjava.protocol.api.keys.MatchEntryDeserializerKey;\r
+ "80 00 48 01 01 "\r
+ "80 00 4B 06 00 00 02 00 00 01 "\r
+ "80 00 4D 10 00 00 00 00 00 00 00 07 00 00 00 00 00 00 00 FF "\r
- + "80 00 4F 04 01 66 03 04 "\r
+ + "80 00 4F 04 00 00 03 04 "\r
+ "00 00 00 00");\r
\r
Match match = matchDeserializer.deserialize(buffer);\r
Assert.assertEquals("Wrong entry field", Ipv6Exthdr.class, entry39.getOxmMatchField());\r
Assert.assertEquals("Wrong entry hasMask", true, entry39.isHasMask());\r
Assert.assertEquals("Wrong entry value",\r
- new Ipv6ExthdrFlags(true, false, true, false, true, false, true, false, true),\r
+ new Ipv6ExthdrFlags(false, false, false, false, false, false, false, false, false),\r
entry39.getAugmentation(PseudoFieldMatchEntry.class).getPseudoField());\r
Assert.assertArrayEquals("Wrong entry mask", ByteBufUtils.hexStringToBytes("03 04"),\r
entry39.getAugmentation(MaskMatchEntry.class).getMask());\r
Assert.assertTrue("Unread data", buffer.readableBytes() == 0);\r
}\r
\r
-}\r
+ /**\r
+ * Testing header deserialization\r
+ */\r
+ @Test\r
+ public void testHeaders() {\r
+ ByteBuf buffer = ByteBufUtils.hexStringToByteBuf("80 00 18 04 00 01 02 03");\r
+\r
+ MatchEntryDeserializerKey key = new MatchEntryDeserializerKey(EncodeConstants.OF13_VERSION_ID,\r
+ 0x8000, 12);\r
+ key.setExperimenterId(null);\r
+ HeaderDeserializer<MatchEntries> entryDeserializer = registry.getDeserializer(key);\r
+ MatchEntries entry = entryDeserializer.deserializeHeader(buffer);\r
+ Assert.assertEquals("Wrong entry class", OpenflowBasicClass.class, entry.getOxmClass());\r
+ Assert.assertEquals("Wrong entry field", Ipv4Dst.class, entry.getOxmMatchField());\r
+ Assert.assertEquals("Wrong entry hasMask", false, entry.isHasMask());\r
+ Assert.assertEquals("Wrong Ipv4 address", null, entry.getAugmentation(Ipv4AddressMatchEntry.class));\r
+ }\r
+}
\ No newline at end of file
Assert.assertTrue("Unread data", out.readableBytes() == 0);\r
}\r
\r
-}\r
+ /**\r
+ * Testing correct serialization of actions\r
+ */\r
+ @Test\r
+ public void testHeaders() {\r
+ List<Action> actions = new ArrayList<>();\r
+ ActionBuilder actionBuilder = new ActionBuilder();\r
+ actionBuilder.setType(Output.class);\r
+ PortActionBuilder port = new PortActionBuilder();\r
+ port.setPort(new PortNumber(42L));\r
+ actionBuilder.addAugmentation(PortAction.class, port.build());\r
+ MaxLengthActionBuilder maxLen = new MaxLengthActionBuilder();\r
+ maxLen.setMaxLength(52);\r
+ actionBuilder.addAugmentation(MaxLengthAction.class, maxLen.build());\r
+ actions.add(actionBuilder.build());\r
+ actionBuilder = new ActionBuilder();\r
+ actionBuilder.setType(SetField.class);\r
+ OxmFieldsActionBuilder matchEntries = new OxmFieldsActionBuilder();\r
+ List<MatchEntries> entries = new ArrayList<>();\r
+ MatchEntriesBuilder matchBuilder = new MatchEntriesBuilder();\r
+ matchBuilder.setOxmClass(OpenflowBasicClass.class);\r
+ matchBuilder.setOxmMatchField(InPort.class);\r
+ matchBuilder.setHasMask(false);\r
+ PortNumberMatchEntryBuilder portBuilder = new PortNumberMatchEntryBuilder();\r
+ portBuilder.setPortNumber(new PortNumber(1L));\r
+ matchBuilder.addAugmentation(PortNumberMatchEntry.class, portBuilder.build());\r
+ entries.add(matchBuilder.build());\r
+ matchEntries.setMatchEntries(entries);\r
+ actionBuilder.addAugmentation(OxmFieldsAction.class, matchEntries.build());\r
+ actions.add(actionBuilder.build());\r
+\r
+ ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();\r
+ ListSerializer.serializeHeaderList(actions, TypeKeyMakerFactory\r
+ .createActionKeyMaker(EncodeConstants.OF13_VERSION_ID), registry, out);\r
+\r
+ Assert.assertEquals("Wrong action type", 0, out.readUnsignedShort());\r
+ Assert.assertEquals("Wrong action length", 4, out.readUnsignedShort());\r
+ Assert.assertEquals("Wrong action type", 25, out.readUnsignedShort());\r
+ Assert.assertEquals("Wrong action length", 4, out.readUnsignedShort());\r
+ Assert.assertTrue("Unread data", out.readableBytes() == 0);\r
+ }\r
+}
\ No newline at end of file
/**
* Test for correct serialization of Ipv6Address match entry
*/
- @Test
+ @Test(expected=IllegalStateException.class)
public void testIpv6Various() {
MatchBuilder builder = new MatchBuilder();
builder.setType(OxmMatchType.class);
addressBuilder.setIpv6Address(new Ipv6Address("1:2:3:4:5:6:7:8:9"));
entriesBuilder.addAugmentation(Ipv6AddressMatchEntry.class, addressBuilder.build());
entries.add(entriesBuilder.build());
+ // ipv6 match entry with too abbreviated Ipv6 address
+ entriesBuilder = new MatchEntriesBuilder();
+ entriesBuilder.setOxmClass(OpenflowBasicClass.class);
+ entriesBuilder.setOxmMatchField(Ipv6NdTarget.class);
+ entriesBuilder.setHasMask(false);
+ addressBuilder = new Ipv6AddressMatchEntryBuilder();
+ addressBuilder.setIpv6Address(new Ipv6Address("1:2::::8"));
+ entriesBuilder.addAugmentation(Ipv6AddressMatchEntry.class, addressBuilder.build());
+ entries.add(entriesBuilder.build());
builder.setMatchEntries(entries);
Match match = builder.build();
ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();