public void testProgrammaticSecurity() throws ServletException {
    _authenticator.setAuth(new MockWindowsAuthProvider());
    SimpleHttpRequest request = new SimpleHttpRequest();
    request.setContext((Context) _authenticator.getContainer());

    request.login(WindowsAccountImpl.getCurrentUsername(), "");

    assertEquals(WindowsAccountImpl.getCurrentUsername(), request.getRemoteUser());
    assertTrue(request.getUserPrincipal() instanceof GenericWindowsPrincipal);
    GenericWindowsPrincipal windowsPrincipal = (GenericWindowsPrincipal) request.getUserPrincipal();
    assertTrue(windowsPrincipal.getSidString().startsWith("S-"));
  }
  /** Test negotiate. */
  @Test
  public void testNegotiate() {
    final String securityPackage = "Negotiate";
    IWindowsCredentialsHandle clientCredentials = null;
    WindowsSecurityContextImpl clientContext = null;
    try {
      // client credentials handle
      clientCredentials = WindowsCredentialsHandleImpl.getCurrent(securityPackage);
      clientCredentials.initialize();
      // initial client security context
      clientContext = new WindowsSecurityContextImpl();
      clientContext.setPrincipalName(WindowsAccountImpl.getCurrentUsername());
      clientContext.setCredentialsHandle(clientCredentials.getHandle());
      clientContext.setSecurityPackage(securityPackage);
      clientContext.initialize(null, null, WindowsAccountImpl.getCurrentUsername());
      // negotiate
      boolean authenticated = false;
      final SimpleHttpRequest request = new SimpleHttpRequest();
      while (true) {
        final String clientToken = BaseEncoding.base64().encode(clientContext.getToken());
        request.addHeader("Authorization", securityPackage + " " + clientToken);

        final SimpleHttpResponse response = new SimpleHttpResponse();
        authenticated = this.authenticator.authenticate(request, response);

        if (authenticated) {
          Assert.assertNotNull(request.getUserPrincipal());
          Assert.assertTrue(request.getUserPrincipal() instanceof GenericWindowsPrincipal);
          final GenericWindowsPrincipal windowsPrincipal =
              (GenericWindowsPrincipal) request.getUserPrincipal();
          Assert.assertTrue(windowsPrincipal.getSidString().startsWith("S-"));
          Assertions.assertThat(windowsPrincipal.getSid().length).isGreaterThan(0);
          Assert.assertTrue(windowsPrincipal.getGroups().containsKey("Everyone"));
          Assertions.assertThat(response.getHeaderNames().size()).isLessThanOrEqualTo(1);
          break;
        }

        Assert.assertTrue(response.getHeader("WWW-Authenticate").startsWith(securityPackage + " "));
        Assert.assertEquals("keep-alive", response.getHeader("Connection"));
        Assert.assertEquals(2, response.getHeaderNames().size());
        Assert.assertEquals(401, response.getStatus());
        final String continueToken =
            response.getHeader("WWW-Authenticate").substring(securityPackage.length() + 1);
        final byte[] continueTokenBytes = BaseEncoding.base64().decode(continueToken);
        Assertions.assertThat(continueTokenBytes.length).isGreaterThan(0);
        final SecBufferDesc continueTokenBuffer =
            new SecBufferDesc(Sspi.SECBUFFER_TOKEN, continueTokenBytes);
        clientContext.initialize(
            clientContext.getHandle(),
            continueTokenBuffer,
            WindowsAccountImpl.getCurrentUsername());
      }
      Assert.assertTrue(authenticated);
    } finally {
      if (clientContext != null) {
        clientContext.dispose();
      }
      if (clientCredentials != null) {
        clientCredentials.dispose();
      }
    }
  }