copay/test/test.PublicKeyRing.js

356 lines
8.9 KiB
JavaScript
Raw Normal View History

2014-04-04 11:57:28 -07:00
'use strict';
var chai = chai || require('chai');
var should = chai.should();
2014-04-07 11:31:41 -07:00
var bitcore = bitcore || require('bitcore');
2014-04-04 11:57:28 -07:00
var Address = bitcore.Address;
var buffertools = bitcore.buffertools;
2014-04-07 11:31:41 -07:00
var copay = copay || require('../copay');
2014-04-09 19:04:22 -07:00
var PublicKeyRing = copay.PublicKeyRing;
2014-04-04 11:57:28 -07:00
var aMasterPubKey = 'tprv8ZgxMBicQKsPdSVTiWXEqCCzqRaRr9EAQdn5UVMpT9UHX67Dh1FmzEMbavPumpAicsUm2XvC6NTdcWB89yN5DUWx5HQ7z3KByUg7Ht74VRZ';
var config = {
2014-04-07 20:54:38 -07:00
networkName:'livenet',
2014-04-04 11:57:28 -07:00
};
2014-04-07 20:54:38 -07:00
var createW = function (networkName) {
2014-04-04 11:57:28 -07:00
var config = {
2014-04-07 20:54:38 -07:00
networkName: networkName || 'livenet',
2014-04-04 11:57:28 -07:00
};
var w = new PublicKeyRing(config);
should.exist(w);
var copayers = [];
for(var i=0; i<5; i++) {
2014-04-09 10:30:12 -07:00
w.isComplete().should.equal(false);
var newEpk = w.addCopayer();
copayers.push(newEpk);
2014-04-04 11:57:28 -07:00
}
2014-04-15 08:17:28 -07:00
w.walletId = '1234567';
2014-04-04 11:57:28 -07:00
return {w:w, copayers: copayers};
};
describe('PublicKeyRing model', function() {
it('should create an instance (livenet)', function () {
var w = new PublicKeyRing({
2014-04-07 20:54:38 -07:00
networkName: config.networkName
2014-04-04 11:57:28 -07:00
});
should.exist(w);
w.network.name.should.equal('livenet');
});
it('should create an instance (testnet)', function () {
var w2 = new PublicKeyRing();
should.exist(w2);
w2.network.name.should.equal('testnet');
});
it('should fail to generate shared pub keys wo extended key', function () {
var w2 = new PublicKeyRing(config);
should.exist(w2);
w2.registeredCopayers().should.equal(0);
2014-04-09 10:30:12 -07:00
w2.isComplete().should.equal(false);
2014-04-04 11:57:28 -07:00
2014-04-16 08:41:13 -07:00
(function() {w2.getAddress(0, false);}).should.throw();
2014-04-04 11:57:28 -07:00
});
it('should add and check when adding shared pub keys', function () {
var k = createW();
var w = k.w;
var copayers = k.copayers;
2014-04-09 10:30:12 -07:00
w.isComplete().should.equal(true);
2014-04-16 08:41:13 -07:00
w.addCopayer.should.throw();
for(var i =0; i<5; i++) {
(function() {w.addCopayer(copayers[i])}).should.throw();
}
2014-04-04 11:57:28 -07:00
});
2014-04-09 19:04:22 -07:00
it('show be able to tostore and read', function () {
2014-04-04 11:57:28 -07:00
var k = createW();
var w = k.w;
var copayers = k.copayers;
2014-04-17 11:04:39 -07:00
var changeN = 2;
var addressN = 2;
var start = new Date().getTime();
for(var i=0; i<changeN; i++) {
2014-04-04 16:16:15 -07:00
w.generateAddress(true);
2014-04-17 11:04:39 -07:00
}
for(var i=0; i<addressN; i++) {
2014-04-04 16:16:15 -07:00
w.generateAddress(false);
2014-04-17 11:04:39 -07:00
}
2014-04-04 11:57:28 -07:00
2014-04-15 08:17:28 -07:00
var data = w.toObj();
2014-04-09 19:04:22 -07:00
should.exist(data);
2014-04-15 08:17:28 -07:00
var w2 = PublicKeyRing.fromObj(data);
w2.walletId.should.equal(w.walletId);
2014-04-09 10:30:12 -07:00
w2.isComplete().should.equal(true);
2014-04-16 08:41:13 -07:00
w2.addCopayer.should.throw();
for(var i =0; i<5; i++) {
(function() {w.addCopayer(copayers[i])}).should.throw();
}
2014-04-04 16:16:15 -07:00
2014-06-04 09:44:32 -07:00
w2.indexes.getChangeIndex().should.equal(changeN);
w2.indexes.getReceiveIndex().should.equal(addressN);
2014-04-04 11:57:28 -07:00
});
it('should generate some p2sh addresses', function () {
var k = createW();
var w = k.w;
for(var isChange=0; isChange<2; isChange++) {
2014-04-17 11:04:39 -07:00
for(var i=0; i<2; i++) {
2014-04-10 21:09:42 -07:00
var a = w.generateAddress(isChange);
2014-04-04 11:57:28 -07:00
a.isValid().should.equal(true);
a.isScript().should.equal(true);
a.network().name.should.equal('livenet');
2014-04-04 15:59:00 -07:00
if (i>1) {
2014-04-10 21:09:42 -07:00
w.getAddress(i-1,isChange).toString().should
.not.equal(w.getAddress(i-2,isChange).toString());
2014-04-04 15:59:00 -07:00
}
2014-04-04 11:57:28 -07:00
}
}
});
it('should return PublicKeyRing addresses', function () {
var k = createW();
var w = k.w;
var a = w.getAddresses();
a.length.should.equal(0);
for(var isChange=0; isChange<2; isChange++)
2014-04-17 11:04:39 -07:00
for(var i=0; i<2; i++)
2014-04-04 11:57:28 -07:00
w.generateAddress(isChange);
var as = w.getAddresses();
2014-04-17 11:04:39 -07:00
as.length.should.equal(4);
2014-04-04 16:16:15 -07:00
for(var j in as) {
2014-04-10 21:09:42 -07:00
var a = as[j];
2014-04-04 11:57:28 -07:00
a.isValid().should.equal(true);
}
});
2014-04-04 16:16:15 -07:00
it('should count generation indexes', function () {
var k = createW();
var w = k.w;
for(var i=0; i<3; i++)
w.generateAddress(true);
2014-04-17 11:04:39 -07:00
for(var i=0; i<2; i++)
2014-04-04 16:16:15 -07:00
w.generateAddress(false);
2014-06-04 09:44:32 -07:00
w.indexes.getChangeIndex().should.equal(3);
w.indexes.getReceiveIndex().should.equal(2);
2014-04-04 16:16:15 -07:00
});
2014-04-07 07:46:45 -07:00
it('#merge index tests', function () {
var k = createW();
var w = k.w;
for(var i=0; i<2; i++)
w.generateAddress(true);
for(var i=0; i<3; i++)
w.generateAddress(false);
var w2 = new PublicKeyRing({
2014-04-07 20:54:38 -07:00
networkName: 'livenet',
2014-04-15 08:17:28 -07:00
walletId: w.walletId,
2014-04-07 07:46:45 -07:00
});
w2.merge(w).should.equal(true);
2014-04-07 07:46:45 -07:00
w2.requiredCopayers.should.equal(3);
w2.totalCopayers.should.equal(5);
2014-06-04 09:44:32 -07:00
w2.indexes.getChangeIndex().should.equal(2);
w2.indexes.getReceiveIndex().should.equal(3);
2014-04-07 07:46:45 -07:00
//
w2.merge(w).should.equal(false);
2014-04-07 07:46:45 -07:00
});
it('#merge check tests', function () {
var config = {
networkName: 'livenet',
};
2014-04-07 20:54:38 -07:00
var w = new PublicKeyRing(config);
2014-04-15 08:17:28 -07:00
w.walletId = 'lwjd5qra8257b9';
2014-04-07 20:54:38 -07:00
var w2 = new PublicKeyRing({
networkName: 'testnet', //wrong
2014-04-15 08:17:28 -07:00
walletId: w.walletId,
2014-04-07 20:54:38 -07:00
});
(function() { w2.merge(w);}).should.throw();
2014-04-07 20:54:38 -07:00
2014-04-07 07:46:45 -07:00
var w3 = new PublicKeyRing({
2014-04-07 20:54:38 -07:00
networkName: 'livenet',
2014-04-15 08:17:28 -07:00
walletId: w.walletId,
requiredCopayers: 2, // wrong
2014-04-07 07:46:45 -07:00
});
(function() { w3.merge(w);}).should.throw();
2014-04-07 07:46:45 -07:00
var w4 = new PublicKeyRing({
2014-04-07 20:54:38 -07:00
networkName: 'livenet',
2014-04-15 08:17:28 -07:00
walletId: w.walletId,
totalCopayers: 3, // wrong
2014-04-07 07:46:45 -07:00
});
(function() { w4.merge(w);}).should.throw();
2014-04-07 07:46:45 -07:00
var w6 = new PublicKeyRing({
2014-04-07 20:54:38 -07:00
networkName: 'livenet',
2014-04-07 07:46:45 -07:00
});
(function() { w6.merge(w);}).should.throw();
w.networkName= 'livenet';
(function() { w6.merge(w);}).should.throw();
2014-04-07 20:54:38 -07:00
var w0 = new PublicKeyRing({
networkName: 'livenet',
});
w0.addCopayer();
w0.addCopayer();
w0.addCopayer();
w0.addCopayer();
w0.addCopayer();
(function() { w0.merge(w);}).should.throw();
w.merge(w0,true).should.equal(true);
w.isComplete().should.equal(true);
var wx = new PublicKeyRing({
networkName: 'livenet',
});
wx.addCopayer();
2014-04-23 18:43:17 -07:00
(function() { w.merge(wx);}).should.throw();
2014-04-07 07:46:45 -07:00
});
it('#merge pubkey tests', function () {
var w = new PublicKeyRing(config);
should.exist(w);
var copayers = [];
for(var i=0; i<2; i++) {
2014-04-09 10:30:12 -07:00
w.isComplete().should.equal(false);
2014-04-07 07:46:45 -07:00
w.addCopayer();
}
var w2 = new PublicKeyRing({
2014-04-07 20:54:38 -07:00
networkName: 'livenet',
2014-04-07 07:46:45 -07:00
id: w.id,
});
should.exist(w);
var copayers = [];
for(var i=0; i<3; i++) {
2014-04-09 10:30:12 -07:00
w2.isComplete().should.equal(false);
2014-04-07 07:46:45 -07:00
w2.addCopayer();
}
w2.merge(w).should.equal(true);
2014-04-09 10:30:12 -07:00
w2.isComplete().should.equal(true);
w2.merge(w).should.equal(false);
2014-04-07 07:46:45 -07:00
2014-04-09 10:30:12 -07:00
w.isComplete().should.equal(false);
w.merge(w2).should.equal(true);
2014-04-09 10:30:12 -07:00
w.isComplete().should.equal(true);
w.merge(w2).should.equal(false);
2014-04-07 07:46:45 -07:00
});
it('#merge pubkey tests (case 2)', function () {
var w = new PublicKeyRing(config);
should.exist(w);
for(var i=0; i<5; i++) {
2014-04-09 10:30:12 -07:00
w.isComplete().should.equal(false);
2014-04-07 07:46:45 -07:00
var w2 = new PublicKeyRing({
2014-04-07 20:54:38 -07:00
networkName: 'livenet',
2014-04-07 07:46:45 -07:00
id: w.id,
});
w2.addCopayer();
w.merge(w2).should.equal(true);
2014-04-07 07:46:45 -07:00
}
2014-04-09 10:30:12 -07:00
w.isComplete().should.equal(true);
2014-04-07 07:46:45 -07:00
});
2014-04-09 13:28:35 -07:00
2014-05-01 05:41:18 -07:00
it('#merge with nickname', function () {
var w = new PublicKeyRing(config);
should.exist(w);
for(var i=0; i<3; i++) {
w.addCopayer();
};
w._setNicknameForIndex(0,'pepe0');
w._setNicknameForIndex(1,'pepe1');
w.nicknameForIndex(0).should.equal('pepe0');
w.nicknameForIndex(1).should.equal('pepe1');
should.not.exist(w.nicknameForIndex(2));
for(var i=0; i<2; i++) {
w.isComplete().should.equal(false);
var w2 = new PublicKeyRing({
networkName: 'livenet',
id: w.id,
});
w2.addCopayer();
w2._setNicknameForIndex(0,'juan' + i);
w.merge(w2).should.equal(true);
}
w.isComplete().should.equal(true);
w.nicknameForIndex(0).should.equal('pepe0');
w.nicknameForIndex(1).should.equal('pepe1');
should.not.exist(w.nicknameForIndex(2));
w.nicknameForIndex(3).should.equal('juan0');
w.nicknameForIndex(4).should.equal('juan1');
});
it('#toObj #fromObj with nickname', function () {
var w = new PublicKeyRing(config);
should.exist(w);
for(var i=0; i<3; i++) {
w.addCopayer(null, 'tito'+i);
};
w.nicknameForIndex(0).should.equal('tito0');
w.nicknameForIndex(1).should.equal('tito1');
w.nicknameForIndex(2).should.equal('tito2');
should.not.exist(w.nicknameForIndex(3));
var o = JSON.parse(JSON.stringify(w.toObj()));
var w2 = PublicKeyRing.fromObj( o );
w2.nicknameForIndex(0).should.equal('tito0');
w2.nicknameForIndex(1).should.equal('tito1');
w2.nicknameForIndex(2).should.equal('tito2');
should.not.exist(w2.nicknameForIndex(3));
});
2014-04-09 13:28:35 -07:00
it('#getRedeemScriptMap check tests', function () {
var k = createW();
var w = k.w;
for(var i=0; i<2; i++)
w.generateAddress(true);
2014-04-17 11:04:39 -07:00
for(var i=0; i<2; i++)
2014-04-09 13:28:35 -07:00
w.generateAddress(false);
var m = w.getRedeemScriptMap();
2014-04-17 11:04:39 -07:00
Object.keys(m).length.should.equal(4);
2014-04-09 13:28:35 -07:00
Object.keys(m).forEach(function (k) {
should.exist(m[k]);
});
});
2014-04-04 11:57:28 -07:00
});