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

function validateBlessings(t, blessings) {
  t.ok(blessings instanceof Blessings, 'Blessings have correct type');
  t.ok(typeof blessings._id === 'number' && blessings._id !== 0,
    'Blessing has non-zero id');
  t.ok(typeof blessings.publicKey === 'string' && blessings.publicKey !== '',
    'Blessing has public key');
  t.ok(blessings._controller, 'Blessing object has controller attached');
}

test('Test blessing store set (promise case)', function(t) {
  vanadium.init(config, function(err, runtime) {
    if (err) {
      t.end(err);
    }
    var blessSelfResult;
    runtime.principal.blessSelf(runtime.getContext(), 'ext')
    .then(function(blessings) {
      validateBlessings(t, blessings);
      blessSelfResult = blessings;

      return runtime.principal.blessingStore.set(runtime.getContext(),
        blessings, 'fake/remote/pattern');
    }).then(function() {
      return runtime.principal.blessingStore.set(runtime.getContext(),
        blessSelfResult, 'fake/remote/pattern');
    }).then(function(firstBlessing) {
      t.equal(firstBlessing._id, blessSelfResult._id,
        'Should get handle of first blessing back');
      validateBlessings(t, firstBlessing);
      runtime.close(t.end);
    }).catch(function(err) {
      t.error(err, 'either blessSelf or blessingStore.set errored');
      runtime.close(t.end);
    });
  });
});

test('Test blessing store set (callback case)', function(t) {
  vanadium.init(config, function(err, runtime) {
    if (err) {
      t.end(err);
    }
    var blessSelfResult;
    runtime.principal.blessSelf(runtime.getContext(), 'ext',
      function(err, blessings) {
      if (err) {
        t.error(err);
        runtime.close(t.end);
        return;
      }
      validateBlessings(t, blessings);
      blessSelfResult = blessings;

      runtime.principal.blessingStore.set(runtime.getContext(),
        blessings, 'fake/remote/pattern',
        function(err) {
        if (err) {
          t.error(err);
          runtime.close(t.end);
          return;
        }
        runtime.principal.blessingStore.set(runtime.getContext(),
          blessSelfResult, 'fake/remote/pattern',
          function(err, firstBlessing) {
          if (err) {
            t.error(err);
            runtime.close(t.end);
            return;
          }
          t.equal(firstBlessing._id, blessSelfResult._id,
            'Should get handle of first blessing back');
          validateBlessings(t, firstBlessing);
          runtime.close(t.end);
        });
      });
    });
  });
});

test('Test blessing store for peer (promise case)', function(t) {
  vanadium.init(config, function(err, runtime) {
    if (err) {
      t.end(err);
    }

    runtime.principal.blessSelf(runtime.getContext(), 'ext')
    .then(function(blessings) {
      validateBlessings(t, blessings);

      return runtime.principal.blessingStore.set(runtime.getContext(),
        blessings, 'fake/remote/pattern');
    }).then(function() {
      return runtime.principal.blessingStore.forPeer(runtime.getContext(),
        'fake/remote/pattern');
    }).then(function(firstBlessing) {
      validateBlessings(t, firstBlessing);
      runtime.close(t.end);
    }).catch(function(err) {
      t.error(err, 'error in one of the async calls');
      runtime.close(t.end);
    });
  });
});

test('Test blessing store for peer (callback case)', function(t) {
  vanadium.init(config, function(err, runtime) {
    if (err) {
      t.end(err);
    }

    runtime.principal.blessSelf(runtime.getContext(), 'ext',
      function(err, blessings) {
      if (err) {
        t.error(err);
        runtime.close(t.end);
        return;
      }
      validateBlessings(t, blessings);

      runtime.principal.blessingStore.set(runtime.getContext(),
        blessings, 'fake/remote/pattern',
        function(err) {
          if (err) {
            t.error(err);
            runtime.close(t.end);
            return;
          }
          return runtime.principal.blessingStore.forPeer(runtime.getContext(),
            'fake/remote/pattern',
            function(err, firstBlessing) {
              validateBlessings(t, firstBlessing);
              runtime.close(t.end);
          });
      });
    });
  });
});

test('Test blessing store set/get default (promise case)', function(t) {
  vanadium.init(config, function(err, runtime) {
    if (err) {
      t.end(err);
    }

    var blessSelfResult;
    var oldDefaultBlessings;
    runtime.principal.blessSelf(runtime.getContext(), 'ext')
    .then(function(blessings) {
      validateBlessings(t, blessings);
      blessSelfResult = blessings;

      return runtime.principal.blessingStore.getDefault(runtime.getContext());
    }).then(function(blessings) {
      oldDefaultBlessings = blessings;
      validateBlessings(t, oldDefaultBlessings);
      return runtime.principal.blessingStore.setDefault(
        runtime.getContext(), blessSelfResult);
    }).then(function() {
      return runtime.principal.blessingStore.getDefault(runtime.getContext());
    }).then(function(defaultBlessings) {
      validateBlessings(t, defaultBlessings);
      t.equal(defaultBlessings._id, blessSelfResult._id,
        'Should get handle of default blessing back');

      // Restore original default blessings
      return runtime.principal.blessingStore.setDefault(
        runtime.getContext(), oldDefaultBlessings);
    }).then(function() {
      runtime.close(t.end);
    }).catch(function(err) {
      t.error(err, 'error in one of the async calls');
      runtime.close(t.end);
    });
  });
});

