// Copyright 2006 Google Inc. All Rights Reserved.

package com.google.gwt.http.client;

import com.google.gwt.core.client.GWT;
import com.google.gwt.http.client.RequestBuilder;
import com.google.gwt.http.client.RequestException;
import com.google.gwt.http.client.RequestPermissionException;
import com.google.gwt.http.client.Request;
import com.google.gwt.http.client.Response;
import com.google.gwt.http.client.RequestCallback;
import com.google.gwt.junit.client.GWTTestCase;

/**
 * HTTPRequestBuilder tests
 */
public class RequestBuilderTest extends GWTTestCase {
  private static final int TEST_FINISH_DELAY = 10000;

  private static String getTestBaseURL() {
    return GWT.getModuleBaseURL() + "testRequestBuilder/";
  }

  public String getModuleName() {
    return "com.google.gwt.http.RequestBuilderTest";
  }

  /**
   * Test method for
   * {@link com.google.gwt.http.client.RequestBuilder#RequestBuilder(java.lang.String, java.lang.String)}.
   * <p>
   * NOTE: When running this test against Internet Explorer, the security settings of IE affect this test.
   * The assumption is  that the "Access Data Sources Across Domains" setting is set to "Disabled". This is
   * the standard setting for the "Internet" zone, which models the case of a user's browser sending a request
   * to a foreign website. However, if you are running the unit tests against a machine running the GWT app which
   * falls into your "Trusted Sites" or "Local Network" content zone, this setting's value is different.
   * You will have to change the setting to "Disabled" in these zones for this test to pass.
   * <p>
   * Test Cases:
   * <ul>
   * <li>httpMethod == null
   * <li>httpMethod == ""
   * <li>url == null
   * <li>url == ""
   * <li>url == "www.freebsd.org" - violates same source
   * </ul>
   */
  public void testRequestBuilderStringString() {
    try {
      RequestBuilder builder = new RequestBuilder((RequestBuilder.Method) null,
          null);
      fail("NullPointerException should have been thrown for construction with null method.");
    } catch (NullPointerException ex) {
      // purposely ignored
    }

    try {
      RequestBuilder builder = new RequestBuilder(RequestBuilder.GET, null);
      fail("NullPointerException should have been thrown for construction with null URL.");
    } catch (NullPointerException ex) {
      // purposely ignored
    }

    try {
      RequestBuilder builder = new RequestBuilder(RequestBuilder.GET, "");
      fail("IllegalArgumentException should have been throw for construction with empty URL.");
    } catch (IllegalArgumentException ex) {
      // purposely ignored
    }

    try {
      RequestBuilder builder = new RequestBuilder(RequestBuilder.GET,
          "http://www.freebsd.org");
      builder.sendRequest(null, new RequestCallback() {
        public void onError(Request request, Throwable exception) {
          // should never get here
          fail("HTTPRequest timed out");
        }

        public void onResponseReceived(Request request, Response response) {
          // should never get here
          fail();
        }
      });
    } catch (IllegalArgumentException ex) {
      // purposely ignored
    } catch (RequestPermissionException ex) {
      // this is the type of exception that we expect
    } catch (RequestException e) {
      fail(e.getMessage());
    }
  }

  /**
   * Test method for
   * {@link com.google.gwt.http.client.RequestBuilder#RequestBuilder(java.lang.String, java.lang.String)}. *
   */
  public void testRequestBuilderStringString_HTTPMethodRestrictionOverride() {
    RequestBuilder builder = new RequestBuilder(RequestBuilder.GET, "FOO");

    try {
      class MyRequestBuilder extends RequestBuilder {
        MyRequestBuilder(String httpMethod, String url) {
          super(httpMethod, url);
        }
      };

      builder = new MyRequestBuilder("HEAD", "FOO");
      // should reach here without any exceptions being thrown
    } catch (IllegalArgumentException ex) {
      fail(ex.getMessage());
    }
  }

  /**
   * Test method for
   * {@link com.google.gwt.http.client.RequestBuilder#sendRequest(java.lang.String, com.google.gwt.http.client.RequestCallback)}.
   */
  public void testSendRequest_GET() {
    delayTestFinish(TEST_FINISH_DELAY);

    try {
      RequestBuilder builder = new RequestBuilder(RequestBuilder.GET,
          getTestBaseURL() + "sendRequest_GET");
      builder.sendRequest(null, new RequestCallback() {
        public void onError(Request request, Throwable exception) {
          fail();
        }

        public void onResponseReceived(Request request, Response response) {
          assertEquals(200, response.getStatusCode());
          finishTest();
        }
      });
    } catch (RequestException e) {
      fail(e.getMessage());
    }
  }

