// 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(blessings.chains.length > 0, 'Non-empty chains');
  t.ok(blessings.publicKey, 'Public key is set');
}

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.deepEqual(firstBlessing, blessSelfResult,
        'Should get first blessings 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.deepEqual(firstBlessing, blessSelfResult,
            'Should get first blessings 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.deepEqual(defaultBlessings, blessSelfResult,
        'Should get default blessings 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.deepEqual(defaultBlessings, blessSelfResult,
              'Should get default blessings 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(publicKey instanceof Uint8Array && publicKey.length > 0,
        '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(publicKey instanceof Uint8Array && publicKey.length > 0,
        '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);
    });
  });
});
