private void checkServer(ServerDetails server) {
    // description can be null
    assert server.getCpuCores() > 0 : server;
    assert server.getDiskSizeGB() > 0 : server;
    assert server.getMemorySizeMB() > 0 : server;
    assert server.getCost() != null;
    assert server.getTransferGB() > 0 : server;

    assertNotNull(server.getTemplateName());
    assertNotNull(server.getIps());
  }
  // takes a few minutes and requires an extra server (using 2 already)
  @Test(enabled = false)
  public void testCloneServer() throws Exception {
    ServerDetails testServer2 =
        client.cloneServer(testServerId, testHostName2, CloneServerOptions.Builder.cpucores(1));

    assertNotNull(testServer2.getId());
    assertEquals(testServer2.getHostname(), "jclouds-test2");
    assertTrue(testServer2.getIps().isEmpty());

    testServerId2 = testServer2.getId();

    RetryablePredicate<Server.State> cloneChecker =
        new ServerStatusChecker(client, testServerId2, 300, 10, TimeUnit.SECONDS);
    assertTrue(cloneChecker.apply(Server.State.STOPPED));

    client.startServer(testServer2.getId());

    // TODO ServerStatus==STOPPED suggests the previous call to start should have worked
    cloneChecker =
        new RetryablePredicate<Server.State>(
            new Predicate<Server.State>() {

              public boolean apply(Server.State value) {
                ServerStatus status =
                    client.getServerStatus(testServerId2, ServerStatusOptions.Builder.state());
                if (status.getState() == value) {
                  return true;
                }

                client.startServer(testServerId2);
                return false;
              }
            },
            300,
            10,
            TimeUnit.SECONDS);

    assertTrue(cloneChecker.apply(Server.State.RUNNING));
  }