// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

var test = require('prova');
var vanadium = require('../../');
var serve = require('./serve');

function dispatcher(suffix) {
  return {
    service: function(ctx, serverCall) {
      throw new Error('NotImplemented');
    },
    authorizer: function(ctx, call) {
      return null;
    }
  };
}

test('Test IsLeaf=True Server Option', function(t) {
  var serverOption = vanadium.rpc.serverOption({
    isLeaf: true
  });
  var name = 'testing/serverOption/isLeafTrue';

  var servObj = {
    name: name,
    dispatcher: dispatcher,
    serverOption: serverOption
  };

  serve(servObj, function(err, res) {
    t.error(err);

    var rt = res.runtime;
    var ns = rt.getNamespace();
    var stream = ns.glob(rt.getContext(), name).stream;
    stream.on('data', function(mp) {
      t.error(err);

      t.equal(mp.isLeaf, true, 'Glob must indicate server is a leaf');
      t.equal(mp.servesMountTable, false,
        'Glob must indicate server is not a mounttable');
      res.end(t);
    });
  });
});

test('Test IsLeaf=False Server Option', function(t) {
  var serverOption = vanadium.rpc.serverOption({
    isLeaf: false
  });
  var name = 'testing/serverOption/isLeafFalse';

  var servObj = {
    name: name,
    dispatcher: dispatcher,
    serverOption: serverOption
  };

  serve(servObj, function(err, res) {
    t.error(err);

    var rt = res.runtime;
    var ns = rt.getNamespace();
    var stream = ns.glob(rt.getContext(), name).stream;
    stream.on('data', function(mp) {
      t.error(err);

      t.equal(mp.isLeaf, false, 'Glob must indicate server is not a leaf');
      t.equal(mp.servesMountTable, false,
        'Glob must indicate server is not a mounttable');
      res.end(t);
    });
  });
});

test('Test ServesMountTable=True Server Option', function(t) {
  var serverOption = vanadium.rpc.serverOption({
    servesMountTable: true
  });
  var name = 'testing/serverOption/ServesMountTableTrue';

  var servObj = {
    name: name,
    dispatcher: dispatcher,
    serverOption: serverOption
  };

  serve(servObj, function(err, res) {
    t.error(err);

    var rt = res.runtime;
    var ns = rt.getNamespace();
    var stream = ns.glob(rt.getContext(), name).stream;
    stream.on('data', function(mp) {
      t.error(err);

      t.equal(mp.isLeaf, false, 'Glob must indicate server is not a leaf');
      t.equal(mp.servesMountTable, true,
        'Glob must indicate server is a mounttable');
      res.end(t);
    });
  });
});

test('Test ServesMountTable=false server option', function(t) {
  var serverOption = vanadium.rpc.serverOption({
    servesMountTable: false
  });
  var name = 'testing/serverOption/ServesMountTableFalse';

  var servObj = {
    name: name,
    dispatcher: dispatcher,
    serverOption: serverOption
  };

  serve(servObj, function(err, res) {
    t.error(err);

    var rt = res.runtime;
    var ns = rt.getNamespace();
    var stream = ns.glob(rt.getContext(), name).stream;
    stream.on('data', function(mp) {
      t.error(err);

      t.equal(mp.isLeaf, false, 'Glob must indicate server is not a leaf');
      t.equal(mp.servesMountTable, false,
        'Glob must indicate server is not a mounttable');
      res.end(t);
    });
  });
});

test('Test ServesMountTable=ture and IsLeaf=true server option',
  function(t) {
    var serverOption = vanadium.rpc.serverOption({
      servesMountTable: true,
      isLeaf: true
    });
    var name = 'testing/serverOption/Both';

    var servObj = {
      name: name,
      dispatcher: dispatcher,
      serverOption: serverOption
    };

    serve(servObj, function(err, res) {
      t.error(err);

      var rt = res.runtime;
      var ns = rt.getNamespace();
      var stream = ns.glob(rt.getContext(), name).stream;
      stream.on('data', function(mp) {
        t.error(err);

        t.equal(mp.isLeaf, true, 'Glob must indicate server is a leaf');
        t.equal(mp.servesMountTable, true,
          'Glob must indicate server is a mounttable');
        res.end(t);
      });
    });
  });