diff --git a/apps/odtn/api/src/test/java/org/onosproject/odtn/utils/openconfig/OpenConfigAssignmentHandlerTest.java b/apps/odtn/api/src/test/java/org/onosproject/odtn/utils/openconfig/OpenConfigAssignmentHandlerTest.java
new file mode 100755
index 0000000..97f3ac1
--- /dev/null
+++ b/apps/odtn/api/src/test/java/org/onosproject/odtn/utils/openconfig/OpenConfigAssignmentHandlerTest.java
@@ -0,0 +1,218 @@
+/*
+ * 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.odtn.utils.openconfig;
+
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.List;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.onosproject.yang.model.ResourceId;
+import org.onosproject.yang.runtime.AnnotatedNodeInfo;
+
+import org.onosproject.yang.gen.v1.openconfigterminaldevice.rev20170708.openconfigterminaldevice.terminallogicalchanassignmenttop.logicalchannelassignments.assignment.DefaultConfig;
+import org.onosproject.yang.gen.v1.openconfigterminaldevice.rev20170708.openconfigterminaldevice.terminallogicalchanassignmenttop.logicalchannelassignments.DefaultAssignment;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * UnitTest class for OpenConfigAssignmentHandler.
+ */
+public class OpenConfigAssignmentHandlerTest {
+    // parent Handler
+    OpenConfigLogicalChannelAssignmentsHandler parent;
+
+    // expected ResourceId
+    ResourceId rid;
+
+    /**
+     * Set up method for UnitTest.
+     */
+    @Before
+    public void setUp() {
+        // parent Handler set up
+        // create <terminal-device xmlns="http://openconfig.net/yang/terminal-device">
+        //        </terminal-device>
+        OpenConfigTerminalDeviceHandler terminalDevice = new OpenConfigTerminalDeviceHandler();
+
+        // add <logical-channels></logical-channels>
+        OpenConfigLogicalChannelsHandler logicalChannels =
+            new OpenConfigLogicalChannelsHandler(terminalDevice);
+
+        // add <channel><index>1</index></channel>
+        OpenConfigChannelHandler channel =
+            new OpenConfigChannelHandler(1, logicalChannels);
+
+        // add <logical-channel-assignments></logical-channel-assignments>
+        parent = new OpenConfigLogicalChannelAssignmentsHandler(channel);
+
+        // expected ResourceId set up
+        rid = ResourceId.builder()
+        .addBranchPointSchema("terminal-device", "http://openconfig.net/yang/terminal-device")
+        .addBranchPointSchema("logical-channels", "http://openconfig.net/yang/terminal-device")
+        .addBranchPointSchema("channel", "http://openconfig.net/yang/terminal-device")
+        .addKeyLeaf("index", "http://openconfig.net/yang/terminal-device", 1)
+        .addBranchPointSchema("logical-channel-assignments", "http://openconfig.net/yang/terminal-device")
+        .addBranchPointSchema("assignment", "http://openconfig.net/yang/terminal-device")
+        .addKeyLeaf("index", "http://openconfig.net/yang/terminal-device", 2)
+        .build();
+    }
+
+    /**
+     * UnitTest method for getModelObject.
+     */
+    @Test
+    public void testGetModelObject() {
+        // test Handler
+        OpenConfigAssignmentHandler assignment = new OpenConfigAssignmentHandler(2, parent);
+
+        // expected ModelObject
+        DefaultAssignment modelObject = new DefaultAssignment();
+        modelObject.index(2);
+
+        assertEquals("[NG]getModelObject:Return is not an expected ModelObject.\n",
+                     modelObject, assignment.getModelObject());
+    }
+
+    /**
+     * UnitTest method for setResourceId.
+     */
+    @Test
+    public void testSetResourceId() {
+        // call setResourceId
+        OpenConfigAssignmentHandler assignment = new OpenConfigAssignmentHandler(2, parent);
+
+        // get resourceId
+        ResourceId resourceId = null;
+        try {
+            Field field = OpenConfigObjectHandler.class.getDeclaredField("resourceId");
+            field.setAccessible(true);
+            resourceId = (ResourceId) field.get(assignment);
+        } catch (NoSuchFieldException e) {
+            Assert.fail("[NG]setResourceId:ResourceId does not exist.\n" + e);
+        } catch (IllegalAccessException e) {
+            Assert.fail("[NG]setResourceId:Access to ResourceId is illegal.\n" + e);
+        }
+
+        assertEquals("[NG]setResourceId:Set ResourceId is not an expected one.\n",
+                     rid, resourceId);
+    }
+
+    /**
+     * UnitTest method for getResourceId.
+     */
+    @Test
+    public void testGetResourceId() {
+        // test Handler
+        OpenConfigAssignmentHandler assignment = new OpenConfigAssignmentHandler(2, parent);
+
+        assertEquals("[NG]getResourceId:Return is not an expected ResourceId.\n",
+                     rid, assignment.getResourceId());
+    }
+
+    /**
+     * UnitTest method for getResourceIdBuilder.
+     */
+    @Test
+    public void testGetResourceIdBuilder() {
+        // test Handler
+        OpenConfigAssignmentHandler assignment = new OpenConfigAssignmentHandler(2, parent);
+
+        assertEquals("[NG]getResourceIdBuilder:Return is not an expected ResourceIdBuilder.\n",
+                     rid, assignment.getResourceIdBuilder().build());
+    }
+
+    /**
+     * UnitTest method for addAnnotation.
+     */
+    @Test
+    public void testAddAnnotation() {
+        // test Handler
+        OpenConfigAssignmentHandler assignment = new OpenConfigAssignmentHandler(2, parent);
+
+        // call addAnnotation
+        assignment.addAnnotation("name", "value");
+
+        // get annotatedNodeInfos
+        List<AnnotatedNodeInfo> annotatedNodeInfos = new ArrayList<AnnotatedNodeInfo>();
+        try {
+            Field field = OpenConfigObjectHandler.class.getDeclaredField("annotatedNodeInfos");
+            field.setAccessible(true);
+            annotatedNodeInfos = (List<AnnotatedNodeInfo>) field.get(assignment);
+        } catch (NoSuchFieldException e) {
+            Assert.fail("[NG]addAnnotation:List of AnnotatedNodeInfo does not exist.\n" + e);
+        } catch (IllegalAccessException e) {
+            Assert.fail("[NG]addAnnotation:Access to list of AnnotatedNodeInfo is illegal.\n" + e);
+        }
+
+        assertEquals("[NG]addAnnotation:List size of AnnotatedNodeInfo is invalid.\n",
+                     1, annotatedNodeInfos.size());
+        assertEquals("[NG]addAnnotation:ResourceId of AnnotatedNodeInfo is not an expected one.\n",
+                     rid, annotatedNodeInfos.get(0).resourceId());
+        assertEquals("[NG]addAnnotation:List size of Annotation is invalid.\n",
+                     1, annotatedNodeInfos.get(0).annotations().size());
+        assertEquals("[NG]addAnnotation:Name of Annotation is not an expected one.\n",
+                     "name", annotatedNodeInfos.get(0).annotations().get(0).name());
+        assertEquals("[NG]addAnnotation:Value of Annotation is not an expected one.\n",
+                     "value", annotatedNodeInfos.get(0).annotations().get(0).value());
+    }
+
+    /**
+     * UnitTest method for getAnnotatedNodeInfoList.
+     */
+    @Test
+    public void testGetAnnotatedNodeInfoList() {
+        // test Handler
+        OpenConfigAssignmentHandler assignment = new OpenConfigAssignmentHandler(2, parent);
+
+        // set list of AnnotatedNodeInfo
+        assignment.addAnnotation("name", "value");
+
+        assertEquals("[NG]getAnnotatedNodeInfoList:List size of AnnotatedNodeInfo is invalid.\n",
+                     1, assignment.getAnnotatedNodeInfoList().size());
+        assertEquals("[NG]getAnnotatedNodeInfoList:ResourceId of AnnotatedNodeInfo is not an expected one.\n",
+                     rid, assignment.getAnnotatedNodeInfoList().get(0).resourceId());
+        assertEquals("[NG]getAnnotatedNodeInfoList:List size of Annotation is invalid.\n",
+                     1, assignment.getAnnotatedNodeInfoList().get(0).annotations().size());
+        assertEquals("[NG]getAnnotatedNodeInfoList:Name of Annotation is not an expected one.\n",
+                     "name", assignment.getAnnotatedNodeInfoList().get(0).annotations().get(0).name());
+        assertEquals("[NG]getAnnotatedNodeInfoList:Value of Annotation is not an expected one.\n",
+                     "value", assignment.getAnnotatedNodeInfoList().get(0).annotations().get(0).value());
+    }
+
+    /**
+     * UnitTest method for addConfig.
+     */
+    @Test
+    public void testAddConfig() {
+        // test Handler
+        OpenConfigAssignmentHandler assignment = new OpenConfigAssignmentHandler(2, parent);
+
+        // call addConfig
+        OpenConfigConfigOfAssignmentHandler configOfAssignment =
+            new OpenConfigConfigOfAssignmentHandler(assignment);
+
+        // expected ModelObject
+        DefaultAssignment modelObject = new DefaultAssignment();
+        modelObject.index(2);
+        DefaultConfig config = new DefaultConfig();
+        modelObject.config(config);
+
+        assertEquals("[NG]addConfig:ModelObject(Config added) is not an expected one.\n",
+                     modelObject, assignment.getModelObject());
+    }
+}
diff --git a/apps/odtn/api/src/test/java/org/onosproject/odtn/utils/openconfig/OpenConfigChannelHandlerTest.java b/apps/odtn/api/src/test/java/org/onosproject/odtn/utils/openconfig/OpenConfigChannelHandlerTest.java
new file mode 100755
index 0000000..999ac36
--- /dev/null
+++ b/apps/odtn/api/src/test/java/org/onosproject/odtn/utils/openconfig/OpenConfigChannelHandlerTest.java
@@ -0,0 +1,231 @@
+/*
+ * 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.odtn.utils.openconfig;
+
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.List;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.onosproject.yang.model.ResourceId;
+import org.onosproject.yang.runtime.AnnotatedNodeInfo;
+
+import org.onosproject.yang.gen.v1.openconfigterminaldevice.rev20170708.openconfigterminaldevice.terminallogicalchanneltop.logicalchannels.channel.DefaultConfig;
+import org.onosproject.yang.gen.v1.openconfigterminaldevice.rev20170708.openconfigterminaldevice.terminallogicalchanneltop.logicalchannels.DefaultChannel;
+import org.onosproject.yang.gen.v1.openconfigterminaldevice.rev20170708.openconfigterminaldevice.terminallogicalchanassignmenttop.DefaultLogicalChannelAssignments;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * UnitTest class for OpenConfigChannelHandler.
+ */
+public class OpenConfigChannelHandlerTest {
+    // parent Handler
+    OpenConfigLogicalChannelsHandler parent;
+
+    // expected ResourceId
+    ResourceId rid;
+
+    /**
+     * Set up method for UnitTest.
+     */
+    @Before
+    public void setUp() {
+        // parent Handler set up
+        // create <terminal-device xmlns="http://openconfig.net/yang/terminal-device">
+        //        </terminal-device>
+        OpenConfigTerminalDeviceHandler terminalDevice = new OpenConfigTerminalDeviceHandler();
+
+        // add <logical-channels></logical-channels>
+        parent = new OpenConfigLogicalChannelsHandler(terminalDevice);
+
+        // expected ResourceId set up
+        rid = ResourceId.builder()
+        .addBranchPointSchema("terminal-device", "http://openconfig.net/yang/terminal-device")
+        .addBranchPointSchema("logical-channels", "http://openconfig.net/yang/terminal-device")
+        .addBranchPointSchema("channel", "http://openconfig.net/yang/terminal-device")
+        .addKeyLeaf("index", "http://openconfig.net/yang/terminal-device", 1)
+        .build();
+    }
+
+    /**
+     * UnitTest method for getModelObject.
+     */
+    @Test
+    public void testGetModelObject() {
+        // test Handler
+        OpenConfigChannelHandler channel = new OpenConfigChannelHandler(1, parent);
+
+        // expected ModelObject
+        DefaultChannel modelObject = new DefaultChannel();
+        modelObject.index(1);
+
+        assertEquals("[NG]getModelObject:Return is not an expected ModelObject.\n",
+                     modelObject, channel.getModelObject());
+    }
+
+    /**
+     * UnitTest method for setResourceId.
+     */
+    @Test
+    public void testSetResourceId() {
+        // call setResourceId
+        OpenConfigChannelHandler channel = new OpenConfigChannelHandler(1, parent);
+
+        // get resourceId
+        ResourceId resourceId = null;
+        try {
+            Field field = OpenConfigObjectHandler.class.getDeclaredField("resourceId");
+            field.setAccessible(true);
+            resourceId = (ResourceId) field.get(channel);
+        } catch (NoSuchFieldException e) {
+            Assert.fail("[NG]setResourceId:ResourceId does not exist.\n" + e);
+        } catch (IllegalAccessException e) {
+            Assert.fail("[NG]setResourceId:Access to ResourceId is illegal.\n" + e);
+        }
+
+        assertEquals("[NG]setResourceId:Set ResourceId is not an expected one.\n",
+                     rid, resourceId);
+    }
+
+    /**
+     * UnitTest method for getResourceId.
+     */
+    @Test
+    public void testGetResourceId() {
+        // test Handler
+        OpenConfigChannelHandler channel = new OpenConfigChannelHandler(1, parent);
+
+        assertEquals("[NG]getResourceId:Return is not an expected ResourceId.\n",
+                     rid, channel.getResourceId());
+    }
+
+    /**
+     * UnitTest method for getResourceIdBuilder.
+     */
+    @Test
+    public void testGetResourceIdBuilder() {
+        // test Handler
+        OpenConfigChannelHandler channel = new OpenConfigChannelHandler(1, parent);
+
+        assertEquals("[NG]getResourceIdBuilder:Return is not an expected ResourceIdBuilder.\n",
+                     rid, channel.getResourceIdBuilder().build());
+    }
+
+    /**
+     * UnitTest method for addAnnotation.
+     */
+    @Test
+    public void testAddAnnotation() {
+        // test Handler
+        OpenConfigChannelHandler channel = new OpenConfigChannelHandler(1, parent);
+
+        // call addAnnotation
+        channel.addAnnotation("name", "value");
+
+        // get annotatedNodeInfos
+        List<AnnotatedNodeInfo> annotatedNodeInfos = new ArrayList<AnnotatedNodeInfo>();
+        try {
+            Field field = OpenConfigObjectHandler.class.getDeclaredField("annotatedNodeInfos");
+            field.setAccessible(true);
+            annotatedNodeInfos = (List<AnnotatedNodeInfo>) field.get(channel);
+        } catch (NoSuchFieldException e) {
+            Assert.fail("[NG]addAnnotation:List of AnnotatedNodeInfo does not exist.\n" + e);
+        } catch (IllegalAccessException e) {
+            Assert.fail("[NG]addAnnotation:Access to list of AnnotatedNodeInfo is illegal.\n" + e);
+        }
+
+        assertEquals("[NG]addAnnotation:List size of AnnotatedNodeInfo is invalid.\n",
+                     1, annotatedNodeInfos.size());
+        assertEquals("[NG]addAnnotation:ResourceId of AnnotatedNodeInfo is not an expected one.\n",
+                     rid, annotatedNodeInfos.get(0).resourceId());
+        assertEquals("[NG]addAnnotation:List size of Annotation is invalid.\n",
+                     1, annotatedNodeInfos.get(0).annotations().size());
+        assertEquals("[NG]addAnnotation:Name of Annotation is not an expected one.\n",
+                     "name", annotatedNodeInfos.get(0).annotations().get(0).name());
+        assertEquals("[NG]addAnnotation:Value of Annotation is not an expected one.\n",
+                     "value", annotatedNodeInfos.get(0).annotations().get(0).value());
+    }
+
+    /**
+     * UnitTest method for getAnnotatedNodeInfoList.
+     */
+    @Test
+    public void testGetAnnotatedNodeInfoList() {
+        // test Handler
+        OpenConfigChannelHandler channel = new OpenConfigChannelHandler(1, parent);
+
+        // set list of AnnotatedNodeInfo
+        channel.addAnnotation("name", "value");
+
+        assertEquals("[NG]getAnnotatedNodeInfoList:List size of AnnotatedNodeInfo is invalid.\n",
+                     1, channel.getAnnotatedNodeInfoList().size());
+        assertEquals("[NG]getAnnotatedNodeInfoList:ResourceId of AnnotatedNodeInfo is not an expected one.\n",
+                     rid, channel.getAnnotatedNodeInfoList().get(0).resourceId());
+        assertEquals("[NG]getAnnotatedNodeInfoList:List size of Annotation is invalid.\n",
+                     1, channel.getAnnotatedNodeInfoList().get(0).annotations().size());
+        assertEquals("[NG]getAnnotatedNodeInfoList:Name of Annotation is not an expected one.\n",
+                     "name", channel.getAnnotatedNodeInfoList().get(0).annotations().get(0).name());
+        assertEquals("[NG]getAnnotatedNodeInfoList:Value of Annotation is not an expected one.\n",
+                     "value", channel.getAnnotatedNodeInfoList().get(0).annotations().get(0).value());
+    }
+
+    /**
+     * UnitTest method for addConfig.
+     */
+    @Test
+    public void testAddConfig() {
+        // test Handler
+        OpenConfigChannelHandler channel = new OpenConfigChannelHandler(1, parent);
+
+        // call addConfig
+        OpenConfigConfigOfChannelHandler configOfChannel =
+            new OpenConfigConfigOfChannelHandler(channel);
+
+        // expected ModelObject
+        DefaultChannel modelObject = new DefaultChannel();
+        modelObject.index(1);
+        DefaultConfig config = new DefaultConfig();
+        modelObject.config(config);
+
+        assertEquals("[NG]addConfig:ModelObject(Config added) is not an expected one.\n",
+                     modelObject, channel.getModelObject());
+    }
+
+    /**
+     * UnitTest method for addLogicalChannelAssignments.
+     */
+    @Test
+    public void testAddLogicalChannelAssignments() {
+        // test Handler
+        OpenConfigChannelHandler channel = new OpenConfigChannelHandler(1, parent);
+
+        // call addLogicalChannelAssignments
+        OpenConfigLogicalChannelAssignmentsHandler logicalChannelAssignments =
+            new OpenConfigLogicalChannelAssignmentsHandler(channel);
+
+        // expected ModelObject
+        DefaultChannel modelObject = new DefaultChannel();
+        modelObject.index(1);
+        DefaultLogicalChannelAssignments logicalChannel = new DefaultLogicalChannelAssignments();
+        modelObject.logicalChannelAssignments(logicalChannel);
+
+        assertEquals(
+        "[NG]addLogicalChannelAssignments:ModelObject(LogicalChannelAssignments added) is not an expected one.\n",
+        modelObject, channel.getModelObject());
+    }
+}
diff --git a/apps/odtn/api/src/test/java/org/onosproject/odtn/utils/openconfig/OpenConfigComponentHandlerTest.java b/apps/odtn/api/src/test/java/org/onosproject/odtn/utils/openconfig/OpenConfigComponentHandlerTest.java
new file mode 100755
index 0000000..64c3f5e
--- /dev/null
+++ b/apps/odtn/api/src/test/java/org/onosproject/odtn/utils/openconfig/OpenConfigComponentHandlerTest.java
@@ -0,0 +1,226 @@
+/*
+ * 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.odtn.utils.openconfig;
+
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.List;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.onosproject.yang.model.ResourceId;
+import org.onosproject.yang.runtime.AnnotatedNodeInfo;
+
+import org.onosproject.yang.gen.v1.openconfigplatform.rev20180603.openconfigplatform.platformcomponenttop.components.component.DefaultConfig;
+import org.onosproject.yang.gen.v1.openconfigplatform.rev20180603.openconfigplatform.platformcomponenttop.components.DefaultComponent;
+import org.onosproject.yang.gen.v1.openconfigplatformtransceiver.rev20180515.openconfigplatformtransceiver.components.component.DefaultAugmentedOcPlatformComponent;
+import org.onosproject.yang.gen.v1.openconfigplatformtransceiver.rev20180515.openconfigplatformtransceiver.porttransceivertop.DefaultTransceiver;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * UnitTest class for OpenConfigComponentHandler.
+ */
+public class OpenConfigComponentHandlerTest {
+    // parent Handler
+    OpenConfigComponentsHandler parent;
+
+    // expected ResourceId
+    ResourceId rid;
+
+    /**
+     * Set up method for UnitTest.
+     */
+    @Before
+    public void setUp() {
+        // parent Handler set up
+        // create <components xmlns="http://openconfig.net/yang/platform"></components>
+        parent = new OpenConfigComponentsHandler();
+
+        // expected ResourceId set up
+        rid = ResourceId.builder()
+        .addBranchPointSchema("components", "http://openconfig.net/yang/platform")
+        .addBranchPointSchema("component", "http://openconfig.net/yang/platform")
+        .addKeyLeaf("name", "http://openconfig.net/yang/platform", "name")
+        .build();
+    }
+
+    /**
+     * UnitTest method for getModelObject.
+     */
+    @Test
+    public void testGetModelObject() {
+        // test Handler
+        OpenConfigComponentHandler component = new OpenConfigComponentHandler("name", parent);
+
+        // expected ModelObject
+        DefaultComponent modelObject = new DefaultComponent();
+        modelObject.name("name");
+
+        assertEquals("[NG]getModelObject:Return is not an expected ModelObject.\n",
+                     modelObject, component.getModelObject());
+    }
+
+    /**
+     * UnitTest method for setResourceId.
+     */
+    @Test
+    public void testSetResourceId() {
+        // call setResourceId
+        OpenConfigComponentHandler component = new OpenConfigComponentHandler("name", parent);
+
+        // get resourceId
+        ResourceId resourceId = null;
+        try {
+            Field field = OpenConfigObjectHandler.class.getDeclaredField("resourceId");
+            field.setAccessible(true);
+            resourceId = (ResourceId) field.get(component);
+        } catch (NoSuchFieldException e) {
+            Assert.fail("[NG]setResourceId:ResourceId does not exist.\n" + e);
+        } catch (IllegalAccessException e) {
+            Assert.fail("[NG]setResourceId:Access to ResourceId is illegal.\n" + e);
+        }
+
+        assertEquals("[NG]setResourceId:Set ResourceId is not an expected one.\n",
+                     rid, resourceId);
+    }
+
+    /**
+     * UnitTest method for getResourceId.
+     */
+    @Test
+    public void testGetResourceId() {
+        // test Handler
+        OpenConfigComponentHandler component = new OpenConfigComponentHandler("name", parent);
+
+        assertEquals("[NG]getResourceId:Return is not an expected ResourceId.\n",
+                     rid, component.getResourceId());
+    }
+
+    /**
+     * UnitTest method for getResourceIdBuilder.
+     */
+    @Test
+    public void testGetResourceIdBuilder() {
+        // test Handler
+        OpenConfigComponentHandler component = new OpenConfigComponentHandler("name", parent);
+
+        assertEquals("[NG]getResourceIdBuilder:Return is not an expected ResourceIdBuilder.\n",
+                     rid, component.getResourceIdBuilder().build());
+    }
+
+    /**
+     * UnitTest method for addAnnotation.
+     */
+    @Test
+    public void testAddAnnotation() {
+        // test Handler
+        OpenConfigComponentHandler component = new OpenConfigComponentHandler("name", parent);
+
+        // call addAnnotation
+        component.addAnnotation("name", "value");
+
+        // get annotatedNodeInfos
+        List<AnnotatedNodeInfo> annotatedNodeInfos = new ArrayList<AnnotatedNodeInfo>();
+        try {
+            Field field = OpenConfigObjectHandler.class.getDeclaredField("annotatedNodeInfos");
+            field.setAccessible(true);
+            annotatedNodeInfos = (List<AnnotatedNodeInfo>) field.get(component);
+        } catch (NoSuchFieldException e) {
+            Assert.fail("[NG]addAnnotation:List of AnnotatedNodeInfo does not exist.\n" + e);
+        } catch (IllegalAccessException e) {
+            Assert.fail("[NG]addAnnotation:Access to list of AnnotatedNodeInfo is illegal.\n" + e);
+        }
+
+        assertEquals("[NG]addAnnotation:List size of AnnotatedNodeInfo is invalid.\n",
+                     1, annotatedNodeInfos.size());
+        assertEquals("[NG]addAnnotation:ResourceId of AnnotatedNodeInfo is not an expected one.\n",
+                     rid, annotatedNodeInfos.get(0).resourceId());
+        assertEquals("[NG]addAnnotation:List size of Annotation is invalid.\n",
+                     1, annotatedNodeInfos.get(0).annotations().size());
+        assertEquals("[NG]addAnnotation:Name of Annotation is not an expected one.\n",
+                     "name", annotatedNodeInfos.get(0).annotations().get(0).name());
+        assertEquals("[NG]addAnnotation:Value of Annotation is not an expected one.\n",
+                     "value", annotatedNodeInfos.get(0).annotations().get(0).value());
+    }
+
+    /**
+     * UnitTest method for getAnnotatedNodeInfoList.
+     */
+    @Test
+    public void testGetAnnotatedNodeInfoList() {
+        // test Handler
+        OpenConfigComponentHandler component = new OpenConfigComponentHandler("name", parent);
+
+        // set list of AnnotatedNodeInfo
+        component.addAnnotation("name", "value");
+
+        assertEquals("[NG]getAnnotatedNodeInfoList:List size of AnnotatedNodeInfo is invalid.\n",
+                     1, component.getAnnotatedNodeInfoList().size());
+        assertEquals("[NG]getAnnotatedNodeInfoList:ResourceId of AnnotatedNodeInfo is not an expected one.\n",
+                     rid, component.getAnnotatedNodeInfoList().get(0).resourceId());
+        assertEquals("[NG]getAnnotatedNodeInfoList:List size of Annotation is invalid.\n",
+                     1, component.getAnnotatedNodeInfoList().get(0).annotations().size());
+        assertEquals("[NG]getAnnotatedNodeInfoList:Name of Annotation is not an expected one.\n",
+                     "name", component.getAnnotatedNodeInfoList().get(0).annotations().get(0).name());
+        assertEquals("[NG]getAnnotatedNodeInfoList:Value of Annotation is not an expected one.\n",
+                     "value", component.getAnnotatedNodeInfoList().get(0).annotations().get(0).value());
+    }
+
+    /**
+     * UnitTest method for addTransceiver.
+     */
+    @Test
+    public void testAddTransceiver() {
+        // test Handler
+        OpenConfigComponentHandler component = new OpenConfigComponentHandler("name", parent);
+
+        // call addTransceiver
+        OpenConfigTransceiverHandler transceiver = new OpenConfigTransceiverHandler(component);
+
+        // expected ModelObject
+        DefaultComponent modelObject = new DefaultComponent();
+        modelObject.name("name");
+        DefaultTransceiver trans = new DefaultTransceiver();
+        DefaultAugmentedOcPlatformComponent augmentedOcPlatformComponent = new DefaultAugmentedOcPlatformComponent();
+        augmentedOcPlatformComponent.transceiver(trans);
+        modelObject.addAugmentation(augmentedOcPlatformComponent);
+
+        assertEquals("[NG]addTransceiver:ModelObject(Transceiver added) is not an expected one.\n",
+                     modelObject, component.getModelObject());
+    }
+
+    /**
+     * UnitTest method for addConfig.
+     */
+    @Test
+    public void testAddConfig() {
+        // test Handler
+        OpenConfigComponentHandler component = new OpenConfigComponentHandler("name", parent);
+
+        // call addConfig
+        OpenConfigConfigOfComponentHandler config = new OpenConfigConfigOfComponentHandler(component);
+
+        // expected ModelObject
+        DefaultComponent modelObject = new DefaultComponent();
+        modelObject.name("name");
+        DefaultConfig con = new DefaultConfig();
+        modelObject.config(con);
+
+        assertEquals("[NG]addConfig:ModelObject(Config added) is not an expected one.\n",
+                     modelObject, component.getModelObject());
+    }
+}
diff --git a/apps/odtn/api/src/test/java/org/onosproject/odtn/utils/openconfig/OpenConfigComponentsHandlerTest.java b/apps/odtn/api/src/test/java/org/onosproject/odtn/utils/openconfig/OpenConfigComponentsHandlerTest.java
new file mode 100755
index 0000000..9045c16
--- /dev/null
+++ b/apps/odtn/api/src/test/java/org/onosproject/odtn/utils/openconfig/OpenConfigComponentsHandlerTest.java
@@ -0,0 +1,191 @@
+/*
+ * 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.odtn.utils.openconfig;
+
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.List;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.onosproject.yang.model.ResourceId;
+import org.onosproject.yang.runtime.AnnotatedNodeInfo;
+
+import org.onosproject.yang.gen.v1.openconfigplatform.rev20180603.openconfigplatform.platformcomponenttop.components.DefaultComponent;
+import org.onosproject.yang.gen.v1.openconfigplatform.rev20180603.openconfigplatform.platformcomponenttop.DefaultComponents;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * UnitTest class for OpenConfigComponentsHandler.
+ */
+public class OpenConfigComponentsHandlerTest {
+    // expected ResourceId
+    ResourceId rid;
+
+    /**
+     * Set up method for UnitTest.
+     */
+    @Before
+    public void setUp() {
+        // expected ResourceId set up
+        rid = ResourceId.builder()
+        .addBranchPointSchema("components", "http://openconfig.net/yang/platform")
+        .build();
+    }
+
+    /**
+     * UnitTest method for getModelObject.
+     */
+    @Test
+    public void testGetModelObject() {
+        // test Handler
+        OpenConfigComponentsHandler components = new OpenConfigComponentsHandler();
+
+        // expected ModelObject
+        DefaultComponents modelObject = new DefaultComponents();
+
+        assertEquals("[NG]getModelObject:Return is not an expected ModelObject.\n",
+                     modelObject, components.getModelObject());
+    }
+
+    /**
+     * UnitTest method for setResourceId.
+     */
+    @Test
+    public void testSetResourceId() {
+        // call setResourceId
+        OpenConfigComponentsHandler components = new OpenConfigComponentsHandler();
+
+        // get resourceId
+        ResourceId resourceId = null;
+        try {
+            Field field = OpenConfigObjectHandler.class.getDeclaredField("resourceId");
+            field.setAccessible(true);
+            resourceId = (ResourceId) field.get(components);
+        } catch (NoSuchFieldException e) {
+            Assert.fail("[NG]setResourceId:ResourceId does not exist.\n" + e);
+        } catch (IllegalAccessException e) {
+            Assert.fail("[NG]setResourceId:Access to ResourceId is illegal.\n" + e);
+        }
+
+        assertEquals("[NG]setResourceId:Set ResourceId is not an expected one.\n",
+                     rid, resourceId);
+    }
+
+    /**
+     * UnitTest method for getResourceId.
+     */
+    @Test
+    public void testGetResourceId() {
+        // test Handler
+        OpenConfigComponentsHandler components = new OpenConfigComponentsHandler();
+
+        assertEquals("[NG]getResourceId:Return is not an expected ResourceId.\n",
+                     rid, components.getResourceId());
+    }
+
+    /**
+     * UnitTest method for getResourceIdBuilder.
+     */
+    @Test
+    public void testGetResourceIdBuilder() {
+        // test Handler
+        OpenConfigComponentsHandler components = new OpenConfigComponentsHandler();
+
+        assertEquals("[NG]getResourceIdBuilder:Return is not an expected ResourceIdBuilder.\n",
+                     rid, components.getResourceIdBuilder().build());
+    }
+
+    /**
+     * UnitTest method for addAnnotation.
+     */
+    @Test
+    public void testAddAnnotation() {
+        // test Handler
+        OpenConfigComponentsHandler components = new OpenConfigComponentsHandler();
+
+        // call addAnnotation
+        components.addAnnotation("name", "value");
+
+        // get annotatedNodeInfos
+        List<AnnotatedNodeInfo> annotatedNodeInfos = new ArrayList<AnnotatedNodeInfo>();
+        try {
+            Field field = OpenConfigObjectHandler.class.getDeclaredField("annotatedNodeInfos");
+            field.setAccessible(true);
+            annotatedNodeInfos = (List<AnnotatedNodeInfo>) field.get(components);
+        } catch (NoSuchFieldException e) {
+            Assert.fail("[NG]addAnnotation:List of AnnotatedNodeInfo does not exist.\n" + e);
+        } catch (IllegalAccessException e) {
+            Assert.fail("[NG]addAnnotation:Access to list of AnnotatedNodeInfo is illegal.\n" + e);
+        }
+
+        assertEquals("[NG]addAnnotation:List size of AnnotatedNodeInfo is invalid.\n",
+                     1, annotatedNodeInfos.size());
+        assertEquals("[NG]addAnnotation:ResourceId of AnnotatedNodeInfo is not an expected one.\n",
+                     rid, annotatedNodeInfos.get(0).resourceId());
+        assertEquals("[NG]addAnnotation:List size of Annotation is invalid.\n",
+                     1, annotatedNodeInfos.get(0).annotations().size());
+        assertEquals("[NG]addAnnotation:Name of Annotation is not an expected one.\n",
+                     "name", annotatedNodeInfos.get(0).annotations().get(0).name());
+        assertEquals("[NG]addAnnotation:Value of Annotation is not an expected one.\n",
+                     "value", annotatedNodeInfos.get(0).annotations().get(0).value());
+    }
+
+    /**
+     * UnitTest method for getAnnotatedNodeInfoList.
+     */
+    @Test
+    public void testGetAnnotatedNodeInfoList() {
+        // test Handler
+        OpenConfigComponentsHandler components = new OpenConfigComponentsHandler();
+
+        // set list of AnnotatedNodeInfo
+        components.addAnnotation("name", "value");
+
+        assertEquals("[NG]getAnnotatedNodeInfoList:List size of AnnotatedNodeInfo is invalid.\n",
+                     1, components.getAnnotatedNodeInfoList().size());
+        assertEquals("[NG]getAnnotatedNodeInfoList:ResourceId of AnnotatedNodeInfo is not an expected one.\n",
+                     rid, components.getAnnotatedNodeInfoList().get(0).resourceId());
+        assertEquals("[NG]getAnnotatedNodeInfoList:List size of Annotation is invalid.\n",
+                     1, components.getAnnotatedNodeInfoList().get(0).annotations().size());
+        assertEquals("[NG]getAnnotatedNodeInfoList:Name of Annotation is not an expected one.\n",
+                     "name", components.getAnnotatedNodeInfoList().get(0).annotations().get(0).name());
+        assertEquals("[NG]getAnnotatedNodeInfoList:Value of Annotation is not an expected one.\n",
+                     "value", components.getAnnotatedNodeInfoList().get(0).annotations().get(0).value());
+    }
+
+    /**
+     * UnitTest method for addComponent.
+     */
+    @Test
+    public void testAddComponent() {
+        // test Handler
+        OpenConfigComponentsHandler components = new OpenConfigComponentsHandler();
+
+        // call addComponent
+        OpenConfigComponentHandler component = new OpenConfigComponentHandler("name", components);
+
+        // expected ModelObject
+        DefaultComponents modelObject = new DefaultComponents();
+        DefaultComponent comp = new DefaultComponent();
+        comp.name("name");
+        modelObject.addToComponent(comp);
+
+        assertEquals("[NG]addComponent:ModelObject(Component added) is not an expected one.\n",
+                     modelObject, components.getModelObject());
+    }
+}
diff --git a/apps/odtn/api/src/test/java/org/onosproject/odtn/utils/openconfig/OpenConfigConfigOfAssignmentHandlerTest.java b/apps/odtn/api/src/test/java/org/onosproject/odtn/utils/openconfig/OpenConfigConfigOfAssignmentHandlerTest.java
new file mode 100755
index 0000000..d941cdc
--- /dev/null
+++ b/apps/odtn/api/src/test/java/org/onosproject/odtn/utils/openconfig/OpenConfigConfigOfAssignmentHandlerTest.java
@@ -0,0 +1,277 @@
+/*
+ * 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.odtn.utils.openconfig;
+
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.List;
+import org.junit.Assert;
+import java.math.BigDecimal;
+import org.junit.Before;
+import org.junit.Test;
+import org.onosproject.yang.model.ResourceId;
+import org.onosproject.yang.runtime.AnnotatedNodeInfo;
+
+import org.onosproject.yang.gen.v1.openconfigterminaldevice.rev20170708.openconfigterminaldevice.terminallogicalchanassignmenttop.logicalchannelassignments.assignment.DefaultConfig;
+import org.onosproject.yang.gen.v1.openconfigterminaldevice.rev20170708.openconfigterminaldevice.terminallogicalchanassignmentconfig.AssignmentTypeEnum;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * UnitTest class for OpenConfigConfigOfAssignmentHandler.
+ */
+public class OpenConfigConfigOfAssignmentHandlerTest {
+    // parent Handler
+    OpenConfigAssignmentHandler parent;
+
+    // expected ResourceId
+    ResourceId rid;
+
+    /**
+     * Set up method for UnitTest.
+     */
+    @Before
+    public void setUp() {
+        // parent Handler set up
+        // create <terminal-device xmlns="http://openconfig.net/yang/terminal-device">
+        //        </terminal-device>
+        OpenConfigTerminalDeviceHandler terminalDevice = new OpenConfigTerminalDeviceHandler();
+
+        // add <logical-channels></logical-channels>
+        OpenConfigLogicalChannelsHandler logicalChannels =
+            new OpenConfigLogicalChannelsHandler(terminalDevice);
+
+        // add <channel><index>1</index></channel>
+        OpenConfigChannelHandler channel =
+            new OpenConfigChannelHandler(1, logicalChannels);
+
+        // add <logical-channel-assignments></logical-channel-assignments>
+        OpenConfigLogicalChannelAssignmentsHandler logicalChannelAssignments =
+            new OpenConfigLogicalChannelAssignmentsHandler(channel);
+
+        // add <assignment><index>2</index></assignment>
+        parent = new OpenConfigAssignmentHandler(2, logicalChannelAssignments);
+
+        // expected ResourceId set up
+        rid = ResourceId.builder()
+        .addBranchPointSchema("terminal-device", "http://openconfig.net/yang/terminal-device")
+        .addBranchPointSchema("logical-channels", "http://openconfig.net/yang/terminal-device")
+        .addBranchPointSchema("channel", "http://openconfig.net/yang/terminal-device")
+        .addKeyLeaf("index", "http://openconfig.net/yang/terminal-device", 1)
+        .addBranchPointSchema("logical-channel-assignments", "http://openconfig.net/yang/terminal-device")
+        .addBranchPointSchema("assignment", "http://openconfig.net/yang/terminal-device")
+        .addKeyLeaf("index", "http://openconfig.net/yang/terminal-device", 2)
+        .addBranchPointSchema("config", "http://openconfig.net/yang/terminal-device")
+        .build();
+    }
+
+    /**
+     * UnitTest method for getModelObject.
+     */
+    @Test
+    public void testGetModelObject() {
+        // test Handler
+        OpenConfigConfigOfAssignmentHandler config = new OpenConfigConfigOfAssignmentHandler(parent);
+
+        // expected ModelObject
+        DefaultConfig modelObject = new DefaultConfig();
+
+        assertEquals("[NG]getModelObject:Return is not an expected ModelObject.\n",
+                     modelObject, config.getModelObject());
+    }
+
+    /**
+     * UnitTest method for setResourceId.
+     */
+    @Test
+    public void testSetResourceId() {
+        // call setResourceId
+        OpenConfigConfigOfAssignmentHandler config = new OpenConfigConfigOfAssignmentHandler(parent);
+
+        // get resourceId
+        ResourceId resourceId = null;
+        try {
+            Field field = OpenConfigObjectHandler.class.getDeclaredField("resourceId");
+            field.setAccessible(true);
+            resourceId = (ResourceId) field.get(config);
+        } catch (NoSuchFieldException e) {
+            Assert.fail("[NG]setResourceId:ResourceId does not exist.\n" + e);
+        } catch (IllegalAccessException e) {
+            Assert.fail("[NG]setResourceId:Access to ResourceId is illegal.\n" + e);
+        }
+
+        assertEquals("[NG]setResourceId:Set ResourceId is not an expected one.\n",
+                     rid, resourceId);
+    }
+
+    /**
+     * UnitTest method for getResourceId.
+     */
+    @Test
+    public void testGetResourceId() {
+        // test Handler
+        OpenConfigConfigOfAssignmentHandler config = new OpenConfigConfigOfAssignmentHandler(parent);
+
+        assertEquals("[NG]getResourceId:Return is not an expected ResourceId.\n",
+                     rid, config.getResourceId());
+    }
+
+    /**
+     * UnitTest method for getResourceIdBuilder.
+     */
+    @Test
+    public void testGetResourceIdBuilder() {
+        // test Handler
+        OpenConfigConfigOfAssignmentHandler config = new OpenConfigConfigOfAssignmentHandler(parent);
+
+        assertEquals("[NG]getResourceIdBuilder:Return is not an expected ResourceIdBuilder.\n",
+                     rid, config.getResourceIdBuilder().build());
+    }
+
+    /**
+     * UnitTest method for addAnnotation.
+     */
+    @Test
+    public void testAddAnnotation() {
+        // test Handler
+        OpenConfigConfigOfAssignmentHandler config = new OpenConfigConfigOfAssignmentHandler(parent);
+
+        // call addAnnotation
+        config.addAnnotation("name", "value");
+
+        // get annotatedNodeInfos
+        List<AnnotatedNodeInfo> annotatedNodeInfos = new ArrayList<AnnotatedNodeInfo>();
+        try {
+            Field field = OpenConfigObjectHandler.class.getDeclaredField("annotatedNodeInfos");
+            field.setAccessible(true);
+            annotatedNodeInfos = (List<AnnotatedNodeInfo>) field.get(config);
+        } catch (NoSuchFieldException e) {
+            Assert.fail("[NG]addAnnotation:List of AnnotatedNodeInfo does not exist.\n" + e);
+        } catch (IllegalAccessException e) {
+            Assert.fail("[NG]addAnnotation:Access to list of AnnotatedNodeInfo is illegal.\n" + e);
+        }
+
+        assertEquals("[NG]addAnnotation:List size of AnnotatedNodeInfo is invalid.\n",
+                     1, annotatedNodeInfos.size());
+        assertEquals("[NG]addAnnotation:ResourceId of AnnotatedNodeInfo is not an expected one.\n",
+                     rid, annotatedNodeInfos.get(0).resourceId());
+        assertEquals("[NG]addAnnotation:List size of Annotation is invalid.\n",
+                     1, annotatedNodeInfos.get(0).annotations().size());
+        assertEquals("[NG]addAnnotation:Name of Annotation is not an expected one.\n",
+                     "name", annotatedNodeInfos.get(0).annotations().get(0).name());
+        assertEquals("[NG]addAnnotation:Value of Annotation is not an expected one.\n",
+                     "value", annotatedNodeInfos.get(0).annotations().get(0).value());
+    }
+
+    /**
+     * UnitTest method for getAnnotatedNodeInfoList.
+     */
+    @Test
+    public void testGetAnnotatedNodeInfoList() {
+        // test Handler
+        OpenConfigConfigOfAssignmentHandler config = new OpenConfigConfigOfAssignmentHandler(parent);
+
+        // set list of AnnotatedNodeInfo
+        config.addAnnotation("name", "value");
+
+        assertEquals("[NG]getAnnotatedNodeInfoList:List size of AnnotatedNodeInfo is invalid.\n",
+                     1, config.getAnnotatedNodeInfoList().size());
+        assertEquals("[NG]getAnnotatedNodeInfoList:ResourceId of AnnotatedNodeInfo is not an expected one.\n",
+                     rid, config.getAnnotatedNodeInfoList().get(0).resourceId());
+        assertEquals("[NG]getAnnotatedNodeInfoList:List size of Annotation is invalid.\n",
+                     1, config.getAnnotatedNodeInfoList().get(0).annotations().size());
+        assertEquals("[NG]getAnnotatedNodeInfoList:Name of Annotation is not an expected one.\n",
+                     "name", config.getAnnotatedNodeInfoList().get(0).annotations().get(0).name());
+        assertEquals("[NG]getAnnotatedNodeInfoList:Value of Annotation is not an expected one.\n",
+                     "value", config.getAnnotatedNodeInfoList().get(0).annotations().get(0).value());
+    }
+
+    /**
+     * UnitTest method for addIndex.
+     */
+    @Test
+    public void testAddIndex() {
+        // test Handler
+        OpenConfigConfigOfAssignmentHandler config = new OpenConfigConfigOfAssignmentHandler(parent);
+
+        // call addIndex
+        config.addIndex(Long.valueOf(3));
+
+        // expected ModelObject
+        DefaultConfig modelObject = new DefaultConfig();
+        modelObject.index(3);
+
+        assertEquals("[NG]addIndex:ModelObject(Index added) is not an expected one.\n",
+                     modelObject, config.getModelObject());
+    }
+
+    /**
+     * UnitTest method for addAssignmentType.
+     */
+    @Test
+    public void testAddAssignmentType() {
+        // test Handler
+        OpenConfigConfigOfAssignmentHandler config = new OpenConfigConfigOfAssignmentHandler(parent);
+
+        // call addAssignmentType
+        config.addAssignmentType(AssignmentTypeEnum.LOGICAL_CHANNEL);
+
+        // expected ModelObject
+        DefaultConfig modelObject = new DefaultConfig();
+        modelObject.assignmentType(AssignmentTypeEnum.LOGICAL_CHANNEL);
+
+        assertEquals("[NG]addAssignmentType:ModelObject(AssignmentType added) is not an expected one.\n",
+                     modelObject, config.getModelObject());
+    }
+
+    /**
+     * UnitTest method for addLogicalChannel.
+     */
+    @Test
+    public void testAddLogicalChannel() {
+        // test Handler
+        OpenConfigConfigOfAssignmentHandler config = new OpenConfigConfigOfAssignmentHandler(parent);
+
+        // call addLogicalChannel
+        config.addLogicalChannel("name");
+
+        // expected ModelObject
+        DefaultConfig modelObject = new DefaultConfig();
+        modelObject.logicalChannel("name");
+
+        assertEquals("[NG]addLogicalChannel:ModelObject(LogicalChannel added) is not an expected one.\n",
+                     modelObject, config.getModelObject());
+    }
+
+    /**
+     * UnitTest method for addAllocation.
+     */
+    @Test
+    public void testAddAllocation() {
+        // test Handler
+        OpenConfigConfigOfAssignmentHandler config = new OpenConfigConfigOfAssignmentHandler(parent);
+
+        // call addAllocation
+        config.addAllocation(BigDecimal.valueOf(4));
+
+        // expected ModelObject
+        DefaultConfig modelObject = new DefaultConfig();
+        modelObject.allocation(BigDecimal.valueOf(4));
+
+        assertEquals("[NG]addAllocation:ModelObject(Allocation added) is not an expected one.\n",
+                     modelObject, config.getModelObject());
+    }
+}
diff --git a/apps/odtn/api/src/test/java/org/onosproject/odtn/utils/openconfig/OpenConfigConfigOfChannelHandlerTest.java b/apps/odtn/api/src/test/java/org/onosproject/odtn/utils/openconfig/OpenConfigConfigOfChannelHandlerTest.java
new file mode 100755
index 0000000..c12ef78
--- /dev/null
+++ b/apps/odtn/api/src/test/java/org/onosproject/odtn/utils/openconfig/OpenConfigConfigOfChannelHandlerTest.java
@@ -0,0 +1,207 @@
+/*
+ * 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.odtn.utils.openconfig;
+
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.List;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.onosproject.yang.model.ResourceId;
+import org.onosproject.yang.runtime.AnnotatedNodeInfo;
+
+import org.onosproject.yang.gen.v1.openconfigterminaldevice.rev20170708.openconfigterminaldevice.terminallogicalchanneltop.logicalchannels.channel.DefaultConfig;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * UnitTest class for OpenConfigConfigOfChannelHandler.
+ */
+public class OpenConfigConfigOfChannelHandlerTest {
+    // parent Handler
+    OpenConfigChannelHandler parent;
+
+    // expected ResourceId
+    ResourceId rid;
+
+    /**
+     * Set up method for UnitTest.
+     */
+    @Before
+    public void setUp() {
+        // parent Handler set up
+        // create <terminal-device xmlns="http://openconfig.net/yang/terminal-device">
+        //        </terminal-device>
+        OpenConfigTerminalDeviceHandler terminalDevice = new OpenConfigTerminalDeviceHandler();
+
+        // add <logical-channels></logical-channels>
+        OpenConfigLogicalChannelsHandler logicalChannels =
+            new OpenConfigLogicalChannelsHandler(terminalDevice);
+
+        // add <channel><index>1</index></channel>
+        parent = new OpenConfigChannelHandler(1, logicalChannels);
+
+        // expected ResourceId set up
+        rid = ResourceId.builder()
+        .addBranchPointSchema("terminal-device", "http://openconfig.net/yang/terminal-device")
+        .addBranchPointSchema("logical-channels", "http://openconfig.net/yang/terminal-device")
+        .addBranchPointSchema("channel", "http://openconfig.net/yang/terminal-device")
+        .addKeyLeaf("index", "http://openconfig.net/yang/terminal-device", 1)
+        .addBranchPointSchema("config", "http://openconfig.net/yang/terminal-device")
+        .build();
+    }
+
+    /**
+     * UnitTest method for getModelObject.
+     */
+    @Test
+    public void testGetModelObject() {
+        // test Handler
+        OpenConfigConfigOfChannelHandler config = new OpenConfigConfigOfChannelHandler(parent);
+
+        // expected ModelObject
+        DefaultConfig modelObject = new DefaultConfig();
+
+        assertEquals("[NG]getModelObject:Return is not an expected ModelObject.\n",
+                     modelObject, config.getModelObject());
+    }
+
+    /**
+     * UnitTest method for setResourceId.
+     */
+    @Test
+    public void testSetResourceId() {
+        // call setResourceId
+        OpenConfigConfigOfChannelHandler config = new OpenConfigConfigOfChannelHandler(parent);
+
+        // get resourceId
+        ResourceId resourceId = null;
+        try {
+            Field field = OpenConfigObjectHandler.class.getDeclaredField("resourceId");
+            field.setAccessible(true);
+            resourceId = (ResourceId) field.get(config);
+        } catch (NoSuchFieldException e) {
+            Assert.fail("[NG]setResourceId:ResourceId does not exist.\n" + e);
+        } catch (IllegalAccessException e) {
+            Assert.fail("[NG]setResourceId:Access to ResourceId is illegal.\n" + e);
+        }
+
+        assertEquals("[NG]setResourceId:Set ResourceId is not an expected one.\n",
+                     rid, resourceId);
+    }
+
+    /**
+     * UnitTest method for getResourceId.
+     */
+    @Test
+    public void testGetResourceId() {
+        // test Handler
+        OpenConfigConfigOfChannelHandler config = new OpenConfigConfigOfChannelHandler(parent);
+
+        assertEquals("[NG]getResourceId:Return is not an expected ResourceId.\n",
+                     rid, config.getResourceId());
+    }
+
+    /**
+     * UnitTest method for getResourceIdBuilder.
+     */
+    @Test
+    public void testGetResourceIdBuilder() {
+        // test Handler
+        OpenConfigConfigOfChannelHandler config = new OpenConfigConfigOfChannelHandler(parent);
+
+        assertEquals("[NG]getResourceIdBuilder:Return is not an expected ResourceIdBuilder.\n",
+                     rid, config.getResourceIdBuilder().build());
+    }
+
+    /**
+     * UnitTest method for addAnnotation.
+     */
+    @Test
+    public void testAddAnnotation() {
+        // test Handler
+        OpenConfigConfigOfChannelHandler config = new OpenConfigConfigOfChannelHandler(parent);
+
+        // call addAnnotation
+        config.addAnnotation("name", "value");
+
+        // get annotatedNodeInfos
+        List<AnnotatedNodeInfo> annotatedNodeInfos = new ArrayList<AnnotatedNodeInfo>();
+        try {
+            Field field = OpenConfigObjectHandler.class.getDeclaredField("annotatedNodeInfos");
+            field.setAccessible(true);
+            annotatedNodeInfos = (List<AnnotatedNodeInfo>) field.get(config);
+        } catch (NoSuchFieldException e) {
+            Assert.fail("[NG]addAnnotation:List of AnnotatedNodeInfo does not exist.\n" + e);
+        } catch (IllegalAccessException e) {
+            Assert.fail("[NG]addAnnotation:Access to list of AnnotatedNodeInfo is illegal.\n" + e);
+        }
+
+        assertEquals("[NG]addAnnotation:List size of AnnotatedNodeInfo is invalid.\n",
+                     1, annotatedNodeInfos.size());
+        assertEquals("[NG]addAnnotation:ResourceId of AnnotatedNodeInfo is not an expected one.\n",
+                     rid, annotatedNodeInfos.get(0).resourceId());
+        assertEquals("[NG]addAnnotation:List size of Annotation is invalid.\n",
+                     1, annotatedNodeInfos.get(0).annotations().size());
+        assertEquals("[NG]addAnnotation:Name of Annotation is not an expected one.\n",
+                     "name", annotatedNodeInfos.get(0).annotations().get(0).name());
+        assertEquals("[NG]addAnnotation:Value of Annotation is not an expected one.\n",
+                     "value", annotatedNodeInfos.get(0).annotations().get(0).value());
+    }
+
+    /**
+     * UnitTest method for getAnnotatedNodeInfoList.
+     */
+    @Test
+    public void testGetAnnotatedNodeInfoList() {
+        // test Handler
+        OpenConfigConfigOfChannelHandler config = new OpenConfigConfigOfChannelHandler(parent);
+
+        // set list of AnnotatedNodeInfo
+        config.addAnnotation("name", "value");
+
+        assertEquals("[NG]getAnnotatedNodeInfoList:List size of AnnotatedNodeInfo is invalid.\n",
+                     1, config.getAnnotatedNodeInfoList().size());
+        assertEquals("[NG]getAnnotatedNodeInfoList:ResourceId of AnnotatedNodeInfo is not an expected one.\n",
+                     rid, config.getAnnotatedNodeInfoList().get(0).resourceId());
+        assertEquals("[NG]getAnnotatedNodeInfoList:List size of Annotation is invalid.\n",
+                     1, config.getAnnotatedNodeInfoList().get(0).annotations().size());
+        assertEquals("[NG]getAnnotatedNodeInfoList:Name of Annotation is not an expected one.\n",
+                     "name", config.getAnnotatedNodeInfoList().get(0).annotations().get(0).name());
+        assertEquals("[NG]getAnnotatedNodeInfoList:Value of Annotation is not an expected one.\n",
+                     "value", config.getAnnotatedNodeInfoList().get(0).annotations().get(0).value());
+    }
+
+    /**
+     * UnitTest method for addIndex.
+     */
+    @Test
+    public void testAddIndex() {
+        // test Handler
+        OpenConfigConfigOfChannelHandler config = new OpenConfigConfigOfChannelHandler(parent);
+
+        // call addIndex
+        config.addIndex(2);
+
+        // expected ModelObject
+        DefaultConfig modelObject = new DefaultConfig();
+        modelObject.index(2);
+
+        assertEquals("[NG]addIndex:ModelObject(Index added) is not an expected one.\n",
+                     modelObject, config.getModelObject());
+    }
+}
diff --git a/apps/odtn/api/src/test/java/org/onosproject/odtn/utils/openconfig/OpenConfigConfigOfComponentHandlerTest.java b/apps/odtn/api/src/test/java/org/onosproject/odtn/utils/openconfig/OpenConfigConfigOfComponentHandlerTest.java
new file mode 100755
index 0000000..299f381
--- /dev/null
+++ b/apps/odtn/api/src/test/java/org/onosproject/odtn/utils/openconfig/OpenConfigConfigOfComponentHandlerTest.java
@@ -0,0 +1,201 @@
+/*
+ * 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.odtn.utils.openconfig;
+
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.List;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.onosproject.yang.model.ResourceId;
+import org.onosproject.yang.runtime.AnnotatedNodeInfo;
+
+import org.onosproject.yang.gen.v1.openconfigplatform.rev20180603.openconfigplatform.platformcomponenttop.components.component.DefaultConfig;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * UnitTest class for OpenConfigConfigOfComponentHandler.
+ */
+public class OpenConfigConfigOfComponentHandlerTest {
+    // parent Handler
+    OpenConfigComponentHandler parent;
+
+    // expected ResourceId
+    ResourceId rid;
+
+    /**
+     * Set up method for UnitTest.
+     */
+    @Before
+    public void setUp() {
+        // parent Handler set up
+        // create <components xmlns="http://openconfig.net/yang/platform"></components>
+        OpenConfigComponentsHandler components = new OpenConfigComponentsHandler();
+
+        // add <component><name>name</name></component>
+        parent = new OpenConfigComponentHandler("name", components);
+
+        // expected ResourceId set up
+        rid = ResourceId.builder()
+        .addBranchPointSchema("components", "http://openconfig.net/yang/platform")
+        .addBranchPointSchema("component", "http://openconfig.net/yang/platform")
+        .addKeyLeaf("name", "http://openconfig.net/yang/platform", "name")
+        .addBranchPointSchema("config", "http://openconfig.net/yang/platform")
+        .build();
+    }
+
+    /**
+     * UnitTest method for getModelObject.
+     */
+    @Test
+    public void testGetModelObject() {
+        // test Handler
+        OpenConfigConfigOfComponentHandler config = new OpenConfigConfigOfComponentHandler(parent);
+
+        // expected ModelObject
+        DefaultConfig modelObject = new DefaultConfig();
+
+        assertEquals("[NG]getModelObject:Return is not an expected ModelObject.\n",
+                     modelObject, config.getModelObject());
+    }
+
+    /**
+     * UnitTest method for setResourceId.
+     */
+    @Test
+    public void testSetResourceId() {
+        // call setResourceId
+        OpenConfigConfigOfComponentHandler config = new OpenConfigConfigOfComponentHandler(parent);
+
+        // get resourceId
+        ResourceId resourceId = null;
+        try {
+            Field field = OpenConfigObjectHandler.class.getDeclaredField("resourceId");
+            field.setAccessible(true);
+            resourceId = (ResourceId) field.get(config);
+        } catch (NoSuchFieldException e) {
+            Assert.fail("[NG]setResourceId:ResourceId does not exist.\n" + e);
+        } catch (IllegalAccessException e) {
+            Assert.fail("[NG]setResourceId:Access to ResourceId is illegal.\n" + e);
+        }
+
+        assertEquals("[NG]setResourceId:Set ResourceId is not an expected one.\n",
+                     rid, resourceId);
+    }
+
+    /**
+     * UnitTest method for getResourceId.
+     */
+    @Test
+    public void testGetResourceId() {
+        // test Handler
+        OpenConfigConfigOfComponentHandler config = new OpenConfigConfigOfComponentHandler(parent);
+
+        assertEquals("[NG]getResourceId:Return is not an expected ResourceId.\n",
+                     rid, config.getResourceId());
+    }
+
+    /**
+     * UnitTest method for getResourceIdBuilder.
+     */
+    @Test
+    public void testGetResourceIdBuilder() {
+        // test Handler
+        OpenConfigConfigOfComponentHandler config = new OpenConfigConfigOfComponentHandler(parent);
+
+        assertEquals("[NG]getResourceIdBuilder:Return is not an expected ResourceIdBuilder.\n",
+                     rid, config.getResourceIdBuilder().build());
+    }
+
+    /**
+     * UnitTest method for addAnnotation.
+     */
+    @Test
+    public void testAddAnnotation() {
+        // test Handler
+        OpenConfigConfigOfComponentHandler config = new OpenConfigConfigOfComponentHandler(parent);
+
+        // call addAnnotation
+        config.addAnnotation("name", "value");
+
+        // get annotatedNodeInfos
+        List<AnnotatedNodeInfo> annotatedNodeInfos = new ArrayList<AnnotatedNodeInfo>();
+        try {
+            Field field = OpenConfigObjectHandler.class.getDeclaredField("annotatedNodeInfos");
+            field.setAccessible(true);
+            annotatedNodeInfos = (List<AnnotatedNodeInfo>) field.get(config);
+        } catch (NoSuchFieldException e) {
+            Assert.fail("[NG]addAnnotation:List of AnnotatedNodeInfo does not exist.\n" + e);
+        } catch (IllegalAccessException e) {
+            Assert.fail("[NG]addAnnotation:Access to list of AnnotatedNodeInfo is illegal.\n" + e);
+        }
+
+        assertEquals("[NG]addAnnotation:List size of AnnotatedNodeInfo is invalid.\n",
+                     1, annotatedNodeInfos.size());
+        assertEquals("[NG]addAnnotation:ResourceId of AnnotatedNodeInfo is not an expected one.\n",
+                     rid, annotatedNodeInfos.get(0).resourceId());
+        assertEquals("[NG]addAnnotation:List size of Annotation is invalid.\n",
+                     1, annotatedNodeInfos.get(0).annotations().size());
+        assertEquals("[NG]addAnnotation:Name of Annotation is not an expected one.\n",
+                     "name", annotatedNodeInfos.get(0).annotations().get(0).name());
+        assertEquals("[NG]addAnnotation:Value of Annotation is not an expected one.\n",
+                     "value", annotatedNodeInfos.get(0).annotations().get(0).value());
+    }
+
+    /**
+     * UnitTest method for getAnnotatedNodeInfoList.
+     */
+    @Test
+    public void testAnnotatedNodeInfoList() {
+        // test Handler
+        OpenConfigConfigOfComponentHandler config = new OpenConfigConfigOfComponentHandler(parent);
+
+        // set list of AnnotatedNodeInfo
+        config.addAnnotation("name", "value");
+
+        assertEquals("[NG]getAnnotatedNodeInfoList:List size of AnnotatedNodeInfo is invalid.\n",
+                     1, config.getAnnotatedNodeInfoList().size());
+        assertEquals("[NG]getAnnotatedNodeInfoList:ResourceId of AnnotatedNodeInfo is not an expected one.\n",
+                     rid, config.getAnnotatedNodeInfoList().get(0).resourceId());
+        assertEquals("[NG]getAnnotatedNodeInfoList:List size of Annotation is invalid.\n",
+                     1, config.getAnnotatedNodeInfoList().get(0).annotations().size());
+        assertEquals("[NG]getAnnotatedNodeInfoList:Name of Annotation is not an expected one.\n",
+                     "name", config.getAnnotatedNodeInfoList().get(0).annotations().get(0).name());
+        assertEquals("[NG]getAnnotatedNodeInfoList:Value of Annotation is not an expected one.\n",
+                     "value", config.getAnnotatedNodeInfoList().get(0).annotations().get(0).value());
+    }
+
+    /**
+     * UnitTest method for addName.
+     */
+    @Test
+    public void testAddName() {
+        // test Handler
+        OpenConfigConfigOfComponentHandler config = new OpenConfigConfigOfComponentHandler(parent);
+
+        // call addName
+        config.addName("name");
+
+        // expected ModelObject
+        DefaultConfig modelObject = new DefaultConfig();
+        modelObject.name("name");
+
+        assertEquals("[NG]addName:ModelObject(Name added) is not an expected one.\n",
+                     modelObject, config.getModelObject());
+    }
+}
diff --git a/apps/odtn/api/src/test/java/org/onosproject/odtn/utils/openconfig/OpenConfigConfigOfTransceiverHandlerTest.java b/apps/odtn/api/src/test/java/org/onosproject/odtn/utils/openconfig/OpenConfigConfigOfTransceiverHandlerTest.java
new file mode 100755
index 0000000..1e11a16
--- /dev/null
+++ b/apps/odtn/api/src/test/java/org/onosproject/odtn/utils/openconfig/OpenConfigConfigOfTransceiverHandlerTest.java
@@ -0,0 +1,206 @@
+/*
+ * 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.odtn.utils.openconfig;
+
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.List;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.onosproject.yang.model.ResourceId;
+import org.onosproject.yang.runtime.AnnotatedNodeInfo;
+
+import org.onosproject.yang.gen.v1.openconfigplatformtransceiver.rev20180515.openconfigplatformtransceiver.porttransceivertop.transceiver.DefaultConfig;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * UnitTest class for OpenConfigConfigOfTransceiverHandler.
+ */
+public class OpenConfigConfigOfTransceiverHandlerTest {
+    // parent Handler
+    OpenConfigTransceiverHandler parent;
+
+    // expected ResourceId
+    ResourceId rid;
+
+    /**
+     * Set up method for UnitTest.
+     */
+    @Before
+    public void setUp() {
+        // parent Handler set up
+        // create <components xmlns="http://openconfig.net/yang/platform"></components>
+        OpenConfigComponentsHandler components = new OpenConfigComponentsHandler();
+
+        // add <component><name>name</name></component>
+        OpenConfigComponentHandler component
+            = new OpenConfigComponentHandler("name", components);
+
+        // add <transceiver xmlns="http://openconfig.net/yang/platform/transceiver"></transceiver>
+        parent = new OpenConfigTransceiverHandler(component);
+
+        // expected ResourceId set up
+        rid = ResourceId.builder()
+        .addBranchPointSchema("components", "http://openconfig.net/yang/platform")
+        .addBranchPointSchema("component", "http://openconfig.net/yang/platform")
+        .addKeyLeaf("name", "http://openconfig.net/yang/platform", "name")
+        .addBranchPointSchema("transceiver", "http://openconfig.net/yang/platform/transceiver")
+        .addBranchPointSchema("config", "http://openconfig.net/yang/platform/transceiver")
+        .build();
+    }
+
+    /**
+     * UnitTest method for getModelObject.
+     */
+    @Test
+    public void testGetModelObject() {
+        // test Handler
+        OpenConfigConfigOfTransceiverHandler config = new OpenConfigConfigOfTransceiverHandler(parent);
+
+        // expected ModelObject
+        DefaultConfig modelObject = new DefaultConfig();
+
+        assertEquals("[NG]getModelObject:Return is not an expected ModelObject.\n",
+                     modelObject, config.getModelObject());
+    }
+
+    /**
+     * UnitTest method for setResourceId.
+     */
+    @Test
+    public void testSetResourceId() {
+        // call setResourceId
+        OpenConfigConfigOfTransceiverHandler config = new OpenConfigConfigOfTransceiverHandler(parent);
+
+        // get resourceId
+        ResourceId resourceId = null;
+        try {
+            Field field = OpenConfigObjectHandler.class.getDeclaredField("resourceId");
+            field.setAccessible(true);
+            resourceId = (ResourceId) field.get(config);
+        } catch (NoSuchFieldException e) {
+            Assert.fail("[NG]setResourceId:ResourceId does not exist.\n" + e);
+        } catch (IllegalAccessException e) {
+            Assert.fail("[NG]setResourceId:Access to ResourceId is illegal.\n" + e);
+        }
+
+        assertEquals("[NG]setResourceId:Set ResourceId is not an expected one.\n",
+                     rid, resourceId);
+    }
+
+    /**
+     * UnitTest method for getResourceId.
+     */
+    @Test
+    public void testGetResourceId() {
+        // test Handler
+        OpenConfigConfigOfTransceiverHandler config = new OpenConfigConfigOfTransceiverHandler(parent);
+
+        assertEquals("[NG]getResourceId:Return is not an expected ResourceId.\n",
+                     rid, config.getResourceId());
+    }
+
+    /**
+     * UnitTest method for getResourceIdBuilder.
+     */
+    @Test
+    public void testGetResourceIdBuilder() {
+        // test Handler
+        OpenConfigConfigOfTransceiverHandler config = new OpenConfigConfigOfTransceiverHandler(parent);
+
+        assertEquals("[NG]getResourceIdBuilder:Return is not an expected ResourceIdBuilder.\n",
+                     rid, config.getResourceIdBuilder().build());
+    }
+
+    /**
+     * UnitTest method for addAnnotation.
+     */
+    @Test
+    public void testAddAnnotation() {
+        // test Handler
+        OpenConfigConfigOfTransceiverHandler config = new OpenConfigConfigOfTransceiverHandler(parent);
+
+        // call addAnnotation
+        config.addAnnotation("name", "value");
+
+        // get annotatedNodeInfos
+        List<AnnotatedNodeInfo> annotatedNodeInfos = new ArrayList<AnnotatedNodeInfo>();
+        try {
+            Field field = OpenConfigObjectHandler.class.getDeclaredField("annotatedNodeInfos");
+            field.setAccessible(true);
+            annotatedNodeInfos = (List<AnnotatedNodeInfo>) field.get(config);
+        } catch (NoSuchFieldException e) {
+            Assert.fail("[NG]addAnnotation:List of AnnotatedNodeInfo does not exist.\n" + e);
+        } catch (IllegalAccessException e) {
+            Assert.fail("[NG]addAnnotation:Access to list of AnnotatedNodeInfo is illegal.\n" + e);
+        }
+
+        assertEquals("[NG]addAnnotation:List size of AnnotatedNodeInfo is invalid.\n",
+                     1, annotatedNodeInfos.size());
+        assertEquals("[NG]addAnnotation:ResourceId of AnnotatedNodeInfo is not an expected one.\n",
+                     rid, annotatedNodeInfos.get(0).resourceId());
+        assertEquals("[NG]addAnnotation:List size of Annotation is invalid.\n",
+                     1, annotatedNodeInfos.get(0).annotations().size());
+        assertEquals("[NG]addAnnotation:Name of Annotation is not an expected one.\n",
+                     "name", annotatedNodeInfos.get(0).annotations().get(0).name());
+        assertEquals("[NG]addAnnotation:Value of Annotation is not an expected one.\n",
+                     "value", annotatedNodeInfos.get(0).annotations().get(0).value());
+    }
+
+    /**
+     * UnitTest method for getAnnotatedNodeInfoList.
+     */
+    @Test
+    public void testGetAnnotatedNodeInfoList() {
+        // test Handler
+        OpenConfigConfigOfTransceiverHandler config = new OpenConfigConfigOfTransceiverHandler(parent);
+
+        // set list of AnnotatedNodeInfo
+        config.addAnnotation("name", "value");
+
+        assertEquals("[NG]getAnnotatedNodeInfoList:List size of AnnotatedNodeInfo is invalid.\n",
+                     1, config.getAnnotatedNodeInfoList().size());
+        assertEquals("[NG]getAnnotatedNodeInfoList:ResourceId of AnnotatedNodeInfo is not an expected one.\n",
+                     rid, config.getAnnotatedNodeInfoList().get(0).resourceId());
+        assertEquals("[NG]getAnnotatedNodeInfoList:List size of Annotation is invalid.\n",
+                     1, config.getAnnotatedNodeInfoList().get(0).annotations().size());
+        assertEquals("[NG]getAnnotatedNodeInfoList:Name of Annotation is not an expected one.\n",
+                     "name", config.getAnnotatedNodeInfoList().get(0).annotations().get(0).name());
+        assertEquals("[NG]getAnnotatedNodeInfoList:Value of Annotation is not an expected one.\n",
+                     "value", config.getAnnotatedNodeInfoList().get(0).annotations().get(0).value());
+    }
+
+    /**
+     * UnitTest method for addEnabled.
+     */
+    @Test
+    public void testAddEnabled() {
+        // test Handler
+        OpenConfigConfigOfTransceiverHandler config = new OpenConfigConfigOfTransceiverHandler(parent);
+
+        // call addEnabled
+        config.addEnabled(true);
+
+        // expected ModelObject
+        DefaultConfig modelObject = new DefaultConfig();
+        modelObject.enabled(true);
+
+        assertEquals("[NG]addEnabled:ModelObject(Enabled added) is not an expected one.\n",
+                     modelObject, config.getModelObject());
+    }
+}
diff --git a/apps/odtn/api/src/test/java/org/onosproject/odtn/utils/openconfig/OpenConfigLogicalChannelAssignmentsHandlerTest.java b/apps/odtn/api/src/test/java/org/onosproject/odtn/utils/openconfig/OpenConfigLogicalChannelAssignmentsHandlerTest.java
new file mode 100755
index 0000000..2593593
--- /dev/null
+++ b/apps/odtn/api/src/test/java/org/onosproject/odtn/utils/openconfig/OpenConfigLogicalChannelAssignmentsHandlerTest.java
@@ -0,0 +1,217 @@
+/*
+ * 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.odtn.utils.openconfig;
+
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.List;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.onosproject.yang.model.ResourceId;
+import org.onosproject.yang.runtime.AnnotatedNodeInfo;
+
+import org.onosproject.yang.gen.v1.openconfigterminaldevice.rev20170708.openconfigterminaldevice.terminallogicalchanassignmenttop.DefaultLogicalChannelAssignments;
+import org.onosproject.yang.gen.v1.openconfigterminaldevice.rev20170708.openconfigterminaldevice.terminallogicalchanassignmenttop.logicalchannelassignments.DefaultAssignment;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * UnitTest class for OpenConfigLogicalChannelAssignmentsHandler.
+ */
+public class OpenConfigLogicalChannelAssignmentsHandlerTest {
+    // parent Handler
+    OpenConfigChannelHandler parent;
+
+    // expected ResourceId
+    ResourceId rid;
+
+    /**
+     * Set up method for UnitTest.
+     */
+    @Before
+    public void setUp() {
+        // parent Handler set up
+        // create <terminal-device xmlns="http://openconfig.net/yang/terminal-device">
+        //        </terminal-device>
+        OpenConfigTerminalDeviceHandler terminalDevice = new OpenConfigTerminalDeviceHandler();
+
+        // add <logical-channels></logical-channels>
+        OpenConfigLogicalChannelsHandler logicalChannels =
+            new OpenConfigLogicalChannelsHandler(terminalDevice);
+
+        // add <channel><index>1</index></channel>
+        parent = new OpenConfigChannelHandler(1, logicalChannels);
+
+        // expected ResourceId set up
+        rid = ResourceId.builder()
+        .addBranchPointSchema("terminal-device", "http://openconfig.net/yang/terminal-device")
+        .addBranchPointSchema("logical-channels", "http://openconfig.net/yang/terminal-device")
+        .addBranchPointSchema("channel", "http://openconfig.net/yang/terminal-device")
+        .addKeyLeaf("index", "http://openconfig.net/yang/terminal-device", 1)
+        .addBranchPointSchema("logical-channel-assignments", "http://openconfig.net/yang/terminal-device")
+        .build();
+    }
+
+    /**
+     * UnitTest method for getModelObject.
+     */
+    @Test
+    public void testGetModelObject() {
+        // test Handler
+        OpenConfigLogicalChannelAssignmentsHandler logicalChannelAssignments =
+            new OpenConfigLogicalChannelAssignmentsHandler(parent);
+
+        // expected ModelObject
+        DefaultLogicalChannelAssignments modelObject = new DefaultLogicalChannelAssignments();
+
+        assertEquals("[NG]getModelObject:Return is not an expected ModelObject.\n",
+                     modelObject, logicalChannelAssignments.getModelObject());
+    }
+
+    /**
+     * UnitTest method for setResourceId.
+     */
+    @Test
+    public void testSetResourceId() {
+        // call setResourceId
+        OpenConfigLogicalChannelAssignmentsHandler logicalChannelAssignments =
+            new OpenConfigLogicalChannelAssignmentsHandler(parent);
+
+        // get resourceId
+        ResourceId resourceId = null;
+        try {
+            Field field = OpenConfigObjectHandler.class.getDeclaredField("resourceId");
+            field.setAccessible(true);
+            resourceId = (ResourceId) field.get(logicalChannelAssignments);
+        } catch (NoSuchFieldException e) {
+            Assert.fail("[NG]setResourceId:ResourceId does not exist.\n" + e);
+        } catch (IllegalAccessException e) {
+            Assert.fail("[NG]setResourceId:Access to ResourceId is illegal.\n" + e);
+        }
+
+        assertEquals("[NG]setResourceId:Set ResourceId is not an expected one.\n",
+                     rid, resourceId);
+    }
+
+    /**
+     * UnitTest method for getResourceId.
+     */
+    @Test
+    public void testGetResourceId() {
+        // test Handler
+        OpenConfigLogicalChannelAssignmentsHandler logicalChannelAssignments =
+            new OpenConfigLogicalChannelAssignmentsHandler(parent);
+
+        assertEquals("[NG]getResourceId:Return is not an expected ResourceId.\n",
+                     rid, logicalChannelAssignments.getResourceId());
+    }
+
+    /**
+     * UnitTest method for getResourceIdBuilder.
+     */
+    @Test
+    public void testGetResourceIdBuilder() {
+        // test Handler
+        OpenConfigLogicalChannelAssignmentsHandler logicalChannelAssignments =
+            new OpenConfigLogicalChannelAssignmentsHandler(parent);
+
+        assertEquals("[NG]getResourceIdBuilder:Return is not an expected ResourceIdBuilder.\n",
+                     rid, logicalChannelAssignments.getResourceIdBuilder().build());
+    }
+
+    /**
+     * UnitTest method for addAnnotation.
+     */
+    @Test
+    public void testAddAnnotation() {
+        // test Handler
+        OpenConfigLogicalChannelAssignmentsHandler logicalChannelAssignments =
+            new OpenConfigLogicalChannelAssignmentsHandler(parent);
+
+        // call addAnnotation
+        logicalChannelAssignments.addAnnotation("name", "value");
+
+        // get annotatedNodeInfos
+        List<AnnotatedNodeInfo> annotatedNodeInfos = new ArrayList<AnnotatedNodeInfo>();
+        try {
+            Field field = OpenConfigObjectHandler.class.getDeclaredField("annotatedNodeInfos");
+            field.setAccessible(true);
+            annotatedNodeInfos = (List<AnnotatedNodeInfo>) field.get(logicalChannelAssignments);
+        } catch (NoSuchFieldException e) {
+            Assert.fail("[NG]addAnnotation:List of AnnotatedNodeInfo does not exist.\n" + e);
+        } catch (IllegalAccessException e) {
+            Assert.fail("[NG]addAnnotation:Access to list of AnnotatedNodeInfo is illegal.\n" + e);
+        }
+
+        assertEquals("[NG]addAnnotation:List size of AnnotatedNodeInfo is invalid.\n",
+                     1, annotatedNodeInfos.size());
+        assertEquals("[NG]addAnnotation:ResourceId of AnnotatedNodeInfo is not an expected one.\n",
+                     rid, annotatedNodeInfos.get(0).resourceId());
+        assertEquals("[NG]addAnnotation:List size of Annotation is invalid.\n",
+                     1, annotatedNodeInfos.get(0).annotations().size());
+        assertEquals("[NG]addAnnotation:Name of Annotation is not an expected one.\n",
+                     "name", annotatedNodeInfos.get(0).annotations().get(0).name());
+        assertEquals("[NG]addAnnotation:Value of Annotation is not an expected one.\n",
+                     "value", annotatedNodeInfos.get(0).annotations().get(0).value());
+    }
+
+    /**
+     * UnitTest method for getAnnotatedNodeInfoList.
+     */
+    @Test
+    public void testGetAnnotatedNodeInfoList() {
+        // test Handler
+        OpenConfigLogicalChannelAssignmentsHandler logicalChannelAssignments =
+            new OpenConfigLogicalChannelAssignmentsHandler(parent);
+
+        // set list of AnnotatedNodeInfo
+        logicalChannelAssignments.addAnnotation("name", "value");
+
+        assertEquals("[NG]getAnnotatedNodeInfoList:List size of AnnotatedNodeInfo is invalid.\n",
+                     1, logicalChannelAssignments.getAnnotatedNodeInfoList().size());
+        assertEquals("[NG]getAnnotatedNodeInfoList:ResourceId of AnnotatedNodeInfo is not an expected one.\n",
+                     rid, logicalChannelAssignments.getAnnotatedNodeInfoList().get(0).resourceId());
+        assertEquals("[NG]getAnnotatedNodeInfoList:List size of Annotation is invalid.\n",
+                     1, logicalChannelAssignments.getAnnotatedNodeInfoList().get(0).annotations().size());
+        assertEquals("[NG]getAnnotatedNodeInfoList:Name of Annotation is not an expected one.\n",
+                     "name", logicalChannelAssignments.getAnnotatedNodeInfoList().get(0).annotations().get(0).name());
+        assertEquals("[NG]getAnnotatedNodeInfoList:Value of Annotation is not an expected one.\n",
+                     "value", logicalChannelAssignments.getAnnotatedNodeInfoList().get(0).annotations().get(0).value());
+    }
+
+    /**
+     * UnitTest method for addAssignment.
+     */
+    @Test
+    public void testAddAssignment() {
+        // test Handler
+        OpenConfigLogicalChannelAssignmentsHandler logicalChannelAssignments =
+            new OpenConfigLogicalChannelAssignmentsHandler(parent);
+
+        // call addAssignment
+        OpenConfigAssignmentHandler assignment = new OpenConfigAssignmentHandler(2, logicalChannelAssignments);
+
+        // expected ModelObject
+        DefaultLogicalChannelAssignments modelObject = new DefaultLogicalChannelAssignments();
+        DefaultAssignment assign = new DefaultAssignment();
+        assign.index(2);
+        modelObject.addToAssignment(assign);
+
+        assertEquals("[NG]addAssignment:ModelObject(Assignment added) is not an expected one.\n",
+                     modelObject, logicalChannelAssignments.getModelObject());
+    }
+}
diff --git a/apps/odtn/api/src/test/java/org/onosproject/odtn/utils/openconfig/OpenConfigLogicalChannelsHandlerTest.java b/apps/odtn/api/src/test/java/org/onosproject/odtn/utils/openconfig/OpenConfigLogicalChannelsHandlerTest.java
new file mode 100755
index 0000000..21cfeaa
--- /dev/null
+++ b/apps/odtn/api/src/test/java/org/onosproject/odtn/utils/openconfig/OpenConfigLogicalChannelsHandlerTest.java
@@ -0,0 +1,200 @@
+/*
+ * 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.odtn.utils.openconfig;
+
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.List;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.onosproject.yang.model.ResourceId;
+import org.onosproject.yang.runtime.AnnotatedNodeInfo;
+
+import org.onosproject.yang.gen.v1.openconfigterminaldevice.rev20170708.openconfigterminaldevice.terminallogicalchanneltop.DefaultLogicalChannels;
+import org.onosproject.yang.gen.v1.openconfigterminaldevice.rev20170708.openconfigterminaldevice.terminallogicalchanneltop.logicalchannels.DefaultChannel;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * UnitTest class for OpenConfigLogicalChannelsHandler.
+ */
+public class OpenConfigLogicalChannelsHandlerTest {
+    // parent Handler
+    OpenConfigTerminalDeviceHandler parent;
+
+    // expected ResourceId
+    ResourceId rid;
+
+    /**
+     * Set up method for UnitTest.
+     */
+    @Before
+    public void setUp() {
+        // parent Handler set up
+        // create <terminal-device xmlns="http://openconfig.net/yang/terminal-device">
+        //        </terminal-device>
+        parent = new OpenConfigTerminalDeviceHandler();
+
+        // expected ResourceId set up
+        rid = ResourceId.builder()
+        .addBranchPointSchema("terminal-device", "http://openconfig.net/yang/terminal-device")
+        .addBranchPointSchema("logical-channels", "http://openconfig.net/yang/terminal-device")
+        .build();
+    }
+
+    /**
+     * UnitTest method for getModelObject.
+     */
+    @Test
+    public void testGetModelObject() {
+        // test Handler
+        OpenConfigLogicalChannelsHandler logicalChannels = new OpenConfigLogicalChannelsHandler(parent);
+
+        // expected ModelObject
+        DefaultLogicalChannels modelObject = new DefaultLogicalChannels();
+
+        assertEquals("[NG]getModelObject:Return is not an expected ModelObject.\n",
+                     modelObject, logicalChannels.getModelObject());
+    }
+
+    /**
+     * UnitTest method for setResourceId.
+     */
+    @Test
+    public void testSetResourceId() {
+        // call setResourceId
+        OpenConfigLogicalChannelsHandler logicalChannels = new OpenConfigLogicalChannelsHandler(parent);
+
+        // get resourceId
+        ResourceId resourceId = null;
+        try {
+            Field field = OpenConfigObjectHandler.class.getDeclaredField("resourceId");
+            field.setAccessible(true);
+            resourceId = (ResourceId) field.get(logicalChannels);
+        } catch (NoSuchFieldException e) {
+            Assert.fail("[NG]setResourceId:ResourceId does not exist.\n" + e);
+        } catch (IllegalAccessException e) {
+            Assert.fail("[NG]setResourceId:Access to ResourceId is illegal.\n" + e);
+        }
+
+        assertEquals("[NG]setResourceId:Set ResourceId is not an expected one.\n",
+                     rid, resourceId);
+    }
+
+    /**
+     * UnitTest method for getResourceId.
+     */
+    @Test
+    public void testGetResourceId() {
+        // test Handler
+        OpenConfigLogicalChannelsHandler logicalChannels = new OpenConfigLogicalChannelsHandler(parent);
+
+        assertEquals("[NG]getResourceId:Return is not an expected ResourceId.\n",
+                     rid, logicalChannels.getResourceId());
+    }
+
+    /**
+     * UnitTest method for getResourceIdBuilder.
+     */
+    @Test
+    public void testGetResourceIdBuilder() {
+        // test Handler
+        OpenConfigLogicalChannelsHandler logicalChannels = new OpenConfigLogicalChannelsHandler(parent);
+
+        assertEquals("[NG]getResourceIdBuilder:Return is not an expected ResourceIdBuilder.\n",
+                     rid, logicalChannels.getResourceIdBuilder().build());
+    }
+
+    /**
+     * UnitTest method for addAnnotation.
+     */
+    @Test
+    public void testAddAnnotation() {
+        // test Handler
+        OpenConfigLogicalChannelsHandler logicalChannels = new OpenConfigLogicalChannelsHandler(parent);
+
+        // call addAnnotation
+        logicalChannels.addAnnotation("name", "value");
+
+        // get annotatedNodeInfos
+        List<AnnotatedNodeInfo> annotatedNodeInfos = new ArrayList<AnnotatedNodeInfo>();
+        try {
+            Field field = OpenConfigObjectHandler.class.getDeclaredField("annotatedNodeInfos");
+            field.setAccessible(true);
+            annotatedNodeInfos = (List<AnnotatedNodeInfo>) field.get(logicalChannels);
+        } catch (NoSuchFieldException e) {
+            Assert.fail("[NG]addAnnotation:List of AnnotatedNodeInfo does not exist.\n" + e);
+        } catch (IllegalAccessException e) {
+            Assert.fail("[NG]addAnnotation:Access to list of AnnotatedNodeInfo is illegal.\n" + e);
+        }
+
+        assertEquals("[NG]addAnnotation:List size of AnnotatedNodeInfo is invalid.\n",
+                     1, annotatedNodeInfos.size());
+        assertEquals("[NG]addAnnotation:ResourceId of AnnotatedNodeInfo is not an expected one.\n",
+                     rid, annotatedNodeInfos.get(0).resourceId());
+        assertEquals("[NG]addAnnotation:List size of Annotation is invalid.\n",
+                     1, annotatedNodeInfos.get(0).annotations().size());
+        assertEquals("[NG]addAnnotation:Name of Annotation is not an expected one.\n",
+                     "name", annotatedNodeInfos.get(0).annotations().get(0).name());
+        assertEquals("[NG]addAnnotation:Value of Annotation is not an expected one.\n",
+                     "value", annotatedNodeInfos.get(0).annotations().get(0).value());
+    }
+
+    /**
+     * UnitTest method for getAnnotatedNodeInfoList.
+     */
+    @Test
+    public void testGetAnnotatedNodeInfoList() {
+        // test Handler
+        OpenConfigLogicalChannelsHandler logicalChannels = new OpenConfigLogicalChannelsHandler(parent);
+
+        // set list of AnnotatedNodeInfo
+        logicalChannels.addAnnotation("name", "value");
+
+        assertEquals("[NG]getAnnotatedNodeInfoList:List size of AnnotatedNodeInfo is invalid.\n",
+                     1, logicalChannels.getAnnotatedNodeInfoList().size());
+        assertEquals("[NG]getAnnotatedNodeInfoList:ResourceId of AnnotatedNodeInfo is not an expected one.\n",
+                     rid, logicalChannels.getAnnotatedNodeInfoList().get(0).resourceId());
+        assertEquals("[NG]getAnnotatedNodeInfoList:List size of Annotation is invalid.\n",
+                     1, logicalChannels.getAnnotatedNodeInfoList().get(0).annotations().size());
+        assertEquals("[NG]getAnnotatedNodeInfoList:Name of Annotation is not an expected one.\n",
+                     "name", logicalChannels.getAnnotatedNodeInfoList().get(0).annotations().get(0).name());
+        assertEquals("[NG]getAnnotatedNodeInfoList:Value of Annotation is not an expected one.\n",
+                     "value", logicalChannels.getAnnotatedNodeInfoList().get(0).annotations().get(0).value());
+    }
+
+    /**
+     * UnitTest method for addChannel.
+     */
+    @Test
+    public void testAddChannel() {
+        // test Handler
+        OpenConfigLogicalChannelsHandler logicalChannels = new OpenConfigLogicalChannelsHandler(parent);
+
+        // call addChannel
+        OpenConfigChannelHandler channel = new OpenConfigChannelHandler(1, logicalChannels);
+
+        // expected ModelObject
+        DefaultLogicalChannels modelObject = new DefaultLogicalChannels();
+        DefaultChannel chan = new DefaultChannel();
+        chan.index(1);
+        modelObject.addToChannel(chan);
+
+        assertEquals("[NG]addChannel:ModelObject(Channel added) is not an expected one.\n",
+                     modelObject, logicalChannels.getModelObject());
+    }
+}
diff --git a/apps/odtn/api/src/test/java/org/onosproject/odtn/utils/openconfig/OpenConfigTerminalDeviceHandlerTest.java b/apps/odtn/api/src/test/java/org/onosproject/odtn/utils/openconfig/OpenConfigTerminalDeviceHandlerTest.java
new file mode 100755
index 0000000..d058dae
--- /dev/null
+++ b/apps/odtn/api/src/test/java/org/onosproject/odtn/utils/openconfig/OpenConfigTerminalDeviceHandlerTest.java
@@ -0,0 +1,190 @@
+/*
+ * 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.odtn.utils.openconfig;
+
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.List;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.onosproject.yang.model.ResourceId;
+import org.onosproject.yang.runtime.AnnotatedNodeInfo;
+
+import org.onosproject.yang.gen.v1.openconfigterminaldevice.rev20170708.openconfigterminaldevice.terminaldevicetop.DefaultTerminalDevice;
+import org.onosproject.yang.gen.v1.openconfigterminaldevice.rev20170708.openconfigterminaldevice.terminallogicalchanneltop.DefaultLogicalChannels;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * UnitTest class for OpenConfigTerminalDeviceHandler.
+ */
+public class OpenConfigTerminalDeviceHandlerTest {
+    // expected ResourceId
+    ResourceId rid;
+
+    /**
+     * Set up method for UnitTest.
+     */
+    @Before
+    public void setUp() {
+        // expected ResourceId set up
+        rid = ResourceId.builder()
+        .addBranchPointSchema("terminal-device", "http://openconfig.net/yang/terminal-device")
+        .build();
+    }
+
+    /**
+     * UnitTest method for getModelObject.
+     */
+    @Test
+    public void testGetModelObject() {
+        // test Handler
+        OpenConfigTerminalDeviceHandler terminalDevice = new OpenConfigTerminalDeviceHandler();
+
+        // expected ModelObject
+        DefaultTerminalDevice modelObject = new DefaultTerminalDevice();
+
+        assertEquals("[NG]getModelObject:Return is not an expected ModelObject.\n",
+                     modelObject, terminalDevice.getModelObject());
+    }
+
+    /**
+     * UnitTest method for setResourceId.
+     */
+    @Test
+    public void testSetResourceId() {
+        // call setResourceId
+        OpenConfigTerminalDeviceHandler terminalDevice = new OpenConfigTerminalDeviceHandler();
+
+        // get resourceId
+        ResourceId resourceId = null;
+        try {
+            Field field = OpenConfigObjectHandler.class.getDeclaredField("resourceId");
+            field.setAccessible(true);
+            resourceId = (ResourceId) field.get(terminalDevice);
+        } catch (NoSuchFieldException e) {
+            Assert.fail("[NG]setResourceId:ResourceId does not exist.\n" + e);
+        } catch (IllegalAccessException e) {
+            Assert.fail("[NG]setResourceId:Access to ResourceId is illegal.\n" + e);
+        }
+
+        assertEquals("[NG]setResourceId:Set ResourceId is not an expected one.\n",
+                     rid, resourceId);
+    }
+
+    /**
+     * UnitTest method for getResourceId.
+     */
+    @Test
+    public void testGetResourceId() {
+        // test Handler
+        OpenConfigTerminalDeviceHandler terminalDevice = new OpenConfigTerminalDeviceHandler();
+
+        assertEquals("[NG]getResourceId:Return is not an expected ResourceId.\n",
+                     rid, terminalDevice.getResourceId());
+    }
+
+    /**
+     * UnitTest method for getResourceIdBuilder.
+     */
+    @Test
+    public void testGetResourceIdBuilder() {
+        // test Handler
+        OpenConfigTerminalDeviceHandler terminalDevice = new OpenConfigTerminalDeviceHandler();
+
+        assertEquals("[NG]getResourceIdBuilder:Return is not an expected ResourceIdBuilder.\n",
+                     rid, terminalDevice.getResourceIdBuilder().build());
+    }
+
+    /**
+     * UnitTest method for addAnnotation.
+     */
+    @Test
+    public void testAddAnnotation() {
+        // test Handler
+        OpenConfigTerminalDeviceHandler terminalDevice = new OpenConfigTerminalDeviceHandler();
+
+        // call addAnnotation
+        terminalDevice.addAnnotation("name", "value");
+
+        // get annotatedNodeInfos
+        List<AnnotatedNodeInfo> annotatedNodeInfos = new ArrayList<AnnotatedNodeInfo>();
+        try {
+            Field field = OpenConfigObjectHandler.class.getDeclaredField("annotatedNodeInfos");
+            field.setAccessible(true);
+            annotatedNodeInfos = (List<AnnotatedNodeInfo>) field.get(terminalDevice);
+        } catch (NoSuchFieldException e) {
+            Assert.fail("[NG]addAnnotation:List of AnnotatedNodeInfo does not exist.\n" + e);
+        } catch (IllegalAccessException e) {
+            Assert.fail("[NG]addAnnotation:Access to list of AnnotatedNodeInfo is illegal.\n" + e);
+        }
+
+        assertEquals("[NG]addAnnotation:List size of AnnotatedNodeInfo is invalid.\n",
+                     1, annotatedNodeInfos.size());
+        assertEquals("[NG]addAnnotation:ResourceId of AnnotatedNodeInfo is not an expected one.\n",
+                     rid, annotatedNodeInfos.get(0).resourceId());
+        assertEquals("[NG]addAnnotation:List size of Annotation is invalid.\n",
+                     1, annotatedNodeInfos.get(0).annotations().size());
+        assertEquals("[NG]addAnnotation:Name of Annotation is not an expected one.\n",
+                     "name", annotatedNodeInfos.get(0).annotations().get(0).name());
+        assertEquals("[NG]addAnnotation:Value of Annotation is not an expected one.\n",
+                     "value", annotatedNodeInfos.get(0).annotations().get(0).value());
+    }
+
+    /**
+     * UnitTest method for getAnnotatedNodeInfoList.
+     */
+    @Test
+    public void testAnnotatedNodeInfoList() {
+        // test Handler
+        OpenConfigTerminalDeviceHandler terminalDevice = new OpenConfigTerminalDeviceHandler();
+
+        // set list of AnnotatedNodeInfo
+        terminalDevice.addAnnotation("name", "value");
+
+        assertEquals("[NG]getAnnotatedNodeInfoList:List size of AnnotatedNodeInfo is invalid.\n",
+                     1, terminalDevice.getAnnotatedNodeInfoList().size());
+        assertEquals("[NG]getAnnotatedNodeInfoList:ResourceId of AnnotatedNodeInfo is not an expected one.\n",
+                     rid, terminalDevice.getAnnotatedNodeInfoList().get(0).resourceId());
+        assertEquals("[NG]getAnnotatedNodeInfoList:List size of Annotation is invalid.\n",
+                     1, terminalDevice.getAnnotatedNodeInfoList().get(0).annotations().size());
+        assertEquals("[NG]getAnnotatedNodeInfoList:Name of Annotation is not an expected one.\n",
+                     "name", terminalDevice.getAnnotatedNodeInfoList().get(0).annotations().get(0).name());
+        assertEquals("[NG]getAnnotatedNodeInfoList:Value of Annotation is not an expected one.\n",
+                     "value", terminalDevice.getAnnotatedNodeInfoList().get(0).annotations().get(0).value());
+    }
+
+    /**
+     * UnitTest method for addLogicalChannels.
+     */
+    @Test
+    public void testAddLogicalChannels() {
+        // test Handler
+        OpenConfigTerminalDeviceHandler terminalDevice = new OpenConfigTerminalDeviceHandler();
+
+        // call addLogicalChannels
+        OpenConfigLogicalChannelsHandler logicalChannels = new OpenConfigLogicalChannelsHandler(terminalDevice);
+
+        // expected ModelObject
+        DefaultTerminalDevice modelObject = new DefaultTerminalDevice();
+        DefaultLogicalChannels logicalChan = new DefaultLogicalChannels();
+        modelObject.logicalChannels(logicalChan);
+
+        assertEquals("[NG]addLogicalChannels:ModelObject(LogicalChannels added) is not an expected one.\n",
+                     modelObject, terminalDevice.getModelObject());
+    }
+}
diff --git a/apps/odtn/api/src/test/java/org/onosproject/odtn/utils/openconfig/OpenConfigTransceiverHandlerTest.java b/apps/odtn/api/src/test/java/org/onosproject/odtn/utils/openconfig/OpenConfigTransceiverHandlerTest.java
new file mode 100755
index 0000000..0a70a38
--- /dev/null
+++ b/apps/odtn/api/src/test/java/org/onosproject/odtn/utils/openconfig/OpenConfigTransceiverHandlerTest.java
@@ -0,0 +1,203 @@
+/*
+ * 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.odtn.utils.openconfig;
+
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.List;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.onosproject.yang.model.ResourceId;
+import org.onosproject.yang.runtime.AnnotatedNodeInfo;
+
+import org.onosproject.yang.gen.v1.openconfigplatformtransceiver.rev20180515.openconfigplatformtransceiver.porttransceivertop.DefaultTransceiver;
+import org.onosproject.yang.gen.v1.openconfigplatformtransceiver.rev20180515.openconfigplatformtransceiver.porttransceivertop.transceiver.DefaultConfig;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * UnitTest class for OpenConfigTransceiverHandler.
+ */
+public class OpenConfigTransceiverHandlerTest {
+    // parent Handler
+    OpenConfigComponentHandler parent;
+
+    // expected ResourceId
+    ResourceId rid;
+
+    /**
+     * Set up method for UnitTest.
+     */
+    @Before
+    public void setUp() {
+        // parent Handler set up
+        // create <components xmlns="http://openconfig.net/yang/platform"></components>
+        OpenConfigComponentsHandler components = new OpenConfigComponentsHandler();
+
+        // add <component><name>name</name></component>
+        parent = new OpenConfigComponentHandler("name", components);
+
+        // expected ResourceId set up
+        rid = ResourceId.builder()
+        .addBranchPointSchema("components", "http://openconfig.net/yang/platform")
+        .addBranchPointSchema("component", "http://openconfig.net/yang/platform")
+        .addKeyLeaf("name", "http://openconfig.net/yang/platform", "name")
+        .addBranchPointSchema("transceiver", "http://openconfig.net/yang/platform/transceiver")
+        .build();
+    }
+
+    /**
+     * UnitTest method for getModelObject.
+     */
+    @Test
+    public void testGetModelObject() {
+        // test Handler
+        OpenConfigTransceiverHandler transceiver = new OpenConfigTransceiverHandler(parent);
+
+        // expected ModelObject
+        DefaultTransceiver modelObject = new DefaultTransceiver();
+
+        assertEquals("[NG]getModelObject:Return is not an expected ModelObject.\n",
+                     modelObject, transceiver.getModelObject());
+    }
+
+    /**
+     * UnitTest method for setResourceId.
+     */
+    @Test
+    public void testSetResourceId() {
+        // call setResourceId
+        OpenConfigTransceiverHandler transceiver = new OpenConfigTransceiverHandler(parent);
+
+        // get resourceId
+        ResourceId resourceId = null;
+        try {
+            Field field = OpenConfigObjectHandler.class.getDeclaredField("resourceId");
+            field.setAccessible(true);
+            resourceId = (ResourceId) field.get(transceiver);
+        } catch (NoSuchFieldException e) {
+            Assert.fail("[NG]setResourceId:ResourceId does not exist.\n" + e);
+        } catch (IllegalAccessException e) {
+            Assert.fail("[NG]setResourceId:Access to ResourceId is illegal.\n" + e);
+        }
+
+        assertEquals("[NG]setResourceId:Set ResourceId is not an expected one.\n",
+                     rid, resourceId);
+    }
+
+    /**
+     * UnitTest method for getResourceId.
+     */
+    @Test
+    public void testGetResourceId() {
+        // test Handler
+        OpenConfigTransceiverHandler transceiver = new OpenConfigTransceiverHandler(parent);
+
+        assertEquals("[NG]getResourceId:Return is not an expected ResourceId.\n",
+                     rid, transceiver.getResourceId());
+    }
+
+    /**
+     * UnitTest method for getResourceIdBuilder.
+     */
+    @Test
+    public void testGetResourceIdBuilder() {
+        // test Handler
+        OpenConfigTransceiverHandler transceiver = new OpenConfigTransceiverHandler(parent);
+
+        assertEquals("[NG]getResourceIdBuilder:Return is not an expected ResourceIdBuilder.\n",
+                     rid, transceiver.getResourceIdBuilder().build());
+    }
+
+    /**
+     * UnitTest method for addAnnotation.
+     */
+    @Test
+    public void testAddAnnotation() {
+        // test Handler
+        OpenConfigTransceiverHandler transceiver = new OpenConfigTransceiverHandler(parent);
+
+        // call addAnnotation
+        transceiver.addAnnotation("name", "value");
+
+        // get annotatedNodeInfos
+        List<AnnotatedNodeInfo> annotatedNodeInfos = new ArrayList<AnnotatedNodeInfo>();
+        try {
+            Field field = OpenConfigObjectHandler.class.getDeclaredField("annotatedNodeInfos");
+            field.setAccessible(true);
+            annotatedNodeInfos = (List<AnnotatedNodeInfo>) field.get(transceiver);
+        } catch (NoSuchFieldException e) {
+            Assert.fail("[NG]addAnnotation:List of AnnotatedNodeInfo does not exist.\n" + e);
+        } catch (IllegalAccessException e) {
+            Assert.fail("[NG]addAnnotation:Access to list of AnnotatedNodeInfo is illegal.\n" + e);
+        }
+
+        assertEquals("[NG]addAnnotation:List size of AnnotatedNodeInfo is invalid.\n",
+                     1, annotatedNodeInfos.size());
+        assertEquals("[NG]addAnnotation:ResourceId of AnnotatedNodeInfo is not an expected one.\n",
+                     rid, annotatedNodeInfos.get(0).resourceId());
+        assertEquals("[NG]addAnnotation:List size of Annotation is invalid.\n",
+                     1, annotatedNodeInfos.get(0).annotations().size());
+        assertEquals("[NG]addAnnotation:Name of Annotation is not an expected one.\n",
+                     "name", annotatedNodeInfos.get(0).annotations().get(0).name());
+        assertEquals("[NG]addAnnotation:Value of Annotation is not an expected one.\n",
+                     "value", annotatedNodeInfos.get(0).annotations().get(0).value());
+    }
+
+    /**
+     * UnitTest method for getAnnotatedNodeInfoList.
+     */
+    @Test
+    public void testAnnotatedNodeInfoList() {
+        // test Handler
+        OpenConfigTransceiverHandler transceiver = new OpenConfigTransceiverHandler(parent);
+
+        // set list of AnnotatedNodeInfo
+        transceiver.addAnnotation("name", "value");
+
+        assertEquals("[NG]getAnnotatedNodeInfoList:List size of AnnotatedNodeInfo is invalid.\n",
+                     1, transceiver.getAnnotatedNodeInfoList().size());
+        assertEquals("[NG]getAnnotatedNodeInfoList:ResourceId of AnnotatedNodeInfo is not an expected one.\n",
+                     rid, transceiver.getAnnotatedNodeInfoList().get(0).resourceId());
+        assertEquals("[NG]getAnnotatedNodeInfoList:List size of Annotation is invalid.\n",
+                     1, transceiver.getAnnotatedNodeInfoList().get(0).annotations().size());
+        assertEquals("[NG]getAnnotatedNodeInfoList:Name of Annotation is not an expected one.\n",
+                     "name", transceiver.getAnnotatedNodeInfoList().get(0).annotations().get(0).name());
+        assertEquals("[NG]getAnnotatedNodeInfoList:Value of Annotation is not an expected one.\n",
+                     "value", transceiver.getAnnotatedNodeInfoList().get(0).annotations().get(0).value());
+    }
+
+    /**
+     * UnitTest method for addConfig.
+     */
+    @Test
+    public void testAddConfig() {
+        // test Handler
+        OpenConfigTransceiverHandler transceiver = new OpenConfigTransceiverHandler(parent);
+
+        // call addConfig
+        OpenConfigConfigOfTransceiverHandler config = new OpenConfigConfigOfTransceiverHandler(transceiver);
+
+        // expected ModelObject
+        DefaultTransceiver modelObject = new DefaultTransceiver();
+        DefaultConfig con = new DefaultConfig();
+        modelObject.config(con);
+
+        assertEquals("[NG]addConfig:ModelObject(Config added) is not an expected one.\n",
+                     modelObject, transceiver.getModelObject());
+    }
+}
