### Question:
AtomicBackoff { public State getState() { return new State(value.get()); } AtomicBackoff(String name, long value); State getState();  }### Answer:
@Test public void backoff_doesNotChangeStateGet() { AtomicBackoff backoff = new AtomicBackoff("test", 8); AtomicBackoff.State state = backoff.getState(); assertEquals(8, state.get()); state.backoff(); assertEquals(8, state.get()); }
@Test public void backoff_doubles() { AtomicBackoff backoff = new AtomicBackoff("test", 3); backoff.getState().backoff(); assertEquals(6, backoff.getState().get()); backoff.getState().backoff(); assertEquals(12, backoff.getState().get()); backoff.getState().backoff(); assertEquals(24, backoff.getState().get()); backoff = new AtomicBackoff("test", 13); backoff.getState().backoff(); assertEquals(26, backoff.getState().get()); }
@Test public void backoff_oncePerState() { AtomicBackoff backoff = new AtomicBackoff("test", 8); AtomicBackoff.State state = backoff.getState(); state.backoff(); assertEquals(8, state.get()); assertEquals(16, backoff.getState().get()); state.backoff(); assertEquals(8, state.get()); assertEquals(16, backoff.getState().get()); }
@Test public void backoff_twiceForEquivalentState_noChange() { AtomicBackoff backoff = new AtomicBackoff("test", 8); AtomicBackoff.State state1 = backoff.getState(); AtomicBackoff.State state2 = backoff.getState(); state1.backoff(); state2.backoff(); assertEquals(16, backoff.getState().get()); }
@Test public void backoff_delayed() { AtomicBackoff backoff = new AtomicBackoff("test", 8); AtomicBackoff.State state = backoff.getState(); backoff.getState().backoff(); backoff.getState().backoff(); assertEquals(32, backoff.getState().get()); state.backoff(); assertEquals(32, backoff.getState().get()); }
@Test public void largeLong() { long tooLarge = Long.MAX_VALUE - 100; AtomicBackoff backoff = new AtomicBackoff("test", tooLarge); backoff.getState().backoff(); assertEquals(tooLarge, backoff.getState().get()); }