/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/**
 * Authentication tests for NNTP (based on RFC4643).
 */

// The basic daemon to use for testing Nntpd.sys.mjs implementations
var daemon = setupNNTPDaemon();

add_task(async function () {
  await Services.logins.initializationPromise;

  daemon.groupCredentials = {
    "test.subscribe.empty": ["group1", "pass1"],
    "test.filter": ["group2", "pass2"],
  };

  var server = makeServer(NNTP_RFC4643_extension, daemon);
  server.start();
  var localserver = setupLocalServer(server.port);
  localserver.singleSignon = false;

  // Add passwords to the manager
  var serverURI = "news://localhost/";
  var loginInfo1 = Cc["@mozilla.org/login-manager/loginInfo;1"].createInstance(
    Ci.nsILoginInfo
  );
  loginInfo1.init(
    serverURI + "test.subscribe.empty",
    null,
    serverURI + "test.subscribe.empty",
    "group1",
    "pass1",
    "",
    ""
  );
  await Services.logins.addLoginAsync(loginInfo1);
  var loginInfo2 = Cc["@mozilla.org/login-manager/loginInfo;1"].createInstance(
    Ci.nsILoginInfo
  );
  loginInfo2.init(
    serverURI + "test.filter",
    null,
    serverURI + "test.filter",
    "group2",
    "pass2",
    "",
    ""
  );
  await Services.logins.addLoginAsync(loginInfo2);
  try {
    var prefix = "news://localhost:" + server.port + "/";
    var transaction;

    test = "per-group password part 1";
    setupProtocolTest(
      server.port,
      prefix + "test.subscribe.empty",
      localserver
    );
    server.performTest();
    transaction = server.playTransaction();
    do_check_transaction(transaction, [
      "MODE READER",
      "GROUP test.subscribe.empty",
      "AUTHINFO user group1",
      "AUTHINFO pass pass1",
      "GROUP test.subscribe.empty",
    ]);

    test = "per-group password part 2";
    server.resetTest();
    setupProtocolTest(server.port, prefix + "test.filter", localserver);
    server.performTest();
    transaction = server.playTransaction();
    do_check_transaction(transaction, [
      "MODE READER",
      "GROUP test.filter",
      "AUTHINFO user group2",
      "AUTHINFO pass pass2",
      "GROUP test.filter",
      "XOVER 1-8",
    ]);
  } catch (e) {
    dump("NNTP Protocol test " + test + " failed for type RFC 977:\n");
    try {
      var trans = server.playTransaction();
      if (trans) {
        dump("Commands called: " + uneval(trans) + "\n");
      }
    } catch (exp) {}
    do_throw(e);
  }
  server.stop();

  var thread = Services.tm.currentThread;
  while (thread.hasPendingEvents()) {
    thread.processNextEvent(true);
  }
});
