/* * Copyright (C) 2011-2014 Chris Vest (mr.chrisvest@gmail.com) * * 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 stormpot; import org.junit.Test; import java.util.Random; import java.util.concurrent.TimeUnit; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.not; import static org.junit.Assert.*; public class TimeoutTest { @Test(expected = IllegalArgumentException.class) public void timeUnitCannotBeNull() { new Timeout(1, null); } @Test public void timeoutCanBeZeroOrLess() { // because it means we don't want to do any waiting at all. new Timeout(0, TimeUnit.DAYS); new Timeout(-1, TimeUnit.DAYS); } @Test public void nonBaseValuesMustBeReproducible() { Timeout timeout = new Timeout(13, TimeUnit.MILLISECONDS); assertThat(timeout.getTimeout(), is(13L)); assertThat(timeout.getUnit(), is(TimeUnit.MILLISECONDS)); } @Test public void baseTimeUnitMustNotBeNull() { assertNotNull("unexpectedly got null for the base unit", new Timeout(1, TimeUnit.DAYS).getBaseUnit()); } @Test public void timeoutsWithEqualValueButDifferentUnitsAreEqual() { Timeout a = new Timeout(1, TimeUnit.SECONDS); Timeout b = new Timeout(1000, TimeUnit.MILLISECONDS); assertThat(a, equalTo(b)); } @Test public void differentTimeoutValuesAreNotEqual() { Timeout a = new Timeout(1, TimeUnit.SECONDS); Timeout b = new Timeout(1, TimeUnit.MILLISECONDS); assertThat(a, not(equalTo(b))); } @Test public void timeoutsAreNotEqualToObjectsOfDifferentClasses() { Object a = new Timeout(1, TimeUnit.SECONDS); Object b = "poke"; assertThat(a, not(equalTo(b))); } @Test public void timeoutsAreNotEqualToNull() { Timeout a = new Timeout(1, TimeUnit.SECONDS); //noinspection ObjectEqualsNull assertFalse(a.equals(null)); } @Test public void timeoutsAreEqualToThemselves() { Timeout a = new Timeout(1, TimeUnit.SECONDS); assertThat(a, equalTo(a)); } @Test public void sameValueAndUnitGivesSameHashCode() { Timeout a = new Timeout(1, TimeUnit.SECONDS); Timeout b = new Timeout(1, TimeUnit.SECONDS); assertTrue(a.hashCode() == b.hashCode()); } @Test public void differentValueGivesDifferentHashcode() { Timeout a = new Timeout(1, TimeUnit.SECONDS); Timeout b = new Timeout(2, TimeUnit.SECONDS); assertTrue(a.hashCode() != b.hashCode()); } @Test public void differentUnitsForSameValuesGivesSameHashcode() { Timeout a = new Timeout(1, TimeUnit.SECONDS); Timeout b = new Timeout(1000, TimeUnit.MILLISECONDS); assertTrue(a.hashCode() == b.hashCode()); } @Test public void sameValuesOfDifferentUnitsGivesDifferentHashcode() { Timeout a = new Timeout(1, TimeUnit.SECONDS); Timeout b = new Timeout(1, TimeUnit.MILLISECONDS); assertTrue(a.hashCode() != b.hashCode()); } @Test public void canGetTimeoutInBaseUnit() { Timeout a = new Timeout(1, TimeUnit.SECONDS); Timeout b = new Timeout(1000, TimeUnit.MILLISECONDS); long timeoutBaseA = a.getTimeoutInBaseUnit(); long timeoutBaseB = b.getTimeoutInBaseUnit(); assertTrue(timeoutBaseA == timeoutBaseB); } @Test public void timeoutValueMustConvertExactlyToBaseUnit() { TimeUnit seconds = TimeUnit.SECONDS; int value = 1; Timeout timeout = new Timeout(value, seconds); long convertedValue = timeout.getBaseUnit().convert(value, seconds); assertThat(timeout.getTimeoutInBaseUnit(), is(convertedValue)); } @Test public void specifyingTimeoutInBaseUnitMustDoNoConversion() { Timeout a = new Timeout(1, TimeUnit.SECONDS); long baseTimeout = a.getTimeoutInBaseUnit(); Timeout b = new Timeout(baseTimeout, a.getBaseUnit()); assertThat(b.getTimeoutInBaseUnit(), is(b.getTimeout())); } @Test public void equalTimeoutsMustHaveSameHashCode() { Random rng = new Random(); TimeUnit[] units = TimeUnit.values(); int[] magnitudes = new int[] {1, 24, 60, 1000}; for (int i = 0; i < 1000000; i++) { TimeUnit unitA = units[rng.nextInt(units.length)]; TimeUnit unitB = units[rng.nextInt(units.length)]; int magnitudeA = magnitudes[rng.nextInt(magnitudes.length)]; int magnitudeB = magnitudes[rng.nextInt(magnitudes.length)]; Timeout timeoutA = new Timeout(magnitudeA, unitA); Timeout timeoutB = new Timeout(magnitudeB, unitB); if (timeoutA.equals(timeoutB)) { assertThat(timeoutA + " = " + timeoutB, timeoutA, equalTo(timeoutB)); } } } }