From e957a4a578b0bf86bf22f90957e760e7e70c4b44 Mon Sep 17 00:00:00 2001 From: Andre Staltz Date: Thu, 25 May 2023 16:11:20 +0300 Subject: [PATCH] more msg-v2 tests --- test/msg-v2/lipmaa.test.js | 129 +++++++++++++++++++++++++ test/msg-v2/tangles.test.js | 178 +++++++++++++++++++++++++++++++++++ test/msg-v2/validate.test.js | 90 ++++++++++++++++++ 3 files changed, 397 insertions(+) create mode 100644 test/msg-v2/lipmaa.test.js create mode 100644 test/msg-v2/tangles.test.js create mode 100644 test/msg-v2/validate.test.js diff --git a/test/msg-v2/lipmaa.test.js b/test/msg-v2/lipmaa.test.js new file mode 100644 index 0000000..d8c54ee --- /dev/null +++ b/test/msg-v2/lipmaa.test.js @@ -0,0 +1,129 @@ +const tape = require('tape') +const MsgV2 = require('../../lib/msg-v2') +const { generateKeypair } = require('../util') + +tape('lipmaa prevs', (t) => { + const keys = generateKeypair('alice') + const group = MsgV2.getMsgHash(MsgV2.createGroup(keys, 'MYNONCE')) + const data = { text: 'Hello world!' } + + const rootMsg = MsgV2.createRoot(group, 'post', keys) + const rootHash = MsgV2.getMsgHash(rootMsg) + const tangle = new MsgV2.Tangle(rootHash) + tangle.add(rootHash, rootMsg) + + const msg1 = MsgV2.create({ + group, + groupTips: [group], + type: 'post', + data, + tangles: { + [rootHash]: tangle, + }, + keys, + }) + const msgHash1 = MsgV2.getMsgHash(msg1) + tangle.add(msgHash1, msg1) + t.equals(msg1.metadata.tangles[rootHash].depth, 1, 'msg1 depth') + t.deepEquals(msg1.metadata.tangles[rootHash].prev, [rootHash], 'msg1 prev') + + const msg2 = MsgV2.create({ + group, + groupTips: [group], + type: 'post', + data, + tangles: { + [rootHash]: tangle, + }, + keys, + }) + const msgHash2 = MsgV2.getMsgHash(msg2) + tangle.add(msgHash2, msg2) + t.equals(msg2.metadata.tangles[rootHash].depth, 2, 'msg2 depth') + t.deepEquals(msg2.metadata.tangles[rootHash].prev, [msgHash1], 'msg2 prev') + + const msg3 = MsgV2.create({ + group, + groupTips: [group], + type: 'post', + data, + tangles: { + [rootHash]: tangle, + }, + keys, + }) + const msgHash3 = MsgV2.getMsgHash(msg3) + tangle.add(msgHash3, msg3) + t.equals(msg3.metadata.tangles[rootHash].depth, 3, 'msg3 depth') + t.deepEquals( + msg3.metadata.tangles[rootHash].prev, + [rootHash, msgHash2].sort(), + 'msg3 prev (has lipmaa!)' + ) + + const msg4 = MsgV2.create({ + group, + groupTips: [group], + type: 'post', + keys, + tangles: { + [rootHash]: tangle, + }, + data, + }) + const msgHash4 = MsgV2.getMsgHash(msg4) + tangle.add(msgHash4, msg4) + t.equals(msg4.metadata.tangles[rootHash].depth, 4, 'msg4 depth') + t.deepEquals(msg4.metadata.tangles[rootHash].prev, [msgHash3], 'msg4 prev') + + const msg5 = MsgV2.create({ + group, + groupTips: [group], + type: 'post', + data, + tangles: { + [rootHash]: tangle, + }, + keys, + }) + const msgHash5 = MsgV2.getMsgHash(msg5) + tangle.add(msgHash5, msg5) + t.equals(msg5.metadata.tangles[rootHash].depth, 5, 'msg5 depth') + t.deepEquals(msg5.metadata.tangles[rootHash].prev, [msgHash4], 'msg5 prev') + + const msg6 = MsgV2.create({ + group, + groupTips: [group], + type: 'post', + data, + tangles: { + [rootHash]: tangle, + }, + keys, + }) + const msgHash6 = MsgV2.getMsgHash(msg6) + tangle.add(msgHash6, msg6) + t.equals(msg6.metadata.tangles[rootHash].depth, 6, 'msg6 depth') + t.deepEquals(msg6.metadata.tangles[rootHash].prev, [msgHash5], 'msg6 prev') + + const msg7 = MsgV2.create({ + group, + groupTips: [group], + type: 'post', + data, + tangles: { + [rootHash]: tangle, + }, + keys, + }) + const msgHash7 = MsgV2.getMsgHash(msg7) + tangle.add(msgHash7, msg7) + t.equals(msg7.metadata.tangles[rootHash].depth, 7, 'msg7 depth') + t.deepEquals( + msg7.metadata.tangles[rootHash].prev, + [msgHash3, msgHash6].sort(), + 'msg7 prev (has lipmaa!)' + ) + + t.end() +}) diff --git a/test/msg-v2/tangles.test.js b/test/msg-v2/tangles.test.js new file mode 100644 index 0000000..93a7612 --- /dev/null +++ b/test/msg-v2/tangles.test.js @@ -0,0 +1,178 @@ +const tape = require('tape') +const MsgV2 = require('../../lib/msg-v2') +const { generateKeypair } = require('../util') + +tape('simple multi-author tangle', (t) => { + const keysA = generateKeypair('alice') + const keysB = generateKeypair('bob') + const groupA = MsgV2.getMsgHash(MsgV2.createGroup(keysA, 'alice')) + const groupB = MsgV2.getMsgHash(MsgV2.createGroup(keysB, 'bob')) + + const rootMsgA = MsgV2.createRoot(groupA, 'post', keysA) + const rootHashA = MsgV2.getMsgHash(rootMsgA) + const tangleA = new MsgV2.Tangle(rootHashA) + tangleA.add(rootHashA, rootMsgA) + + const rootMsgB = MsgV2.createRoot(groupB, 'post', keysB) + const rootHashB = MsgV2.getMsgHash(rootMsgB) + const tangleB = new MsgV2.Tangle(rootHashB) + tangleB.add(rootHashB, rootMsgB) + + const msg1 = MsgV2.create({ + group: groupA, + groupTips: [groupA], + type: 'post', + data: { text: 'Hello world!' }, + tangles: { + [rootHashA]: tangleA, + }, + keys: keysA, + }) + const msgHash1 = MsgV2.getMsgHash(msg1) + t.deepEquals( + Object.keys(msg1.metadata.tangles), + [rootHashA], + 'msg1 has only feed tangle' + ) + + const tangleX = new MsgV2.Tangle(msgHash1) + tangleX.add(msgHash1, msg1) + + const msg2 = MsgV2.create({ + group: groupB, + groupTips: [groupB], + type: 'post', + data: { text: 'Hello world!' }, + tangles: { + [rootHashB]: tangleB, + [msgHash1]: tangleX, + }, + keys: keysB, + }) + + t.deepEquals( + Object.keys(msg2.metadata.tangles).sort(), + [rootHashB, msgHash1].sort(), + 'msg2 has feed tangle and misc tangle' + ) + t.equal(msg2.metadata.tangles[rootHashB].depth, 1, 'msg2 feed tangle depth') + t.deepEquals( + msg2.metadata.tangles[rootHashB].prev, + [rootHashB], + 'msg2 feed tangle prev' + ) + + t.equal(msg2.metadata.tangles[msgHash1].depth, 1, 'msg2 has tangle depth 1') + t.deepEquals( + msg2.metadata.tangles[msgHash1].prev, + [msgHash1], + 'msg2 has tangle prev' + ) + + t.end() +}) + +tape('lipmaa in multi-author tangle', (t) => { + const keysA = generateKeypair('alice') + const keysB = generateKeypair('bob') + const groupA = MsgV2.getMsgHash(MsgV2.createGroup(keysA, 'alice')) + const groupB = MsgV2.getMsgHash(MsgV2.createGroup(keysB, 'bob')) + + const data = { text: 'Hello world!' } + + const rootMsgA = MsgV2.createRoot(groupA, 'post', keysA) + const rootHashA = MsgV2.getMsgHash(rootMsgA) + const tangleA = new MsgV2.Tangle(rootHashA) + tangleA.add(rootHashA, rootMsgA) + + const rootMsgB = MsgV2.createRoot(groupB, 'post', keysB) + const rootHashB = MsgV2.getMsgHash(rootMsgB) + const tangleB = new MsgV2.Tangle(rootHashB) + tangleB.add(rootHashB, rootMsgB) + + const msg1 = MsgV2.create({ + group: groupA, + groupTips: [groupA], + type: 'post', + data, + tangles: { + [rootHashA]: tangleA, + }, + keys: keysA, + }) + const msgHash1 = MsgV2.getMsgHash(msg1) + tangleA.add(msgHash1, msg1) + const tangleThread = new MsgV2.Tangle(msgHash1) + tangleThread.add(msgHash1, msg1) + + t.deepEquals( + Object.keys(msg1.metadata.tangles), + [rootHashA], + 'A:msg1 has only feed tangle' + ) + + const msg2 = MsgV2.create({ + group: groupB, + groupTips: [groupB], + type: 'post', + data, + tangles: { + [rootHashB]: tangleB, + [msgHash1]: tangleThread, + }, + keys: keysB, + }) + const msgHash2 = MsgV2.getMsgHash(msg2) + tangleB.add(msgHash2, msg2) + tangleThread.add(msgHash2, msg2) + + t.deepEquals( + msg2.metadata.tangles[msgHash1].prev, + [msgHash1], + 'B:msg2 points to A:msg1' + ) + + const msg3 = MsgV2.create({ + group: groupB, + groupTips: [groupB], + type: 'post', + data, + tangles: { + [rootHashB]: tangleB, + [msgHash1]: tangleThread, + }, + keys: keysB, + }) + const msgHash3 = MsgV2.getMsgHash(msg3) + tangleB.add(msgHash3, msg3) + tangleThread.add(msgHash3, msg3) + + t.deepEquals( + msg3.metadata.tangles[msgHash1].prev, + [msgHash2], + 'B:msg3 points to B:msg2' + ) + + const msg4 = MsgV2.create({ + group: groupA, + groupTips: [groupA], + type: 'post', + data, + tangles: { + [rootHashA]: tangleA, + [msgHash1]: tangleThread, + }, + keys: keysA, + }) + const msgHash4 = MsgV2.getMsgHash(msg4) + tangleB.add(msgHash4, msg4) + tangleThread.add(msgHash4, msg4) + + t.deepEquals( + msg4.metadata.tangles[msgHash1].prev, + [msgHash1, msgHash3].sort(), + 'A:msg4 points to A:msg1,B:msg3' + ) + + t.end() +}) diff --git a/test/msg-v2/validate.test.js b/test/msg-v2/validate.test.js new file mode 100644 index 0000000..c1f3857 --- /dev/null +++ b/test/msg-v2/validate.test.js @@ -0,0 +1,90 @@ +const tape = require('tape') +const base58 = require('bs58') +const MsgV2 = require('../../lib/msg-v2') +const { generateKeypair } = require('../util') + +tape('validate root msg', (t) => { + const keys = generateKeypair('alice') + const group = MsgV2.getMsgHash(MsgV2.createGroup(keys, 'alice')) + const pubkeys = new Set([keys.id]) + + const rootMsg = MsgV2.createRoot(group, 'post', keys) + const rootHash = MsgV2.getMsgHash(rootMsg) + const tangle = new MsgV2.Tangle(rootHash) + + const err = MsgV2.validate(rootMsg, tangle, pubkeys, rootHash, rootHash) + if (err) console.log(err) + t.error(err, 'valid root msg') + t.end() +}) + +tape('validate 2nd msg with existing root', (t) => { + const keys = generateKeypair('alice') + const group = MsgV2.getMsgHash(MsgV2.createGroup(keys, 'alice')) + const pubkeys = new Set([keys.id]) + + const rootMsg = MsgV2.createRoot(group, 'post', keys) + const rootHash = MsgV2.getMsgHash(rootMsg) + const tangle = new MsgV2.Tangle(rootHash) + tangle.add(rootHash, rootMsg) + + const msg1 = MsgV2.create({ + group, + groupTips: [group], + type: 'post', + data: { text: 'Hello world!' }, + tangles: { + [rootHash]: tangle, + }, + keys, + }) + const msgHash1 = MsgV2.getMsgHash(msg1) + tangle.add(msgHash1, msg1) + + const err = MsgV2.validate(msg1, tangle, pubkeys, msgHash1, rootHash) + if (err) console.log(err) + t.error(err, 'valid 2nd msg') + t.end() +}) + +tape('validate 2nd forked msg', (t) => { + const keys = generateKeypair('alice') + const group = MsgV2.getMsgHash(MsgV2.createGroup(keys, 'alice')) + const pubkeys = new Set([keys.id]) + + const rootMsg = MsgV2.createRoot(group, 'post', keys) + const rootHash = MsgV2.getMsgHash(rootMsg) + const tangle = new MsgV2.Tangle(rootHash) + tangle.add(rootHash, rootMsg) + + const msg1A = MsgV2.create({ + group, + groupTips: [group], + type: 'post', + data: { text: 'Hello world!' }, + tangles: { + [rootHash]: tangle, + }, + keys, + }) + const msgHash1A = MsgV2.getMsgHash(msg1A) + + const msg1B = MsgV2.create({ + group, + groupTips: [group], + type: 'post', + data: { text: 'Hello world!' }, + tangles: { + [rootHash]: tangle, + }, + keys, + }) + const msgHash1B = MsgV2.getMsgHash(msg1B) + + tangle.add(msgHash1A, msg1A) + tangle.add(msgHash1B, msg1B) + const err = MsgV2.validate(msg1B, tangle, pubkeys, msgHash1B, rootHash) + if (err) console.log(err) + t.error(err, 'valid 2nd forked msg') + t.end() +})