Skip to content

Commit

Permalink
draupnir: add tests
Browse files Browse the repository at this point in the history
  • Loading branch information
TheArcaneBrony committed Jan 20, 2024
1 parent 48a733b commit 28ee30d
Show file tree
Hide file tree
Showing 3 changed files with 181 additions and 3 deletions.
1 change: 1 addition & 0 deletions nixos/tests/all-tests.nix
Original file line number Diff line number Diff line change
Expand Up @@ -255,6 +255,7 @@ in {
dolibarr = handleTest ./dolibarr.nix {};
domination = handleTest ./domination.nix {};
dovecot = handleTest ./dovecot.nix {};
draupnir = handleTest ./matrix/draupnir.nix {};
drbd = handleTest ./drbd.nix {};
dublin-traceroute = handleTest ./dublin-traceroute.nix {};
earlyoom = handleTestOn ["x86_64-linux"] ./earlyoom.nix {};
Expand Down
176 changes: 176 additions & 0 deletions nixos/tests/matrix/draupnir.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,176 @@
import ../make-test-python.nix (
{ pkgs, ... }:
let
# Set up SSL certs for Synapse to be happy.
runWithOpenSSL = file: cmd: pkgs.runCommand file
{
buildInputs = [ pkgs.openssl ];
}
cmd;

ca_key = runWithOpenSSL "ca-key.pem" "openssl genrsa -out $out 2048";
ca_pem = runWithOpenSSL "ca.pem" ''
openssl req \
-x509 -new -nodes -key ${ca_key} \
-days 10000 -out $out -subj "/CN=snakeoil-ca"
'';
key = runWithOpenSSL "matrix_key.pem" "openssl genrsa -out $out 2048";
csr = runWithOpenSSL "matrix.csr" ''
openssl req \
-new -key ${key} \
-out $out -subj "/CN=localhost" \
'';
cert = runWithOpenSSL "matrix_cert.pem" ''
openssl x509 \
-req -in ${csr} \
-CA ${ca_pem} -CAkey ${ca_key} \
-CAcreateserial -out $out \
-days 365
'';
in
{
name = "draupnir";
meta = with pkgs.lib; {
maintainers = [ maintainers.Rory ];
};

nodes = {
homeserver = { pkgs, ... }: {
services.matrix-synapse = {
enable = true;
settings = {
database.name = "sqlite3";
tls_certificate_path = "${cert}";
tls_private_key_path = "${key}";
enable_registration = true;
enable_registration_without_verification = true;
registration_shared_secret = "supersecret-registration";

listeners = [ {
# The default but tls=false
bind_addresses = [
"0.0.0.0"
];
port = 8448;
resources = [ {
compress = true;
names = [ "client" ];
} {
compress = false;
names = [ "federation" ];
} ];
tls = false;
type = "http";
x_forwarded = false;
} ];
};
};

networking.firewall.allowedTCPPorts = [ 8448 ];

environment.systemPackages = [
(pkgs.writeShellScriptBin "register_draupnir_user" ''
exec ${pkgs.matrix-synapse}/bin/register_new_matrix_user \
-u draupnir \
-p draupnir-password \
--admin \
--shared-secret supersecret-registration \
http://localhost:8448
''
)
(pkgs.writeShellScriptBin "register_moderator_user" ''
exec ${pkgs.matrix-synapse}/bin/register_new_matrix_user \
-u moderator \
-p moderator-password \
--no-admin \
--shared-secret supersecret-registration \
http://localhost:8448
''
)
];
};

draupnir = { pkgs, ... }: {
services.draupnir = {
enable = true;
homeserverUrl = "http://homeserver:8448";
pantalaimon = {
enable = true;
username = "draupnir";
passwordFile = pkgs.writeText "password.txt" "draupnir-password";
# otherwise draupnir tries to connect to ::1, which is not listened by pantalaimon
options.listenAddress = "127.0.0.1";
};
managementRoom = "#moderators:homeserver";
};
};

client = { pkgs, ... }: {
environment.systemPackages = [
(pkgs.writers.writePython3Bin "create_management_room_and_invite_draupnir"
{ libraries = with pkgs.python3Packages; [
matrix-nio
] ++ matrix-nio.optional-dependencies.e2e;
} ''
import asyncio
from nio import (
AsyncClient,
EnableEncryptionBuilder
)
async def main() -> None:
client = AsyncClient("http://homeserver:8448", "moderator")
await client.login("moderator-password")
room = await client.room_create(
name="Moderators",
alias="moderators",
initial_state=[EnableEncryptionBuilder().as_dict()],
)
await client.join(room.room_id)
await client.room_invite(room.room_id, "@draupnir:homeserver")
asyncio.run(main())
''
)
];
};
};

testScript = ''
with subtest("start homeserver"):
homeserver.start()
homeserver.wait_for_unit("matrix-synapse.service")
homeserver.wait_until_succeeds("curl --fail -L http://localhost:8448/")
with subtest("register users"):
# register draupnir user
homeserver.succeed("register_draupnir_user")
# register moderator user
homeserver.succeed("register_moderator_user")
with subtest("start draupnir"):
draupnir.start()
# wait for pantalaimon to be ready
draupnir.wait_for_unit("pantalaimon-draupnir.service")
draupnir.wait_for_unit("draupnir.service")
draupnir.wait_until_succeeds("curl --fail -L http://localhost:8009/")
with subtest("ensure draupnir can be invited to the management room"):
client.start()
client.wait_until_succeeds("curl --fail -L http://homeserver:8448/")
client.succeed("create_management_room_and_invite_draupnir")
draupnir.wait_for_console_text("Startup complete. Now monitoring rooms")
'';
}
)
7 changes: 4 additions & 3 deletions pkgs/by-name/dr/draupnir/package.nix
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
, matrix-sdk-crypto-nodejs
, mkYarnPackage
, fetchYarnDeps
, nixosTests
}:

# docs: https://github.com/NixOS/nixpkgs/blob/master/doc/languages-frameworks/javascript.section.md#yarn2nix-javascript-yarn2nix
Expand Down Expand Up @@ -66,9 +67,9 @@ mkYarnPackage rec {
distPhase = "true";

passthru = {
#tests = {
# inherit (nixosTests) draupnir;
#};
tests = {
inherit (nixosTests) draupnir;
};
updateScript = ./update.sh;
};

Expand Down

0 comments on commit 28ee30d

Please sign in to comment.