@Test
  public void createAuthenticatableResource_invalidPassword_shouldFail() {
    authenticateSystemResource();

    final String domainName = generateDomain();
    final String resourceClassName = generateResourceClass(true, false);

    // attempt to create authenticatable resource with invalid passwords
    try {
      accessControlContext.createResource(resourceClassName, domainName, (Credentials) null);
      fail("creating authenticatable resource with null credentials should have failed");
    } catch (NullPointerException e) {
      assertThat(e.getMessage().toLowerCase(), containsString("credentials required"));
    }

    try {
      accessControlContext.createResource(
          resourceClassName, domainName, PasswordCredentials.newInstance(null));
      fail("creating authenticatable resource with null password should have failed");
    } catch (InvalidCredentialsException e) {
      assertThat(e.getMessage().toLowerCase(), containsString("password required, none specified"));
    }
  }
  @Test
  public void createAuthenticatableResource_blankNames_shouldFail() {
    authenticateSystemResource();

    final String domainName = generateDomain();
    final String resourceClassName = generateResourceClass(true, false);
    final char[] password = generateUniquePassword();
    final String externalId = generateUniqueExternalId();

    // attempt to create authenticatable resources with empty or whitespaced parameters
    try {
      accessControlContext.createResource(
          "", domainName, PasswordCredentials.newInstance(password));
      fail("creating authenticatable resource with empty resource class name should have failed");
    } catch (IllegalArgumentException e) {
      assertThat(e.getMessage().toLowerCase(), containsString("resource class required"));
    }
    try {
      accessControlContext.createResource(
          "", domainName, externalId, PasswordCredentials.newInstance(password));
      fail("creating authenticatable resource with empty resource class name should have failed");
    } catch (IllegalArgumentException e) {
      assertThat(e.getMessage().toLowerCase(), containsString("resource class required"));
    }
    try {
      accessControlContext.createResource(
          " \t", domainName, PasswordCredentials.newInstance(password));
      fail("creating authenticatable resource with empty resource class name should have failed");
    } catch (IllegalArgumentException e) {
      assertThat(e.getMessage().toLowerCase(), containsString("resource class required"));
    }
    try {
      accessControlContext.createResource(
          " \t", domainName, externalId, PasswordCredentials.newInstance(password));
      fail("creating authenticatable resource with empty resource class name should have failed");
    } catch (IllegalArgumentException e) {
      assertThat(e.getMessage().toLowerCase(), containsString("resource class required"));
    }

    try {
      accessControlContext.createResource(
          resourceClassName, "", PasswordCredentials.newInstance(password));
      fail("creating authenticatable resource with empty domain name should have failed");
    } catch (IllegalArgumentException e) {
      assertThat(e.getMessage().toLowerCase(), containsString("domain required"));
    }
    try {
      accessControlContext.createResource(
          resourceClassName, "", externalId, PasswordCredentials.newInstance(password));
      fail("creating authenticatable resource with empty domain name should have failed");
    } catch (IllegalArgumentException e) {
      assertThat(e.getMessage().toLowerCase(), containsString("domain required"));
    }
    try {
      accessControlContext.createResource(
          resourceClassName, " \t", PasswordCredentials.newInstance(password));
      fail("creating authenticatable resource with empty domain name should have failed");
    } catch (IllegalArgumentException e) {
      assertThat(e.getMessage().toLowerCase(), containsString("domain required"));
    }
    try {
      accessControlContext.createResource(
          resourceClassName, " \t", externalId, PasswordCredentials.newInstance(password));
      fail("creating authenticatable resource with empty domain name should have failed");
    } catch (IllegalArgumentException e) {
      assertThat(e.getMessage().toLowerCase(), containsString("domain required"));
    }

    try {
      accessControlContext.createResource(
          resourceClassName, domainName, "", PasswordCredentials.newInstance(password));
      fail("creating authenticatable resource with empty external id should have failed");
    } catch (IllegalArgumentException e) {
      assertThat(e.getMessage().toLowerCase(), containsString("external id required"));
    }
    try {
      accessControlContext.createResource(
          resourceClassName, domainName, " \t", PasswordCredentials.newInstance(password));
      fail("creating authenticatable resource with empty external id should have failed");
    } catch (IllegalArgumentException e) {
      assertThat(e.getMessage().toLowerCase(), containsString("external id required"));
    }

    try {
      accessControlContext.createResource(
          resourceClassName, domainName, PasswordCredentials.newInstance("".toCharArray()));
      fail("creating authenticatable resource with empty password should have failed");
    } catch (InvalidCredentialsException e) {
      assertThat(e.getMessage().toLowerCase(), containsString("password cannot be zero length"));
    }
    try {
      accessControlContext.createResource(
          resourceClassName,
          domainName,
          externalId,
          PasswordCredentials.newInstance("".toCharArray()));
      fail("creating authenticatable resource with empty password should have failed");
    } catch (InvalidCredentialsException e) {
      assertThat(e.getMessage().toLowerCase(), containsString("password cannot be zero length"));
    }
    try {
      accessControlContext.createResource(
          resourceClassName,
          domainName,
          externalId,
          PasswordCredentials.newInstance(" \t".toCharArray()));
      fail("creating authenticatable resource with empty password should have failed");
    } catch (InvalidCredentialsException e) {
      assertThat(e.getMessage().toLowerCase(), containsString("password cannot be blank"));
    }
    try {
      accessControlContext.createResource(
          resourceClassName, domainName, PasswordCredentials.newInstance(" \t".toCharArray()));
      fail("creating authenticatable resource with empty password should have failed");
    } catch (InvalidCredentialsException e) {
      assertThat(e.getMessage().toLowerCase(), containsString("password cannot be blank"));
    }
  }
  @Test
  public void createAuthenticatableResource_nulls_shouldFail() {
    authenticateSystemResource();

    final String domainName = generateDomain();
    final String resourceClassName = generateResourceClass(true, false);
    final char[] password = generateUniquePassword();
    final String externalId = generateUniqueExternalId();

    // attempt to create resources with null parameters
    try {
      accessControlContext.createResource(
          null, domainName, PasswordCredentials.newInstance(password));
      fail("creating authenticatable resource with null resource class name should have failed");
    } catch (NullPointerException e) {
      assertThat(e.getMessage().toLowerCase(), containsString("resource class required"));
    }
    try {
      accessControlContext.createResource(
          null, domainName, externalId, PasswordCredentials.newInstance(password));
      fail("creating authenticatable resource with null resource class name should have failed");
    } catch (NullPointerException e) {
      assertThat(e.getMessage().toLowerCase(), containsString("resource class required"));
    }

    try {
      accessControlContext.createResource(
          resourceClassName, null, PasswordCredentials.newInstance(password));
      fail("creating authenticatable resource with null domain name should have failed");
    } catch (NullPointerException e) {
      assertThat(e.getMessage().toLowerCase(), containsString("domain required"));
    }
    try {
      accessControlContext.createResource(
          resourceClassName, null, externalId, PasswordCredentials.newInstance(password));
      fail("creating authenticatable resource with null domain name should have failed");
    } catch (NullPointerException e) {
      assertThat(e.getMessage().toLowerCase(), containsString("domain required"));
    }

    try {
      accessControlContext.createResource(
          resourceClassName, domainName, null, PasswordCredentials.newInstance(password));
      fail("creating authenticatable resource with null external id should have failed");
    } catch (NullPointerException e) {
      assertThat(e.getMessage().toLowerCase(), containsString("external id required"));
    }

    try {
      accessControlContext.createResource(resourceClassName, domainName, (Credentials) null);
      fail("creating authenticatable resource with null credentials should have failed");
    } catch (NullPointerException e) {
      assertThat(
          e.getMessage().toLowerCase(), containsString("credentials required, none specified"));
    }
    try {
      accessControlContext.createResource(resourceClassName, domainName, externalId, null);
      fail("creating authenticatable resource with null credentials should have failed");
    } catch (NullPointerException e) {
      assertThat(
          e.getMessage().toLowerCase(), containsString("credentials required, none specified"));
    }

    try {
      accessControlContext.createResource(
          resourceClassName, domainName, PasswordCredentials.newInstance(null));
      fail("creating authenticatable resource with null password should have failed");
    } catch (InvalidCredentialsException e) {
      assertThat(e.getMessage().toLowerCase(), containsString("password required, none specified"));
    }
    try {
      accessControlContext.createResource(
          resourceClassName, domainName, externalId, PasswordCredentials.newInstance(null));
      fail("creating authenticatable resource with null password should have failed");
    } catch (InvalidCredentialsException e) {
      assertThat(e.getMessage().toLowerCase(), containsString("password required, none specified"));
    }
  }