1 | /* |
2 | * Copyright (c) 2001-2009, Jean Tessier |
3 | * All rights reserved. |
4 | * |
5 | * Redistribution and use in source and binary forms, with or without |
6 | * modification, are permitted provided that the following conditions |
7 | * are met: |
8 | * |
9 | * * Redistributions of source code must retain the above copyright |
10 | * notice, this list of conditions and the following disclaimer. |
11 | * |
12 | * * Redistributions in binary form must reproduce the above copyright |
13 | * notice, this list of conditions and the following disclaimer in the |
14 | * documentation and/or other materials provided with the distribution. |
15 | * |
16 | * * Neither the name of Jean Tessier nor the names of his contributors |
17 | * may be used to endorse or promote products derived from this software |
18 | * without specific prior written permission. |
19 | * |
20 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
21 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
22 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
23 | * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR |
24 | * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
25 | * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
26 | * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
27 | * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
28 | * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
29 | * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
30 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
31 | */ |
32 | |
33 | package com.jeantessier.metrics; |
34 | |
35 | import junit.framework.*; |
36 | |
37 | public class TestRatioMeasurement extends TestCase implements MeasurementVisitor { |
38 | private MeasurementDescriptor descriptor; |
39 | private RatioMeasurement measurement; |
40 | private Metrics metrics; |
41 | private Measurement visited; |
42 | |
43 | private Measurement m1; |
44 | private Measurement m2; |
45 | |
46 | protected void setUp() throws Exception { |
47 | metrics = new Metrics("foobar"); |
48 | |
49 | m1 = new CounterMeasurement(null, metrics, null); |
50 | m2 = new CounterMeasurement(null, metrics, null); |
51 | |
52 | metrics.track("base", m1); |
53 | metrics.track("divider", m2); |
54 | |
55 | descriptor = new MeasurementDescriptor(); |
56 | descriptor.setShortName("foo"); |
57 | descriptor.setLongName("bar"); |
58 | descriptor.setClassFor(RatioMeasurement.class); |
59 | descriptor.setInitText("base\ndivider"); |
60 | descriptor.setCached(false); |
61 | } |
62 | |
63 | public void testMeasurementDescriptor() { |
64 | measurement = new RatioMeasurement(descriptor, metrics, "base\ndivider"); |
65 | |
66 | assertNotNull(measurement.getDescriptor()); |
67 | assertEquals(RatioMeasurement.class, measurement.getDescriptor().getClassFor()); |
68 | assertEquals("foo", measurement.getShortName()); |
69 | assertEquals("bar", measurement.getLongName()); |
70 | } |
71 | |
72 | public void testCreateFromMeasurementDescriptor() throws Exception { |
73 | descriptor.setInitText(null); |
74 | |
75 | measurement = (RatioMeasurement) descriptor.createMeasurement(); |
76 | |
77 | assertNotNull(measurement); |
78 | assertEquals(descriptor, measurement.getDescriptor()); |
79 | assertSame(descriptor, measurement.getDescriptor()); |
80 | assertEquals(RatioMeasurement.class, measurement.getClass()); |
81 | assertEquals("foo", measurement.getShortName()); |
82 | assertEquals("bar", measurement.getLongName()); |
83 | |
84 | assertNull(measurement.getBaseName()); |
85 | assertNull(measurement.getDividerName()); |
86 | assertTrue(Double.isNaN(measurement.getValue().doubleValue())); |
87 | } |
88 | |
89 | public void testCreateAndInitFromMeasurementDescriptor() throws Exception { |
90 | measurement = (RatioMeasurement) descriptor.createMeasurement(); |
91 | |
92 | assertNotNull(measurement); |
93 | assertEquals(descriptor, measurement.getDescriptor()); |
94 | assertSame(descriptor, measurement.getDescriptor()); |
95 | assertEquals(RatioMeasurement.class, measurement.getClass()); |
96 | assertEquals("foo", measurement.getShortName()); |
97 | assertEquals("bar", measurement.getLongName()); |
98 | assertEquals("base", measurement.getBaseName()); |
99 | assertEquals("divider", measurement.getDividerName()); |
100 | |
101 | assertTrue(Double.isNaN(measurement.getValue().doubleValue())); |
102 | } |
103 | |
104 | public void testCreate() { |
105 | measurement = new RatioMeasurement(null, null, null); |
106 | |
107 | assertNull(measurement.getBaseName()); |
108 | assertEquals(StatisticalMeasurement.DISPOSE_IGNORE, measurement.getBaseDispose()); |
109 | assertNull(measurement.getDividerName()); |
110 | assertEquals(StatisticalMeasurement.DISPOSE_IGNORE, measurement.getDividerDispose()); |
111 | |
112 | measurement = new RatioMeasurement(null, null, "base\ndivider"); |
113 | |
114 | assertEquals("base", measurement.getBaseName()); |
115 | assertEquals(StatisticalMeasurement.DISPOSE_IGNORE, measurement.getBaseDispose()); |
116 | assertEquals("divider", measurement.getDividerName()); |
117 | assertEquals(StatisticalMeasurement.DISPOSE_IGNORE, measurement.getDividerDispose()); |
118 | |
119 | measurement = new RatioMeasurement(null, null, "base"); |
120 | |
121 | assertNull(measurement.getBaseName()); |
122 | assertEquals(StatisticalMeasurement.DISPOSE_IGNORE, measurement.getBaseDispose()); |
123 | assertNull(measurement.getDividerName()); |
124 | assertEquals(StatisticalMeasurement.DISPOSE_IGNORE, measurement.getDividerDispose()); |
125 | |
126 | measurement = new RatioMeasurement(null, null, null); |
127 | |
128 | assertNull(measurement.getBaseName()); |
129 | assertEquals(StatisticalMeasurement.DISPOSE_IGNORE, measurement.getBaseDispose()); |
130 | assertNull(measurement.getDividerName()); |
131 | assertEquals(StatisticalMeasurement.DISPOSE_IGNORE, measurement.getDividerDispose()); |
132 | |
133 | measurement = new RatioMeasurement(null, null, "foo\nbar"); |
134 | |
135 | assertEquals("foo", measurement.getBaseName()); |
136 | assertEquals(StatisticalMeasurement.DISPOSE_IGNORE, measurement.getBaseDispose()); |
137 | assertEquals("bar", measurement.getDividerName()); |
138 | assertEquals(StatisticalMeasurement.DISPOSE_IGNORE, measurement.getDividerDispose()); |
139 | |
140 | measurement = new RatioMeasurement(null, null, "foo\nbar"); |
141 | |
142 | assertEquals("foo", measurement.getBaseName()); |
143 | assertEquals(StatisticalMeasurement.DISPOSE_IGNORE, measurement.getBaseDispose()); |
144 | assertEquals("bar", measurement.getDividerName()); |
145 | assertEquals(StatisticalMeasurement.DISPOSE_IGNORE, measurement.getDividerDispose()); |
146 | |
147 | measurement = new RatioMeasurement(null, null, "foo DISPOSE_MINIMUM\nbar DISPOSE_AVERAGE"); |
148 | |
149 | assertEquals("foo", measurement.getBaseName()); |
150 | assertEquals(StatisticalMeasurement.DISPOSE_MINIMUM, measurement.getBaseDispose()); |
151 | assertEquals("bar", measurement.getDividerName()); |
152 | assertEquals(StatisticalMeasurement.DISPOSE_AVERAGE, measurement.getDividerDispose()); |
153 | } |
154 | |
155 | public void testStatistical() { |
156 | Metrics c = new Metrics("foobar"); |
157 | Metrics m1 = new Metrics("foo"); |
158 | Metrics m2 = new Metrics("bar"); |
159 | |
160 | c.addSubMetrics(m1); |
161 | c.addSubMetrics(m2); |
162 | |
163 | m1.track("base", new CounterMeasurement(null, null, null)); |
164 | m1.track("divider", new CounterMeasurement(null, null, null)); |
165 | m2.track("base", new CounterMeasurement(null, null, null)); |
166 | m2.track("divider", new CounterMeasurement(null, null, null)); |
167 | |
168 | m1.addToMeasurement("base", 1); |
169 | m1.addToMeasurement("divider", 2); |
170 | m2.addToMeasurement("base", 3); |
171 | m2.addToMeasurement("divider", 4); |
172 | |
173 | c.track("base", new StatisticalMeasurement(null, c, "base")); |
174 | c.track("divider", new StatisticalMeasurement(null, c, "divider")); |
175 | |
176 | measurement = new RatioMeasurement(descriptor, c, "base DISPOSE_MINIMUM\ndivider DISPOSE_MINIMUM"); |
177 | assertEquals(0.5, measurement.getValue().doubleValue(), 0.01); |
178 | |
179 | measurement = new RatioMeasurement(descriptor, c, "base DISPOSE_AVERAGE\ndivider DISPOSE_AVERAGE"); |
180 | assertEquals(2.0 / 3.0, measurement.getValue().doubleValue(), 0.01); |
181 | |
182 | measurement = new RatioMeasurement(descriptor, c, "base DISPOSE_AVERAGE\ndivider DISPOSE_NB_DATA_POINTS"); |
183 | assertEquals(1.0, measurement.getValue().doubleValue(), 0.01); |
184 | } |
185 | |
186 | public void testNormal() throws Exception { |
187 | measurement = (RatioMeasurement) descriptor.createMeasurement(metrics); |
188 | |
189 | m1.add(10); |
190 | m2.add(1); |
191 | |
192 | assertEquals(10 / 1, measurement.getValue().intValue()); |
193 | |
194 | m2.add(1); |
195 | |
196 | assertEquals(10 / 2, measurement.getValue().intValue()); |
197 | |
198 | m1.add(m1.getValue()); |
199 | |
200 | assertEquals(20 / 2, measurement.getValue().intValue()); |
201 | } |
202 | |
203 | public void testDevideByZero() throws Exception { |
204 | measurement = (RatioMeasurement) descriptor.createMeasurement(metrics); |
205 | |
206 | assertTrue("0/0 not NaN", Double.isNaN(measurement.getValue().doubleValue())); |
207 | |
208 | m1.add(1); |
209 | |
210 | assertTrue("1/0 not infitity", Double.isInfinite(measurement.getValue().doubleValue())); |
211 | |
212 | m1.add(-2); |
213 | |
214 | assertTrue("-1/0 not infitity", Double.isInfinite(measurement.getValue().doubleValue())); |
215 | } |
216 | |
217 | public void testZeroDevidedBy() throws Exception { |
218 | measurement = (RatioMeasurement) descriptor.createMeasurement(metrics); |
219 | |
220 | assertTrue("0/0 not NaN", Double.isNaN(measurement.getValue().doubleValue())); |
221 | |
222 | m2.add(1); |
223 | |
224 | assertEquals("0/1 not zero", 0.0, measurement.getValue().doubleValue(), 0.01); |
225 | |
226 | m2.add(-2); |
227 | |
228 | assertEquals("0/-1 not zero", 0.0, measurement.getValue().doubleValue(), 0.01); |
229 | } |
230 | |
231 | public void testInUndefinedRange() throws Exception { |
232 | measurement = (RatioMeasurement) descriptor.createMeasurement(metrics); |
233 | |
234 | m2.add(1); |
235 | |
236 | assertTrue(measurement.isInRange()); |
237 | |
238 | m1.add(1); |
239 | |
240 | assertTrue(measurement.isInRange()); |
241 | |
242 | m1.add(2); |
243 | |
244 | assertTrue(measurement.isInRange()); |
245 | } |
246 | |
247 | public void testInOpenRange() throws Exception { |
248 | measurement = (RatioMeasurement) descriptor.createMeasurement(metrics); |
249 | |
250 | m2.add(1); |
251 | |
252 | assertTrue(measurement.isInRange()); |
253 | |
254 | m1.add(1); |
255 | |
256 | assertTrue(measurement.isInRange()); |
257 | |
258 | m1.add(2); |
259 | |
260 | assertTrue(measurement.isInRange()); |
261 | } |
262 | |
263 | public void testInLowerBoundRange() throws Exception { |
264 | descriptor.setLowerThreshold(new Integer(1)); |
265 | |
266 | measurement = (RatioMeasurement) descriptor.createMeasurement(metrics); |
267 | |
268 | m2.add(1); |
269 | |
270 | assertTrue(!measurement.isInRange()); |
271 | |
272 | m1.add(1); |
273 | |
274 | assertTrue(measurement.isInRange()); |
275 | |
276 | m1.add(2); |
277 | |
278 | assertTrue(measurement.isInRange()); |
279 | } |
280 | |
281 | public void testInUpperBoundRange() throws Exception { |
282 | descriptor.setUpperThreshold(new Float(1.5)); |
283 | |
284 | measurement = (RatioMeasurement) descriptor.createMeasurement(metrics); |
285 | |
286 | m2.add(1); |
287 | |
288 | assertTrue(measurement.isInRange()); |
289 | |
290 | m1.add(1); |
291 | |
292 | assertTrue(measurement.isInRange()); |
293 | |
294 | m1.add(2); |
295 | |
296 | assertTrue(!measurement.isInRange()); |
297 | } |
298 | |
299 | public void testInBoundRange() throws Exception { |
300 | descriptor.setLowerThreshold(new Integer(1)); |
301 | descriptor.setUpperThreshold(new Float(1.5)); |
302 | |
303 | measurement = (RatioMeasurement) descriptor.createMeasurement(metrics); |
304 | |
305 | m2.add(1); |
306 | |
307 | assertTrue(!measurement.isInRange()); |
308 | |
309 | m1.add(1); |
310 | |
311 | assertTrue(measurement.isInRange()); |
312 | |
313 | m1.add(2); |
314 | |
315 | assertTrue(!measurement.isInRange()); |
316 | } |
317 | |
318 | public void testCachedValue() throws Exception { |
319 | descriptor.setCached(true); |
320 | |
321 | measurement = (RatioMeasurement) descriptor.createMeasurement(metrics); |
322 | |
323 | assertTrue("0/0 not NaN", Double.isNaN(measurement.getValue().doubleValue())); |
324 | |
325 | m2.add(1); |
326 | |
327 | assertTrue("cached 0/0 not NaN", Double.isNaN(measurement.getValue().doubleValue())); |
328 | } |
329 | |
330 | public void testAccept() throws Exception { |
331 | measurement = (RatioMeasurement) descriptor.createMeasurement(metrics); |
332 | |
333 | visited = null; |
334 | measurement.accept(this); |
335 | assertSame(measurement, visited); |
336 | } |
337 | |
338 | public void testEmpty() throws Exception { |
339 | measurement = (RatioMeasurement) descriptor.createMeasurement(metrics); |
340 | |
341 | assertEquals("base == 0", 0, m1.getValue().intValue()); |
342 | assertEquals("divider == 0", 0, m2.getValue().intValue()); |
343 | assertTrue("0/0", measurement.isEmpty()); |
344 | |
345 | m1.add(1); |
346 | |
347 | assertEquals("base != 1", 1, m1.getValue().intValue()); |
348 | assertEquals("divider != 0", 0, m2.getValue().intValue()); |
349 | assertTrue("1/0", measurement.isEmpty()); |
350 | |
351 | m2.add(1); |
352 | |
353 | assertEquals("base != 1", 1, m1.getValue().intValue()); |
354 | assertEquals("divider != 1", 1, m2.getValue().intValue()); |
355 | assertFalse("1/1", measurement.isEmpty()); |
356 | |
357 | m1.add(-1); |
358 | |
359 | assertEquals("base != 0", 0, m1.getValue().intValue()); |
360 | assertEquals("divider != 1", 1, m2.getValue().intValue()); |
361 | assertFalse("0/1", measurement.isEmpty()); |
362 | |
363 | m2.add(-1); |
364 | |
365 | assertEquals("base != 0", 0, m1.getValue().intValue()); |
366 | assertEquals("divider != 0", 0, m2.getValue().intValue()); |
367 | assertTrue("0/0", measurement.isEmpty()); |
368 | } |
369 | |
370 | public void visitStatisticalMeasurement(StatisticalMeasurement measurement) { |
371 | // Do nothing |
372 | } |
373 | |
374 | public void visitRatioMeasurement(RatioMeasurement measurement) { |
375 | visited = measurement; |
376 | } |
377 | |
378 | public void visitNbSubMetricsMeasurement(NbSubMetricsMeasurement measurement) { |
379 | // Do nothing |
380 | } |
381 | |
382 | public void visitCounterMeasurement(CounterMeasurement measurement) { |
383 | // Do nothing |
384 | } |
385 | |
386 | public void visitContextAccumulatorMeasurement(ContextAccumulatorMeasurement measurement) { |
387 | // Do nothing |
388 | } |
389 | |
390 | public void visitNameListMeasurement(NameListMeasurement measurement) { |
391 | // Do nothing |
392 | } |
393 | |
394 | public void visitSubMetricsAccumulatorMeasurement(SubMetricsAccumulatorMeasurement measurement) { |
395 | // Do nothing |
396 | } |
397 | |
398 | public void visitSumMeasurement(SumMeasurement measurement) { |
399 | // Do nothing |
400 | } |
401 | } |