Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
pull/28860/head
Michael Telatynski 2025-01-06 08:58:11 +00:00
parent c0337f141b
commit a4ba79ae69
No known key found for this signature in database
GPG Key ID: A2B008A5F49F5D0D
4 changed files with 56 additions and 7 deletions

View File

@ -18,10 +18,11 @@ const test = base.extend<{
testRoom: { roomId: string; name: string }; testRoom: { roomId: string; name: string };
joinedBot: Bot; joinedBot: Bot;
}>({ }>({
slidingSyncProxy: async ({ network, postgres, page, homeserver }, use, testInfo) => { slidingSyncProxy: async ({ logger, network, postgres, page, homeserver }, use, testInfo) => {
const container = await new GenericContainer("ghcr.io/matrix-org/sliding-sync:v0.99.3") const container = await new GenericContainer("ghcr.io/matrix-org/sliding-sync:v0.99.3")
.withNetwork(network) .withNetwork(network)
.withExposedPorts(8008) .withExposedPorts(8008)
.withLogConsumer(logger.getConsumer("sliding-sync-proxy"))
.withEnvironment({ .withEnvironment({
SYNCV3_SECRET: "bwahahaha", SYNCV3_SECRET: "bwahahaha",
SYNCV3_DB: `user=postgres dbname=postgres password=${postgres.getPassword()} host=${postgres.getHost()} sslmode=disable`, SYNCV3_DB: `user=postgres dbname=postgres password=${postgres.getPassword()} host=${postgres.getHost()} sslmode=disable`,

View File

@ -12,8 +12,11 @@ import { PostgreSqlContainer, StartedPostgreSqlContainer } from "@testcontainers
import { StartedSynapseContainer, SynapseConfigOptions, SynapseContainer } from "./testcontainers/synapse.ts"; import { StartedSynapseContainer, SynapseConfigOptions, SynapseContainer } from "./testcontainers/synapse.ts";
import { MatrixAuthenticationServiceContainer } from "./testcontainers/mas.ts"; import { MatrixAuthenticationServiceContainer } from "./testcontainers/mas.ts";
import { ContainerLogger } from "./testcontainers/utils.ts";
export interface Services { export interface Services {
logger: ContainerLogger;
network: StartedNetwork; network: StartedNetwork;
postgres: StartedPostgreSqlContainer; postgres: StartedPostgreSqlContainer;
@ -26,18 +29,24 @@ export interface Services {
mas: StartedTestContainer; mas: StartedTestContainer;
} }
// TODO logs
export const test = base.extend<Services>({ export const test = base.extend<Services>({
// eslint-disable-next-line no-empty-pattern
logger: async ({}, use, testInfo) => {
const logger = new ContainerLogger();
await use(logger);
await logger.testFinished(testInfo);
},
// eslint-disable-next-line no-empty-pattern // eslint-disable-next-line no-empty-pattern
network: async ({}, use) => { network: async ({}, use) => {
const network = await new Network().start(); const network = await new Network().start();
await use(network); await use(network);
await network.stop(); await network.stop();
}, },
postgres: async ({ network }, use) => { postgres: async ({ logger, network }, use) => {
const container = await new PostgreSqlContainer() const container = await new PostgreSqlContainer()
.withNetwork(network) .withNetwork(network)
.withNetworkAliases("postgres") .withNetworkAliases("postgres")
.withLogConsumer(logger.getConsumer("postgres"))
.withTmpFs({ .withTmpFs({
"/dev/shm/pgdata/data": "", "/dev/shm/pgdata/data": "",
}) })
@ -59,11 +68,12 @@ export const test = base.extend<Services>({
await container.stop(); await container.stop();
}, },
mailhog: async ({ network }, use) => { mailhog: async ({ logger, network }, use) => {
const container = await new GenericContainer("mailhog/mailhog:latest") const container = await new GenericContainer("mailhog/mailhog:latest")
.withNetwork(network) .withNetwork(network)
.withNetworkAliases("mailhog") .withNetworkAliases("mailhog")
.withExposedPorts(8025) .withExposedPorts(8025)
.withLogConsumer(logger.getConsumer("mailhog"))
.withWaitStrategy(Wait.forListeningPorts()) .withWaitStrategy(Wait.forListeningPorts())
.start(); .start();
await use(container); await use(container);
@ -78,20 +88,22 @@ export const test = base.extend<Services>({
const container = new SynapseContainer(request); const container = new SynapseContainer(request);
await use(container); await use(container);
}, },
homeserver: async ({ network, _homeserver: homeserver, synapseConfigOptions }, use) => { homeserver: async ({ logger, network, _homeserver: homeserver, synapseConfigOptions }, use) => {
const container = await homeserver const container = await homeserver
.withNetwork(network) .withNetwork(network)
.withNetworkAliases("homeserver") .withNetworkAliases("homeserver")
.withLogConsumer(logger.getConsumer("synapse"))
.withConfig(synapseConfigOptions) .withConfig(synapseConfigOptions)
.start(); .start();
await use(container); await use(container);
await container.stop(); await container.stop();
}, },
mas: async ({ network }, use) => { mas: async ({ logger, network }, use) => {
const container = await new MatrixAuthenticationServiceContainer() const container = await new MatrixAuthenticationServiceContainer()
.withNetwork(network) .withNetwork(network)
.withNetworkAliases("mas") .withNetworkAliases("mas")
.withLogConsumer(logger.getConsumer("mas"))
.withConfig({ .withConfig({
clients: [ clients: [
{ {

View File

@ -94,7 +94,7 @@ const DEFAULT_CONFIG = {
burst_count: 10000, burst_count: 10000,
}, },
}, },
media_store_path: "/media", media_store_path: "/data/media_store",
max_upload_size: "50M", max_upload_size: "50M",
max_image_pixels: "32M", max_image_pixels: "32M",
dynamic_thumbnails: false, dynamic_thumbnails: false,

View File

@ -0,0 +1,36 @@
/*
Copyright 2024 New Vector Ltd.
SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only
Please see LICENSE files in the repository root for full details.
*/
import { TestInfo } from "@playwright/test";
import { Readable } from "stream";
export class ContainerLogger {
private logs: Record<string, string> = {};
public getConsumer(container: string) {
this.logs[container] = "";
return (stream: Readable) => {
stream.on("data", (chunk) => {
this.logs[container] += chunk.toString();
});
stream.on("err", (chunk) => {
this.logs[container] += "ERR " + chunk.toString();
});
};
}
public async testFinished(testInfo: TestInfo) {
if (testInfo.status !== "passed") {
for (const container in this.logs) {
await testInfo.attach(container, {
body: this.logs[container],
contentType: "text/plain",
});
}
}
}
}