Add a set of unit tests for openstack telemetry app

Change-Id: Ib5963c61ef0c0302a90a4f30d3dd1f0ec2862aea
diff --git a/apps/openstacknetworking/app/src/test/java/org/onosproject/openstacknetworking/impl/DefaultInstancePortTest.java b/apps/openstacknetworking/app/src/test/java/org/onosproject/openstacknetworking/impl/DefaultInstancePortTest.java
index 50e8f01..ae0e4b4 100644
--- a/apps/openstacknetworking/app/src/test/java/org/onosproject/openstacknetworking/impl/DefaultInstancePortTest.java
+++ b/apps/openstacknetworking/app/src/test/java/org/onosproject/openstacknetworking/impl/DefaultInstancePortTest.java
@@ -75,7 +75,7 @@
     private InstancePort instancePort2;
 
     /**
-     * Checks that the DefaultInstancePort class is immutable.
+     * Tests class immutability.
      */
     @Test
     public void testImmutability() {
diff --git a/apps/openstacknode/app/src/test/java/org/onosproject/openstacknode/impl/DefaultOpenstackAuthTest.java b/apps/openstacknode/app/src/test/java/org/onosproject/openstacknode/impl/DefaultOpenstackAuthTest.java
index 6442aa0..723ea27 100644
--- a/apps/openstacknode/app/src/test/java/org/onosproject/openstacknode/impl/DefaultOpenstackAuthTest.java
+++ b/apps/openstacknode/app/src/test/java/org/onosproject/openstacknode/impl/DefaultOpenstackAuthTest.java
@@ -58,6 +58,9 @@
                 .build();
     }
 
+    /**
+     * Tests object equality.
+     */
     @Test
     public void testEquality() {
         new EqualsTester().addEqualityGroup(OS_AUTH_1, OS_AUTH_3)
@@ -65,6 +68,9 @@
                 .testEquals();
     }
 
+    /**
+     * Test object construction.
+     */
     @Test
     public void testConstruction() {
         OpenstackAuth auth = OS_AUTH_1;
diff --git a/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/OpenstackTelemetryService.java b/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/OpenstackTelemetryService.java
index 52ff745..8d5df0b 100644
--- a/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/OpenstackTelemetryService.java
+++ b/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/OpenstackTelemetryService.java
@@ -43,4 +43,11 @@
      * @param flowInfos virtual flow information
      */
     void publish(Set<FlowInfo> flowInfos);
+
+    /**
+     * Obtains a collection of openstack telemetry services.
+     *
+     * @return telemetry services
+     */
+    Set<TelemetryService> telemetryServices();
 }
diff --git a/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/TelemetryConfigService.java b/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/TelemetryConfigService.java
index 156e8ff..51e4cea 100644
--- a/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/TelemetryConfigService.java
+++ b/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/TelemetryConfigService.java
@@ -17,6 +17,9 @@
 
 import org.onosproject.openstacktelemetry.api.config.TelemetryConfig;
 
