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