diff --git a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/codec/TinaFlowInfoByteBufferCodecTest.java b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/codec/TinaFlowInfoByteBufferCodecTest.java
new file mode 100644
index 0000000..f8bc900
--- /dev/null
+++ b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/codec/TinaFlowInfoByteBufferCodecTest.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * 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 org.onosproject.openstacktelemetry.codec;
+
+import com.google.common.testing.EqualsTester;
+import org.junit.Before;
+import org.junit.Test;
+import org.onlab.packet.IpAddress;
+import org.onlab.packet.IpPrefix;
+import org.onlab.packet.MacAddress;
+import org.onlab.packet.TpPort;
+import org.onlab.packet.VlanId;
+import org.onosproject.net.DeviceId;
+import org.onosproject.openstacktelemetry.api.FlowInfo;
+import org.onosproject.openstacktelemetry.api.StatsInfo;
+import org.onosproject.openstacktelemetry.impl.DefaultFlowInfo;
+import org.onosproject.openstacktelemetry.impl.DefaultStatsInfo;
+
+import java.nio.ByteBuffer;
+
+/**
+ * Unit tests for TinaFlowInfoByteBufferCodec.
+ */
+public final class TinaFlowInfoByteBufferCodecTest {
+
+    private static final byte FLOW_TYPE = 1;
+    private static final DeviceId DEVICE_ID = DeviceId.deviceId("1234");
+    private static final int INPUT_INTERFACE_ID = 10;
+    private static final int OUTPUT_INTERFACE_ID = 10;
+    private static final VlanId VLAN_ID = VlanId.vlanId("100");
+    private static final IpAddress SRC_IP_ADDRESS = IpAddress.valueOf("10.10.10.1");
+    private static final IpPrefix SRC_IP_PREFIX = IpPrefix.valueOf(SRC_IP_ADDRESS, 24);
+    private static final IpAddress DST_IP_ADDRESS = IpAddress.valueOf("20.20.20.1");
+    private static final IpPrefix DST_IP_PREFIX = IpPrefix.valueOf(DST_IP_ADDRESS, 24);
+    private static final TpPort SRC_PORT_NUMBER = TpPort.tpPort(1000);
+    private static final TpPort DST_PORT_NUMBER = TpPort.tpPort(2000);
+    private static final byte PROTOCOL = 10;
+    private static final MacAddress SRC_MAC_ADDRESS = MacAddress.valueOf("AA:BB:CC:DD:EE:FF");
+    private static final MacAddress DST_MAC_ADDRESS = MacAddress.valueOf("FF:EE:DD:CC:BB:AA");
+
+    private FlowInfo info;
+    private final TinaFlowInfoByteBufferCodec codec =
+            new TinaFlowInfoByteBufferCodec();
+
+    @Before
+    public void setup() {
+        StatsInfo statsInfo = new DefaultStatsInfo.DefaultBuilder().build();
+        FlowInfo.Builder builder = new DefaultFlowInfo.DefaultBuilder();
+
+        info = builder
+                .withFlowType(FLOW_TYPE)
+                .withDeviceId(DEVICE_ID)
+                .withInputInterfaceId(INPUT_INTERFACE_ID)
+                .withOutputInterfaceId(OUTPUT_INTERFACE_ID)
+                .withVlanId(VLAN_ID)
+                .withSrcIp(SRC_IP_PREFIX)
+                .withDstIp(DST_IP_PREFIX)
+                .withSrcPort(SRC_PORT_NUMBER)
+                .withDstPort(DST_PORT_NUMBER)
+                .withProtocol(PROTOCOL)
+                .withSrcMac(SRC_MAC_ADDRESS)
+                .withDstMac(DST_MAC_ADDRESS)
+                .withStatsInfo(statsInfo)
+                .build();
+    }
+
+    @Test
+    public void testEncodeDecode() {
+        ByteBuffer buffer = codec.encode(info);
+        FlowInfo decoded = codec.decode(ByteBuffer.wrap(buffer.array()));
+        new EqualsTester().addEqualityGroup(info, decoded).testEquals();
+    }
+}
