diff --git a/src/test/java/net/onrc/onos/core/topology/TopologyManagerTest.java b/src/test/java/net/onrc/onos/core/topology/TopologyManagerTest.java
index e8e06b7..79dfc89 100644
--- a/src/test/java/net/onrc/onos/core/topology/TopologyManagerTest.java
+++ b/src/test/java/net/onrc/onos/core/topology/TopologyManagerTest.java
@@ -14,6 +14,7 @@
 import java.util.List;
 import java.util.concurrent.CopyOnWriteArrayList;
 
+import net.floodlightcontroller.core.IFloodlightProviderService.Role;
 import net.floodlightcontroller.util.MACAddress;
 import net.onrc.onos.core.datagrid.IDatagridService;
 import net.onrc.onos.core.datagrid.IEventChannel;
@@ -262,6 +263,59 @@
     }
 
     /**
+     * Test the Switch Mastership updated event.
+     */
+    @Test
+    public void testPutSwitchMastershipEvent() {
+        // Mock the eventChannel functions first
+        eventChannel.addEntry(anyObject(byte[].class),
+                anyObject(TopologyEvent.class));
+        EasyMock.expectLastCall().times(1, 1); // 1 event
+        replay(eventChannel);
+
+        setupTopologyManager();
+
+        // Generate a new Switch Mastership event
+        Dpid dpid = new Dpid(100L);
+        String onosInstanceId = "ONOS-Test-Instance-ID";
+        Role role = Role.MASTER;
+        MastershipEvent mastershipEvent =
+            new MastershipEvent(dpid, onosInstanceId, role);
+
+        // Call the topologyManager function for adding the event
+        theTopologyManager.putSwitchMastershipEvent(mastershipEvent);
+
+        // Verify the function calls
+        verify(eventChannel);
+    }
+
+    /**
+     * Test the Switch Mastership removed event.
+     */
+    @Test
+    public void testRemoveSwitchMastershipEvent() {
+        // Mock the eventChannel functions first
+        eventChannel.removeEntry(anyObject(byte[].class));
+        EasyMock.expectLastCall().times(1, 1); // 1 event
+        replay(eventChannel);
+
+        setupTopologyManager();
+
+        // Generate a new Switch Mastership event
+        Dpid dpid = new Dpid(100L);
+        String onosInstanceId = "ONOS-Test-Instance-ID";
+        Role role = Role.MASTER;
+        MastershipEvent mastershipEvent =
+            new MastershipEvent(dpid, onosInstanceId, role);
+
+        // Call the topologyManager function for removing the event
+        theTopologyManager.removeSwitchMastershipEvent(mastershipEvent);
+
+        // Verify the function calls
+        verify(eventChannel);
+    }
+
+    /**
      * Test the link discovered function.
      */
     @Test
diff --git a/src/test/java/net/onrc/onos/core/util/serializers/KryoFactoryTest.java b/src/test/java/net/onrc/onos/core/util/serializers/KryoFactoryTest.java
index 42d6a6a..95b1ca2 100644
--- a/src/test/java/net/onrc/onos/core/util/serializers/KryoFactoryTest.java
+++ b/src/test/java/net/onrc/onos/core/util/serializers/KryoFactoryTest.java
@@ -226,7 +226,7 @@
             Result result = benchType(obj, EqualityCheck.TO_STRING);
             results.add(result);
             // update me if serialized form is expected to change
-            assertEquals(26, result.size);
+            assertEquals(27, result.size);
         }
 
         // TODO Add registered classes we still use.
