OverviewFilesCommitsIssuesDocsReleasesPeers

P2P-Hiverelay / test / unit / client-verify-seeded.test.js

57 lines · javascript ref:
/**
 * verifySeeded (Tier 1): trustlessly confirm a relay holds + serves an app.
 * The replication itself is Hypercore's (it verifies every block against the
 * drive key — upstream-tested); here we cover the parts THIS method owns: the
 * argument/connection guards, and the pure verdict logic.
 */
import test from 'brittle'
import { HiveRelayClient } from 'p2p-hiverelay-client'
import { EventEmitter } from 'events'
import { randomBytes } from 'crypto'

function mockSwarm () {
  const s = new EventEmitter()
  s.keyPair = { publicKey: Buffer.alloc(32, 0xaa), secretKey: null }
  s.connections = new Set(); s.join = () => ({ destroy () {} })
  s.leave = async () => {}; s.flush = async () => {}; s.destroy = async () => {}
  return s
}
const mockStore = () => ({ close: async () => {}, get: () => ({ key: Buffer.alloc(32), ready: async () => {} }) })
function makeClient () {
  const c = new HiveRelayClient({ swarm: mockSwarm(), store: mockStore() })
  c._started = true
  return c
}
const V = (c, o) => c._seededVerdict({ driveKey: 'x', relay: 'r', metaLength: 10, blobsLength: 5, relayIsPeer: true, relayRemoteLength: 10, contentVerified: true, ...o })

test('verifySeeded guards: requires opts.relay + an active connection (before any replication)', async (t) => {
  const c = makeClient()
  await t.exception(c.verifySeeded('a'.repeat(64), {}), /opts\.relay/)
  await t.exception(c.verifySeeded('a'.repeat(64), { relay: randomBytes(32).toString('hex') }), /NO_RELAY/)
})

test('verdict: relay is a full-length peer AND content verified => complete', (t) => {
  const v = V(makeClient(), {})
  t.ok(v.relayIsPeer); t.ok(v.relayHasFullLength); t.ok(v.contentVerified); t.ok(v.complete)
})

test('verdict: relay behind on length => not full, not complete', (t) => {
  const v = V(makeClient(), { relayRemoteLength: 4 })
  t.absent(v.relayHasFullLength); t.absent(v.complete)
})

test('verdict: relay not a peer => not held', (t) => {
  const v = V(makeClient(), { relayIsPeer: false, relayRemoteLength: 0 })
  t.absent(v.relayIsPeer); t.absent(v.relayHasFullLength); t.absent(v.complete)
})

test('verdict: content not verified => not complete even if relay advertises full', (t) => {
  const v = V(makeClient(), { contentVerified: false })
  t.ok(v.relayHasFullLength); t.absent(v.complete)
})

test('verdict: empty drive (metaLength 0) is never "full"', (t) => {
  const v = V(makeClient(), { metaLength: 0, relayRemoteLength: 0 })
  t.absent(v.relayHasFullLength); t.absent(v.complete)
})