  /**
   * Test method for
   * {@link com.google.gwt.http.client.RequestBuilder#sendRequest(java.lang.String, com.google.gwt.http.client.RequestCallback)}.
   */
  public void testSendRequest_POST() {
    delayTestFinish(TEST_FINISH_DELAY);

    try {
      RequestBuilder builder = new RequestBuilder(RequestBuilder.POST,
          getTestBaseURL() + "sendRequest_POST");
      builder.sendRequest("method=test+request", new RequestCallback() {
        public void onError(Request request, Throwable exception) {
          fail("HTTPRequest timed out");
        }

        public void onResponseReceived(Request request, Response response) {
          assertEquals(200, response.getStatusCode());
          finishTest();
        }
      });
    } catch (RequestException e) {
      fail(e.getMessage());
    }
  }

  public void testSetPassword() {
    RequestBuilder builder = new RequestBuilder(RequestBuilder.GET,
        getTestBaseURL());
    try {
      builder.setPassword(null);
    } catch (NullPointerException ex) {
      // Correct behavior, exception was thrown
    }

    try {
      builder.setPassword("");
    } catch (IllegalArgumentException ex) {
      // Correct behavior, exception was thrown
    }
  }

  /**
   * Test method for
   * {@link com.google.gwt.http.client.RequestBuilder#setHeader(java.lang.String, java.lang.String)}.
   * 
   * <p>
   * Test Cases:
   * <ul>
   * <li>name == null
   * <li>name == ""
   * <li>value == null
   * <li>value == ""
   * </ul>
   */
  public void testSetRequestHeader() {
    RequestBuilder builder = new RequestBuilder(RequestBuilder.GET,
        getTestBaseURL() + "setRequestHeader");

    try {
      builder.setHeader(null, "bar");
      fail("setRequestHeader(null, \"bar\")");
    } catch (NullPointerException ex) {
      // purposely ignored
    }

    try {
      builder.setHeader("", "bar");
      fail("setRequestHeader(\"\", \"bar\")");
    } catch (IllegalArgumentException ex) {
      // purposely ignored
    }

    try {
      builder.setHeader("foo", null);
      fail("setRequestHeader(\"foo\", null)");
    } catch (NullPointerException ex) {
      // purposely ignored
    }

    try {
      builder.setHeader("foo", "");
      fail("setRequestHeader(\"foo\", \"\")");
    } catch (IllegalArgumentException ex) {
      // purposely ignored
    }

    delayTestFinish(TEST_FINISH_DELAY);

    try {
      builder = new RequestBuilder(RequestBuilder.GET, getTestBaseURL()
          + "setRequestHeader");
      builder.setHeader("Foo", "Bar");
      builder.setHeader("Foo", "Bar1");
      
      builder.sendRequest(null, new RequestCallback() {
        public void onError(Request request, Throwable exception) {
          fail("HTTPRequest timed out");
        }

        public void onResponseReceived(Request request, Response response) {
          assertEquals(200, response.getStatusCode());
          finishTest();
        }
      });
    } catch (RequestException e) {
      fail(e.getMessage());
    }
  }

  /**
   * Test method for
   * {@link com.google.gwt.http.client.RequestBuilder#setTimeoutMillis(int)}.
   * 
   * <p>
   * Test Cases:
   * <ul>
   * <li>Timeout greater than the server's response time
   * <li>Timeout is less than the server's response time
   * </ul>
   */
  public void testSetTimeout_noTimeout() {
    delayTestFinish(TEST_FINISH_DELAY);

    try {
      RequestBuilder builder = new RequestBuilder(RequestBuilder.GET,
          getTestBaseURL() + "setTimeout/noTimeout");
      builder.setTimeoutMillis(10000);
      builder.sendRequest(null, new RequestCallback() {
        public void onError(Request request, Throwable exception) {
          fail("Test timed out");
        }

        public void onResponseReceived(Request request, Response response) {
          assertEquals(200, response.getStatusCode());
          finishTest();
        }
      });
    } catch (RequestException e) {
      fail(e.getMessage());
    }
  }

  /**
   * Test method for
   * {@link com.google.gwt.http.client.RequestBuilder#setTimeoutMillis(int)}.
   * 
   * <p>
   * Test Cases:
   * <ul>
   * <li>Timeout greater than the server's response time
   * <li>Timeout is less than the server's response time
   * </ul>
   */
  public void testSetTimeout_timeout() {
    delayTestFinish(TEST_FINISH_DELAY);

    try {
      RequestBuilder builder = new RequestBuilder(RequestBuilder.GET,
          getTestBaseURL() + "setTimeout/timeout");
      builder.setTimeoutMillis(2000);
      builder.sendRequest(null, new RequestCallback() {
        public void onError(Request request, Throwable exception) {
          finishTest();
        }

        public void onResponseReceived(Request request, Response response) {
          assertEquals(200, response.getStatusCode());
          fail("Test did not timeout");
        }
      });
    } catch (RequestException e) {
      fail(e.getMessage());
    }
  }

  public void testSetUser() {
    RequestBuilder builder = new RequestBuilder(RequestBuilder.GET,
        getTestBaseURL());
    try {
      builder.setUser(null);
    } catch (NullPointerException ex) {
      // Correct behavior, exception was thrown
    }

    try {
      builder.setUser("");
    } catch (IllegalArgumentException ex) {
      // Correct behavior, exception was thrown
    }
  }
}