test('Test blessing store set/get default (callback case)', function(t) {
  vanadium.init(config, function(err, runtime) {
    if (err) {
      t.end(err);
    }

    var blessSelfResult;
    var oldDefaultBlessings;
    runtime.principal.blessSelf(runtime.getContext(), 'ext',
      function(err, blessings) {
      if (err) {
        t.error(err);
        runtime.close(t.end);
        return;
      }
      validateBlessings(t, blessings);
      blessSelfResult = blessings;

      runtime.principal.blessingStore.getDefault(runtime.getContext(),
        function(err, blessings) {
        if (err) {
          t.error(err);
          runtime.close(t.end);
          return;
        }
        oldDefaultBlessings = blessings;
        validateBlessings(t, oldDefaultBlessings);

        runtime.principal.blessingStore.setDefault(runtime.getContext(),
          blessSelfResult, function(err) {
          runtime.principal.blessingStore.getDefault(runtime.getContext(),
            function(err, defaultBlessings) {
            if (err) {
              t.error(err);
              runtime.close(t.end);
              return;
            }
            validateBlessings(t, defaultBlessings);
            t.equal(defaultBlessings._id, blessSelfResult._id,
              'Should get handle of default blessing back');

            // Restore original default blessings
            runtime.principal.blessingStore.setDefault(runtime.getContext(),
              oldDefaultBlessings, function(err) {
              t.error(err, 'error setting default');
              runtime.close(t.end);
            });
          });
        });
      });
    });
  });
});

test('Test blessing store get public key (promise case)', function(t) {
  vanadium.init(config, function(err, runtime) {
    if (err) {
      t.end(err);
    }

    runtime.principal.blessingStore.getPublicKey(runtime.getContext())
    .then(function(publicKey) {
      t.ok(typeof publicKey === 'string' && publicKey !== '', 'got public key');
      runtime.close(t.end);
    }).catch(function(err) {
      t.error(err, 'error in getPublicKey()');
      runtime.close(t.end);
    });
  });
});

test('Test blessing store get public key (callback case)', function(t) {
  vanadium.init(config, function(err, runtime) {
    if (err) {
      t.end(err);
    }

    runtime.principal.blessingStore.getPublicKey(runtime.getContext(),
      function(err, publicKey) {
      if (err) {
        t.error(err);
        runtime.close(t.end);
        return;
      }
      t.ok(typeof publicKey === 'string' && publicKey !== '', 'got public key');
      runtime.close(t.end);
    });
  });
});

test('Test peer blessings (promise case)', function(t) {
  vanadium.init(config, function(err, runtime) {
    if (err) {
      t.end(err);
    }
    runtime.principal.blessSelf(runtime.getContext(), 'ext')
    .then(function(blessings) {
      validateBlessings(t, blessings);

      return runtime.principal.blessingStore.set(runtime.getContext(),
        blessings, 'fake/remote/pattern');
    }).then(function() {
      return runtime.principal.blessingStore.getPeerBlessings(
        runtime.getContext());
    }).then(function(peerBlessings) {
      t.ok(peerBlessings instanceof Map, 'Peer blessings is a map');
      t.ok(peerBlessings.size > 0, 'Non-empty peer blessings');
      peerBlessings.forEach(function(blessings, pattern) {
        t.ok(typeof pattern === 'string' && pattern !== '',
          'got string pattern');
        validateBlessings(t, blessings);
      });
      runtime.close(t.end);
    }).catch(function(err) {
      t.error(err, 'error in getPublicKey()');
      runtime.close(t.end);
    });
  });
});

test('Test peer blessings (callback case)', function(t) {
  vanadium.init(config, function(err, runtime) {
    if (err) {
      t.end(err);
    }
    runtime.principal.blessSelf(runtime.getContext(), 'ext',
      function(err, blessings) {
      if (err) {
        t.error(err);
        runtime.close(t.end);
        return;
      }
      validateBlessings(t, blessings);

      runtime.principal.blessingStore.set(runtime.getContext(),
        blessings, 'fake/remote/pattern', function(err){
        if (err) {
          t.error(err);
          runtime.close(t.end);
          return;
        }
        runtime.principal.blessingStore.getPeerBlessings(runtime.getContext(),
          function(err, peerBlessings) {
          if (err) {
            t.error(err);
            runtime.close(t.end);
            return;
          }
          t.ok(peerBlessings instanceof Map, 'Peer blessings is a map');
          t.ok(peerBlessings.size > 0, 'Non-empty peer blessings');
          peerBlessings.forEach(function(blessings, pattern) {
            t.ok(typeof pattern === 'string' && pattern !== '',
              'got string pattern');
            validateBlessings(t, blessings);
          });
          runtime.close(t.end);
        });
      });
    });
  });
});

test('Test blessing store get debug string (promise case)', function(t) {
  vanadium.init(config, function(err, runtime) {
    if (err) {
      t.end(err);
    }

    runtime.principal.blessingStore.getDebugString(runtime.getContext())
    .then(function(debugString) {
      t.ok(typeof debugString === 'string' && debugString !== '',
        'got blessing store debug string');
      runtime.close(t.end);
    }).catch(function(err) {
      t.error(err, 'error in getDebugString()');
      runtime.close(t.end);
    });
  });
});

test('Test blessing store get debug string (callback case)', function(t) {
  vanadium.init(config, function(err, runtime) {
    if (err) {
      t.end(err);
    }

    runtime.principal.blessingStore.getDebugString(runtime.getContext(),
      function(err, debugString) {
      if (err) {
        t.error(err);
        runtime.close(t.end);
        return;
      }
      t.ok(typeof debugString === 'string' && debugString !== '',
        'got blessing store debug string');
      runtime.close(t.end);
    });
  });
});
