initial commit

Signed-off-by: dzdidi <deniszalessky@gmail.com>
This commit is contained in:
dzdidi
2023-08-07 18:19:41 +02:00
commit 2b709e0b55
16 changed files with 1000 additions and 0 deletions

68
test/appHome.test.js Normal file
View File

@@ -0,0 +1,68 @@
const { test } = require('brittle')
const fs = require('fs')
const path = require('path')
const appHome = require('../src/appHome')
test('getAppHome', t => {
t.ok(appHome.APP_HOME)
})
test('createAppFolder, share, is shared, unshare, isInitialized, list, getCodePath', t => {
appHome.createAppFolder('appHome-test')
t.ok(fs.existsSync(path.join(appHome.APP_HOME, 'appHome-test', 'code')))
t.absent(appHome.isShared('appHome-test'))
t.absent(fs.existsSync(path.join(appHome.APP_HOME, 'appHome-test', '.git-daemon-export-ok')))
appHome.shareAppFolder('appHome-test')
t.ok(appHome.isShared('appHome-test'))
t.ok(fs.existsSync(path.join(appHome.APP_HOME, 'appHome-test', '.git-daemon-export-ok')))
appHome.unshareAppFolder('appHome-test')
t.absent(appHome.isShared('appHome-test'))
t.absent(fs.existsSync(path.join(appHome.APP_HOME, 'appHome-test', '.git-daemon-export-ok')))
t.absent(appHome.isInitialized('appHome-test'))
t.ok(appHome.isInitialized('foo'))
t.alike(new Set(appHome.list()), new Set(['foo', 'bar', 'zar', 'appHome-test']))
t.alike(new Set(appHome.list(true)), new Set(['foo', 'bar', 'zar']))
t.alike(path.resolve(appHome.getCodePath('appHome-test')), path.resolve(path.join(appHome.APP_HOME, 'appHome-test', 'code')))
t.teardown(() => {
fs.rmdirSync(path.join(appHome.APP_HOME, 'appHome-test', 'code'), { recursive: true })
})
})
test('readPk, getKeyPair', t => {
t.ok(appHome.readPk())
t.ok(appHome.getKeyPair())
})
test('getOutStream, getErrStream', t => {
t.absent(fs.existsSync(path.join(appHome.APP_HOME, 'out.log')))
t.ok(appHome.getOutStream())
t.ok(fs.existsSync(path.join(appHome.APP_HOME, 'out.log')))
t.absent(fs.existsSync(path.join(appHome.APP_HOME, 'err.log')))
t.ok(appHome.getErrStream())
t.ok(fs.existsSync(path.join(appHome.APP_HOME, 'err.log')))
t.teardown(() => {
fs.unlinkSync(path.join(appHome.APP_HOME, 'out.log'))
fs.unlinkSync(path.join(appHome.APP_HOME, 'err.log'))
})
})
test('getDaemonPid, removeDaemonPid', t => {
t.absent(appHome.getDaemonPid())
appHome.storeDaemonPid(123)
t.alike(appHome.getDaemonPid(), 123)
appHome.removeDaemonPid()
t.absent(appHome.getDaemonPid())
})

65
test/git.test.js Normal file
View File

@@ -0,0 +1,65 @@
const test = require('brittle')
const fs = require('fs')
const path = require('path')
const appHome = require('../src/appHome.js')
const git = require('../src/git.js')
test('git - lsPromise', async t => {
const res = await git.lsPromise('./')
t.ok(res)
t.ok(res.HEAD)
t.is(Buffer.from(res.HEAD, 'hex').length, 20)
for (const key in res) {
if (key === 'HEAD') continue
t.ok(key.startsWith('refs/'))
t.is(Buffer.from(res[key], 'hex').length, 20)
}
})
test('git - uploadPack (wo have)', async t => {
t.plan(3)
const { HEAD } = await git.lsPromise('./')
t.ok(HEAD)
const res = git.uploadPack('./', HEAD)
res.on('exit', (code) => t.ok(code === 0))
res.on('ready', () => {
const stream = fs.createWriteStream('/dev/null')
res.stdout.pipe(stream)
stream.on('close', () => t.pass())
})
})
test('git - uploadPack (w have)', { skip: true }, async t => {
t.plan(3)
const SECOND_COMMIT = ''
const { HEAD } = await git.lsPromise('./')
t.ok(HEAD)
const res = git.uploadPack('./', HEAD, SECOND_COMMIT)
res.on('exit', (code) => t.ok(code === 0))
res.on('ready', () => {
const stream = fs.createWriteStream('/dev/null')
res.stdout.pipe(stream)
stream.on('close', () => t.pass())
})
})
test('git - createBareRepo', async t => {
t.absent(fs.existsSync(path.join(appHome.APP_HOME, 'test-git', 'code')))
appHome.createAppFolder('test-git')
t.absent(fs.existsSync(path.join(appHome.APP_HOME, 'test-git', 'code', 'HEAD')))
await git.createBareRepo('test-git')
t.ok(fs.existsSync(path.join(appHome.APP_HOME, 'test-git', 'code', 'HEAD')))
t.teardown(() => {
fs.rmdirSync(path.join(appHome.APP_HOME, 'test-git'), { recursive: true })
})
})

