@Test public void testSet() throws Exception { StateMachine<State> stateMachine = new StateMachine<>("test", executor, State.BREAKFAST, ImmutableSet.of(State.DINNER)); assertEquals(stateMachine.get(), State.BREAKFAST); assertNoStateChange(stateMachine, () -> assertEquals(stateMachine.set(State.BREAKFAST), State.BREAKFAST)); assertStateChange(stateMachine, () -> assertEquals(stateMachine.set(State.LUNCH), State.BREAKFAST), State.LUNCH); assertStateChange(stateMachine, () -> assertEquals(stateMachine.set(State.BREAKFAST), State.LUNCH), State.BREAKFAST); // transition to a final state assertStateChange(stateMachine, () -> assertEquals(stateMachine.set(State.DINNER), State.BREAKFAST), State.DINNER); // attempt transition from a final state assertNoStateChange(stateMachine, () -> { try { stateMachine.set(State.LUNCH); fail("expected IllegalStateException"); } catch (IllegalStateException expected) { } }); assertNoStateChange(stateMachine, () -> stateMachine.set(State.DINNER)); }
stateMachine.set(null); fail("expected a NullPointerException");
stateMachine.set(null); fail("expected a NullPointerException");
/** * Fail the buffer, discarding all pages, but blocking readers. */ public synchronized void fail() { // ignore fail if the buffer already in a terminal state. if (state.get().isTerminal()) { return; } state.set(FAILED); partitionBuffers.values().forEach(PartitionBuffer::destroy); // DO NOT free readers }
/** * Destroys the buffer, discarding all pages. */ public synchronized void destroy() { // ignore destroy if the buffer already in a terminal state. if (state.get().isTerminal()) { return; } state.set(FINISHED); partitionBuffers.values().forEach(PartitionBuffer::destroy); // free readers namedBuffers.values().forEach(SharedBuffer.NamedBuffer::abort); processPendingReads(); }
@Test public void testSet() throws Exception { StateMachine<State> stateMachine = new StateMachine<>("test", executor, State.BREAKFAST, ImmutableSet.of(State.DINNER)); assertEquals(stateMachine.get(), State.BREAKFAST); assertNoStateChange(stateMachine, () -> assertEquals(stateMachine.set(State.BREAKFAST), State.BREAKFAST)); assertStateChange(stateMachine, () -> assertEquals(stateMachine.set(State.LUNCH), State.BREAKFAST), State.LUNCH); assertStateChange(stateMachine, () -> assertEquals(stateMachine.set(State.BREAKFAST), State.LUNCH), State.BREAKFAST); // transition to a final state assertStateChange(stateMachine, () -> assertEquals(stateMachine.set(State.DINNER), State.BREAKFAST), State.DINNER); // attempt transition from a final state assertNoStateChange(stateMachine, () -> { try { stateMachine.set(State.LUNCH); fail("expected IllegalStateException"); } catch (IllegalStateException expected) { } }); assertNoStateChange(stateMachine, () -> stateMachine.set(State.DINNER)); }