Basic harness, starts synapse and mjolnir.

This commit is contained in:
gnuxie 2021-09-06 14:29:28 +01:00
parent 7e44cf99c1
commit 1a1eb5fadd
4 changed files with 144 additions and 27 deletions

View File

@ -4,17 +4,19 @@ services:
synapse_release:
build:
context: .
dockerfile: docker/Dockerfile.synapse.latest
dockerfile: test/harness/config/docker/Dockerfile.synapse.latest
ports:
- "9999:9999"
volumes:
- ./docker/synapse-data:/data
- ./test/harness/synapse-data:/data
env_file:
- ./test/harness/config/synapse/synapse.env
synapse_registration:
build:
context: .
dockerfile: docker/Dockerfile.synapse.registration
dockerfile: test/harness/config/docker/Dockerfile.synapse.registration
volumes:
- ./docker/synapse-data:/data
- ./test/harness/synapse-data:/data
depends_on: [synapse_release]
mjolnir:
environment:

View File

@ -1,23 +0,0 @@
#!/bin/bash
# This script only exists so that the persitent state in volumes
# is removed. Eventually this should be moved to a module
# managing the integration tests.
cleanup () {
set +e
rm -f docker/synapse-data/homeserver.db
set -e
}
case "$1" in
up)
cleanup
exec docker-compose up
;;
down)
exec docker-compose down
;;
*)
echo "Usage: $SCRIPTNAME {up|down}" >&2
exit 3
;;
esac

View File

@ -0,0 +1,12 @@
import * as mjolnirTesting from './mjolnirTesting';
console.log('wat')
switch (process.argv[2]) {
case 'up':
console.info('hmm')
mjolnirTesting.upHarness();
break;
case 'down':
mjolnirTesting.downHarness();
break;
}

View File

@ -0,0 +1,126 @@
import * as compose from 'docker-compose';
import * as path from 'path';
import * as fs from 'fs/promises';
import * as HmacSHA1 from 'crypto-js/hmac-sha1';
import axios from 'axios';
import config from "../../src/config";
const composeConfig = path.join(__dirname, '../../docker-compose.test.yaml');
async function synapseGenerate() {
let synapseEnv = path.join(__dirname, 'config/synapse/synapse.env');
await fs.writeFile(synapseEnv, `UID=${process.getuid()}\n\
GID=${process.getuid()}\n\
SYNAPSE_SERVER_NAME=localhost:9999
SYNAPSE_REPORT_STATS=no\n\
SYNAPSE_CONFIG_DIR=/data`);
console.log('generating synapse keys');
await compose.run('synapse_release', 'generate', {config: composeConfig, log:true});
console.log(process.env.NODE_ENV)
}
// create synapase-data directory
// copy config to it
async function configureSynapseData() {
let synapseData = path.join(__dirname, 'synapse-data');
let synapseConfig = path.join(__dirname, 'config/synapse');
await fs.mkdir(synapseData).catch(e => {
if (e.code === 'EEXIST') {
console.debug('synapse-data already exists')
} else {
throw e
}
}
);
await fs.mkdir(path.join(synapseData, 'media_store')).catch (e => {
if (e.code === 'EEXIST') {
console.debug('media_store already exists')
} else {
throw e
}
});
await fs.copyFile(path.join(synapseConfig, 'homeserver.yaml'),
path.join(synapseData, "homeserver.yaml"));
}
async function startSynpase() {
await synapseGenerate();
console.info('starting synapse.')
await compose.upOne('synapse_release', {config: composeConfig, log: true})
await registerTestUser();
}
async function configureMjolnir() {
// do we want to clean mjolnir everytime?
//await fs.rm('synapse-data', {recursive: true, force: true});
await fs.mkdir(path.join(__dirname, 'mjolnir-data')).catch (e => {
if (e.code === 'EEXIST') {
console.debug('mjolnir-data already exists')
} else {
throw e
}
});
// now we need to setup the management room alias that it should join.
// just make bot sdk and make it here or something
// or we should probably have a generic setup module.
}
async function startMjolnir() {
await configureMjolnir();
console.info('starting mjolnir');
// will not work without some additonal config, but also it isn't useful to debug like this.
// it would be nice if there was a way to run tests and mjolnir in the same process
// to assist with debugging
//await compose.upOne('mjolnir', {config: composeConfig, log: true})
await import('../../src/index');
}
async function cleanUpSynpase() {
await fs.rm('synapse-data', {recursive: true, force: true});
}
async function registerUser(username: string, displayname: string, password: string, admin: boolean) {
let registerUrl = `${config.homeserverUrl}/_synapse/admin/v1/register`
console.log(registerUrl);
let { data } = await axios.get(registerUrl);
let nonce = data.nonce!;
let mac = HmacSHA1(`${nonce}\0${username}\0${password}\0${admin ? 'admin' : 'notadmin'}`, 'REGISTRATION_SHARED_SECRET');
return await axios.post(registerUrl, {
nonce,
username,
displayname,
password,
admin,
mac: mac.toString()
}).catch(e => {
if (e.isAxiosError && e.response.data.errcode === 'M_USER_IN_USE') {
console.log('user already registered, skipping')
} else {
throw e;
}
});
}
async function registerTestUser() {
return await registerUser('mjolnir', 'mjolnir', 'mjolnir', true);
}
export async function upHarness() {
try {
await configureSynapseData();
await startSynpase();
// this doesn't actually seem to be implented by the library authors (at least it doesn't do what you'd expect)?
// see their github issue https://github.com/PDMLab/docker-compose/issues/127
//await compose.logs(['mjolnir', 'synapse_release'], {config: composeConfig, follow: true});
} catch (e) {
console.error(e);
throw e;
}
await startMjolnir();
}
export async function downHarness() {
await cleanUpSynpase();
}