package com.workshare.msnos.usvc; import static com.workshare.msnos.core.CoreHelper.fakeSystemTime; import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import java.util.Arrays; import java.util.Collection; import java.util.HashSet; import java.util.Set; import org.junit.After; import org.junit.Before; import org.junit.Test; import com.workshare.msnos.core.RemoteAgent; import com.workshare.msnos.core.Ring; import com.workshare.msnos.core.geo.Location; import com.workshare.msnos.core.protocols.ip.BaseEndpoint; import com.workshare.msnos.core.protocols.ip.Endpoint; import com.workshare.msnos.core.protocols.ip.Endpoint.Type; import com.workshare.msnos.core.protocols.ip.Network; import com.workshare.msnos.soup.time.SystemTime; import com.workshare.msnos.usvc.api.RestApi; public class RemoteMicroserviceTest { private Ring ring; @Before public void before() { ring = mock(Ring.class); Location location = mock(Location.class); when(ring.location()).thenReturn(location ); } @After public void afterTest() { SystemTime.reset(); } @Test public void shouldFixRestApisWhenHostIsMissing() { RemoteMicroservice micro = createRemoteMicroservice(); Set<RestApi> apis = micro.getApis(); assertEquals("25.25.25.25", first(apis).getHost()); } @Test public void shouldUpdatedLastUpdatedWehnApisSet() { fakeSystemTime(10000); RemoteMicroservice micro = createRemoteMicroservice(); assertEquals(10000, micro.getLastUpdated()); fakeSystemTime(99999); micro.setApis(asSet(new RestApi("path", 2222))); assertEquals(99999, micro.getLastUpdated()); } @Test public void shouldUpdatedLastCheckTimeWehnMarkedWorkingOrFaulty() { RemoteMicroservice micro = createRemoteMicroservice(); fakeSystemTime(11111); micro.markFaulty(); assertEquals(11111, micro.getLastChecked()); fakeSystemTime(22222); micro.markWorking(); assertEquals(22222, micro.getLastChecked()); } @Test public void shouldNotifyRing() { RemoteMicroservice micro = createRemoteMicroservice(); verify(ring).onMicroserviceJoin(micro); } @Test public void shouldUseRingLocationIfAvailable() { RemoteMicroservice micro = createRemoteMicroservice(); assertEquals(ring.location(), micro.getLocation()); } private <T> Set<T> asSet(T... elements) { return new HashSet<T>(Arrays.asList(elements)); } private <T> T first(Collection<T> elements) { return elements.iterator().next(); } private RemoteMicroservice createRemoteMicroservice() { RemoteAgent agent = mock(RemoteAgent.class); final Endpoint endpoint = new BaseEndpoint(Type.UDP, new Network(new byte[]{25,25,25,25}, (short)15)); when(agent.getEndpoints()).thenReturn(asSet(endpoint)); when(agent.getRing()).thenReturn(ring); RemoteMicroservice micro = new RemoteMicroservice("foo" , agent, asSet(new RestApi("path", 1234))); return micro; } }