/** configureURLForProtectedAccess */
  @Test
  public void testConfigureURLForProtectedAccess() throws Exception {
    CoreOAuthConsumerSupport support =
        new CoreOAuthConsumerSupport() {
          // Inherited.
          @Override
          public String getOAuthQueryString(
              ProtectedResourceDetails details,
              OAuthConsumerToken accessToken,
              URL url,
              String httpMethod,
              Map<String, String> additionalParameters) {
            return "myquerystring";
          }
        };
    support.setStreamHandlerFactory(new DefaultOAuthURLStreamHandlerFactory());
    ProtectedResourceDetails details = createMock(ProtectedResourceDetails.class);
    OAuthConsumerToken token = new OAuthConsumerToken();
    URL url = new URL("https://myhost.com/somepath?with=some&query=params&too");

    expect(details.isAcceptsAuthorizationHeader()).andReturn(true);
    replay(details);
    assertEquals(
        "https://myhost.com/somepath?with=some&query=params&too",
        support.configureURLForProtectedAccess(url, token, details, "GET", null).toString());
    verify(details);
    reset(details);

    expect(details.isAcceptsAuthorizationHeader()).andReturn(false);
    replay(details);
    assertEquals(
        "https://myhost.com/somepath?myquerystring",
        support.configureURLForProtectedAccess(url, token, details, "GET", null).toString());
    verify(details);
    reset(details);

    replay(details);
    assertEquals(
        "https://myhost.com/somepath?with=some&query=params&too",
        support.configureURLForProtectedAccess(url, token, details, "POST", null).toString());
    verify(details);
    reset(details);

    replay(details);
    assertEquals(
        "https://myhost.com/somepath?with=some&query=params&too",
        support.configureURLForProtectedAccess(url, token, details, "PUT", null).toString());
    verify(details);
    reset(details);
  }
  /** readResouce */
  @Test
  public void testReadResouce() throws Exception {
    ProtectedResourceDetails details = createMock(ProtectedResourceDetails.class);
    OAuthConsumerToken token = new OAuthConsumerToken();
    URL url = new URL("http://myhost.com/resource?with=some&query=params&too");
    final ConnectionProps connectionProps = new ConnectionProps();
    final ByteArrayInputStream inputStream = new ByteArrayInputStream(new byte[0]);
    final HttpURLConnectionForTestingPurposes connectionMock =
        new HttpURLConnectionForTestingPurposes(url) {
          @Override
          public void setRequestMethod(String method) throws ProtocolException {
            connectionProps.method = method;
          }

          @Override
          public void setDoOutput(boolean dooutput) {
            connectionProps.doOutput = dooutput;
          }

          @Override
          public void connect() throws IOException {
            connectionProps.connected = true;
          }

          @Override
          public OutputStream getOutputStream() throws IOException {
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            connectionProps.outputStream = out;
            return out;
          }

          @Override
          public int getResponseCode() throws IOException {
            return connectionProps.responseCode;
          }

          @Override
          public String getResponseMessage() throws IOException {
            return connectionProps.responseMessage;
          }

          @Override
          public InputStream getInputStream() throws IOException {
            return inputStream;
          }

          @Override
          public String getHeaderField(String name) {
            return connectionProps.headerFields.get(name);
          }
        };

    CoreOAuthConsumerSupport support =
        new CoreOAuthConsumerSupport() {
          @Override
          public URL configureURLForProtectedAccess(
              URL url,
              OAuthConsumerToken accessToken,
              ProtectedResourceDetails details,
              String httpMethod,
              Map<String, String> additionalParameters)
              throws OAuthRequestFailedException {
            try {
              return new URL(
                  url.getProtocol(),
                  url.getHost(),
                  url.getPort(),
                  url.getFile(),
                  new SteamHandlerForTestingPurposes(connectionMock));
            } catch (MalformedURLException e) {
              throw new RuntimeException(e);
            }
          }

          @Override
          public String getOAuthQueryString(
              ProtectedResourceDetails details,
              OAuthConsumerToken accessToken,
              URL url,
              String httpMethod,
              Map<String, String> additionalParameters) {
            return "POSTBODY";
          }
        };
    support.setStreamHandlerFactory(new DefaultOAuthURLStreamHandlerFactory());

    expect(details.getAuthorizationHeaderRealm()).andReturn("realm1");
    expect(details.isAcceptsAuthorizationHeader()).andReturn(true);
    expect(details.getAdditionalRequestHeaders()).andReturn(null);
    replay(details);
    try {
      support.readResource(details, url, "POST", token, null, null);
      fail("shouldn't have been a valid response code.");
    } catch (OAuthRequestFailedException e) {
      // fall through...
    }
    verify(details);
    reset(details);
    assertFalse(connectionProps.doOutput);
    assertEquals("POST", connectionProps.method);
    assertTrue(connectionProps.connected);
    connectionProps.reset();

    expect(details.getAuthorizationHeaderRealm()).andReturn(null);
    expect(details.isAcceptsAuthorizationHeader()).andReturn(true);
    expect(details.getAdditionalRequestHeaders()).andReturn(null);
    connectionProps.responseCode = 400;
    connectionProps.responseMessage = "Nasty";
    replay(details);
    try {
      support.readResource(details, url, "POST", token, null, null);
      fail("shouldn't have been a valid response code.");
    } catch (OAuthRequestFailedException e) {
      // fall through...
    }
    verify(details);
    reset(details);
    assertFalse(connectionProps.doOutput);
    assertEquals("POST", connectionProps.method);
    assertTrue(connectionProps.connected);
    connectionProps.reset();

    expect(details.getAuthorizationHeaderRealm()).andReturn(null);
    expect(details.isAcceptsAuthorizationHeader()).andReturn(true);
    expect(details.getAdditionalRequestHeaders()).andReturn(null);
    connectionProps.responseCode = 401;
    connectionProps.responseMessage = "Bad Realm";
    connectionProps.headerFields.put("WWW-Authenticate", "realm=\"goodrealm\"");
    replay(details);
    try {
      support.readResource(details, url, "POST", token, null, null);
      fail("shouldn't have been a valid response code.");
    } catch (InvalidOAuthRealmException e) {
      // fall through...
    }
    verify(details);
    reset(details);
    assertFalse(connectionProps.doOutput);
    assertEquals("POST", connectionProps.method);
    assertTrue(connectionProps.connected);
    connectionProps.reset();

    expect(details.getAuthorizationHeaderRealm()).andReturn(null);
    expect(details.isAcceptsAuthorizationHeader()).andReturn(true);
    expect(details.getAdditionalRequestHeaders()).andReturn(null);
    connectionProps.responseCode = 200;
    connectionProps.responseMessage = "Congrats";
    replay(details);
    assertSame(inputStream, support.readResource(details, url, "GET", token, null, null));
    verify(details);
    reset(details);
    assertFalse(connectionProps.doOutput);
    assertEquals("GET", connectionProps.method);
    assertTrue(connectionProps.connected);
    connectionProps.reset();

    expect(details.getAuthorizationHeaderRealm()).andReturn(null);
    expect(details.isAcceptsAuthorizationHeader()).andReturn(false);
    expect(details.getAdditionalRequestHeaders()).andReturn(null);
    connectionProps.responseCode = 200;
    connectionProps.responseMessage = "Congrats";
    replay(details);
    assertSame(inputStream, support.readResource(details, url, "POST", token, null, null));
    assertEquals(
        "POSTBODY",
        new String(((ByteArrayOutputStream) connectionProps.outputStream).toByteArray()));
    verify(details);
    reset(details);
    assertTrue(connectionProps.doOutput);
    assertEquals("POST", connectionProps.method);
    assertTrue(connectionProps.connected);
    connectionProps.reset();
  }