mirror of https://codeberg.org/pzp/pzp-net.git
125 lines
4.6 KiB
JavaScript
125 lines
4.6 KiB
JavaScript
const test = require('node:test')
|
|
const assert = require('node:assert')
|
|
const FS = require('node:fs')
|
|
const Path = require('node:path')
|
|
const p = require('node:util').promisify
|
|
const { createPeerMock } = require('./util')
|
|
|
|
const PUBKEY = 'EqTMFv7zm8hpPyAkj789qdJgqtz81AEbcinpAs24RRUC'
|
|
const PUBKEY2 = 'FqTMFv7zm8hpPyAkj789qdJgqtz81AEbcinpAs24RRUC'
|
|
const TEST_ADDR = `/ip4/127.0.0.1/tcp/9752/shse/${PUBKEY}`
|
|
const TEST_TUNNEL_ADDR = `/tunnel/${PUBKEY}.${PUBKEY2}/shse/${PUBKEY2}`
|
|
|
|
test('Glueing together stats with connections', async (t) => {
|
|
await t.test('stage() is ignored when peer already connected', async () => {
|
|
const peer = createPeerMock()
|
|
|
|
const address = TEST_ADDR
|
|
const result = await p(peer.net.connect)(address)
|
|
assert.ok(result, 'connect was succesful')
|
|
|
|
const entriesBefore = await p(peer.net.peers())(null)
|
|
assert.equal(entriesBefore.length, 1, 'there is one entry in peers()')
|
|
assert.equal(entriesBefore[0][0], address, 'entry addr ok')
|
|
assert.equal(entriesBefore[0][1].state, 'connected', 'entry state ok')
|
|
|
|
const stagingResult = peer.net.stage(address, { mode: 'internet' })
|
|
assert.equal(stagingResult, false, 'stage() should refuse')
|
|
|
|
const entriesAfter = await p(peer.net.peers())(null)
|
|
assert.equal(entriesAfter.length, 1, 'there is one entry in peers()')
|
|
assert.equal(entriesAfter[0][0], address, 'entry addr ok')
|
|
assert.equal(entriesAfter[0][1].state, 'connected', 'entry state ok')
|
|
})
|
|
|
|
await t.test('stage() successful', async (t) => {
|
|
const peer = createPeerMock()
|
|
const address = TEST_ADDR
|
|
|
|
const entriesBefore = await p(peer.net.peers())(null)
|
|
assert.equal(entriesBefore.length, 0, 'there is no entry in peers()')
|
|
|
|
const stagingResult = peer.net.stage(address, { mode: 'internet' })
|
|
assert.equal(stagingResult, true, 'stage() successful')
|
|
|
|
const entriesAfter = await p(peer.net.peers())(null)
|
|
assert.equal(entriesAfter.length, 1, 'there is one entry in peers()')
|
|
assert.equal(entriesAfter[0][0], address, 'entry addr ok')
|
|
assert.equal(entriesAfter[0][1].state, 'disconnected', 'entry state ok')
|
|
})
|
|
|
|
await t.test('connect() will trigger stats persistence', async (t) => {
|
|
const peer = createPeerMock()
|
|
const address = TEST_ADDR
|
|
|
|
const entriesBefore = await p(peer.net.peers())(null)
|
|
assert.equal(entriesBefore.length, 0, 'there is no entry in peers()')
|
|
|
|
const rpc = await p(peer.net.connect)(address)
|
|
assert.ok(rpc, 'connect() successful')
|
|
|
|
const statsJSONPath = Path.join(peer.mockDir, 'net', './stats.json')
|
|
while (FS.existsSync(statsJSONPath) === false) {
|
|
await p(setTimeout)(1)
|
|
}
|
|
|
|
await p(setTimeout)(2000)
|
|
|
|
const fileContents = FS.readFileSync(statsJSONPath, 'utf8')
|
|
const json = JSON.parse(fileContents)
|
|
assert.deepEqual(Object.keys(json), [TEST_ADDR])
|
|
assert.ok(Object.keys(json[TEST_ADDR]).includes('stateChange'))
|
|
})
|
|
|
|
await t.test('tunnel connections are not stats-persisted', async (t) => {
|
|
const peer = createPeerMock()
|
|
const address = TEST_TUNNEL_ADDR
|
|
|
|
const entriesBefore = await p(peer.net.peers())(null)
|
|
assert.equal(entriesBefore.length, 0, 'there is no entry in peers()')
|
|
|
|
const rpc = await p(peer.net.connect)(address)
|
|
assert.ok(rpc, 'connect() successful')
|
|
|
|
const statsJSONPath = Path.join(peer.mockDir, 'net', './stats.json')
|
|
while (FS.existsSync(statsJSONPath) === false) {
|
|
await p(setTimeout)(1)
|
|
}
|
|
const fileContents = FS.readFileSync(statsJSONPath, 'utf8')
|
|
const json = JSON.parse(fileContents)
|
|
assert.deepEqual(Object.keys(json), [])
|
|
})
|
|
|
|
await t.test('forget() will remove stats', async (t) => {
|
|
const peer = createPeerMock()
|
|
const address = TEST_ADDR
|
|
|
|
const entriesBefore = await p(peer.net.peers())(null)
|
|
assert.equal(entriesBefore.length, 0, 'there is no entry in peers()')
|
|
|
|
const rpc = await p(peer.net.connect)(address)
|
|
assert.ok(rpc, 'connect() successful')
|
|
|
|
const statsJSONPath = Path.join(peer.mockDir, 'net', './stats.json')
|
|
while (FS.existsSync(statsJSONPath) === false) {
|
|
await p(setTimeout)(1)
|
|
}
|
|
|
|
await p(setTimeout)(1000)
|
|
|
|
const fileContents = FS.readFileSync(statsJSONPath, 'utf8')
|
|
assert.equal(fileContents.length > 10, true, 'stats.json is not empty')
|
|
|
|
peer.net.forget(address)
|
|
await p(setTimeout)(200)
|
|
|
|
await p(setTimeout)(1000)
|
|
|
|
const entriesAfterForget = await p(peer.net.peers())(null)
|
|
assert.equal(entriesAfterForget.length, 0, 'there is no entry in peers()')
|
|
|
|
const fileContents2 = FS.readFileSync(statsJSONPath, 'utf8')
|
|
assert.equal(fileContents2, '{}', 'stats.json is empty')
|
|
})
|
|
})
|