Skip to content

Commit 7bd2f02

Browse files
committed
refactor: DRY NixOS test configurations
Extract common NixOS test node configuration into common.nix to eliminate duplication across extension tests. Tests with custom requirements use lib.mkMerge to override defaults. This helps us to see at a glance why a test deviates from the standard setup.
1 parent 6a6be67 commit 7bd2f02

20 files changed

Lines changed: 706 additions & 2035 deletions

nix/ext/plpgsql-check.nix

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -135,12 +135,6 @@ buildEnv {
135135
passthru = {
136136
inherit versions numberOfVersions switch-ext-version;
137137
hasBackgroundWorker = true;
138-
defaultSettings = {
139-
shared_preload_libraries = [
140-
"plpgsql"
141-
"plpgsql_check"
142-
];
143-
};
144138
version =
145139
"multi-" + lib.concatStringsSep "-" (map (v: lib.replaceStrings [ "." ] [ "-" ] v) versions);
146140
};

nix/ext/tests/default.nix

Lines changed: 53 additions & 257 deletions
Large diffs are not rendered by default.

nix/ext/tests/http.nix

Lines changed: 44 additions & 210 deletions
Original file line numberDiff line numberDiff line change
@@ -3,227 +3,61 @@ let
33
pname = "http";
44
inherit (pkgs) lib;
55
mockServer = ../../tests/http-mock-server.py;
6-
installedExtension =
7-
postgresMajorVersion:
8-
self.legacyPackages.${pkgs.pkgsLinux.stdenv.hostPlatform.system}."psql_${postgresMajorVersion}".exts."${
9-
pname
10-
}";
11-
versions = postgresqlMajorVersion: (installedExtension postgresqlMajorVersion).versions;
12-
postgresqlWithExtension =
13-
postgresql:
14-
let
15-
majorVersion =
16-
if postgresql.isOrioleDB then "orioledb-17" else lib.versions.major postgresql.version;
17-
pkg = pkgs.pkgsLinux.buildEnv {
18-
name = "postgresql-${majorVersion}-${pname}";
19-
paths = [
20-
postgresql
21-
postgresql.lib
22-
(installedExtension majorVersion)
23-
]
24-
++ lib.optional (postgresql.isOrioleDB
25-
) self.legacyPackages.${pkgs.pkgsLinux.stdenv.hostPlatform.system}.psql_orioledb-17.exts.orioledb;
26-
passthru = {
27-
inherit (postgresql) version psqlSchema;
28-
installedExtensions = [ (installedExtension majorVersion) ];
29-
lib = pkg;
30-
withPackages = _: pkg;
31-
withJIT = pkg;
32-
withoutJIT = pkg;
33-
};
34-
nativeBuildInputs = [ pkgs.pkgsLinux.makeWrapper ];
35-
pathsToLink = [
36-
"/"
37-
"/bin"
38-
"/lib"
39-
];
40-
postBuild = ''
41-
wrapProgram $out/bin/postgres --set NIX_PGLIBDIR $out/lib
42-
wrapProgram $out/bin/pg_ctl --set NIX_PGLIBDIR $out/lib
43-
wrapProgram $out/bin/pg_upgrade --set NIX_PGLIBDIR $out/lib
44-
'';
45-
};
46-
in
47-
pkg;
48-
psql_15 =
49-
postgresqlWithExtension
50-
self.packages.${pkgs.pkgsLinux.stdenv.hostPlatform.system}.postgresql_15;
51-
psql_17 =
52-
postgresqlWithExtension
53-
self.packages.${pkgs.pkgsLinux.stdenv.hostPlatform.system}.postgresql_17;
54-
orioledb_17 =
55-
postgresqlWithExtension
56-
self.packages.${pkgs.pkgsLinux.stdenv.hostPlatform.system}.postgresql_orioledb-17;
6+
testLib = import ./lib.nix {
7+
inherit self pkgs;
8+
testedExtensionName = pname;
9+
};
10+
inherit (testLib)
11+
versions
12+
installedExtension
13+
psql_15
14+
psql_17
15+
orioledb_17
16+
;
5717
in
5818
pkgs.testers.runNixOSTest {
5919
name = pname;
6020
nodes.server =
6121
{ config, ... }:
62-
{
63-
services.openssh = {
64-
enable = true;
65-
};
66-
67-
services.postgresql = {
68-
enable = true;
69-
package =
70-
postgresqlWithExtension
71-
self.packages.${pkgs.pkgsLinux.stdenv.hostPlatform.system}.postgresql_15;
72-
settings = (installedExtension "15").defaultSettings or { };
73-
authentication = ''
74-
local all postgres peer map=postgres
75-
local all all peer map=root
76-
'';
77-
identMap = ''
78-
root root supabase_admin
79-
postgres postgres postgres
80-
'';
81-
ensureUsers = [
82-
{
83-
name = "supabase_admin";
84-
ensureClauses.superuser = true;
85-
}
86-
];
87-
initialScript = pkgs.writeText "init-postgres" ''
88-
CREATE TABLE IF NOT EXISTS test_config (key TEXT PRIMARY KEY, value TEXT);
89-
'';
90-
};
91-
92-
systemd.services.http-mock-server = {
93-
wantedBy = [ "multi-user.target" ];
94-
before = [ "postgresql.service" ];
95-
serviceConfig = {
96-
Type = "simple";
97-
Restart = "on-failure";
98-
RestartSec = "2";
99-
TimeoutStartSec = "30";
100-
User = "root";
101-
};
102-
environment = {
103-
HTTP_MOCK_PORT_FILE = "/tmp/http-mock-port";
104-
PYTHONUNBUFFERED = "1";
105-
};
106-
script = ''
107-
# Ensure temp directory exists
108-
mkdir -p /tmp
109-
110-
# Start the mock server
111-
exec ${pkgs.pkgsLinux.python3}/bin/python3 ${mockServer}
112-
'';
113-
};
114-
115-
systemd.services.postgresql = {
116-
after = [ "http-mock-server.service" ];
117-
};
118-
119-
specialisation.postgresql17.configuration = {
120-
services.postgresql = {
121-
package = lib.mkForce (
122-
postgresqlWithExtension self.packages.${pkgs.pkgsLinux.stdenv.hostPlatform.system}.postgresql_17
123-
);
124-
settings = ((installedExtension "17").defaultSettings or { });
125-
};
126-
127-
systemd.services.postgresql-migrate = {
22+
pkgs.lib.mkMerge [
23+
(testLib.mkDefaultNixosTestNode {
24+
inherit
25+
config
26+
psql_15
27+
psql_17
28+
orioledb_17
29+
;
30+
})
31+
{
32+
systemd.services.http-mock-server = {
33+
wantedBy = [ "multi-user.target" ];
34+
before = [ "postgresql.service" ];
12835
serviceConfig = {
129-
Type = "oneshot";
130-
RemainAfterExit = true;
131-
User = "postgres";
132-
Group = "postgres";
133-
StateDirectory = "postgresql";
134-
WorkingDirectory = "${builtins.dirOf config.services.postgresql.dataDir}";
36+
Type = "simple";
37+
Restart = "on-failure";
38+
RestartSec = "2";
39+
TimeoutStartSec = "30";
40+
User = "root";
13541
};
136-
script =
137-
let
138-
oldPostgresql =
139-
postgresqlWithExtension
140-
self.packages.${pkgs.pkgsLinux.stdenv.hostPlatform.system}.postgresql_15;
141-
newPostgresql =
142-
postgresqlWithExtension
143-
self.packages.${pkgs.pkgsLinux.stdenv.hostPlatform.system}.postgresql_17;
144-
oldDataDir = "${builtins.dirOf config.services.postgresql.dataDir}/${oldPostgresql.psqlSchema}";
145-
newDataDir = "${builtins.dirOf config.services.postgresql.dataDir}/${newPostgresql.psqlSchema}";
146-
in
147-
''
148-
if [[ ! -d ${newDataDir} ]]; then
149-
install -d -m 0700 -o postgres -g postgres "${newDataDir}"
150-
${newPostgresql}/bin/initdb -D "${newDataDir}"
151-
${newPostgresql}/bin/pg_upgrade --old-datadir "${oldDataDir}" --new-datadir "${newDataDir}" \
152-
--old-bindir "${oldPostgresql}/bin" --new-bindir "${newPostgresql}/bin"
153-
else
154-
echo "${newDataDir} already exists"
155-
fi
156-
'';
157-
};
158-
159-
systemd.services.postgresql = {
160-
after = [ "postgresql-migrate.service" ];
161-
requires = [ "postgresql-migrate.service" ];
162-
};
163-
};
164-
165-
specialisation.orioledb17.configuration = {
166-
services.postgresql = {
167-
package = lib.mkForce (
168-
postgresqlWithExtension
169-
self.packages.${pkgs.pkgsLinux.stdenv.hostPlatform.system}.postgresql_orioledb-17
170-
);
171-
settings = lib.mkForce (
172-
((installedExtension "17").defaultSettings or { })
173-
// {
174-
jit = "off";
175-
shared_preload_libraries = [
176-
"orioledb"
177-
]
178-
++ (lib.toList ((installedExtension "17").defaultSettings.shared_preload_libraries or [ ]));
179-
default_table_access_method = "orioledb";
180-
}
181-
);
182-
initdbArgs = [
183-
"--allow-group-access"
184-
"--locale-provider=icu"
185-
"--encoding=UTF-8"
186-
"--icu-locale=en_US.UTF-8"
187-
];
188-
initialScript = lib.mkForce (
189-
pkgs.writeText "init-postgres-with-orioledb" ''
190-
CREATE EXTENSION orioledb CASCADE;
191-
CREATE TABLE IF NOT EXISTS test_config (key TEXT PRIMARY KEY, value TEXT);
192-
''
193-
);
194-
};
195-
196-
systemd.services.postgresql-migrate = {
197-
# we don't support migrating from postgresql 17 to orioledb-17 so we just reinit the datadir
198-
serviceConfig = {
199-
Type = "oneshot";
200-
RemainAfterExit = true;
201-
User = "postgres";
202-
Group = "postgres";
203-
StateDirectory = "postgresql";
204-
WorkingDirectory = "${builtins.dirOf config.services.postgresql.dataDir}";
42+
environment = {
43+
HTTP_MOCK_PORT_FILE = "/tmp/http-mock-port";
44+
PYTHONUNBUFFERED = "1";
20545
};
206-
script =
207-
let
208-
newPostgresql =
209-
postgresqlWithExtension
210-
self.packages.${pkgs.pkgsLinux.stdenv.hostPlatform.system}.postgresql_orioledb-17;
211-
in
212-
''
213-
if [[ -z "${newPostgresql.psqlSchema}" ]]; then
214-
echo "Error: psqlSchema is empty, refusing to rm -rf"
215-
exit 1
216-
fi
217-
rm -rf ${builtins.dirOf config.services.postgresql.dataDir}/${newPostgresql.psqlSchema}
218-
'';
46+
script = ''
47+
# Ensure temp directory exists
48+
mkdir -p /tmp
49+
50+
# Start the mock server
51+
exec ${pkgs.pkgsLinux.python3}/bin/python3 ${mockServer}
52+
'';
21953
};
22054

22155
systemd.services.postgresql = {
222-
after = [ "postgresql-migrate.service" ];
223-
requires = [ "postgresql-migrate.service" ];
56+
after = [ "http-mock-server.service" ];
22457
};
225-
};
226-
};
58+
59+
}
60+
];
22761
testScript =
22862
{ nodes, ... }:
22963
let
@@ -269,7 +103,7 @@ pkgs.testers.runNixOSTest {
269103
echo "Waiting for HTTP mock server port file... ($i/30)"
270104
sleep 1
271105
done
272-
106+
273107
if [ ! -f /tmp/http-mock-port ]; then
274108
echo "ERROR: HTTP mock server port file not found after 30 seconds"
275109
systemctl status http-mock-server.service || true

0 commit comments

Comments
 (0)