@Test
  public void testAccountService() throws Exception {
    // 1. Get captcha
    String captchaKey = accountService.generateCaptchaKey();
    accountService.generateCaptchaImage(captchaKey);
    String captchaValue = "12345";

    // 2. Submit sign up Request
    SignUpRequest signUpRequest = new SignUpRequest();
    signUpRequest.setCaptchaKey(captchaKey);
    signUpRequest.setCaptchaValue(captchaValue);
    signUpRequest.setId("juven");
    signUpRequest.setEmail("*****@*****.**");
    signUpRequest.setName("Juven Xu");
    signUpRequest.setPassword("admin123");
    signUpRequest.setConfirmPassword("admin123");
    signUpRequest.setActivateServiceUrl("http://localhost:8080/account/activate");
    accountService.signUp(signUpRequest);

    // 3. Read activation link
    greenMail.waitForIncomingEmail(2000, 1);
    Message[] msgs = greenMail.getReceivedMessages();
    assertEquals(1, msgs.length);
    assertEquals("Please Activate Your Account", msgs[0].getSubject());
    String activationLink = GreenMailUtil.getBody(msgs[0]).trim();

    // 3a. Try login but not activated
    try {
      accountService.login("juven", "admin123");
      fail("Disabled account shouldn't be able to log in.");
    } catch (AccountServiceException e) {
    }

    // 4. Activate account
    String activationCode = activationLink.substring(activationLink.lastIndexOf("=") + 1);
    accountService.activate(activationCode);

    // 5. Login with correct id and password
    accountService.login("juven", "admin123");

    // 5a. Login with incorrect password
    try {
      accountService.login("juven", "admin456");
      fail("Password is incorrect, shouldn't be able to login.");
    } catch (AccountServiceException e) {
    }
  }
  public Request<SignUpRequest> marshall(SignUpRequest signUpRequest) {

    if (signUpRequest == null) {
      throw new AmazonClientException("Invalid argument passed to marshall(...)");
    }

    Request<SignUpRequest> request =
        new DefaultRequest<SignUpRequest>(signUpRequest, "AWSCognitoIdentityProvider");
    request.addHeader("X-Amz-Target", "AWSCognitoIdentityProviderService.SignUp");

    request.setHttpMethod(HttpMethodName.POST);

    request.setResourcePath("");

    try {
      final StructuredJsonGenerator jsonGenerator = protocolFactory.createGenerator();

      jsonGenerator.writeStartObject();

      if (signUpRequest.getClientId() != null) {
        jsonGenerator.writeFieldName("ClientId").writeValue(signUpRequest.getClientId());
      }
      if (signUpRequest.getSecretHash() != null) {
        jsonGenerator.writeFieldName("SecretHash").writeValue(signUpRequest.getSecretHash());
      }
      if (signUpRequest.getUsername() != null) {
        jsonGenerator.writeFieldName("Username").writeValue(signUpRequest.getUsername());
      }
      if (signUpRequest.getPassword() != null) {
        jsonGenerator.writeFieldName("Password").writeValue(signUpRequest.getPassword());
      }

      java.util.List<AttributeType> userAttributesList = signUpRequest.getUserAttributes();
      if (userAttributesList != null) {
        jsonGenerator.writeFieldName("UserAttributes");
        jsonGenerator.writeStartArray();
        for (AttributeType userAttributesListValue : userAttributesList) {
          if (userAttributesListValue != null) {

            AttributeTypeJsonMarshaller.getInstance()
                .marshall(userAttributesListValue, jsonGenerator);
          }
        }
        jsonGenerator.writeEndArray();
      }

      java.util.List<AttributeType> validationDataList = signUpRequest.getValidationData();
      if (validationDataList != null) {
        jsonGenerator.writeFieldName("ValidationData");
        jsonGenerator.writeStartArray();
        for (AttributeType validationDataListValue : validationDataList) {
          if (validationDataListValue != null) {

            AttributeTypeJsonMarshaller.getInstance()
                .marshall(validationDataListValue, jsonGenerator);
          }
        }
        jsonGenerator.writeEndArray();
      }

      jsonGenerator.writeEndObject();

      byte[] content = jsonGenerator.getBytes();
      request.setContent(new ByteArrayInputStream(content));
      request.addHeader("Content-Length", Integer.toString(content.length));
      request.addHeader("Content-Type", jsonGenerator.getContentType());
    } catch (Throwable t) {
      throw new AmazonClientException("Unable to marshall request to JSON: " + t.getMessage(), t);
    }

    return request;
  }