80
test/rpc.test.js Normal file
View File

@@ -0,0 +1,80 @@
const test = require('brittle')
const RAM = require('random-access-memory')
const createTestnet = require('@hyperswarm/testnet')
const Corestore = require('corestore')
const Hyperswarm = require('hyperswarm')
const Hyperdrive = require('hyperdrive')
const ProtomuxRPC = require('protomux-rpc')
const RPC = require('../src/rpc.js')
const setState = require('../src/state.js')
test('constructor', async t => {
const rpc = new RPC('announcedRefs', 'repositories', 'drives')
t.ok(rpc)
t.is(rpc.announcedRefs, 'announcedRefs')
t.is(rpc.repositories, 'repositories')
t.is(rpc.drives, 'drives')
t.alike(rpc.connections, {})
})
test('e2e', async t => {
t.plan(3)
const testnet = await createTestnet(3, t)
const { rpc, store } = await getRPC()
const clientStore = new Corestore(RAM)
const topic = Buffer.alloc(32).fill('pear 2 pear')
const serverSwarm = new Hyperswarm(testnet)
serverSwarm.on('connection', (socket, details) => {
store.replicate(socket)
rpc.setHandlers(socket, details)
})
serverSwarm.join(topic)
await serverSwarm.flush()
const clientSwarm = new Hyperswarm(testnet)
clientSwarm.on('connection', async (socket) => {
clientStore.replicate(socket)
const rpc = new ProtomuxRPC(socket)
const reposRes = await rpc.request('get-repos')
const reposJSON = JSON.parse(reposRes.toString())
const driveKey = Buffer.from(reposJSON.foo, 'hex')
t.ok(driveKey)
const drive = new Hyperdrive(clientStore.namespace('foo'), driveKey)
await drive.ready()
clientSwarm.join(drive.discoveryKey, { server: false, client: true })
await clientSwarm.flush()
await drive.core.update({ wait: true })
const refsRes = await rpc.request('get-refs', Buffer.from('foo'))
t.ok(refsRes)
const want = Object.values(JSON.parse(refsRes.toString()))[0]
const exists = await drive.exists(`/packs/${want}.pack`)
t.ok(exists)
})
clientSwarm.join(topic, { server: false, client: true })
t.teardown(async () => {
await serverSwarm.destroy()
await clientSwarm.destroy()
})
})
async function getRPC () {
const store = new Corestore(RAM)
const { announcedRefs, repositories, drives } = await setState(store)
return {
rpc: new RPC(announcedRefs, repositories, drives),
store
}
}

23
test/state.test.js Normal file
View File

@@ -0,0 +1,23 @@
const test = require('brittle')
const setState = require('../src/state.js')
const Corestore = require('corestore')
const RAM = require('random-access-memory')
const repoNames = ['foo', 'bar', 'zar']
test('setState', async t => {
const res = await setState(new Corestore(RAM))
t.ok(res.announcedRefs)
t.alike(new Set(Object.values(res.announcedRefs)), new Set(repoNames))
t.ok(res.repositories)
t.alike(new Set(Object.keys(res.repositories)), new Set(repoNames))
t.ok(res.drives)
for (const repo in res.repositories) {
t.ok(res.repositories[repo])
t.ok(res.drives[repo].key)
}
})