var Cc = Components.classes;
var Ci = Components.interfaces;
var Cu = Components.utils;
var Cr = Components.results;

ChromeUtils.import("resource://testing-common/httpd.js");

function getRDFService()
{
  return Cc["@mozilla.org/rdf/rdf-service;1"].
    getService(Ci.nsIRDFService);
}

var server1, server2;

function run_test()
{
  var samplefile = do_get_file('sample.rdf');

  server1 = new HttpServer();
  server1.registerPathHandler("/sample-xs.rdf", xsRedirect);
  server1.registerPathHandler("/sample-local.rdf", localRedirect);
  server1.registerFile('/sample.rdf', samplefile);
  server1.start(4444);

  server2 = new HttpServer();
  server2.registerFile('/sample.rdf', samplefile);
  server2.start(4445);

  do_test_pending();

  new rdfLoadObserver('http://localhost:4444/sample.rdf', true);
  new rdfLoadObserver('http://localhost:4445/sample.rdf', true);
  new rdfLoadObserver('http://localhost:4444/sample-xs.rdf', false);
  new rdfLoadObserver('http://localhost:4444/sample-local.rdf', true);
}

var gPending = 0;

function rdfLoadObserver(uri, shouldPass)
{
  this.shouldPass = shouldPass;
  this.uri = uri;

  ++gPending;

  var rdfService = getRDFService();
  this.ds = rdfService.GetDataSource(uri).
    QueryInterface(Ci.nsIRDFXMLSink);
  this.ds.addXMLSinkObserver(this);
}

rdfLoadObserver.prototype =
{
  onBeginLoad : function() { },
  onInterrupt : function() { },
  onResume : function() { },
  onEndLoad : function() {
    print("Testing results of loading " + this.uri);

    var rdfs = getRDFService();
    var res = rdfs.GetResource("urn:mozilla:sample-data");
    var arc = rdfs.GetResource("http://purl.org/dc/elements/1.1/title");
    var answer = this.ds.GetTarget(res, arc, true);
    if (answer !== null) {
      Assert.ok(this.shouldPass);
      Assert.ok(answer instanceof Ci.nsIRDFLiteral);
      Assert.equal(answer.Value, "Sample");
    }
    else {
      Assert.ok(!this.shouldPass);
    }

    gPending -= 1;

    this.ds.removeXMLSinkObserver(this);

    if (gPending == 0) {
      do_test_pending();
      server1.stop(do_test_finished);
      server2.stop(do_test_finished);
    }
  },
  onError : function() { }
}

function xsRedirect(metadata, response)
{
  response.setStatusLine(metadata.httpVersion, 301, "Moved Permanently");
  response.setHeader("Location", "http://localhost:4445/sample.rdf", false);
}

function localRedirect(metadata, response)
{
  response.setStatusLine(metadata.httpVersion, 301, "Moved Permanently");
  response.setHeader("Location", "http://localhost:4444/sample.rdf", false);
}
