Tidy up test harness.

This commit is contained in:
gnuxie committed 2021-09-24 18:25:27 +01:00
1 parent 1a1eb5fadd
commit 57ef8ab7fe
6 files changed
+72 -64

No files matched your search

-10
View File
@@ -1,10 +0,0 @@
## Testing mjolnir with docker
At the moment a test environment for mjolnir can be setup by running
`./mjolnir_testing.sh` from the parent directory. This script will use
the `docker-compose.yaml` in the parent directory.
This sets up synapse container with a user for mjolnir to use.
The container for mjolnir, creates and joins the moderation room
which has to be specified with an alias in the config under `managementRoom`.
Eventually this setup should be moved to a testing module.
-14
View File
@@ -44,11 +44,6 @@ if (config.health.healthz.enabled) {
Healthz.listen();
}
async function createManagementRoom(client: MatrixClient, alias: string) {
let roomId = await client.createRoom();
await client.createRoomAlias(alias, roomId);
}
(async function () {
const storage = new SimpleFsStorageProvider(path.join(config.dataPath, "bot.json"));
@@ -61,13 +56,6 @@ async function createManagementRoom(client: MatrixClient, alias: string) {
}
config.RUNTIME.client = client;
// probably better to change to a config value
if (process.env.NODE_ENV === "development") {
// expects the config value to be an alias
// don't know what to do about that for now
// probably should validate it so someone doesn't have a huge headache
await createManagementRoom(client, config.managementRoom);
}
client.on("room.invite", async (roomId: string, inviteEvent: any) => {
const membershipEvent = new MembershipEvent(inviteEvent);
@@ -100,9 +88,7 @@ async function createManagementRoom(client: MatrixClient, alias: string) {
const banLists: BanList[] = [];
const protectedRooms: { [roomId: string]: string } = {};
const joinedRooms = await client.getJoinedRooms();
// Ensure we're also joined to the rooms we're protecting
LogService.info("index", "Resolving protected rooms...");
for (const roomRef of config.protectedRooms) {
@@ -1,6 +0,0 @@
# Only exists to register a user, temporary solution
FROM matrixdotorg/synapse:latest
VOLUME ["/data"]
CMD ["-c", "/data/homeserver.yaml", "-u", "mjolnir", "-p", "mjolnir", "--admin", "http://synapse_release:9999"]
ENTRYPOINT ["register_new_matrix_user"]
-2
View File
@@ -1,9 +1,7 @@
import * as mjolnirTesting from './mjolnirTesting';
console.log('wat')
switch (process.argv[2]) {
case 'up':
console.info('hmm')
mjolnirTesting.upHarness();
break;
case 'down':
+31
View File
@@ -0,0 +1,31 @@
import {
MatrixClient,
Permalinks,
} from "matrix-bot-sdk";
import config from "../../src/config";
export async function createManagementRoom(client: MatrixClient) {
let roomId = await client.createRoom();
return await client.createRoomAlias(config.managementRoom, roomId);
}
export async function ensureManagementRoomExists(client: MatrixClient): Promise<string> {
return await client.resolveRoom(config.managementRoom).catch(async e => {
if (e?.body?.errcode === 'M_NOT_FOUND') {
console.info("moderation room hasn't been created yet, so we're making it now.")
return await createManagementRoom(client);
}
throw e;
});
}
export async function ensureLobbyRoomExists(client: MatrixClient): Promise<string> {
const alias = Permalinks.parseUrl(config.protectedRooms[0]).roomIdOrAlias;
return await client.resolveRoom(alias).catch(async e => {
if (e?.body?.errcode === 'M_NOT_FOUND') {
console.info(`${alias} hasn't been created yet, so we're making it now.`)
return await client.createRoomAlias(alias, await client.createRoom());
}
throw e;
});
}
+41 -32
View File
@@ -1,14 +1,35 @@
/*
Copyright 2021 The Matrix.org Foundation C.I.C.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
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";
import * as mjolnirSetup from './mjolnirSetup';
import {
PantalaimonClient,
MemoryStorageProvider
} from "matrix-bot-sdk";
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\
await fs.writeFile(synapseEnv, `# NOTE: This file is generated by the test harness.
UID=${process.getuid()}\n\
GID=${process.getuid()}\n\
SYNAPSE_SERVER_NAME=localhost:9999
SYNAPSE_REPORT_STATS=no\n\
@@ -18,8 +39,6 @@ SYNAPSE_CONFIG_DIR=/data`);
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');
@@ -43,46 +62,39 @@ async function configureSynapseData() {
}
async function startSynpase() {
const sleep = ms => new Promise(resolve => setTimeout(resolve, ms))
await synapseGenerate();
console.info('starting synapse.')
await compose.upOne('synapse_release', {config: composeConfig, log: true})
await registerTestUser();
await sleep(5000);
await registerUser('mjolnir', 'mjolnir', 'mjolnir', true);
await registerUser('admin', 'admin', 'admin', true);
}
async function configureMjolnir() {
// do we want to clean mjolnir everytime?
//await fs.rm('synapse-data', {recursive: true, force: true});
await fs.copyFile(path.join(__dirname, 'config', 'mjolnir', 'harness.yaml'), path.join(__dirname, '../../config/harness.yaml'));
await fs.rm(path.join(__dirname, 'mjolnir-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')
console.debug('mjolnir-data already exists');
} else {
throw e
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.
const pantalaimon = new PantalaimonClient(config.homeserverUrl, new MemoryStorageProvider());
const client = await pantalaimon.createClientWithCredentials(config.pantalaimon.username, config.pantalaimon.password);
await mjolnirSetup.ensureManagementRoomExists(client);
return await mjolnirSetup.ensureLobbyRoomExists(client);
}
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');
@@ -95,23 +107,19 @@ async function registerUser(username: string, displayname: string, password: str
mac: mac.toString()
}).catch(e => {
if (e.isAxiosError && e.response.data.errcode === 'M_USER_IN_USE') {
console.log('user already registered, skipping')
console.log(`${username} 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
// 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);
@@ -121,6 +129,7 @@ export async function upHarness() {
}
export async function downHarness() {
await cleanUpSynpase();
}
compose.down({config: composeConfig, log: true});
await fs.rm(path.join(__dirname, 'synapse-data'), {recursive: true, force: true});
await fs.rm(path.join(__dirname, 'mjolnir-data'), {recursive: true, force: true});
}