<html>
<import src="../resources/chai.sky" />
<import src="../resources/mocha.sky" />
<import src="/gen/mojo/public/interfaces/application/shell.mojom.sky" as="shellMojom" />
<import src="/gen/mojo/public/sky/connection.sky" as="connection" />
<import src="/gen/mojo/public/sky/core.sky" as="core" />
<import src="/gen/mojo/services/network/public/interfaces/network_service.mojom.sky" as="net" />
<import src="/gen/mojo/services/network/public/interfaces/url_loader.mojom.sky" as="loader" />
<import src="/gen/mojo/services/public/sky/shell.sky" as="shell" />
<script>
const Shell = shell.Shell;

describe('Mojo network_service', function() {
  this.enableTimeouts(false);

  it('should be able to fetch text files', function(done) {
    var shellHandle = internals.passShellProxyHandle();
    var shellProxy = connection.bindHandleToProxy(shellHandle, shellMojom.Shell);
    var shell = new Shell(shellProxy);
    var netService = shell.connectToService(
      "mojo:network_service", net.NetworkService);

    var urlLoader;
    netService.createURLLoader(function(urlLoaderProxy) {
      urlLoader = urlLoaderProxy;
    });

    var urlRequest = new loader.URLRequest();
    urlRequest.url = "http://127.0.0.1:8000/sky/tests/services/resources/pass.txt";
    urlRequest.method = "GET";
    urlRequest.auto_follow_redirects = true;

    var urlRequestPromise = urlLoader.start(urlRequest);
    urlRequestPromise.then(function(result) {
      if (result.response.error) {
        assert.ok(false, "network request failed " + result.response.error.code + " "
            + result.response.error.description);
        done();
      }
      console.log("url => " + result.response["url"]);
      console.log("status_line => " + result.response["status_line"]);
      console.log("mime_type => " + result.response["mime_type"]);

      var start = Date.now();
      while (Date.now() - start < 3) {}

      var drainDataPromise = core.drainData(result.response.body);
      drainDataPromise.then(function(result) {
        console.log("read " + result.buffer.byteLength + " bytes");
        done();
      }).catch(function() {
        assert.ok(false, "core.drainData failed");
        done();
      });
    }).catch(function() {
      assert.ok(false, "start failed");
      done();
    });
  });
});
</script>
</html>
