@Test
 public void commitACoupleOfTransactionsSuccessfully() throws Exception {
   MasterTxIdGenerator generator = newGenerator(3, 1, givenOrder());
   generator.committed(dataSource, 0, 2, null);
   generator.committed(dataSource, 0, 3, null);
   generator.committed(dataSource, 0, 4, null);
   assertCalls((FakeSlave) slaves.iterator().next(), 2, 3, 4);
   assertNoFailureLogs();
 }
 @Test
 public void commitSuccessfullyToTheFirstOne() throws Exception {
   MasterTxIdGenerator generator = newGenerator(3, 1, givenOrder());
   generator.committed(dataSource, 0, 2, null);
   assertCalls((FakeSlave) slaves.iterator().next(), 2l);
   assertNoFailureLogs();
 }
  @Test
  public void commitSuccessfullyAtThreeSlaves() throws Exception {
    MasterTxIdGenerator generator = newGenerator(5, 3, givenOrder());
    generator.committed(dataSource, 0, 2, null);
    generator.committed(dataSource, 0, 3, 1);
    generator.committed(dataSource, 0, 4, 3);

    Iterator<Slave> slaveIt = slaves.iterator();

    assertCalls((FakeSlave) slaveIt.next(), 2, 3, 4);
    assertCalls((FakeSlave) slaveIt.next(), 2, 4);
    assertCalls((FakeSlave) slaveIt.next(), 2, 3);
    assertCalls((FakeSlave) slaveIt.next());
    assertCalls((FakeSlave) slaveIt.next());

    assertNoFailureLogs();
  }
 @Test
 public void commitFailureAtFirstOneShouldMoveOnToNext() throws Exception {
   MasterTxIdGenerator generator = newGenerator(3, 1, givenOrder(), true);
   generator.committed(dataSource, 0, 2, null);
   Iterator<Slave> slaveIt = slaves.iterator();
   assertCalls((FakeSlave) slaveIt.next());
   assertCalls((FakeSlave) slaveIt.next(), 2);
   assertNoFailureLogs();
 }
 @Test
 public void notEnoughSlavesSuccessful() throws Exception {
   MasterTxIdGenerator generator = newGenerator(3, 2, givenOrder(), true, true);
   generator.committed(dataSource, 0, 2, null);
   Iterator<Slave> slaveIt = slaves.iterator();
   slaveIt.next();
   slaveIt.next();
   assertCalls((FakeSlave) slaveIt.next(), 2);
   assertFailureLogs();
 }
 @Test
 public void roundRobinSingleSlave() throws Exception {
   MasterTxIdGenerator generator = newGenerator(3, 1, roundRobin());
   for (long tx = 2; tx <= 6; tx++) {
     generator.committed(dataSource, 0, tx, null);
   }
   Iterator<Slave> slaveIt = slaves.iterator();
   assertCalls((FakeSlave) slaveIt.next(), 2, 5);
   assertCalls((FakeSlave) slaveIt.next(), 3, 6);
   assertCalls((FakeSlave) slaveIt.next(), 4);
   assertNoFailureLogs();
 }
  @Test
  public void roundRobinSomeFailing() throws Exception {
    MasterTxIdGenerator generator = newGenerator(4, 2, roundRobin(), false, true);
    for (long tx = 2; tx <= 6; tx++) {
      generator.committed(dataSource, 0, tx, null);
    }

    /* SLAVE |    TX
     *   0   | 2     5 6
     * F 1   |
     *   2   | 2 3 4   6
     *   3   |   3 4 5
     */
    Iterator<Slave> slaveIt = slaves.iterator();
    assertCalls((FakeSlave) slaveIt.next(), 2, 5, 6);
    slaveIt.next();
    assertCalls((FakeSlave) slaveIt.next(), 2, 3, 4, 6);
    assertCalls((FakeSlave) slaveIt.next(), 3, 4, 5);
    assertNoFailureLogs();
  }