package kvstore; import static org.junit.Assert.*; import static kvstore.KVConstants.*; import java.net.Socket; import org.junit.*; import static org.mockito.Matchers.*; import static org.mockito.Mockito.*; import org.powermock.modules.junit4.PowerMockRunner; import org.junit.runner.RunWith; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.api.mockito.PowerMockito; @RunWith(PowerMockRunner.class) @PrepareForTest({Socket.class, KVMessage.class, TPCMasterHandler.class, TPCSlaveInfo.class, TPCMaster.class}) public class TPCMasterTest { TPCMaster master; KVCache masterCache; static final long SLAVE1 = 4611686018427387903L; // Long.MAX_VALUE/2 static final long SLAVE2 = 9223372036854775807L; // Long.MAX_VALUE static final long SLAVE3 = -4611686018427387903L; // Long.MIN_VALUE/2 static final long SLAVE4 = -0000000000000000001; // Long.MIN_VALUE static final long SLAVE5 = 6230492013836775123L; // Arbitrary long value TPCSlaveInfo slave1; TPCSlaveInfo slave2; TPCSlaveInfo slave3; TPCSlaveInfo slave4; TPCSlaveInfo slave5; @Before public void setupMaster() throws KVException { masterCache = new KVCache(5, 5); master = new TPCMaster(4, masterCache); slave1 = new TPCSlaveInfo(SLAVE1 + "@111.111.111.111:1"); slave2 = new TPCSlaveInfo(SLAVE2 + "@111.111.111.111:2"); slave3 = new TPCSlaveInfo(SLAVE3 + "@111.111.111.111:3"); slave4 = new TPCSlaveInfo(SLAVE4 + "@111.111.111.111:4"); slave5 = new TPCSlaveInfo(SLAVE5 + "@111.111.111.111:5"); } @Test public void testMaxSlaves() throws KVException { master.registerSlave(slave1); master.registerSlave(slave2); master.registerSlave(slave3); master.registerSlave(slave4); assertTrue(master.getNumRegisteredSlaves() == 4); } @Test public void testMoreThanMaxSlaves() throws KVException { master.registerSlave(slave1); master.registerSlave(slave2); master.registerSlave(slave3); master.registerSlave(slave4); master.registerSlave(slave5); assertTrue(master.getNumRegisteredSlaves() == 4); assertEquals(master.getSlave(SLAVE5), null); } @Test public void testReconnectSlave() throws KVException { master.registerSlave(slave1); master.registerSlave(slave2); master.registerSlave(slave3); master.registerSlave(slave4); assertTrue(master.getNumRegisteredSlaves() == 4); slave1 = new TPCSlaveInfo(SLAVE1 + "@111.111.111.111:8080"); master.registerSlave(slave1); assertTrue(master.getNumRegisteredSlaves() == 4); } @Test public void testFindFirstReplica() throws KVException { master.registerSlave(slave1); master.registerSlave(slave2); master.registerSlave(slave3); master.registerSlave(slave4); String key = "6666666666666666666"; assertEquals(master.hashTo64bit(key), 2846774474343087985L); String key2 = "6666666666666666665"; assertEquals(master.hashTo64bit(key2), 2846774474343087984L); TPCSlaveInfo firstReplica = master.findFirstReplica(key); assertEquals(firstReplica, slave1); TPCSlaveInfo firstReplica2 = master.findFirstReplica(key2); assertEquals(firstReplica2, slave1); } @Test public void testFindSuccessor() throws KVException { master.registerSlave(slave1); master.registerSlave(slave2); master.registerSlave(slave3); master.registerSlave(slave4); assertEquals(master.findSuccessor(slave1), slave2); assertEquals(master.findSuccessor(slave2), slave3); assertEquals(master.findSuccessor(slave3), slave4); assertEquals(master.findSuccessor(slave4), slave1); } @Test public void testFindInvalidSuccessor() throws KVException { master.registerSlave(slave1); master.registerSlave(slave2); master.registerSlave(slave3); master.registerSlave(slave4); assertEquals(master.findSuccessor(slave5), slave2); } @Test public void testSimpleHandleGet() { try { //Setting up Master masterCache = new KVCache(5, 5); // masterCache = mock(KVCache.class); master = new TPCMaster(2, masterCache); slave1 = mock(TPCSlaveInfo.class); slave2 = mock(TPCSlaveInfo.class); //Mocking!! Socket sockMock = mock(Socket.class); KVMessage kvmGetMock = mock(KVMessage.class); KVMessage kvmRespMock = mock(KVMessage.class); TPCSlaveInfo slaveInfoMock = mock(TPCSlaveInfo.class); PowerMockito.whenNew(Socket.class).withAnyArguments().thenReturn(sockMock); PowerMockito.whenNew(TPCSlaveInfo.class).withAnyArguments().thenReturn(slaveInfoMock); PowerMockito.whenNew(KVMessage.class).withArguments(GET_REQ).thenReturn(kvmGetMock); PowerMockito.whenNew(KVMessage.class).withArguments(RESP).thenReturn(kvmRespMock); PowerMockito.whenNew(KVMessage.class).withArguments(any(Socket.class), any(Integer.class)).thenReturn(kvmRespMock); when(slave1.connectHost(any(Integer.class))).thenReturn(sockMock); when(kvmGetMock.getKey()).thenReturn("I'm kvmRespMock key!"); doNothing().when(kvmGetMock).setKey(any(String.class)); doNothing().when(kvmGetMock).sendMessage(any(Socket.class)); doNothing().when(kvmRespMock).sendMessage(any(Socket.class)); when(slave1.getSlaveID()).thenReturn(1L); when(slave2.getSlaveID()).thenReturn(2L); when(kvmRespMock.getMsgType()).thenReturn(RESP); when(kvmRespMock.getKey()).thenReturn("I'm kvmRespMock key!"); when(kvmRespMock.getValue()).thenReturn("I'm kvmRespMock value!"); master.registerSlave(slave1); master.registerSlave(slave2); KVMessage msg = new KVMessage(GET_REQ); msg.setKey("I'm kvmRespMock key!"); assertEquals(master.handleGet(msg), "I'm kvmRespMock value!"); //Test to see that phase 1 wasn't entered verify(kvmRespMock, times(1)).getValue(); verify(kvmRespMock, times(0)).getKey(); } catch (Exception e) { e.printStackTrace(); fail("This shouldn't fail"); } } }