/** * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.aurora.common.stats; import org.apache.aurora.common.quantity.Amount; import org.apache.aurora.common.quantity.Time; import org.apache.aurora.common.stats.SlidingStats.Timeable; import org.apache.aurora.common.util.testing.FakeClock; import org.junit.Before; import org.junit.Test; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; import static org.junit.Assert.fail; public class SlidingStatsTest { private static final long OPERATION_TIME = 5L; private static final Amount<Long, Time> OPERATION_TIME_AMOUNT = Amount.of(OPERATION_TIME, Time.NANOSECONDS); private FakeClock clock; private TimedActions actions; private SlidingStats stat; @Before public void setUp() { clock = new FakeClock(); actions = new TimedActions(clock); stat = new SlidingStats("a", "nanos", 1, clock); } @Test public void testAccumulate() { assertEquals(0L, stat.getEventCounter().get()); assertEquals(0L, stat.getTotalCounter().get()); stat.accumulate(100L); assertEquals(1L, stat.getEventCounter().get()); assertEquals(100L, stat.getTotalCounter().get()); } @Test public void testTimeable() { String value = stat.time(() -> actions.quietAction("World")); assertEquals("HelloWorld", value); assertEquals(1L, stat.getEventCounter().get()); assertEquals(OPERATION_TIME, stat.getTotalCounter().get()); } @Test public void testNoResultQuietTimeable() { stat.time((Timeable.NoResult.Quiet) actions::noResultQuietAction); assertEquals(1L, stat.getEventCounter().get()); assertEquals(OPERATION_TIME, stat.getTotalCounter().get()); } @Test public void testTimeableThrowsException() { String value = null; try { value = stat.time(actions::action); fail("Should have thrown exception."); } catch (Exception e) { assertEquals("Expected!", e.getMessage()); } assertNull(value); assertEquals(1L, stat.getEventCounter().get()); assertEquals(OPERATION_TIME, stat.getTotalCounter().get()); } @Test public void testNoResultTimeableThrowsException() { try { stat.time((Timeable.NoResult<Exception>) actions::noResultAction); fail("Should have thrown exception."); } catch (Exception e) { assertEquals("Expected!", e.getMessage()); } assertEquals(1L, stat.getEventCounter().get()); assertEquals(OPERATION_TIME, stat.getTotalCounter().get()); } @Test public void testQuietTimeableThrowsRuntimeException() { String value = null; try { value = stat.time(actions::quietExceptionalAction); fail("Should have thrown exception."); } catch (RuntimeException e) { assertEquals("Expected!", e.getMessage()); } assertNull(value); assertEquals(1L, stat.getEventCounter().get()); assertEquals(OPERATION_TIME, stat.getTotalCounter().get()); } private static class TimedActions { private FakeClock clock; public TimedActions(FakeClock clock) { this.clock = clock; } String action() throws Exception{ clock.advance(OPERATION_TIME_AMOUNT); throw new Exception("Expected!"); } String quietAction(String input) { clock.advance(OPERATION_TIME_AMOUNT); return "Hello" + input; } String quietExceptionalAction() { clock.advance(OPERATION_TIME_AMOUNT); throw new RuntimeException("Expected!"); } void noResultAction() throws Exception { clock.advance(OPERATION_TIME_AMOUNT); throw new Exception("Expected!"); } void noResultQuietAction() { clock.advance(OPERATION_TIME_AMOUNT); System.gc(); } } }