blob: ac84e1da0bbecc0e7f2c5eeac5d41bb167f64f6d [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;
Jian Li1a424692016-02-03 16:21:18 -080030import org.onosproject.cpman.SystemInfo;
31import org.onosproject.cpman.impl.SystemInfoFactory;
Jian Lic132c112016-01-28 20:27:34 -080032import org.onosproject.net.DeviceId;
33
34import javax.ws.rs.core.MediaType;
35import java.io.IOException;
36import java.io.InputStream;
37import java.net.HttpURLConnection;
38import java.net.ServerSocket;
39import java.util.Optional;
40
Jian Lic5cb4a12016-02-03 23:24:42 -080041import static org.easymock.EasyMock.anyInt;
Jian Lic132c112016-01-28 20:27:34 -080042import static org.easymock.EasyMock.anyObject;
Jian Liba6b1172016-02-01 22:40:42 -080043import static org.easymock.EasyMock.anyString;
Jian Lic132c112016-01-28 20:27:34 -080044import static org.easymock.EasyMock.createMock;
45import static org.easymock.EasyMock.expectLastCall;
46import static org.easymock.EasyMock.replay;
47import static org.hamcrest.Matchers.is;
48import static org.hamcrest.Matchers.notNullValue;
49import static org.junit.Assert.assertThat;
50
51/**
52 * Unit test for ControlMetricsCollector.
53 */
54public class ControlMetricsCollectorResourceTest extends JerseyTest {
55
56 final ControlPlaneMonitorService mockControlPlaneMonitorService =
57 createMock(ControlPlaneMonitorService.class);
58
Jian Li54df73e2016-02-01 17:09:03 -080059 private static final String PREFIX = "collector";
60
Jian Lic132c112016-01-28 20:27:34 -080061 /**
Jian Li1fdd2242016-02-05 10:01:19 -080062 * Constructs a control metrics collector resource test instance.
63 */
64 public ControlMetricsCollectorResourceTest() {
65 super(new WebAppDescriptor.Builder("javax.ws.rs.Application",
66 CPManWebApplication.class.getCanonicalName())
67 .servletClass(ServletContainer.class).build());
68 }
69
70 /**
Jian Lic132c112016-01-28 20:27:34 -080071 * Sets up the global values for all the tests.
72 */
73 @Before
74 public void setUpTest() {
75 ServiceDirectory testDirectory =
76 new TestServiceDirectory()
77 .add(ControlPlaneMonitorService.class, mockControlPlaneMonitorService);
78 BaseResource.setServiceDirectory(testDirectory);
79 }
80
Jian Li1fdd2242016-02-05 10:01:19 -080081 /**
82 * Tests CPU metrics POST through REST API.
83 */
Jian Lic132c112016-01-28 20:27:34 -080084 @Test
85 public void testCpuMetricsPost() {
Jian Lic5cb4a12016-02-03 23:24:42 -080086 mockControlPlaneMonitorService.updateMetric(anyObject(), anyInt(),
Jian Lic132c112016-01-28 20:27:34 -080087 (Optional<DeviceId>) anyObject());
88 expectLastCall().times(5);
89 replay(mockControlPlaneMonitorService);
Jian Li54df73e2016-02-01 17:09:03 -080090 basePostTest("cpu-metrics-post.json", PREFIX + "/cpu_metrics");
Jian Lic132c112016-01-28 20:27:34 -080091 }
92
Jian Li1fdd2242016-02-05 10:01:19 -080093 /**
94 * Tests memory metrics POST through REST API.
95 */
Jian Lic132c112016-01-28 20:27:34 -080096 @Test
97 public void testMemoryMetricsPost() {
Jian Lic5cb4a12016-02-03 23:24:42 -080098 mockControlPlaneMonitorService.updateMetric(anyObject(), anyInt(),
Jian Lic132c112016-01-28 20:27:34 -080099 (Optional<DeviceId>) anyObject());
100 expectLastCall().times(4);
101 replay(mockControlPlaneMonitorService);
Jian Li54df73e2016-02-01 17:09:03 -0800102 basePostTest("memory-metrics-post.json", PREFIX + "/memory_metrics");
Jian Lic132c112016-01-28 20:27:34 -0800103 }
104
Jian Li1fdd2242016-02-05 10:01:19 -0800105 /**
106 * Tests disk metrics POST through REST API.
107 */
Jian Lic132c112016-01-28 20:27:34 -0800108 @Test
Jian Li1fdd2242016-02-05 10:01:19 -0800109 public void testDiskMetrics() {
Jian Lic5cb4a12016-02-03 23:24:42 -0800110 mockControlPlaneMonitorService.updateMetric(anyObject(), anyInt(), anyString());
Jian Liba6b1172016-02-01 22:40:42 -0800111 expectLastCall().times(4);
Jian Lic132c112016-01-28 20:27:34 -0800112 replay(mockControlPlaneMonitorService);
Jian Li54df73e2016-02-01 17:09:03 -0800113 basePostTest("disk-metrics-post.json", PREFIX + "/disk_metrics");
Jian Lic132c112016-01-28 20:27:34 -0800114 }
115
Jian Li1fdd2242016-02-05 10:01:19 -0800116 /**
117 * Tests network metrics POST through REST API.
118 */
Jian Lic132c112016-01-28 20:27:34 -0800119 @Test
Jian Li1fdd2242016-02-05 10:01:19 -0800120 public void testNetworkMetrics() {
Jian Lic5cb4a12016-02-03 23:24:42 -0800121 mockControlPlaneMonitorService.updateMetric(anyObject(), anyInt(), anyString());
Jian Liba6b1172016-02-01 22:40:42 -0800122 expectLastCall().times(8);
Jian Lic132c112016-01-28 20:27:34 -0800123 replay(mockControlPlaneMonitorService);
Jian Li54df73e2016-02-01 17:09:03 -0800124 basePostTest("network-metrics-post.json", PREFIX + "/network_metrics");
Jian Lic132c112016-01-28 20:27:34 -0800125 }
126
127 @Test
Jian Li1a424692016-02-03 16:21:18 -0800128 public void testSystemInfoPost() {
129 basePostTest("system-info-post.json", PREFIX + "/system_info");
130
131 SystemInfo si = SystemInfoFactory.getInstance().getSystemInfo();
132 assertThat(si.cpuSpeed(), is(2048));
133 assertThat(si.coreCount(), is(6));
134 assertThat(si.cpuCount(), is(2));
135 assertThat(si.totalMemory(), is(4096));
Jian Lic132c112016-01-28 20:27:34 -0800136 }
137
Jian Liba6b1172016-02-01 22:40:42 -0800138 private ClientResponse baseTest(String jsonFile, String path) {
Jian Lic132c112016-01-28 20:27:34 -0800139 final WebResource rs = resource();
140 InputStream jsonStream = ControlMetricsCollectorResourceTest.class
141 .getResourceAsStream(jsonFile);
142
143 assertThat(jsonStream, notNullValue());
144
Jian Liba6b1172016-02-01 22:40:42 -0800145 return rs.path(path)
Jian Lic132c112016-01-28 20:27:34 -0800146 .type(MediaType.APPLICATION_JSON_TYPE)
147 .post(ClientResponse.class, jsonStream);
Jian Liba6b1172016-02-01 22:40:42 -0800148 }
149
150 private void basePostTest(String jsonFile, String path) {
151 ClientResponse response = baseTest(jsonFile, path);
Jian Lic132c112016-01-28 20:27:34 -0800152 assertThat(response.getStatus(), is(HttpURLConnection.HTTP_OK));
153 }
154
Jian Lic132c112016-01-28 20:27:34 -0800155 /**
156 * Assigns an available port for the test.
157 *
158 * @param defaultPort If a port cannot be determined, this one is used.
159 * @return free port
160 */
161 @Override
162 public int getPort(int defaultPort) {
163 try {
164 ServerSocket socket = new ServerSocket(0);
165 socket.setReuseAddress(true);
166 int port = socket.getLocalPort();
167 socket.close();
168 return port;
169 } catch (IOException ioe) {
170 return defaultPort;
171 }
172 }
173
174 @Override
175 public AppDescriptor configure() {
176 return new WebAppDescriptor.Builder("org.onosproject.cpman.rest").build();
177 }
178}