blob: 6fd877044b4817154c67356f3276b26574d3af5a [file] [log] [blame]
Jian Lic132c112016-01-28 20:27:34 -08001/*
2 * Copyright 2016 Open Networking Laboratory
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16package org.onosproject.cpman.rest;
17
18import com.sun.jersey.api.client.ClientResponse;
19import com.sun.jersey.api.client.WebResource;
20import com.sun.jersey.spi.container.servlet.ServletContainer;
21import com.sun.jersey.test.framework.AppDescriptor;
22import com.sun.jersey.test.framework.JerseyTest;
23import com.sun.jersey.test.framework.WebAppDescriptor;
24import org.junit.Before;
25import org.junit.Test;
26import org.onlab.osgi.ServiceDirectory;
27import org.onlab.osgi.TestServiceDirectory;
28import org.onlab.rest.BaseResource;
29import org.onosproject.cpman.ControlPlaneMonitorService;
30import org.onosproject.net.DeviceId;
31
32import javax.ws.rs.core.MediaType;
33import java.io.IOException;
34import java.io.InputStream;
35import java.net.HttpURLConnection;
36import java.net.ServerSocket;
37import java.util.Optional;
38
Jian Lic5cb4a12016-02-03 23:24:42 -080039import static org.easymock.EasyMock.anyInt;
Jian Lic132c112016-01-28 20:27:34 -080040import static org.easymock.EasyMock.anyObject;
Jian Liba6b1172016-02-01 22:40:42 -080041import static org.easymock.EasyMock.anyString;
Jian Lic132c112016-01-28 20:27:34 -080042import static org.easymock.EasyMock.createMock;
43import static org.easymock.EasyMock.expectLastCall;
44import static org.easymock.EasyMock.replay;
45import static org.hamcrest.Matchers.is;
46import static org.hamcrest.Matchers.notNullValue;
47import static org.junit.Assert.assertThat;
48
49/**
50 * Unit test for ControlMetricsCollector.
51 */
52public class ControlMetricsCollectorResourceTest extends JerseyTest {
53
54 final ControlPlaneMonitorService mockControlPlaneMonitorService =
55 createMock(ControlPlaneMonitorService.class);
56
Jian Li54df73e2016-02-01 17:09:03 -080057 private static final String PREFIX = "collector";
58
Jian Lic132c112016-01-28 20:27:34 -080059 /**
Jian Li1fdd2242016-02-05 10:01:19 -080060 * Constructs a control metrics collector resource test instance.
61 */
62 public ControlMetricsCollectorResourceTest() {
63 super(new WebAppDescriptor.Builder("javax.ws.rs.Application",
64 CPManWebApplication.class.getCanonicalName())
65 .servletClass(ServletContainer.class).build());
66 }
67
68 /**
Jian Lic132c112016-01-28 20:27:34 -080069 * Sets up the global values for all the tests.
70 */
71 @Before
72 public void setUpTest() {
73 ServiceDirectory testDirectory =
74 new TestServiceDirectory()
75 .add(ControlPlaneMonitorService.class, mockControlPlaneMonitorService);
76 BaseResource.setServiceDirectory(testDirectory);
77 }
78
Jian Li1fdd2242016-02-05 10:01:19 -080079 /**
80 * Tests CPU metrics POST through REST API.
81 */
Jian Lic132c112016-01-28 20:27:34 -080082 @Test
83 public void testCpuMetricsPost() {
Jian Lic5cb4a12016-02-03 23:24:42 -080084 mockControlPlaneMonitorService.updateMetric(anyObject(), anyInt(),
Jian Lic132c112016-01-28 20:27:34 -080085 (Optional<DeviceId>) anyObject());
86 expectLastCall().times(5);
87 replay(mockControlPlaneMonitorService);
Jian Li54df73e2016-02-01 17:09:03 -080088 basePostTest("cpu-metrics-post.json", PREFIX + "/cpu_metrics");
Jian Lic132c112016-01-28 20:27:34 -080089 }
90
Jian Li1fdd2242016-02-05 10:01:19 -080091 /**
92 * Tests memory metrics POST through REST API.
93 */
Jian Lic132c112016-01-28 20:27:34 -080094 @Test
95 public void testMemoryMetricsPost() {
Jian Lic5cb4a12016-02-03 23:24:42 -080096 mockControlPlaneMonitorService.updateMetric(anyObject(), anyInt(),
Jian Lic132c112016-01-28 20:27:34 -080097 (Optional<DeviceId>) anyObject());
98 expectLastCall().times(4);
99 replay(mockControlPlaneMonitorService);
Jian Li54df73e2016-02-01 17:09:03 -0800100 basePostTest("memory-metrics-post.json", PREFIX + "/memory_metrics");
Jian Lic132c112016-01-28 20:27:34 -0800101 }
102
Jian Li1fdd2242016-02-05 10:01:19 -0800103 /**
104 * Tests disk metrics POST through REST API.
105 */
Jian Lic132c112016-01-28 20:27:34 -0800106 @Test
Jian Li1fdd2242016-02-05 10:01:19 -0800107 public void testDiskMetrics() {
Jian Lic5cb4a12016-02-03 23:24:42 -0800108 mockControlPlaneMonitorService.updateMetric(anyObject(), anyInt(), anyString());
Jian Liba6b1172016-02-01 22:40:42 -0800109 expectLastCall().times(4);
Jian Lic132c112016-01-28 20:27:34 -0800110 replay(mockControlPlaneMonitorService);
Jian Li54df73e2016-02-01 17:09:03 -0800111 basePostTest("disk-metrics-post.json", PREFIX + "/disk_metrics");
Jian Lic132c112016-01-28 20:27:34 -0800112 }
113
Jian Li1fdd2242016-02-05 10:01:19 -0800114 /**
115 * Tests network metrics POST through REST API.
116 */
Jian Lic132c112016-01-28 20:27:34 -0800117 @Test
Jian Li1fdd2242016-02-05 10:01:19 -0800118 public void testNetworkMetrics() {
Jian Lic5cb4a12016-02-03 23:24:42 -0800119 mockControlPlaneMonitorService.updateMetric(anyObject(), anyInt(), anyString());
Jian Liba6b1172016-02-01 22:40:42 -0800120 expectLastCall().times(8);
Jian Lic132c112016-01-28 20:27:34 -0800121 replay(mockControlPlaneMonitorService);
Jian Li54df73e2016-02-01 17:09:03 -0800122 basePostTest("network-metrics-post.json", PREFIX + "/network_metrics");
Jian Lic132c112016-01-28 20:27:34 -0800123 }
124
125 @Test
126 public void testSystemSpecsPost() {
Jian Li54df73e2016-02-01 17:09:03 -0800127 basePostTest("system-spec-post.json", PREFIX + "/system_specs");
Jian Lic132c112016-01-28 20:27:34 -0800128 }
129
Jian Liba6b1172016-02-01 22:40:42 -0800130 private ClientResponse baseTest(String jsonFile, String path) {
Jian Lic132c112016-01-28 20:27:34 -0800131 final WebResource rs = resource();
132 InputStream jsonStream = ControlMetricsCollectorResourceTest.class
133 .getResourceAsStream(jsonFile);
134
135 assertThat(jsonStream, notNullValue());
136
Jian Liba6b1172016-02-01 22:40:42 -0800137 return rs.path(path)
Jian Lic132c112016-01-28 20:27:34 -0800138 .type(MediaType.APPLICATION_JSON_TYPE)
139 .post(ClientResponse.class, jsonStream);
Jian Liba6b1172016-02-01 22:40:42 -0800140 }
141
142 private void basePostTest(String jsonFile, String path) {
143 ClientResponse response = baseTest(jsonFile, path);
Jian Lic132c112016-01-28 20:27:34 -0800144 assertThat(response.getStatus(), is(HttpURLConnection.HTTP_OK));
145 }
146
Jian Lic132c112016-01-28 20:27:34 -0800147 /**
148 * Assigns an available port for the test.
149 *
150 * @param defaultPort If a port cannot be determined, this one is used.
151 * @return free port
152 */
153 @Override
154 public int getPort(int defaultPort) {
155 try {
156 ServerSocket socket = new ServerSocket(0);
157 socket.setReuseAddress(true);
158 int port = socket.getLocalPort();
159 socket.close();
160 return port;
161 } catch (IOException ioe) {
162 return defaultPort;
163 }
164 }
165
166 @Override
167 public AppDescriptor configure() {
168 return new WebAppDescriptor.Builder("org.onosproject.cpman.rest").build();
169 }
170}