package org.cloudname.service; import org.junit.Test; import java.util.ArrayList; import java.util.Arrays; import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.nullValue; import static org.junit.Assert.assertThat; public class ServiceDataTest { @Test public void testCreation() { final Endpoint ep1 = new Endpoint("foo", "bar", 1); final Endpoint ep2 = new Endpoint("bar", "baz", 1); final ServiceData data = new ServiceData(Arrays.asList(ep1, ep2)); assertThat(data.getEndpoint("foo"), is(equalTo(ep1))); assertThat(data.getEndpoint("bar"), is(equalTo(ep2))); assertThat(data.getEndpoint("baz"), is(nullValue())); } @Test public void testAddRemoveEndpoint() { final ServiceData data = new ServiceData(new ArrayList<Endpoint>()); assertThat(data.getEndpoint("a"), is(nullValue())); assertThat(data.getEndpoint("b"), is(nullValue())); final Endpoint ep1 = new Endpoint("a", "localhost", 80); final Endpoint ep1a = new Endpoint("a", "localhost", 80); // Endpoint can only be added once assertThat(data.addEndpoint(ep1), is(true)); assertThat(data.addEndpoint(ep1), is(false)); // Endpoints must be unique assertThat(data.addEndpoint(ep1a), is(false)); // Another endpoint can be added final Endpoint ep2 = new Endpoint("b", "localhost", 80); final Endpoint ep2a = new Endpoint("b", "localhost", 80); assertThat(data.addEndpoint(ep2), is(true)); // But the same rules applies assertThat(data.addEndpoint(ep2), is(false)); assertThat(data.addEndpoint(ep2a), is(false)); // Data now contains both endpoints assertThat(data.getEndpoint("a"), is(equalTo(ep1))); assertThat(data.getEndpoint("b"), is(equalTo(ep2))); assertThat(data.removeEndpoint(ep1), is(true)); assertThat(data.removeEndpoint(ep1a), is(false)); // ...ditto for next endpoint assertThat(data.removeEndpoint(ep2), is(true)); assertThat(data.removeEndpoint(ep2), is(false)); // The endpoints with identical names can be added assertThat(data.addEndpoint(ep1a), is(true)); assertThat(data.addEndpoint(ep2a), is(true)); } @Test public void testConversionToFromJson() { final Endpoint endpointA = new Endpoint("foo", "bar", 80); final Endpoint endpointB = new Endpoint("baz", "bar", 81); final ServiceData dataA = new ServiceData( Arrays.asList(endpointA, endpointB)); final String jsonString = dataA.toJsonString(); final ServiceData dataB = ServiceData.fromJsonString(jsonString); assertThat(dataB.getEndpoint("foo"), is(endpointA)); assertThat(dataB.getEndpoint("baz"), is(endpointB)); } @Test public void uniqueNamesAreRequired() { final Endpoint endpointA = new Endpoint("foo", "bar", 80); final Endpoint endpointB = new Endpoint("foo", "baz", 82); final Endpoint endpointC = new Endpoint("foo", "localhost", 80); final Endpoint endpointD = new Endpoint("foobar", "localhost", 80); final ServiceData serviceData = new ServiceData(new ArrayList<Endpoint>()); assertThat(serviceData.addEndpoint(endpointA), is(true)); assertThat(serviceData.addEndpoint(endpointB), is(false)); assertThat(serviceData.addEndpoint(endpointC), is(false)); assertThat(serviceData.addEndpoint(endpointD), is(true)); } @Test (expected = IllegalArgumentException.class) public void testInvalidJson1() { final String nullStr = null; ServiceData.fromJsonString(nullStr); } @Test (expected = IllegalArgumentException.class) public void testInvalidJson2() { ServiceData.fromJsonString(""); } @Test (expected = org.json.JSONException.class) public void testInvalidJson3() { ServiceData.fromJsonString("}{"); } @Test (expected = org.json.JSONException.class) public void testInvalidJson4() { ServiceData.fromJsonString("{ \"foo\": 12 }"); } @Test (expected = IllegalArgumentException.class) public void addNullEndpoint() { final ServiceData data = new ServiceData(); data.addEndpoint(null); } @Test (expected = IllegalArgumentException.class) public void removeNullEndpoint() { final ServiceData data = new ServiceData(); data.removeEndpoint(null); } }