package com.workshare.msnos.core.payloads;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import com.workshare.msnos.core.Agent;
import com.workshare.msnos.core.Gateways;
import com.workshare.msnos.core.Message.Payload;
import com.workshare.msnos.core.MsnosException;
import com.workshare.msnos.core.protocols.ip.Endpoint;
@RunWith(PowerMockRunner.class)
@PrepareForTest(Gateways.class)
public class PresencePayloadTest {
@Test
public void shouldSplitEndpointsSetOnSplit() {
Endpoint alfa = Mockito.mock(Endpoint.class);
Endpoint beta = Mockito.mock(Endpoint.class);
Presence payload = new Presence(true, asSet(alfa, beta));
Payload[] loads = payload.split();
assertEquals(2, loads.length);
Set<Endpoint> newdpoints = new HashSet<Endpoint>();
newdpoints.add(getEndpoint(loads[0]));
newdpoints.add(getEndpoint(loads[1]));
assertEquals(payload.getEndpoints(), newdpoints);
}
@Test
public void shouldKeepPresenceFlagOnSplit() {
Endpoint alfa = Mockito.mock(Endpoint.class);
Endpoint beta = Mockito.mock(Endpoint.class);
Presence payload = new Presence(true, asSet(alfa, beta));
Payload[] loads = payload.split();
for (Payload load : loads) {
assertTrue(((Presence) load).isPresent());
}
}
@Test
public void shouldLoadMyGatewaysWhenPresenceTrue() throws MsnosException {
PowerMockito.mockStatic(Gateways.class);
Endpoint alfa = Mockito.mock(Endpoint.class);
Endpoint beta = Mockito.mock(Endpoint.class);
HashSet<Endpoint> expected = asSet(alfa, beta);
Agent agent = mock(Agent.class);
when(agent.getEndpoints()).thenReturn(expected);
Presence payload = new Presence(true, agent);
final Set<Endpoint> current = payload.getEndpoints();
assertEquals(expected, current);
}
@Test
public void shouldLoadNoGatewaysWhenPresenceFalse() throws MsnosException {
PowerMockito.mockStatic(Gateways.class);
Endpoint alfa = Mockito.mock(Endpoint.class);
Endpoint beta = Mockito.mock(Endpoint.class);
HashSet<Endpoint> expected = asSet(alfa, beta);
when(Gateways.endpointsOf(any(Agent.class))).thenReturn(expected);
Agent agent = mock(Agent.class);
Presence payload = new Presence(false, agent);
assertEquals(0, payload.getEndpoints().size());
}
private Endpoint getEndpoint(Payload payload) {
Presence load = (Presence) payload;
Set<Endpoint> nets = load.getEndpoints();
if (nets.size() == 1)
return nets.iterator().next();
else
throw new AssertionError("One network only was expected!");
}
private HashSet<Endpoint> asSet(Endpoint... endpoints) {
return new HashSet<Endpoint>(Arrays.asList(endpoints));
}
}