+/**
+ * Telemetry configuration service interface.
+ */
 public interface TelemetryConfigService {
 
     /**
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/DefaultFlowInfo.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/DefaultFlowInfo.java
index a631abc..6033483 100644
--- a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/DefaultFlowInfo.java
+++ b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/DefaultFlowInfo.java
@@ -205,6 +205,15 @@
     }
 
     /**
+     * Obtains a default flow info builder object.
+     *
+     * @return flow info builder object
+     */
+    public static Builder builder() {
+        return new DefaultBuilder();
+    }
+
+    /**
      * Builder class of DefaultFlowInfo.
      */
     public static final class DefaultBuilder implements FlowInfo.Builder {
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/DefaultInfluxRecord.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/DefaultInfluxRecord.java
index 8c45a60..d7ec2e1 100644
--- a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/DefaultInfluxRecord.java
+++ b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/DefaultInfluxRecord.java
@@ -15,6 +15,7 @@
  */
 package org.onosproject.openstacktelemetry.impl;
 
+import com.google.common.base.Strings;
 import org.onosproject.openstacktelemetry.api.InfluxRecord;
 
 import java.util.Objects;
@@ -22,14 +23,19 @@
 import static com.google.common.base.MoreObjects.toStringHelper;
 import static org.onosproject.openstacktelemetry.api.Constants.DEFAULT_INFLUXDB_MEASUREMENT;
 
-
+/**
+ * A default implementation of influx record.
+ *
+ * @param <K> key of influx record
+ * @param <V> value of influx record
+ */
 public final class DefaultInfluxRecord<K, V> implements InfluxRecord<K, V> {
     public static final String MEASUREMENT_NAME = DEFAULT_INFLUXDB_MEASUREMENT;
     private final K measurement;
     private final V flowInfos;
 
     protected DefaultInfluxRecord(K measurement, V flowInfos) {
-        if ((measurement == null) || (measurement.equals(""))) {
+        if (Strings.isNullOrEmpty((String) measurement)) {
             this.measurement = (K) MEASUREMENT_NAME;
         } else {
             this.measurement = measurement;
@@ -66,6 +72,7 @@
         return Objects.hash(measurement, flowInfos);
     }
 
+    @Override
     public String toString() {
         return toStringHelper(this)
                 .add("measurement", measurement)
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/DefaultStatsFlowRule.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/DefaultStatsFlowRule.java
index 83c7519..2b2d7b6 100644
--- a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/DefaultStatsFlowRule.java
+++ b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/DefaultStatsFlowRule.java
@@ -20,6 +20,8 @@
 import org.onlab.packet.TpPort;
 import org.onosproject.openstacktelemetry.api.StatsFlowRule;
 
+import java.util.Objects;
+
 import static com.google.common.base.Preconditions.checkArgument;
 
 public final class DefaultStatsFlowRule implements StatsFlowRule {
@@ -79,10 +81,43 @@
                 .toString();
     }
 
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+
+        if (obj instanceof DefaultStatsFlowRule) {
+            final DefaultStatsFlowRule other = (DefaultStatsFlowRule) obj;
+            return Objects.equals(this.srcIpPrefix, other.srcIpPrefix) &&
+                    Objects.equals(this.dstIpPrefix, other.dstIpPrefix) &&
+                    Objects.equals(this.srcTpPort, other.srcTpPort) &&
+                    Objects.equals(this.dstTpPort, other.dstTpPort) &&
+                    Objects.equals(this.ipProtocol, other.ipProtocol);
+        }
+        return false;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(srcIpPrefix, dstIpPrefix, srcTpPort, dstTpPort, ipProtocol);
+    }
+
+    /**
+     * Obtains a default stats flow rule builder object.
+     *
+     * @return flow rule builder object
+     */
     public static Builder builder() {
         return new Builder();
     }
 
+    /**
+     * Obtains the builder object existing flow rule.
+     *
+     * @param flowRule flow rule
+     * @return builder object
+     */
     public static Builder from(StatsFlowRule flowRule) {
         return new Builder()
                 .srcIpPrefix(flowRule.srcIpPrefix())
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/GrpcTelemetryManager.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/GrpcTelemetryManager.java
index 8812cca..0ea76dc 100644
--- a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/GrpcTelemetryManager.java
+++ b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/GrpcTelemetryManager.java
@@ -16,6 +16,7 @@
 package org.onosproject.openstacktelemetry.impl;
 
 import io.grpc.ManagedChannel;
+import io.grpc.ManagedChannelBuilder;
 import org.apache.felix.scr.annotations.Activate;
 import org.apache.felix.scr.annotations.Component;
 import org.apache.felix.scr.annotations.Deactivate;
@@ -24,6 +25,7 @@
 import org.apache.felix.scr.annotations.Service;
 import org.onosproject.openstacktelemetry.api.GrpcTelemetryAdminService;
 import org.onosproject.openstacktelemetry.api.OpenstackTelemetryService;
+import org.onosproject.openstacktelemetry.api.config.GrpcTelemetryConfig;
 import org.onosproject.openstacktelemetry.api.config.TelemetryConfig;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -66,24 +68,22 @@
             return;
         }
 
-        // FIXME do not activate grpc service for now due to deps conflict
-//        GrpcTelemetryConfig grpcConfig = (GrpcTelemetryConfig) config;
-//        channel = ManagedChannelBuilder
-//                .forAddress(grpcConfig.address(), grpcConfig.port())
-//                .maxInboundMessageSize(grpcConfig.maxInboundMsgSize())
-//                .usePlaintext(grpcConfig.usePlaintext())
-//                .build();
+        GrpcTelemetryConfig grpcConfig = (GrpcTelemetryConfig) config;
+        channel = ManagedChannelBuilder
+                .forAddress(grpcConfig.address(), grpcConfig.port())
+                .maxInboundMessageSize(grpcConfig.maxInboundMsgSize())
+                .usePlaintext(grpcConfig.usePlaintext())
+                .build();
 
         log.info("gRPC producer has Started");
     }
 
     @Override
     public void stop() {
-        // FIXME do not activate grpc service for now due to deps conflict
-//        if (channel != null) {
-//            channel.shutdown();
-//            channel = null;
-//        }
+        if (channel != null) {
+            channel.shutdown();
+            channel = null;
+        }
 
         log.info("gRPC producer has Stopped");
     }
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/OpenstackTelemetryManager.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/OpenstackTelemetryManager.java
index e19a579..7d8a233 100644
--- a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/OpenstackTelemetryManager.java
+++ b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/OpenstackTelemetryManager.java
@@ -15,6 +15,7 @@
  */
 package org.onosproject.openstacktelemetry.impl;
 
+import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Lists;
 import org.apache.felix.scr.annotations.Activate;
 import org.apache.felix.scr.annotations.Component;
@@ -94,6 +95,11 @@
         });
     }
 
+    @Override
+    public Set<TelemetryService> telemetryServices() {
+        return ImmutableSet.copyOf(telemetryServices);
+    }
+
     private void invokeGrpcPublisher(GrpcTelemetryService service, Set<FlowInfo> flowInfos) {
         // TODO: need provide implementation
     }
diff --git a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/codec/FlowInfoJsonCodecTest.java b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/codec/FlowInfoJsonCodecTest.java
index 24fe947..ca97f8d 100644
--- a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/codec/FlowInfoJsonCodecTest.java
+++ b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/codec/FlowInfoJsonCodecTest.java
@@ -76,7 +76,9 @@
     private static final int INTEGER_VALUE = 1;
     private static final short SHORT_VALUE = (short) 1;
 
-
+    /**
+     * Initial setup for this unit test.
+     */
     @Before
     public void setUp() {
         context = new MockCodecContext();
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
index 9e3294d..8f4af77 100644
--- 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
@@ -55,6 +55,9 @@
     private final TinaFlowInfoByteBufferCodec codec =
             new TinaFlowInfoByteBufferCodec();
 
+    /**
+     * Initial setup for this unit test.
+     */
     @Before
     public void setup() {
         StatsInfo statsInfo = new DefaultStatsInfo.DefaultBuilder().build();
diff --git a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/codec/TinaStatsInfoByteBufferCodecTest.java b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/codec/TinaStatsInfoByteBufferCodecTest.java
index f23f728..f32e5bb 100644
--- a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/codec/TinaStatsInfoByteBufferCodecTest.java
+++ b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/codec/TinaStatsInfoByteBufferCodecTest.java
@@ -42,6 +42,9 @@
     private final TinaStatsInfoByteBufferCodec codec =
                                             new TinaStatsInfoByteBufferCodec();
 
+    /**
+     * Initial setup for this unit test.
+     */
     @Before
     public void setup() {
         StatsInfo.Builder builder = new DefaultStatsInfo.DefaultBuilder();
@@ -59,6 +62,9 @@
                 .build();
     }
 
+    /**
+     * Tests codec encode and decode.
+     */
     @Test
     public void testEncodeDecode() {
         ByteBuffer buffer = codec.encode(info);
diff --git a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/config/DefaultGrpcTelemetryConfigTest.java b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/config/DefaultGrpcTelemetryConfigTest.java
index 6dcf229..1a7f752 100644
--- a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/config/DefaultGrpcTelemetryConfigTest.java
+++ b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/config/DefaultGrpcTelemetryConfigTest.java
@@ -25,6 +25,7 @@
 
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.is;
+import static org.onlab.junit.ImmutableClassChecker.assertThatClassIsImmutable;
 
 /**
  * Unit tests for DefaultGrpcTelemetryConfig class.
@@ -52,6 +53,9 @@
     private GrpcTelemetryConfig sameAsConfig1;
     private GrpcTelemetryConfig config2;
 
+    /**
+     * Initial setup for this unit test.
+     */
     @Before
     public void setup() {
 
@@ -87,6 +91,17 @@
                 .build();
     }
 
+    /**
+     * Tests class immutability.
+     */
+    @Test
+    public void testImmutability() {
+        assertThatClassIsImmutable(DefaultGrpcTelemetryConfig.class);
+    }
+
+    /**
+     * Tests object equality.
+     */
     @Test
     public void testEquality() {
         new EqualsTester()
@@ -94,6 +109,9 @@
                 .addEqualityGroup(config2).testEquals();
     }
 
+    /**
+     * Tests object construction.
+     */
     @Test
     public void testConstruction() {
         GrpcTelemetryConfig config = config1;
diff --git a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/config/DefaultInfluxDbTelemetryConfigTest.java b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/config/DefaultInfluxDbTelemetryConfigTest.java
index 4af5b4a..2357fec 100644
--- a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/config/DefaultInfluxDbTelemetryConfigTest.java
+++ b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/config/DefaultInfluxDbTelemetryConfigTest.java
@@ -25,6 +25,7 @@
 
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.is;
+import static org.onlab.junit.ImmutableClassChecker.assertThatClassIsImmutable;
 
 /**
  * Unit tests for DefaultInfluxDbTelemetryConfig class.
@@ -61,6 +62,9 @@
     private InfluxDbTelemetryConfig sameAsConfig1;
     private InfluxDbTelemetryConfig config2;
 
+    /**
+     * Initial setup for this unit test.
+     */
     @Before
     public void setup() {
 
@@ -105,6 +109,17 @@
                 .build();
     }
 
+    /**
+     * Tests class immutability.
+     */
+    @Test
+    public void testImmutability() {
+        assertThatClassIsImmutable(DefaultInfluxDbTelemetryConfig.class);
+    }
+
+    /**
+     * Tests object equality.
+     */
     @Test
     public void testEquality() {
         new EqualsTester()
@@ -112,6 +127,9 @@
                 .addEqualityGroup(config2).testEquals();
     }
 
+    /**
+     * Tests object construction.
+     */
     @Test
     public void testConstruction() {
         InfluxDbTelemetryConfig config = config1;
diff --git a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/config/DefaultKafkaTelemetryConfigTest.java b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/config/DefaultKafkaTelemetryConfigTest.java
index 6608d7a..d3958fe 100644
--- a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/config/DefaultKafkaTelemetryConfigTest.java
+++ b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/config/DefaultKafkaTelemetryConfigTest.java
@@ -25,6 +25,7 @@
 
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.is;
+import static org.onlab.junit.ImmutableClassChecker.assertThatClassIsImmutable;
 
 public final class DefaultKafkaTelemetryConfigTest {
 
@@ -63,6 +64,9 @@
     private KafkaTelemetryConfig sameAsConfig1;
     private KafkaTelemetryConfig config2;
 
+    /**
+     * Initial setup for this unit test.
+     */
     @Before
     public void setup() {
 
@@ -113,6 +117,17 @@
                 .build();
     }
 
+    /**
+     * Tests class immutability.
+     */
+    @Test
+    public void testImmutability() {
+        assertThatClassIsImmutable(DefaultKafkaTelemetryConfig.class);
+    }
+
+    /**
+     * Tests object equality.
+     */
     @Test
     public void testEquality() {
         new EqualsTester()
@@ -120,6 +135,9 @@
                 .addEqualityGroup(config2).testEquals();
     }
 
+    /**
+     * Tests object construction.
+     */
     @Test
     public void testConstruction() {
         KafkaTelemetryConfig config = config1;
diff --git a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/config/DefaultRestTelemetryConfigTest.java b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/config/DefaultRestTelemetryConfigTest.java
index 2a6277b..3e8bac06 100644
--- a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/config/DefaultRestTelemetryConfigTest.java
+++ b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/config/DefaultRestTelemetryConfigTest.java
@@ -25,6 +25,7 @@
 
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.is;
+import static org.onlab.junit.ImmutableClassChecker.assertThatClassIsImmutable;
 
 public final class DefaultRestTelemetryConfigTest {
 
@@ -55,6 +56,9 @@
     private RestTelemetryConfig sameAsConfig1;
     private RestTelemetryConfig config2;
 
+    /**
+     * Initial setup for this unit test.
+     */
     @Before
     public void setup() {
 
@@ -96,6 +100,17 @@
                 .build();
     }
 
+    /**
+     * Tests class immutability.
+     */
+    @Test
+    public void testImmutability() {
+        assertThatClassIsImmutable(DefaultRestTelemetryConfig.class);
+    }
+
+    /**
+     * Tests object equality.
+     */
     @Test
     public void testEquality() {
         new EqualsTester()
@@ -103,6 +118,9 @@
                 .addEqualityGroup(config2).testEquals();
     }
 
+    /**
+     * Tests object construction.
+     */
     @Test
     public void testConstruction() {
         RestTelemetryConfig config = config1;
diff --git a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/impl/DefaultFlowInfoTest.java b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/impl/DefaultFlowInfoTest.java
index 53d18c3..1d03415 100644
--- a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/impl/DefaultFlowInfoTest.java
+++ b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/impl/DefaultFlowInfoTest.java
@@ -29,6 +29,7 @@
 
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.is;
+import static org.onlab.junit.ImmutableClassChecker.assertThatClassIsImmutable;
 
 /**
  * Unit tests for DefaultFlowInfo class.
@@ -58,8 +59,11 @@
     private FlowInfo sameAsInfo1;
     private FlowInfo info2;
 
+    /**
+     * Initial setup for this unit test.
+     */
     @Before
-    public void setup() {
+    public void setUp() {
 
         FlowInfo.Builder builder1 = new DefaultFlowInfo.DefaultBuilder();
         FlowInfo.Builder builder2 = new DefaultFlowInfo.DefaultBuilder();
@@ -122,6 +126,17 @@
                 .build();
     }
 
+    /**
+     * Tests class immutability.
+     */
+    @Test
+    public void testImmutability() {
+        assertThatClassIsImmutable(DefaultFlowInfo.class);
+    }
+
+    /**
+     * Tests object equality.
+     */
     @Test
     public void testEquality() {
         new EqualsTester()
@@ -129,6 +144,9 @@
                 .addEqualityGroup(info2).testEquals();
     }
 
+    /**
+     * Tests object construction.
+     */
     @Test
     public void testConstruction() {
         FlowInfo info = info1;
diff --git a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/impl/DefaultInfluxRecordTest.java b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/impl/DefaultInfluxRecordTest.java
new file mode 100644
index 0000000..866e34d
--- /dev/null
+++ b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/impl/DefaultInfluxRecordTest.java
@@ -0,0 +1,153 @@
+/*
+ * 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.impl;
+
+import com.google.common.collect.ImmutableSet;
+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.InfluxRecord;
+import org.onosproject.openstacktelemetry.api.StatsInfo;
+
+import java.util.Set;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+import static org.onlab.junit.ImmutableClassChecker.assertThatClassIsImmutable;
+
+/**
+ * Unit tests for DefaultInfluxRecord class.
+ */
+public final class DefaultInfluxRecordTest {
+
+    private static final String MEASUREMENT_1 = "sonaflow-1";
+    private static final String MEASUREMENT_2 = "sonaflow-2";
+
+    private static final String IP_ADDRESS_1 = "10.10.10.1";
+    private static final String IP_ADDRESS_2 = "20.20.20.1";
+
+    private static final String MAC_ADDRESS_1 = "AA:BB:CC:DD:EE:FF";
+    private static final String MAC_ADDRESS_2 = "FF:EE:DD:CC:BB:AA";
+
+    private static final int IP_PREFIX_LENGTH_1 = 10;
+    private static final int IP_PREFIX_LENGTH_2 = 20;
+
+    private static final int PORT_1 = 1000;
+    private static final int PORT_2 = 2000;
+
+    private static final int STATIC_INTEGER_1 = 1;
+    private static final int STATIC_INTEGER_2 = 2;
+
+    private static final String STATIC_STRING_1 = "1";
+    private static final String STATIC_STRING_2 = "2";
+
+    private InfluxRecord record1;
+    private InfluxRecord sameAsRecord1;
+    private InfluxRecord record2;
+
+    private Set<FlowInfo> flowInfos1;
+    private Set<FlowInfo> flowInfos2;
+
+    /**
+     * Initial setup for this unit test.
+     */
+    @Before
+    public void setUp() {
+
+        FlowInfo.Builder builder1 = new DefaultFlowInfo.DefaultBuilder();
+        FlowInfo.Builder builder2 = new DefaultFlowInfo.DefaultBuilder();
+
+        StatsInfo statsInfo = new DefaultStatsInfo.DefaultBuilder().build();
+
+        FlowInfo info1 = builder1
+                .withFlowType((byte) STATIC_INTEGER_1)
+                .withInputInterfaceId(STATIC_INTEGER_1)
+                .withOutputInterfaceId(STATIC_INTEGER_1)
+                .withDeviceId(DeviceId.deviceId(STATIC_STRING_1))
+                .withSrcIp(IpPrefix.valueOf(
+                        IpAddress.valueOf(IP_ADDRESS_1), IP_PREFIX_LENGTH_1))
+                .withDstIp(IpPrefix.valueOf(
+                        IpAddress.valueOf(IP_ADDRESS_1), IP_PREFIX_LENGTH_1))
+                .withSrcPort(TpPort.tpPort(PORT_1))
+                .withDstPort(TpPort.tpPort(PORT_1))
+                .withProtocol((byte) STATIC_INTEGER_1)
+                .withVlanId(VlanId.vlanId(STATIC_STRING_1))
+                .withSrcMac(MacAddress.valueOf(MAC_ADDRESS_1))
+                .withDstMac(MacAddress.valueOf(MAC_ADDRESS_1))
+                .withStatsInfo(statsInfo)
+                .build();
+
+        FlowInfo info2 = builder2
+                .withFlowType((byte) STATIC_INTEGER_2)
+                .withInputInterfaceId(STATIC_INTEGER_2)
+                .withOutputInterfaceId(STATIC_INTEGER_2)
+                .withDeviceId(DeviceId.deviceId(STATIC_STRING_2))
+                .withSrcIp(IpPrefix.valueOf(
+                        IpAddress.valueOf(IP_ADDRESS_2), IP_PREFIX_LENGTH_2))
+                .withDstIp(IpPrefix.valueOf(
+                        IpAddress.valueOf(IP_ADDRESS_2), IP_PREFIX_LENGTH_2))
+                .withSrcPort(TpPort.tpPort(PORT_2))
+                .withDstPort(TpPort.tpPort(PORT_2))
+                .withProtocol((byte) STATIC_INTEGER_2)
+                .withVlanId(VlanId.vlanId(STATIC_STRING_2))
+                .withSrcMac(MacAddress.valueOf(MAC_ADDRESS_2))
+                .withDstMac(MacAddress.valueOf(MAC_ADDRESS_2))
+                .withStatsInfo(statsInfo)
+                .build();
+        flowInfos1 = ImmutableSet.of(info1);
+        flowInfos2 = ImmutableSet.of(info2);
+
+        record1 = new DefaultInfluxRecord(MEASUREMENT_1, flowInfos1);
+        sameAsRecord1 = new DefaultInfluxRecord(MEASUREMENT_1, flowInfos1);
+        record2 = new DefaultInfluxRecord(MEASUREMENT_2, flowInfos2);
+    }
+
+    /**
+     * Tests class immutability.
+     */
+    @Test
+    public void testImmutability() {
+        assertThatClassIsImmutable(DefaultInfluxRecord.class);
+    }
+
+    /**
+     * Tests object equality.
+     */
+    @Test
+    public void testEquality() {
+        new EqualsTester()
+                .addEqualityGroup(record1, sameAsRecord1)
+                .addEqualityGroup(record2).testEquals();
+    }
+
+    /**
+     * Tests object construction.
+     */
+    @Test
+    public void testConstruction() {
+        InfluxRecord record = record1;
+
+        assertThat(record.measurement(), is(MEASUREMENT_1));
+        assertThat(record.flowInfos(), is(flowInfos1));
+    }
+}
diff --git a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/impl/DefaultStatsFlowRuleTest.java b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/impl/DefaultStatsFlowRuleTest.java
new file mode 100644
index 0000000..54140dc
--- /dev/null
+++ b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/impl/DefaultStatsFlowRuleTest.java
@@ -0,0 +1,112 @@
+/*
+ * 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.impl;
+
+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.TpPort;
+import org.onosproject.openstacktelemetry.api.StatsFlowRule;
+
+import static org.junit.Assert.assertEquals;
+import static org.onlab.junit.ImmutableClassChecker.assertThatClassIsImmutable;
+
+/**
+ * Unit tests for DefaultStatsFlowRule class.
+ */
+public final class DefaultStatsFlowRuleTest {
+
+    private static final IpAddress IP_ADDRESS_1 = IpAddress.valueOf("10.10.10.1");
+    private static final IpAddress IP_ADDRESS_2 = IpAddress.valueOf("20.20.20.1");
+
+    private static final int IP_PREFIX_LENGTH_1 = 10;
+    private static final int IP_PREFIX_LENGTH_2 = 20;
+
+    private static final int PORT_1 = 1000;
+    private static final int PORT_2 = 2000;
+
+    private static final byte PROTOCOL_1 = 1;
+    private static final byte PROTOCOL_2 = 2;
+
+    private StatsFlowRule rule1;
+    private StatsFlowRule sameAsRule1;
+    private StatsFlowRule rule2;
+
+    /**
+     * Initial setup for this unit test.
+     */
+    @Before
+    public void setUp() {
+
+        rule1 = DefaultStatsFlowRule.builder()
+                .srcIpPrefix(IpPrefix.valueOf(IP_ADDRESS_1, IP_PREFIX_LENGTH_1))
+                .dstIpPrefix(IpPrefix.valueOf(IP_ADDRESS_2, IP_PREFIX_LENGTH_2))
+                .srcTpPort(TpPort.tpPort(PORT_1))
+                .dstTpPort(TpPort.tpPort(PORT_2))
+                .ipProtocol(PROTOCOL_1)
+                .build();
+
+        sameAsRule1 = DefaultStatsFlowRule.builder()
+                .srcIpPrefix(IpPrefix.valueOf(IP_ADDRESS_1, IP_PREFIX_LENGTH_1))
+                .dstIpPrefix(IpPrefix.valueOf(IP_ADDRESS_2, IP_PREFIX_LENGTH_2))
+                .srcTpPort(TpPort.tpPort(PORT_1))
+                .dstTpPort(TpPort.tpPort(PORT_2))
+                .ipProtocol(PROTOCOL_1)
+                .build();
+
+        rule2 = DefaultStatsFlowRule.builder()
+                .srcIpPrefix(IpPrefix.valueOf(IP_ADDRESS_2, IP_PREFIX_LENGTH_2))
+                .dstIpPrefix(IpPrefix.valueOf(IP_ADDRESS_1, IP_PREFIX_LENGTH_1))
+                .srcTpPort(TpPort.tpPort(PORT_2))
+                .dstTpPort(TpPort.tpPort(PORT_1))
+                .ipProtocol(PROTOCOL_2)
+                .build();
+    }
+
+    /**
+     * Tests class immutability.
+     */
+    @Test
+    public void testImmutability() {
+        assertThatClassIsImmutable(DefaultStatsFlowRule.class);
+    }
+
+    /**
+     * Tests object equality.
+     */
+    @Test
+    public void testEquality() {
+        new EqualsTester()
+                .addEqualityGroup(rule1, sameAsRule1)
+                .addEqualityGroup(rule2).testEquals();
+    }
+
+    /**
+     * Tests object construction.
+     */
+    @Test
+    public void testConstruction() {
+        StatsFlowRule rule = rule1;
+
+        assertEquals(IpPrefix.valueOf(IP_ADDRESS_1, IP_PREFIX_LENGTH_1), rule.srcIpPrefix());
+        assertEquals(IpPrefix.valueOf(IP_ADDRESS_2, IP_PREFIX_LENGTH_2), rule.dstIpPrefix());
+        assertEquals(TpPort.tpPort(PORT_1), rule.srcTpPort());
+        assertEquals(TpPort.tpPort(PORT_2), rule.dstTpPort());
+        assertEquals(PROTOCOL_1, rule.ipProtocol());
+    }
+}
diff --git a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/impl/DefaultStatsInfoTest.java b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/impl/DefaultStatsInfoTest.java
index d1e0b7e..bfe3745 100644
--- a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/impl/DefaultStatsInfoTest.java
+++ b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/impl/DefaultStatsInfoTest.java
@@ -22,6 +22,7 @@
 
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.is;
+import static org.onlab.junit.ImmutableClassChecker.assertThatClassIsImmutable;
 
 /**
  * Unit tests for DefaultStatsInfo class.
@@ -35,6 +36,9 @@
     private StatsInfo sameAsInfo1;
     private StatsInfo info2;
 
+    /**
+     * Initial setup for this unit test.
+     */
     @Before
     public void setup() {
         StatsInfo.Builder builder1 = new DefaultStatsInfo.DefaultBuilder();
@@ -78,6 +82,17 @@
                 .build();
     }
 
+    /**
+     * Tests class immutability.
+     */
+    @Test
+    public void testImmutability() {
+        assertThatClassIsImmutable(DefaultStatsInfo.class);
+    }
+
+    /**
+     * Tests object equality.
+     */
     @Test
     public void testEquality() {
         new EqualsTester()
@@ -85,6 +100,9 @@
                 .addEqualityGroup(info2).testEquals();
     }
 
+    /**
+     * Tests object construction.
+     */
     @Test
     public void testConstruction() {
         StatsInfo info = info1;
diff --git a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/impl/GrpcTelemetryManagerTest.java b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/impl/GrpcTelemetryManagerTest.java
new file mode 100644
index 0000000..48474fe
--- /dev/null
+++ b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/impl/GrpcTelemetryManagerTest.java
@@ -0,0 +1,50 @@
+/*
+ * 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.impl;
+
+import org.junit.Test;
+import org.onlab.junit.TestUtils;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+/**
+ * Unit tests for gRPC telemetry manager.
+ */
+public final class GrpcTelemetryManagerTest {
+
+    private GrpcTelemetryManager manager;
+    private OpenstackTelemetryServiceAdapter telemetryService =
+                                            new OpenstackTelemetryServiceAdapter();
+
+    /**
+     * Tests codec register activation and deactivation.
+     */
+    @Test
+    public void testActivateDeactivate() {
+        manager = new GrpcTelemetryManager();
+
+        TestUtils.setField(manager, "openstackTelemetryService", telemetryService);
+
+        manager.activate();
+
+        assertTrue(telemetryService.services.contains(manager));
+
+        manager.deactivate();
+
+        assertFalse(telemetryService.services.contains(manager));
+    }
+}
\ No newline at end of file
diff --git a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/impl/InfluxDbTelemetryManagerTest.java b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/impl/InfluxDbTelemetryManagerTest.java
new file mode 100644
index 0000000..dfd4671
--- /dev/null
+++ b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/impl/InfluxDbTelemetryManagerTest.java
@@ -0,0 +1,50 @@
+/*
+ * 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.impl;
+
+import org.junit.Test;
+import org.onlab.junit.TestUtils;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+/**
+ * Unit tests for influxDB telemetry manager.
+ */
+public final class InfluxDbTelemetryManagerTest {
+
+    private InfluxDbTelemetryManager manager;
+    private OpenstackTelemetryServiceAdapter telemetryService =
+                                            new OpenstackTelemetryServiceAdapter();
+
+    /**
+     * Tests codec register activation and deactivation.
+     */
+    @Test
+    public void testActivateDeactivate() {
+        manager = new InfluxDbTelemetryManager();
+
+        TestUtils.setField(manager, "openstackTelemetryService", telemetryService);
+
+        manager.activate();
+
+        assertTrue(telemetryService.services.contains(manager));
+
+        manager.deactivate();
+
+        assertFalse(telemetryService.services.contains(manager));
+    }
+}
diff --git a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/impl/KafkaTelemetryManagerTest.java b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/impl/KafkaTelemetryManagerTest.java
new file mode 100644
index 0000000..16076da
--- /dev/null
+++ b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/impl/KafkaTelemetryManagerTest.java
@@ -0,0 +1,50 @@
+/*
+ * 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.impl;
+
+import org.junit.Test;
+import org.onlab.junit.TestUtils;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+/**
+ * Unit tests for kafka telemetry manager.
+ */
+public final class KafkaTelemetryManagerTest {
+
+    private KafkaTelemetryManager manager;
+    private OpenstackTelemetryServiceAdapter telemetryService =
+            new OpenstackTelemetryServiceAdapter();
+
+    /**
+     * Tests codec register activation and deactivation.
+     */
+    @Test
+    public void testActivateDeactivate() {
+        manager = new KafkaTelemetryManager();
+
+        TestUtils.setField(manager, "openstackTelemetryService", telemetryService);
+
+        manager.activate();
+
+        assertTrue(telemetryService.services.contains(manager));
+
+        manager.deactivate();
+
+        assertFalse(telemetryService.services.contains(manager));
+    }
+}
diff --git a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/impl/OpenstackTelemetryManagerTest.java b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/impl/OpenstackTelemetryManagerTest.java
new file mode 100644
index 0000000..3a4aaed
--- /dev/null
+++ b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/impl/OpenstackTelemetryManagerTest.java
@@ -0,0 +1,87 @@
+/*
+ * 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.impl;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.onosproject.openstacktelemetry.api.TelemetryService;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * Unit tests for OpenstackTelemetryService class.
+ */
+public final class OpenstackTelemetryManagerTest {
+
+    private static final TelemetryService GRPC_SERVICE = new GrpcTelemetryManager();
+    private static final TelemetryService INFLUXDB_SERVICE = new InfluxDbTelemetryManager();
+
+    private OpenstackTelemetryManager manager;
+
+    /**
+     * Initializes the unit test.
+     */
+    @Before
+    public void setUp() {
+        manager = new OpenstackTelemetryManager();
+
+        manager.activate();
+    }
+
+    /**
+     * Tests addTelemetryService method.
+     */
+    @Test
+    public void testAddTelemetryService() {
+        addDefaultServices();
+
+        TelemetryService kafkaService = new KafkaTelemetryManager();
+
+        assertEquals(2, manager.telemetryServices().size());
+
+        manager.addTelemetryService(kafkaService);
+
+        assertEquals(3, manager.telemetryServices().size());
+    }
+
+    /**
+     * Tests removeTelemetryService method.
+     */
+    @Test
+    public void testRemoveTelemetryService() {
+        addDefaultServices();
+
+        assertEquals(2, manager.telemetryServices().size());
+
+        manager.removeTelemetryService(GRPC_SERVICE);
+
+        assertEquals(1, manager.telemetryServices().size());
+    }
+
+    /**
+     * Tears down the unit test.
+     */
+    @After
+    public void tearDown() {
+        manager.deactivate();
+    }
+
+    private void addDefaultServices() {
+        manager.addTelemetryService(GRPC_SERVICE);
+        manager.addTelemetryService(INFLUXDB_SERVICE);
+    }
+}
diff --git a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/impl/OpenstackTelemetryServiceAdapter.java b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/impl/OpenstackTelemetryServiceAdapter.java
new file mode 100644
index 0000000..129fec5
--- /dev/null
+++ b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/impl/OpenstackTelemetryServiceAdapter.java
@@ -0,0 +1,52 @@
+/*
+ * 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.impl;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Sets;
+import org.onosproject.openstacktelemetry.api.FlowInfo;
+import org.onosproject.openstacktelemetry.api.OpenstackTelemetryService;
+import org.onosproject.openstacktelemetry.api.TelemetryService;
+
+import java.util.Set;
+
+/**
+ * A mock up test class of openstack telemetry service.
+ */
+public class OpenstackTelemetryServiceAdapter implements OpenstackTelemetryService {
+
+    Set<TelemetryService> services = Sets.newConcurrentHashSet();
+
+    @Override
+    public void addTelemetryService(TelemetryService telemetryService) {
+        services.add(telemetryService);
+    }
+
+    @Override
+    public void removeTelemetryService(TelemetryService telemetryService) {
+        services.remove(telemetryService);
+    }
+
+    @Override
+    public void publish(Set<FlowInfo> flowInfos) {
+
+    }
+
+    @Override
+    public Set<TelemetryService> telemetryServices() {
+        return ImmutableSet.copyOf(services);
+    }
+}
diff --git a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/impl/RestTelemetryManagerTest.java b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/impl/RestTelemetryManagerTest.java
new file mode 100644
index 0000000..3946f24
--- /dev/null
+++ b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/impl/RestTelemetryManagerTest.java
@@ -0,0 +1,51 @@
+/*
+ * 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.impl;
+
+import org.junit.Test;
+import org.onlab.junit.TestUtils;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+/**
+ * Unit tests for REST telemetry manager.
+ */
+public final class RestTelemetryManagerTest {
+
+    private RestTelemetryManager manager;
+
+    private OpenstackTelemetryServiceAdapter telemetryService =
+            new OpenstackTelemetryServiceAdapter();
+
+    /**
+     * Tests codec register activation and deactivation.
+     */
+    @Test
+    public void testActivateDeactivate() {
+        manager = new RestTelemetryManager();
+
+        TestUtils.setField(manager, "openstackTelemetryService", telemetryService);
+
+        manager.activate();
+
+        assertTrue(telemetryService.services.contains(manager));
+
+        manager.deactivate();
+
+        assertFalse(telemetryService.services.contains(manager));
+    }
+}