@Test
 public void testSequentialGroup() throws Exception {
   //
   final ModelNode result = new ModelNode();
   final BlockingOperationListener listener = new BlockingOperationListener(CLIENTS);
   final List<TestUpdateWrapper> wrappers = createTestClients(CLIENTS);
   for (final TestUpdateWrapper update : wrappers) {
     // Execute a single operation
     final TransactionalProtocolClient client = update.getClient();
     client.execute(listener, update);
     // Wait for the operation to reach the prepared state
     final TransactionalProtocolClient.PreparedOperation<TestUpdateWrapper> prepared =
         listener.retrievePreparedOperation();
     assert !prepared.isFailed();
     assert !prepared.isDone();
     // Check that the controller is locked in the prepared state
     final MockController controller = update.getController();
     assert controller.lock.isLocked();
     // Commit
     prepared.commit();
     // Block until we have the result
     final ModelNode finalResult = prepared.getFinalResult().get().getResponseNode();
     assert prepared.isDone();
     assert !controller.lock.isLocked();
     final int id = prepared.getOperation().getId();
     result.get("" + id).set(finalResult);
     // onto to the next operation
   }
   for (int i = 0; i < CLIENTS; i++) {
     assert result.hasDefined("" + i);
     assert result.get("" + i).hasDefined(ModelDescriptionConstants.OUTCOME);
   }
 }
  @Test
  public void testClosePrepared() throws Exception {
    final BlockingOperationListener listener = new BlockingOperationListener();
    final TestOperationHandler handler =
        new TestOperationHandler() {
          @Override
          public void execute(
              ModelNode operation,
              OperationMessageHandler handler,
              OperationAttachments attachments)
              throws Exception {
            //
          }
        };
    final TestUpdateWrapper wrapper = createTestClient(0, handler);
    final Future<OperationResponse> futureResult = wrapper.execute(listener);
    listener.retrievePreparedOperation();

    futureConnection.get().close();

    try {
      futureResult.get();
      Assert.fail();
    } catch (CancellationException expected) {
      //
    }
  }
  @Test
  public void testConcurrentGroup() throws Exception {
    //
    final BlockingOperationListener listener = new BlockingOperationListener(CLIENTS);
    final List<TestUpdateWrapper> wrappers = createTestClients(CLIENTS);
    // First execute all operations
    for (final TestUpdateWrapper update : wrappers) {
      final TransactionalProtocolClient client = update.getClient();
      client.execute(listener, update);
    }
    // Now wait for all operations to be prepared
    final List<TransactionalProtocolClient.PreparedOperation<TestUpdateWrapper>> preparedOps =
        new ArrayList<TransactionalProtocolClient.PreparedOperation<TestUpdateWrapper>>();
    for (int i = 0; i < CLIENTS; i++) {
      // Wait for 10 prepared results
      final TransactionalProtocolClient.PreparedOperation<TestUpdateWrapper> prepared =
          listener.retrievePreparedOperation();
      assert !prepared.isFailed();
      assert !prepared.isDone();

      // Check that the controller is locked in the prepared state
      final MockController controller = prepared.getOperation().getController();
      assert controller.lock.isLocked();

      // Commit all
      prepared.commit();
      preparedOps.add(prepared);
    }
    final ModelNode result = new ModelNode();
    // Now we just need to get the final results
    for (final TransactionalProtocolClient.PreparedOperation<TestUpdateWrapper> prepared :
        preparedOps) {
      // Block until we have the result
      final ModelNode finalResult = prepared.getFinalResult().get().getResponseNode();
      final MockController controller = prepared.getOperation().getController();
      assert prepared.isDone();
      assert !controller.lock.isLocked();
      final int id = prepared.getOperation().getId();
      result.get("" + id).set(finalResult);
    }
    for (int i = 0; i < CLIENTS; i++) {
      assert result.hasDefined("" + i);
      assert result.get("" + i).hasDefined(ModelDescriptionConstants.OUTCOME);
    }
  }
 @Test
 public void testSimpleRequest() throws Exception {
   //
   final TestUpdateWrapper update = createTestClient(0);
   final TransactionalProtocolClient client = update.getClient();
   final BlockingOperationListener listener = new BlockingOperationListener();
   client.execute(listener, update);
   //
   final TransactionalProtocolClient.PreparedOperation<TestUpdateWrapper> prepared =
       listener.retrievePreparedOperation();
   assert !prepared.isFailed();
   assert !prepared.isDone();
   // Commit
   prepared.commit();
   // Block until we have the result
   final ModelNode result = prepared.getFinalResult().get().getResponseNode();
   assert result.hasDefined(ModelDescriptionConstants.OUTCOME);
   assert prepared.isDone();
 }