vuls: init at 0.27.0
[NixPkgs.git] / nixos / tests / mysql / mysql.nix
blob093da4f46aa10e3dd9891133b6184dc6b70d29ba
2   system ? builtins.currentSystem,
3   config ? {},
4   pkgs ? import ../../.. { inherit system config; },
5   lib ? pkgs.lib
6 }:
8 let
9   inherit (import ./common.nix { inherit pkgs lib; }) mkTestName mariadbPackages mysqlPackages perconaPackages;
11   makeTest = import ./../make-test-python.nix;
12   # Setup common users
13   makeMySQLTest = {
14     package,
15     name ? mkTestName package,
16     useSocketAuth ? true,
17     hasMroonga ? true,
18     hasRocksDB ? pkgs.stdenv.hostPlatform.is64bit
19   }: makeTest {
20     inherit name;
21     meta = {
22       maintainers = lib.teams.helsinki-systems.members;
23     };
25     nodes = {
26       ${name} =
27         { pkgs, ... }: {
29           users = {
30             groups.testusers = { };
32             users.testuser = {
33               isSystemUser = true;
34               group = "testusers";
35             };
37             users.testuser2 = {
38               isSystemUser = true;
39               group = "testusers";
40             };
41           };
43           services.mysql = {
44             enable = true;
45             initialDatabases = [
46               { name = "testdb3"; schema = ./testdb.sql; }
47             ];
48             # note that using pkgs.writeText here is generally not a good idea,
49             # as it will store the password in world-readable /nix/store ;)
50             initialScript = pkgs.writeText "mysql-init.sql" (if (!useSocketAuth) then ''
51               CREATE USER 'testuser3'@'localhost' IDENTIFIED BY 'secure';
52               GRANT ALL PRIVILEGES ON testdb3.* TO 'testuser3'@'localhost';
53             '' else ''
54               ALTER USER root@localhost IDENTIFIED WITH unix_socket;
55               DELETE FROM mysql.user WHERE password = ''' AND plugin = ''';
56               DELETE FROM mysql.user WHERE user = ''';
57               FLUSH PRIVILEGES;
58             '');
60             ensureDatabases = [ "testdb" "testdb2" ];
61             ensureUsers = [{
62               name = "testuser";
63               ensurePermissions = {
64                 "testdb.*" = "ALL PRIVILEGES";
65               };
66             } {
67               name = "testuser2";
68               ensurePermissions = {
69                 "testdb2.*" = "ALL PRIVILEGES";
70               };
71             }];
72             package = package;
73             settings = {
74               mysqld = {
75                 plugin-load-add = lib.optional hasMroonga "ha_mroonga.so"
76                   ++ lib.optional hasRocksDB "ha_rocksdb.so";
77               };
78             };
79           };
80         };
81     };
83     testScript = ''
84       start_all()
86       machine = ${name}
87       machine.wait_for_unit("mysql")
88       machine.succeed(
89           "echo 'use testdb; create table tests (test_id INT, PRIMARY KEY (test_id));' | sudo -u testuser mysql -u testuser"
90       )
91       machine.succeed(
92           "echo 'use testdb; insert into tests values (42);' | sudo -u testuser mysql -u testuser"
93       )
94       # Ensure testuser2 is not able to insert into testdb as mysql testuser2
95       machine.fail(
96           "echo 'use testdb; insert into tests values (23);' | sudo -u testuser2 mysql -u testuser2"
97       )
98       # Ensure testuser2 is not able to authenticate as mysql testuser
99       machine.fail(
100           "echo 'use testdb; insert into tests values (23);' | sudo -u testuser2 mysql -u testuser"
101       )
102       machine.succeed(
103           "echo 'use testdb; select test_id from tests;' | sudo -u testuser mysql -u testuser -N | grep 42"
104       )
106       ${lib.optionalString hasMroonga ''
107         # Check if Mroonga plugin works
108         machine.succeed(
109             "echo 'use testdb; create table mroongadb (test_id INT, PRIMARY KEY (test_id)) ENGINE = Mroonga;' | sudo -u testuser mysql -u testuser"
110         )
111         machine.succeed(
112             "echo 'use testdb; insert into mroongadb values (25);' | sudo -u testuser mysql -u testuser"
113         )
114         machine.succeed(
115             "echo 'use testdb; select test_id from mroongadb;' | sudo -u testuser mysql -u testuser -N | grep 25"
116         )
117         machine.succeed(
118             "echo 'use testdb; drop table mroongadb;' | sudo -u testuser mysql -u testuser"
119         )
120       ''}
122       ${lib.optionalString hasRocksDB ''
123         # Check if RocksDB plugin works
124         machine.succeed(
125             "echo 'use testdb; create table rocksdb (test_id INT, PRIMARY KEY (test_id)) ENGINE = RocksDB;' | sudo -u testuser mysql -u testuser"
126         )
127         machine.succeed(
128             "echo 'use testdb; insert into rocksdb values (28);' | sudo -u testuser mysql -u testuser"
129         )
130         machine.succeed(
131             "echo 'use testdb; select test_id from rocksdb;' | sudo -u testuser mysql -u testuser -N | grep 28"
132         )
133         machine.succeed(
134             "echo 'use testdb; drop table rocksdb;' | sudo -u testuser mysql -u testuser"
135         )
136       ''}
137     '';
138   };
140   lib.mapAttrs (_: package: makeMySQLTest {
141     inherit package;
142     hasRocksDB = false; hasMroonga = false; useSocketAuth = false;
143   }) mysqlPackages
144   // (lib.mapAttrs (_: package: makeMySQLTest {
145     inherit package;
146   }) mariadbPackages)
147   // (lib.mapAttrs (_: package: makeMySQLTest {
148     inherit package;
149     name = builtins.replaceStrings ["-"] ["_"] package.pname;
150     hasMroonga = false; useSocketAuth = false;
151   }) perconaPackages)