// Copyright © 2011-2013, Esko Luontola <www.orfjackal.net> // This software is released under the Apache License 2.0. // The license text is at http://www.apache.org/licenses/LICENSE-2.0 package fi.jumi.core.runs; import fi.jumi.core.api.RunId; import org.junit.Test; import java.util.*; import java.util.concurrent.*; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; public class RunIdSequenceTest { private final RunIdSequence sequence = new RunIdSequence(); @Test public void starts_from_the_first_RunId() { assertThat(sequence.nextRunId(), is(new RunId(RunId.FIRST_ID))); } @Test public void each_subsequent_RunId_is_incremented_by_one() { RunId id0 = sequence.nextRunId(); RunId id1 = sequence.nextRunId(); RunId id2 = sequence.nextRunId(); assertThat(id1.toInt(), is(id0.toInt() + 1)); assertThat(id2.toInt(), is(id1.toInt() + 1)); } @Test public void the_sequence_is_thread_safe() throws Exception { final int ITERATIONS = 50; List<RunId> expectedRunIds = generateRunIdsSequentially(ITERATIONS); List<RunId> actualRunIds = generateRunIdsInParallel(ITERATIONS); assertThat("generating RunIds in parallel should have produced the same values as sequentially", actualRunIds, is(expectedRunIds)); } private static List<RunId> generateRunIdsSequentially(int count) { RunIdSequence sequence = new RunIdSequence(); List<RunId> results = new ArrayList<>(); for (int i = 0; i < count; i++) { results.add(sequence.nextRunId()); } return results; } private static List<RunId> generateRunIdsInParallel(int count) throws Exception { RunIdSequence sequence = new RunIdSequence(); ExecutorService executor = Executors.newFixedThreadPool(10); List<Future<RunId>> futures = new ArrayList<>(); for (int i = 0; i < count; i++) { futures.add(executor.submit((Callable<RunId>) sequence::nextRunId)); } List<RunId> results = new ArrayList<>(); for (Future<RunId> future : futures) { results.add(future.get(1000, TimeUnit.MILLISECONDS)); } Collections.sort(results, (id1, id2) -> id1.toInt() - id2.toInt()); executor.shutdown(); return results; } }