onos-2420 Add unit test for Host REST API and fix documentation errors.
Change-Id: I633d6a8ed75dd3f79f134873967615c196f7e14b
diff --git a/web/api/src/main/java/org/onosproject/rest/resources/HostsWebResource.java b/web/api/src/main/java/org/onosproject/rest/resources/HostsWebResource.java
index 95afe99..b34d4eb 100644
--- a/web/api/src/main/java/org/onosproject/rest/resources/HostsWebResource.java
+++ b/web/api/src/main/java/org/onosproject/rest/resources/HostsWebResource.java
@@ -112,8 +112,9 @@
ObjectNode root = (ObjectNode) mapper().readTree(stream);
HostProviderRegistry hostProviderRegistry = get(HostProviderRegistry.class);
- InternalHostProvider hostProvider = new InternalHostProvider(hostProviderRegistry);
- hostProvider.register();
+ InternalHostProvider hostProvider = new InternalHostProvider();
+ HostProviderService hostProviderService = hostProviderRegistry.register(hostProvider);
+ hostProvider.setHostProviderService(hostProviderService);
HostId hostId = hostProvider.parseHost(root);
UriBuilder locationBuilder = uriInfo.getBaseUriBuilder()
@@ -121,7 +122,7 @@
.path(hostId.mac().toString())
.path(hostId.vlanId().toString());
location = locationBuilder.build();
- hostProvider.unregister();
+ hostProviderRegistry.unregister(hostProvider);
} catch (IOException ex) {
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).build();
@@ -131,49 +132,24 @@
.build();
}
- /**
- * Produces annotations from specified JsonNode. Copied from the ConfigProvider
- * class for use in the POST method.
- *
- * @param node node to be annotated
- * @return SparseAnnotations object with information about node
- */
- private SparseAnnotations annotations(JsonNode node) {
- if (node == null) {
- return DefaultAnnotations.EMPTY;
- }
-
- DefaultAnnotations.Builder builder = DefaultAnnotations.builder();
- Iterator<String> it = node.fieldNames();
- while (it.hasNext()) {
- String k = it.next();
- builder.set(k, node.get(k).asText());
- }
- return builder.build();
- }
-
private final class InternalHostProvider implements HostProvider {
private final ProviderId providerId =
new ProviderId("host", "org.onosproject.rest", true);
- private HostProviderRegistry hostProviderRegistry;
private HostProviderService hostProviderService;
+ // Not implemented since there is no need to check for hosts on network
public void triggerProbe(Host host) {
- // No need to implement since we don't need to check if the host exists
}
- private InternalHostProvider(HostProviderRegistry hostProviderRegistry) {
- this.hostProviderRegistry = hostProviderRegistry;
+ // Creates new InternalHostProvider with a HostProviderRegistry param.
+ private InternalHostProvider() {
}
- private void register() {
- this.hostProviderService = hostProviderRegistry.register(this);
+ public void setHostProviderService(HostProviderService service) {
+ this.hostProviderService = service;
}
- private void unregister() {
- hostProviderRegistry.unregister(this);
- }
-
+ // Return the ProviderId of "this"
public ProviderId id() {
return providerId;
}
@@ -204,6 +180,28 @@
hostProviderService.hostDetected(hostId, desc);
return hostId;
}
+
+ /**
+ * Produces annotations from specified JsonNode. Copied from the ConfigProvider
+ * class for use in the POST method.
+ *
+ * @param node node to be annotated
+ * @return SparseAnnotations object with information about node
+ */
+ private SparseAnnotations annotations(JsonNode node) {
+ if (node == null) {
+ return DefaultAnnotations.EMPTY;
+ }
+
+ DefaultAnnotations.Builder builder = DefaultAnnotations.builder();
+ Iterator<String> it = node.fieldNames();
+ while (it.hasNext()) {
+ String k = it.next();
+ builder.set(k, node.get(k).asText());
+ }
+ return builder.build();
+ }
+
}
}
diff --git a/web/api/src/test/java/org/onosproject/rest/HostResourceTest.java b/web/api/src/test/java/org/onosproject/rest/HostResourceTest.java
index 63af000..8c76540 100644
--- a/web/api/src/test/java/org/onosproject/rest/HostResourceTest.java
+++ b/web/api/src/test/java/org/onosproject/rest/HostResourceTest.java
@@ -16,10 +16,14 @@
package org.onosproject.rest;
+import java.io.InputStream;
+import java.net.HttpURLConnection;
import java.util.HashSet;
import java.util.Set;
+import com.sun.jersey.api.client.ClientResponse;
import org.hamcrest.Description;
+import org.hamcrest.Matchers;
import org.hamcrest.TypeSafeMatcher;
import org.junit.After;
import org.junit.Before;
@@ -36,6 +40,8 @@
import org.onosproject.net.Host;
import org.onosproject.net.HostId;
import org.onosproject.net.HostLocation;
+import org.onosproject.net.host.HostProviderRegistry;
+import org.onosproject.net.host.HostProviderService;
import org.onosproject.net.host.HostService;
import org.onosproject.net.provider.ProviderId;
@@ -45,10 +51,9 @@
import com.sun.jersey.api.client.UniformInterfaceException;
import com.sun.jersey.api.client.WebResource;
-import static org.easymock.EasyMock.createMock;
-import static org.easymock.EasyMock.expect;
-import static org.easymock.EasyMock.replay;
-import static org.easymock.EasyMock.verify;
+import javax.ws.rs.core.MediaType;
+
+import static org.easymock.EasyMock.*;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.hasSize;
import static org.hamcrest.Matchers.is;
@@ -65,6 +70,8 @@
*/
public class HostResourceTest extends ResourceTest {
final HostService mockHostService = createMock(HostService.class);
+ final HostProviderRegistry mockHostProviderRegistry = createMock(HostProviderRegistry.class);
+ final HostProviderService mockHostProviderService = createMock(HostProviderService.class);
final HashSet<Host> hosts = new HashSet<>();
/**
@@ -80,8 +87,8 @@
ServiceDirectory testDirectory =
new TestServiceDirectory()
.add(HostService.class, mockHostService)
- .add(CodecService.class, codecService);
-
+ .add(CodecService.class, codecService)
+ .add(HostProviderRegistry.class, mockHostProviderRegistry);
BaseResource.setServiceDirectory(testDirectory);
}
@@ -352,5 +359,32 @@
}
}
+ /**
+ * Tests post of a single host via JSON stream.
+ */
+ @Test
+ public void testPost() {
+ mockHostProviderService.hostDetected(anyObject(), anyObject());
+ expectLastCall();
+ replay(mockHostProviderService);
+
+ expect(mockHostProviderRegistry.register(anyObject())).andReturn(mockHostProviderService);
+ mockHostProviderRegistry.unregister(anyObject());
+ expectLastCall();
+ replay(mockHostProviderRegistry);
+
+ replay(mockHostService);
+
+ InputStream jsonStream = IntentsResourceTest.class
+ .getResourceAsStream("post-host.json");
+ WebResource rs = resource();
+
+ ClientResponse response = rs.path("hosts")
+ .type(MediaType.APPLICATION_JSON_TYPE)
+ .post(ClientResponse.class, jsonStream);
+ assertThat(response.getStatus(), is(HttpURLConnection.HTTP_CREATED));
+ String location = response.getLocation().getPath();
+ assertThat(location, Matchers.startsWith("/hosts/11:22:33:44:55:66/-1"));
+ }
}
diff --git a/web/api/src/test/resources/org/onosproject/rest/post-host.json b/web/api/src/test/resources/org/onosproject/rest/post-host.json
new file mode 100644
index 0000000..26c6292
--- /dev/null
+++ b/web/api/src/test/resources/org/onosproject/rest/post-host.json
@@ -0,0 +1,12 @@
+{
+ "id": "11:22:33:44:55:66/-1",
+ "vlan": "-1",
+ "mac": "11:22:33:44:55:66",
+ "location": {
+ "port": 3,
+ "elementId": "of:0000000000000001"
+ },
+ "ipAddresses": [
+ "10.10.10.10"
+ ]
+}