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;
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 ? true
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 mariadb = {
83 };
84 };
85
86 testScript = ''
87 start_all()
88
89 machine = ${name}
90 machine.wait_for_unit("mysql")
91 machine.succeed(
92 "echo 'use testdb; create table tests (test_id INT, PRIMARY KEY (test_id));' | sudo -u testuser mysql -u testuser"
93 )
94 machine.succeed(
95 "echo 'use testdb; insert into tests values (42);' | sudo -u testuser mysql -u testuser"
96 )
97 # Ensure testuser2 is not able to insert into testdb as mysql testuser2
98 machine.fail(
99 "echo 'use testdb; insert into tests values (23);' | sudo -u testuser2 mysql -u testuser2"
100 )
101 # Ensure testuser2 is not able to authenticate as mysql testuser
102 machine.fail(
103 "echo 'use testdb; insert into tests values (23);' | sudo -u testuser2 mysql -u testuser"
104 )
105 machine.succeed(
106 "echo 'use testdb; select test_id from tests;' | sudo -u testuser mysql -u testuser -N | grep 42"
107 )
108
109 ${lib.optionalString hasMroonga ''
110 # Check if Mroonga plugin works
111 machine.succeed(
112 "echo 'use testdb; create table mroongadb (test_id INT, PRIMARY KEY (test_id)) ENGINE = Mroonga;' | sudo -u testuser mysql -u testuser"
113 )
114 machine.succeed(
115 "echo 'use testdb; insert into mroongadb values (25);' | sudo -u testuser mysql -u testuser"
116 )
117 machine.succeed(
118 "echo 'use testdb; select test_id from mroongadb;' | sudo -u testuser mysql -u testuser -N | grep 25"
119 )
120 machine.succeed(
121 "echo 'use testdb; drop table mroongadb;' | sudo -u testuser mysql -u testuser"
122 )
123 ''}
124
125 ${lib.optionalString hasRocksDB ''
126 # Check if RocksDB plugin works
127 machine.succeed(
128 "echo 'use testdb; create table rocksdb (test_id INT, PRIMARY KEY (test_id)) ENGINE = RocksDB;' | sudo -u testuser mysql -u testuser"
129 )
130 machine.succeed(
131 "echo 'use testdb; insert into rocksdb values (28);' | sudo -u testuser mysql -u testuser"
132 )
133 machine.succeed(
134 "echo 'use testdb; select test_id from rocksdb;' | sudo -u testuser mysql -u testuser -N | grep 28"
135 )
136 machine.succeed(
137 "echo 'use testdb; drop table rocksdb;' | sudo -u testuser mysql -u testuser"
138 )
139 ''}
140 '';
141 };
142in
143 lib.mapAttrs (_: package: makeMySQLTest {
144 inherit package;
145 hasRocksDB = false; hasMroonga = false; useSocketAuth = false;
146 }) mysqlPackages
147 // (lib.mapAttrs (_: package: makeMySQLTest {
148 inherit package;
149 }) mariadbPackages)