// 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 config = require('./default-config');
var security = vanadium.security;

test('Test union of blessings (promise case)', function(t) {
  vanadium.init(config, function(err, runtime) {
    if (err) {
      t.end(err);
    }

    runtime.principal.blessSelf(runtime.getContext(), 'blessedname1')
    .then(function(blessings1) {
      return runtime.principal.blessSelf(runtime.getContext(), 'blessedname2')
      .then(function(blessings2) {
        return security.unionOfBlessings(
          runtime.getContext(), blessings1, blessings2);
      });
    })
    .then(function(unionedBlessings) {
      t.ok(unionedBlessings.toString().indexOf('blessedname1') >= 0,
          'first blessing in union');
      t.ok(unionedBlessings.toString().indexOf('blessedname2') >= 0,
          'second blessing in union');
      runtime.close(t.end);
    }).catch(function(err) {
      runtime.close();
      t.end(err);
    });
  });
});

test('Test union of blessings (callback case)', function(t) {
  vanadium.init(config, function(err, runtime) {
    if (err) {
      t.end(err);
    }

    runtime.principal.blessSelf(runtime.getContext(), 'blessedname1',
      function(err, blessings1) {
      if (err) {
        t.error(err);
        runtime.close(t.end);
        return;
      }
      runtime.principal.blessSelf(runtime.getContext(), 'blessedname2',
        function(err, blessings2) {
        if (err) {
          t.error(err);
          runtime.close(t.end);
          return;
        }
        security.unionOfBlessings(runtime.getContext(), blessings1,
          blessings2, function(err, unionedBlessings) {
          if (err) {
            t.error(err);
            runtime.close(t.end);
            return;
          }
          t.ok(unionedBlessings.toString().indexOf('blessedname1') >= 0,
              'first blessing in union');
          t.ok(unionedBlessings.toString().indexOf('blessedname2') >= 0,
              'second blessing in union');
            runtime.close(t.end);
        });
      });
    });
  });
});
