Committed by
Gerrit Code Review
[ONOS-3601] Add more cases in metrics REST API unit test
Change-Id: Ifa0398517d54149822a4c13bc06a3944c909abc6
Showing
1 changed file
with
144 additions
and
3 deletions
| ... | @@ -18,10 +18,13 @@ package org.onosproject.rest; | ... | @@ -18,10 +18,13 @@ package org.onosproject.rest; |
| 18 | import com.codahale.metrics.Counter; | 18 | import com.codahale.metrics.Counter; |
| 19 | import com.codahale.metrics.Meter; | 19 | import com.codahale.metrics.Meter; |
| 20 | import com.codahale.metrics.Metric; | 20 | import com.codahale.metrics.Metric; |
| 21 | +import com.codahale.metrics.Timer; | ||
| 21 | import com.eclipsesource.json.JsonArray; | 22 | import com.eclipsesource.json.JsonArray; |
| 22 | import com.eclipsesource.json.JsonObject; | 23 | import com.eclipsesource.json.JsonObject; |
| 23 | import com.google.common.collect.ImmutableMap; | 24 | import com.google.common.collect.ImmutableMap; |
| 24 | import com.sun.jersey.api.client.WebResource; | 25 | import com.sun.jersey.api.client.WebResource; |
| 26 | +import org.hamcrest.Description; | ||
| 27 | +import org.hamcrest.TypeSafeMatcher; | ||
| 25 | import org.junit.After; | 28 | import org.junit.After; |
| 26 | import org.junit.Before; | 29 | import org.junit.Before; |
| 27 | import org.junit.Test; | 30 | import org.junit.Test; |
| ... | @@ -32,6 +35,8 @@ import org.onlab.rest.BaseResource; | ... | @@ -32,6 +35,8 @@ import org.onlab.rest.BaseResource; |
| 32 | import org.onosproject.codec.CodecService; | 35 | import org.onosproject.codec.CodecService; |
| 33 | import org.onosproject.codec.impl.CodecManager; | 36 | import org.onosproject.codec.impl.CodecManager; |
| 34 | 37 | ||
| 38 | +import java.util.concurrent.TimeUnit; | ||
| 39 | + | ||
| 35 | import static org.easymock.EasyMock.createMock; | 40 | import static org.easymock.EasyMock.createMock; |
| 36 | import static org.easymock.EasyMock.expect; | 41 | import static org.easymock.EasyMock.expect; |
| 37 | import static org.easymock.EasyMock.replay; | 42 | import static org.easymock.EasyMock.replay; |
| ... | @@ -40,6 +45,7 @@ import static org.hamcrest.Matchers.containsString; | ... | @@ -40,6 +45,7 @@ import static org.hamcrest.Matchers.containsString; |
| 40 | import static org.hamcrest.Matchers.is; | 45 | import static org.hamcrest.Matchers.is; |
| 41 | import static org.hamcrest.Matchers.notNullValue; | 46 | import static org.hamcrest.Matchers.notNullValue; |
| 42 | import static org.junit.Assert.assertThat; | 47 | import static org.junit.Assert.assertThat; |
| 48 | +import static org.junit.Assert.assertTrue; | ||
| 43 | 49 | ||
| 44 | /** | 50 | /** |
| 45 | * Unit tests for Metrics REST APIs. | 51 | * Unit tests for Metrics REST APIs. |
| ... | @@ -73,20 +79,24 @@ public class MetricsResourceTest extends ResourceTest { | ... | @@ -73,20 +79,24 @@ public class MetricsResourceTest extends ResourceTest { |
| 73 | } | 79 | } |
| 74 | 80 | ||
| 75 | /** | 81 | /** |
| 76 | - * Tests that a fetch of a non-existent object throws an exception. | 82 | + * Tests GetAllMetrics method. |
| 77 | */ | 83 | */ |
| 78 | @Test | 84 | @Test |
| 79 | - public void testBadGet() { | 85 | + public void testGetAllMetrics() { |
| 80 | Counter onosCounter = new Counter(); | 86 | Counter onosCounter = new Counter(); |
| 81 | onosCounter.inc(); | 87 | onosCounter.inc(); |
| 82 | 88 | ||
| 83 | Meter onosMeter = new Meter(); | 89 | Meter onosMeter = new Meter(); |
| 84 | onosMeter.mark(); | 90 | onosMeter.mark(); |
| 85 | 91 | ||
| 92 | + Timer onosTimer = new Timer(); | ||
| 93 | + onosTimer.update(1, TimeUnit.MILLISECONDS); | ||
| 94 | + | ||
| 86 | ImmutableMap<String, Metric> metrics = | 95 | ImmutableMap<String, Metric> metrics = |
| 87 | new ImmutableMap.Builder<String, Metric>() | 96 | new ImmutableMap.Builder<String, Metric>() |
| 88 | .put("onosCounter", onosCounter) | 97 | .put("onosCounter", onosCounter) |
| 89 | .put("onosMeter", onosMeter) | 98 | .put("onosMeter", onosMeter) |
| 99 | + .put("onosTimer", onosTimer) | ||
| 90 | .build(); | 100 | .build(); |
| 91 | 101 | ||
| 92 | expect(mockMetricsService.getMetrics()) | 102 | expect(mockMetricsService.getMetrics()) |
| ... | @@ -104,6 +114,137 @@ public class MetricsResourceTest extends ResourceTest { | ... | @@ -104,6 +114,137 @@ public class MetricsResourceTest extends ResourceTest { |
| 104 | 114 | ||
| 105 | JsonArray jsonMetrics = result.get("metrics").asArray(); | 115 | JsonArray jsonMetrics = result.get("metrics").asArray(); |
| 106 | assertThat(jsonMetrics, notNullValue()); | 116 | assertThat(jsonMetrics, notNullValue()); |
| 107 | - assertThat(jsonMetrics.size(), is(2)); | 117 | + assertThat(jsonMetrics.size(), is(3)); |
| 118 | + | ||
| 119 | + assertTrue(matchesMetric(metrics.get("onosCounter")).matchesSafely(jsonMetrics.get(0).asObject())); | ||
| 120 | + assertTrue(matchesMetric(metrics.get("onosMeter")).matchesSafely(jsonMetrics.get(1).asObject())); | ||
| 121 | + assertTrue(matchesMetric(metrics.get("onosTimer")).matchesSafely(jsonMetrics.get(2).asObject())); | ||
| 122 | + } | ||
| 123 | + | ||
| 124 | + /** | ||
| 125 | + * Hamcrest matcher to check that an device representation in JSON matches | ||
| 126 | + * the actual device. | ||
| 127 | + */ | ||
| 128 | + public static class MetricJsonMatcher extends TypeSafeMatcher<JsonObject> { | ||
| 129 | + private final Metric metric; | ||
| 130 | + private String reason = ""; | ||
| 131 | + | ||
| 132 | + public MetricJsonMatcher(Metric metricValue) { | ||
| 133 | + this.metric = metricValue; | ||
| 134 | + } | ||
| 135 | + | ||
| 136 | + @Override | ||
| 137 | + public boolean matchesSafely(JsonObject jsonObject) { | ||
| 138 | + | ||
| 139 | + JsonObject jsonMetric = jsonObject.get("metric").asObject(); | ||
| 140 | + JsonObject jsonCounter; | ||
| 141 | + JsonObject jsonMeter; | ||
| 142 | + JsonObject jsonTimer; | ||
| 143 | + Counter counter; | ||
| 144 | + Meter meter; | ||
| 145 | + Timer timer; | ||
| 146 | + | ||
| 147 | + // check counter metric | ||
| 148 | + if (jsonMetric.get("counter") != null) { | ||
| 149 | + jsonCounter = jsonMetric.get("counter").asObject(); | ||
| 150 | + counter = (Counter) metric; | ||
| 151 | + if (jsonCounter.get("counter").asLong() != counter.getCount()) { | ||
| 152 | + reason = "counter " + counter.getCount(); | ||
| 153 | + return false; | ||
| 154 | + } | ||
| 155 | + } | ||
| 156 | + | ||
| 157 | + // check meter metric | ||
| 158 | + if (jsonMetric.get("meter") != null) { | ||
| 159 | + jsonMeter = jsonMetric.get("meter").asObject(); | ||
| 160 | + meter = (Meter) metric; | ||
| 161 | + | ||
| 162 | + if (jsonMeter.get("counter").asLong() != meter.getCount()) { | ||
| 163 | + reason = "counter " + meter.getCount(); | ||
| 164 | + return false; | ||
| 165 | + } | ||
| 166 | + | ||
| 167 | + if (jsonMeter.get("1_min_rate").asDouble() != meter.getOneMinuteRate()) { | ||
| 168 | + reason = "1 minute rate " + meter.getOneMinuteRate(); | ||
| 169 | + return false; | ||
| 170 | + } | ||
| 171 | + | ||
| 172 | + if (jsonMeter.get("5_min_rate").asDouble() != meter.getOneMinuteRate()) { | ||
| 173 | + reason = "5 minute rate " + meter.getFiveMinuteRate(); | ||
| 174 | + return false; | ||
| 175 | + } | ||
| 176 | + | ||
| 177 | + if (jsonMeter.get("15_min_rate").asDouble() != meter.getFifteenMinuteRate()) { | ||
| 178 | + reason = "15 minute rate " + meter.getFifteenMinuteRate(); | ||
| 179 | + return false; | ||
| 180 | + } | ||
| 181 | + } | ||
| 182 | + | ||
| 183 | + if (jsonMetric.get("timer") != null) { | ||
| 184 | + jsonTimer = jsonMetric.get("timer").asObject(); | ||
| 185 | + timer = (Timer) metric; | ||
| 186 | + | ||
| 187 | + if (jsonTimer.get("counter").asLong() != timer.getCount()) { | ||
| 188 | + reason = "counter " + timer.getCount(); | ||
| 189 | + return false; | ||
| 190 | + } | ||
| 191 | + | ||
| 192 | + if (jsonTimer.get("1_min_rate").asDouble() != timer.getOneMinuteRate()) { | ||
| 193 | + reason = "1 minute rate " + timer.getOneMinuteRate(); | ||
| 194 | + return false; | ||
| 195 | + } | ||
| 196 | + | ||
| 197 | + if (jsonTimer.get("5_min_rate").asDouble() != timer.getOneMinuteRate()) { | ||
| 198 | + reason = "5 minute rate " + timer.getFiveMinuteRate(); | ||
| 199 | + return false; | ||
| 200 | + } | ||
| 201 | + | ||
| 202 | + if (jsonTimer.get("15_min_rate").asDouble() != timer.getFifteenMinuteRate()) { | ||
| 203 | + reason = "15 minute rate " + timer.getFifteenMinuteRate(); | ||
| 204 | + return false; | ||
| 205 | + } | ||
| 206 | + | ||
| 207 | + if (jsonTimer.get("mean").asDouble() != nanoToMs(timer.getSnapshot().getMean())) { | ||
| 208 | + reason = "mean " + timer.getSnapshot().getMean(); | ||
| 209 | + return false; | ||
| 210 | + } | ||
| 211 | + | ||
| 212 | + if (jsonTimer.get("min").asDouble() != nanoToMs(timer.getSnapshot().getMin())) { | ||
| 213 | + reason = "min " + timer.getSnapshot().getMin(); | ||
| 214 | + return false; | ||
| 215 | + } | ||
| 216 | + | ||
| 217 | + if (jsonTimer.get("max").asDouble() != nanoToMs(timer.getSnapshot().getMax())) { | ||
| 218 | + reason = "max " + timer.getSnapshot().getMax(); | ||
| 219 | + return false; | ||
| 220 | + } | ||
| 221 | + | ||
| 222 | + if (jsonTimer.get("stddev").asDouble() != nanoToMs(timer.getSnapshot().getStdDev())) { | ||
| 223 | + reason = "stddev " + timer.getSnapshot().getStdDev(); | ||
| 224 | + return false; | ||
| 225 | + } | ||
| 226 | + } | ||
| 227 | + | ||
| 228 | + return true; | ||
| 229 | + } | ||
| 230 | + | ||
| 231 | + @Override | ||
| 232 | + public void describeTo(Description description) { | ||
| 233 | + description.appendText(reason); | ||
| 234 | + } | ||
| 235 | + | ||
| 236 | + private double nanoToMs(double nano) { | ||
| 237 | + return nano / 1_000_000D; | ||
| 238 | + } | ||
| 239 | + } | ||
| 240 | + | ||
| 241 | + /** | ||
| 242 | + * Factory to allocate an metric matcher. | ||
| 243 | + * | ||
| 244 | + * @param metric metric object we are looking for | ||
| 245 | + * @return matcher | ||
| 246 | + */ | ||
| 247 | + private static MetricJsonMatcher matchesMetric(Metric metric) { | ||
| 248 | + return new MetricJsonMatcher(metric); | ||
| 108 | } | 249 | } |
| 109 | } | 250 | } | ... | ... |
-
Please register or login to post a comment