postgresql: remove thisAttr argument by calling tests directly

Previously, it was not possible to run tests on an overridden derivation, because
the derivation under test was always pulled from pkgs.

With this change, the following will return the same test:

postgresql_jit.tests

and

(postgresql.override { jitSupport = true; }).tests

+123 -102
+11 -4
nixos/tests/postgresql-jit.nix
··· 1 1 { system ? builtins.currentSystem 2 2 , config ? {} 3 3 , pkgs ? import ../.. { inherit system config; } 4 + , package ? null 4 5 }: 5 6 6 7 with import ../lib/testing-python.nix { inherit system pkgs; }; ··· 9 10 inherit (pkgs) lib; 10 11 packages = builtins.attrNames (import ../../pkgs/servers/sql/postgresql pkgs); 11 12 12 - mkJitTest = packageName: makeTest { 13 - name = "${packageName}"; 13 + mkJitTestFromName = name: 14 + mkJitTest pkgs.${name}; 15 + 16 + mkJitTest = package: makeTest { 17 + name = package.name; 14 18 meta.maintainers = with lib.maintainers; [ ma27 ]; 15 19 nodes.machine = { pkgs, lib, ... }: { 16 20 services.postgresql = { 21 + inherit package; 17 22 enable = true; 18 23 enableJIT = true; 19 - package = pkgs.${packageName}; 20 24 initialScript = pkgs.writeText "init.sql" '' 21 25 create table demo (id int); 22 26 insert into demo (id) select generate_series(1, 5); ··· 45 49 ''; 46 50 }; 47 51 in 48 - lib.genAttrs packages mkJitTest 52 + if package == null then 53 + lib.genAttrs packages mkJitTestFromName 54 + else 55 + mkJitTest package
+101 -94
nixos/tests/postgresql-wal-receiver.nix
··· 1 1 { system ? builtins.currentSystem, 2 2 config ? {}, 3 - pkgs ? import ../.. { inherit system config; } 3 + pkgs ? import ../.. { inherit system config; }, 4 + package ? null 4 5 }: 5 6 6 7 with import ../lib/testing-python.nix { inherit system pkgs; }; ··· 9 10 lib = pkgs.lib; 10 11 11 12 # Makes a test for a PostgreSQL package, given by name and looked up from `pkgs`. 12 - makePostgresqlWalReceiverTest = postgresqlPackage: 13 + makeTestAttribute = name: 13 14 { 14 - name = postgresqlPackage; 15 - value = 16 - let 17 - pkg = pkgs."${postgresqlPackage}"; 18 - postgresqlDataDir = "/var/lib/postgresql/${pkg.psqlSchema}"; 19 - replicationUser = "wal_receiver_user"; 20 - replicationSlot = "wal_receiver_slot"; 21 - replicationConn = "postgresql://${replicationUser}@localhost"; 22 - baseBackupDir = "/tmp/pg_basebackup"; 23 - walBackupDir = "/tmp/pg_wal"; 24 - atLeast12 = lib.versionAtLeast pkg.version "12.0"; 15 + inherit name; 16 + value = makePostgresqlWalReceiverTest pkgs."${name}"; 17 + }; 25 18 26 - recoveryFile = if atLeast12 27 - then pkgs.writeTextDir "recovery.signal" "" 28 - else pkgs.writeTextDir "recovery.conf" "restore_command = 'cp ${walBackupDir}/%f %p'"; 19 + makePostgresqlWalReceiverTest = pkg: 20 + let 21 + postgresqlDataDir = "/var/lib/postgresql/${pkg.psqlSchema}"; 22 + replicationUser = "wal_receiver_user"; 23 + replicationSlot = "wal_receiver_slot"; 24 + replicationConn = "postgresql://${replicationUser}@localhost"; 25 + baseBackupDir = "/tmp/pg_basebackup"; 26 + walBackupDir = "/tmp/pg_wal"; 27 + atLeast12 = lib.versionAtLeast pkg.version "12.0"; 29 28 30 - in makeTest { 31 - name = "postgresql-wal-receiver-${postgresqlPackage}"; 32 - meta.maintainers = with lib.maintainers; [ pacien ]; 29 + recoveryFile = if atLeast12 30 + then pkgs.writeTextDir "recovery.signal" "" 31 + else pkgs.writeTextDir "recovery.conf" "restore_command = 'cp ${walBackupDir}/%f %p'"; 33 32 34 - nodes.machine = { ... }: { 35 - services.postgresql = { 36 - package = pkg; 37 - enable = true; 38 - settings = lib.mkMerge [ 39 - { 40 - wal_level = "archive"; # alias for replica on pg >= 9.6 41 - max_wal_senders = 10; 42 - max_replication_slots = 10; 43 - } 44 - (lib.mkIf atLeast12 { 45 - restore_command = "cp ${walBackupDir}/%f %p"; 46 - recovery_end_command = "touch recovery.done"; 47 - }) 48 - ]; 49 - authentication = '' 50 - host replication ${replicationUser} all trust 51 - ''; 52 - initialScript = pkgs.writeText "init.sql" '' 53 - create user ${replicationUser} replication; 54 - select * from pg_create_physical_replication_slot('${replicationSlot}'); 55 - ''; 56 - }; 33 + in makeTest { 34 + name = "postgresql-wal-receiver-${pkg.name}"; 35 + meta.maintainers = with lib.maintainers; [ pacien ]; 36 + 37 + nodes.machine = { ... }: { 38 + services.postgresql = { 39 + package = pkg; 40 + enable = true; 41 + settings = lib.mkMerge [ 42 + { 43 + wal_level = "archive"; # alias for replica on pg >= 9.6 44 + max_wal_senders = 10; 45 + max_replication_slots = 10; 46 + } 47 + (lib.mkIf atLeast12 { 48 + restore_command = "cp ${walBackupDir}/%f %p"; 49 + recovery_end_command = "touch recovery.done"; 50 + }) 51 + ]; 52 + authentication = '' 53 + host replication ${replicationUser} all trust 54 + ''; 55 + initialScript = pkgs.writeText "init.sql" '' 56 + create user ${replicationUser} replication; 57 + select * from pg_create_physical_replication_slot('${replicationSlot}'); 58 + ''; 59 + }; 57 60 58 - services.postgresqlWalReceiver.receivers.main = { 59 - postgresqlPackage = pkg; 60 - connection = replicationConn; 61 - slot = replicationSlot; 62 - directory = walBackupDir; 63 - }; 64 - # This is only to speedup test, it isn't time racing. Service is set to autorestart always, 65 - # default 60sec is fine for real system, but is too much for a test 66 - systemd.services.postgresql-wal-receiver-main.serviceConfig.RestartSec = lib.mkForce 5; 61 + services.postgresqlWalReceiver.receivers.main = { 62 + postgresqlPackage = pkg; 63 + connection = replicationConn; 64 + slot = replicationSlot; 65 + directory = walBackupDir; 67 66 }; 67 + # This is only to speedup test, it isn't time racing. Service is set to autorestart always, 68 + # default 60sec is fine for real system, but is too much for a test 69 + systemd.services.postgresql-wal-receiver-main.serviceConfig.RestartSec = lib.mkForce 5; 70 + }; 68 71 69 - testScript = '' 70 - # make an initial base backup 71 - machine.wait_for_unit("postgresql") 72 - machine.wait_for_unit("postgresql-wal-receiver-main") 73 - # WAL receiver healthchecks PG every 5 seconds, so let's be sure they have connected each other 74 - # required only for 9.4 75 - machine.sleep(5) 76 - machine.succeed( 77 - "${pkg}/bin/pg_basebackup --dbname=${replicationConn} --pgdata=${baseBackupDir}" 78 - ) 72 + testScript = '' 73 + # make an initial base backup 74 + machine.wait_for_unit("postgresql") 75 + machine.wait_for_unit("postgresql-wal-receiver-main") 76 + # WAL receiver healthchecks PG every 5 seconds, so let's be sure they have connected each other 77 + # required only for 9.4 78 + machine.sleep(5) 79 + machine.succeed( 80 + "${pkg}/bin/pg_basebackup --dbname=${replicationConn} --pgdata=${baseBackupDir}" 81 + ) 79 82 80 - # create a dummy table with 100 records 81 - machine.succeed( 82 - "sudo -u postgres psql --command='create table dummy as select * from generate_series(1, 100) as val;'" 83 - ) 83 + # create a dummy table with 100 records 84 + machine.succeed( 85 + "sudo -u postgres psql --command='create table dummy as select * from generate_series(1, 100) as val;'" 86 + ) 84 87 85 - # stop postgres and destroy data 86 - machine.systemctl("stop postgresql") 87 - machine.systemctl("stop postgresql-wal-receiver-main") 88 - machine.succeed("rm -r ${postgresqlDataDir}/{base,global,pg_*}") 88 + # stop postgres and destroy data 89 + machine.systemctl("stop postgresql") 90 + machine.systemctl("stop postgresql-wal-receiver-main") 91 + machine.succeed("rm -r ${postgresqlDataDir}/{base,global,pg_*}") 89 92 90 - # restore the base backup 91 - machine.succeed( 92 - "cp -r ${baseBackupDir}/* ${postgresqlDataDir} && chown postgres:postgres -R ${postgresqlDataDir}" 93 - ) 93 + # restore the base backup 94 + machine.succeed( 95 + "cp -r ${baseBackupDir}/* ${postgresqlDataDir} && chown postgres:postgres -R ${postgresqlDataDir}" 96 + ) 94 97 95 - # prepare WAL and recovery 96 - machine.succeed("chmod a+rX -R ${walBackupDir}") 97 - machine.execute( 98 - "for part in ${walBackupDir}/*.partial; do mv $part ''${part%%.*}; done" 99 - ) # make use of partial segments too 100 - machine.succeed( 101 - "cp ${recoveryFile}/* ${postgresqlDataDir}/ && chmod 666 ${postgresqlDataDir}/recovery*" 102 - ) 98 + # prepare WAL and recovery 99 + machine.succeed("chmod a+rX -R ${walBackupDir}") 100 + machine.execute( 101 + "for part in ${walBackupDir}/*.partial; do mv $part ''${part%%.*}; done" 102 + ) # make use of partial segments too 103 + machine.succeed( 104 + "cp ${recoveryFile}/* ${postgresqlDataDir}/ && chmod 666 ${postgresqlDataDir}/recovery*" 105 + ) 103 106 104 - # replay WAL 105 - machine.systemctl("start postgresql") 106 - machine.wait_for_file("${postgresqlDataDir}/recovery.done") 107 - machine.systemctl("restart postgresql") 108 - machine.wait_for_unit("postgresql") 107 + # replay WAL 108 + machine.systemctl("start postgresql") 109 + machine.wait_for_file("${postgresqlDataDir}/recovery.done") 110 + machine.systemctl("restart postgresql") 111 + machine.wait_for_unit("postgresql") 109 112 110 - # check that our records have been restored 111 - machine.succeed( 112 - "test $(sudo -u postgres psql --pset='pager=off' --tuples-only --command='select count(distinct val) from dummy;') -eq 100" 113 - ) 114 - ''; 115 - }; 113 + # check that our records have been restored 114 + machine.succeed( 115 + "test $(sudo -u postgres psql --pset='pager=off' --tuples-only --command='select count(distinct val) from dummy;') -eq 100" 116 + ) 117 + ''; 116 118 }; 117 119 118 - # Maps the generic function over all attributes of PostgreSQL packages 119 - in builtins.listToAttrs (map makePostgresqlWalReceiverTest (builtins.attrNames (import ../../pkgs/servers/sql/postgresql pkgs))) 120 + in 121 + if package == null then 122 + # all-tests.nix: Maps the generic function over all attributes of PostgreSQL packages 123 + builtins.listToAttrs (map makeTestAttribute (builtins.attrNames (import ../../pkgs/servers/sql/postgresql pkgs))) 124 + else 125 + # Called directly from <package>.tests 126 + makePostgresqlWalReceiverTest package
-1
pkgs/servers/sql/postgresql/default.nix
··· 15 15 in 16 16 self.lib.nameValuePair attrName (import path { 17 17 inherit jitSupport self; 18 - thisAttr = attrName; 19 18 }) 20 19 ) versions; 21 20
+11 -3
pkgs/servers/sql/postgresql/generic.nix
··· 19 19 , version, hash, muslPatches 20 20 21 21 # for tests 22 - , testers, nixosTests, thisAttr 22 + , testers, nixosTests 23 23 24 24 # JIT 25 25 , jitSupport ··· 254 254 this.pkgs; 255 255 256 256 tests = { 257 - postgresql = nixosTests.postgresql-wal-receiver.${thisAttr}; 257 + postgresql-wal-receiver = import ../../../../nixos/tests/postgresql-wal-receiver.nix { 258 + inherit (stdenv) system; 259 + pkgs = self; 260 + package = this; 261 + }; 258 262 pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; 259 263 } // lib.optionalAttrs jitSupport { 260 - postgresql-jit = nixosTests.postgresql-jit.${thisAttr}; 264 + postgresql-jit = import ../../../../nixos/tests/postgresql-jit.nix { 265 + inherit (stdenv) system; 266 + pkgs = self; 267 + package = this; 268 + }; 261 269 }; 262 270 }; 263 271