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; }) mkTestName mariadbPackages mysqlPackages perconaPackages;
10
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 = with lib.maintainers; {
22 maintainers = [ ajs124 das_j ];
23 };
24
25 nodes = {
26 ${name} =
27 { pkgs, ... }: {
28
29 users = {
30 groups.testusers = { };
31
32 users.testuser = {
33 isSystemUser = true;
34 group = "testusers";
35 };
36
37 users.testuser2 = {
38 isSystemUser = true;
39 group = "testusers";
40 };
41 };
42
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 '');
59
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 };
82
83 testScript = ''
84 start_all()
85
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 )
105
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 ''}
121
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 };
139in
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 = "percona_8_0";
150 hasMroonga = false; useSocketAuth = false;
151 }) perconaPackages)