summaryrefslogtreecommitdiffstats
path: root/src/go/collectors/go.d.plugin/modules/mysql/mysql_test.go
blob: da64507e4151d92f2ab41725c1d5ba465bb1198d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
// SPDX-License-Identifier: GPL-3.0-or-later

package mysql

import (
	"bufio"
	"bytes"
	"database/sql/driver"
	"errors"
	"fmt"
	"os"
	"strings"
	"testing"

	"github.com/netdata/netdata/go/go.d.plugin/agent/module"

	"github.com/DATA-DOG/go-sqlmock"
	"github.com/blang/semver/v4"
	"github.com/stretchr/testify/assert"
	"github.com/stretchr/testify/require"
)

var (
	dataConfigJSON, _ = os.ReadFile("testdata/config.json")
	dataConfigYAML, _ = os.ReadFile("testdata/config.yaml")

	dataSessionVariables, _ = os.ReadFile("testdata/session_variables.txt")

	dataMySQLVer8030Version, _                  = os.ReadFile("testdata/mysql/v8.0.30/version.txt")
	dataMySQLVer8030GlobalStatus, _             = os.ReadFile("testdata/mysql/v8.0.30/global_status.txt")
	dataMySQLVer8030GlobalVariables, _          = os.ReadFile("testdata/mysql/v8.0.30/global_variables.txt")
	dataMySQLVer8030ReplicaStatusMultiSource, _ = os.ReadFile("testdata/mysql/v8.0.30/replica_status_multi_source.txt")
	dataMySQLVer8030ProcessList, _              = os.ReadFile("testdata/mysql/v8.0.30/process_list.txt")

	dataPerconaVer8029Version, _         = os.ReadFile("testdata/percona/v8.0.29/version.txt")
	dataPerconaVer8029GlobalStatus, _    = os.ReadFile("testdata/percona/v8.0.29/global_status.txt")
	dataPerconaVer8029GlobalVariables, _ = os.ReadFile("testdata/percona/v8.0.29/global_variables.txt")
	dataPerconaVer8029UserStatistics, _  = os.ReadFile("testdata/percona/v8.0.29/user_statistics.txt")
	dataPerconaV8029ProcessList, _       = os.ReadFile("testdata/percona/v8.0.29/process_list.txt")

	dataMariaVer5564Version, _         = os.ReadFile("testdata/mariadb/v5.5.64/version.txt")
	dataMariaVer5564GlobalStatus, _    = os.ReadFile("testdata/mariadb/v5.5.64/global_status.txt")
	dataMariaVer5564GlobalVariables, _ = os.ReadFile("testdata/mariadb/v5.5.64/global_variables.txt")
	dataMariaVer5564ProcessList, _     = os.ReadFile("testdata/mariadb/v5.5.64/process_list.txt")

	dataMariaVer1084Version, _                     = os.ReadFile("testdata/mariadb/v10.8.4/version.txt")
	dataMariaVer1084GlobalStatus, _                = os.ReadFile("testdata/mariadb/v10.8.4/global_status.txt")
	dataMariaVer1084GlobalVariables, _             = os.ReadFile("testdata/mariadb/v10.8.4/global_variables.txt")
	dataMariaVer1084AllSlavesStatusSingleSource, _ = os.ReadFile("testdata/mariadb/v10.8.4/all_slaves_status_single_source.txt")
	dataMariaVer1084AllSlavesStatusMultiSource, _  = os.ReadFile("testdata/mariadb/v10.8.4/all_slaves_status_multi_source.txt")
	dataMariaVer1084UserStatistics, _              = os.ReadFile("testdata/mariadb/v10.8.4/user_statistics.txt")
	dataMariaVer1084ProcessList, _                 = os.ReadFile("testdata/mariadb/v10.8.4/process_list.txt")

	dataMariaGaleraClusterVer1084Version, _         = os.ReadFile("testdata/mariadb/v10.8.4-galera-cluster/version.txt")
	dataMariaGaleraClusterVer1084GlobalStatus, _    = os.ReadFile("testdata/mariadb/v10.8.4-galera-cluster/global_status.txt")
	dataMariaGaleraClusterVer1084GlobalVariables, _ = os.ReadFile("testdata/mariadb/v10.8.4-galera-cluster/global_variables.txt")
	dataMariaGaleraClusterVer1084UserStatistics, _  = os.ReadFile("testdata/mariadb/v10.8.4-galera-cluster/user_statistics.txt")
	dataMariaGaleraClusterVer1084ProcessList, _     = os.ReadFile("testdata/mariadb/v10.8.4-galera-cluster/process_list.txt")
)

func Test_testDataIsValid(t *testing.T) {
	for name, data := range map[string][]byte{
		"dataConfigJSON":                               dataConfigJSON,
		"dataConfigYAML":                               dataConfigYAML,
		"dataSessionVariables":                         dataSessionVariables,
		"dataMySQLVer8030Version":                      dataMySQLVer8030Version,
		"dataMySQLVer8030GlobalStatus":                 dataMySQLVer8030GlobalStatus,
		"dataMySQLVer8030GlobalVariables":              dataMySQLVer8030GlobalVariables,
		"dataMySQLVer8030ReplicaStatusMultiSource":     dataMySQLVer8030ReplicaStatusMultiSource,
		"dataMySQLVer8030ProcessList":                  dataMySQLVer8030ProcessList,
		"dataPerconaVer8029Version":                    dataPerconaVer8029Version,
		"dataPerconaVer8029GlobalStatus":               dataPerconaVer8029GlobalStatus,
		"dataPerconaVer8029GlobalVariables":            dataPerconaVer8029GlobalVariables,
		"dataPerconaVer8029UserStatistics":             dataPerconaVer8029UserStatistics,
		"dataPerconaV8029ProcessList":                  dataPerconaV8029ProcessList,
		"dataMariaVer5564Version":                      dataMariaVer5564Version,
		"dataMariaVer5564GlobalStatus":                 dataMariaVer5564GlobalStatus,
		"dataMariaVer5564GlobalVariables":              dataMariaVer5564GlobalVariables,
		"dataMariaVer5564ProcessList":                  dataMariaVer5564ProcessList,
		"dataMariaVer1084Version":                      dataMariaVer1084Version,
		"dataMariaVer1084GlobalStatus":                 dataMariaVer1084GlobalStatus,
		"dataMariaVer1084GlobalVariables":              dataMariaVer1084GlobalVariables,
		"dataMariaVer1084AllSlavesStatusSingleSource":  dataMariaVer1084AllSlavesStatusSingleSource,
		"dataMariaVer1084AllSlavesStatusMultiSource":   dataMariaVer1084AllSlavesStatusMultiSource,
		"dataMariaVer1084UserStatistics":               dataMariaVer1084UserStatistics,
		"dataMariaVer1084ProcessList":                  dataMariaVer1084ProcessList,
		"dataMariaGaleraClusterVer1084Version":         dataMariaGaleraClusterVer1084Version,
		"dataMariaGaleraClusterVer1084GlobalStatus":    dataMariaGaleraClusterVer1084GlobalStatus,
		"dataMariaGaleraClusterVer1084GlobalVariables": dataMariaGaleraClusterVer1084GlobalVariables,
		"dataMariaGaleraClusterVer1084UserStatistics":  dataMariaGaleraClusterVer1084UserStatistics,
		"dataMariaGaleraClusterVer1084ProcessList":     dataMariaGaleraClusterVer1084ProcessList,
	} {
		require.NotNil(t, data, fmt.Sprintf("read data: %s", name))
		_, err := prepareMockRows(data)
		require.NoError(t, err, fmt.Sprintf("prepare mock rows: %s", name))
	}
}

func TestMySQL_ConfigurationSerialize(t *testing.T) {
	module.TestConfigurationSerialize(t, &MySQL{}, dataConfigJSON, dataConfigYAML)
}

func TestMySQL_Init(t *testing.T) {
	tests := map[string]struct {
		config   Config
		wantFail bool
	}{
		"empty DSN": {
			config:   Config{DSN: ""},
			wantFail: true,
		},
	}

	for name, test := range tests {
		t.Run(name, func(t *testing.T) {
			mySQL := New()
			mySQL.Config = test.config

			if test.wantFail {
				assert.Error(t, mySQL.Init())
			} else {
				assert.NoError(t, mySQL.Init())
			}
		})
	}
}

func TestMySQL_Cleanup(t *testing.T) {
	tests := map[string]func(t *testing.T) (mySQL *MySQL, cleanup func()){
		"db connection not initialized": func(t *testing.T) (mySQL *MySQL, cleanup func()) {
			return New(), func() {}
		},
		"db connection initialized": func(t *testing.T) (mySQL *MySQL, cleanup func()) {
			db, mock, err := sqlmock.New()
			require.NoError(t, err)

			mock.ExpectClose()
			mySQL = New()
			mySQL.db = db
			cleanup = func() { _ = db.Close() }

			return mySQL, cleanup
		},
	}

	for name, prepare := range tests {
		t.Run(name, func(t *testing.T) {
			mySQL, cleanup := prepare(t)
			defer cleanup()

			assert.NotPanics(t, mySQL.Cleanup)
			assert.Nil(t, mySQL.db)
		})
	}
}

func TestMySQL_Charts(t *testing.T) {
	assert.NotNil(t, New().Charts())
}

func TestMySQL_Check(t *testing.T) {
	tests := map[string]struct {
		prepareMock func(t *testing.T, m sqlmock.Sqlmock)
		wantFail    bool
	}{
		"success on all queries": {
			wantFail: false,
			prepareMock: func(t *testing.T, m sqlmock.Sqlmock) {
				mockExpect(t, m, queryShowVersion, dataMariaVer1084Version)
				mockExpect(t, m, queryShowSessionVariables, dataSessionVariables)
				mockExpect(t, m, queryDisableSessionQueryLog, nil)
				mockExpect(t, m, queryDisableSessionSlowQueryLog, nil)
				mockExpect(t, m, queryShowGlobalStatus, dataMariaVer1084GlobalStatus)
				mockExpect(t, m, queryShowGlobalVariables, dataMariaVer1084GlobalVariables)
				mockExpect(t, m, queryShowAllSlavesStatus, dataMariaVer1084AllSlavesStatusMultiSource)
				mockExpect(t, m, queryShowUserStatistics, dataMariaVer1084UserStatistics)
				mockExpect(t, m, queryShowProcessList, dataMariaVer1084ProcessList)
			},
		},
		"fails when error on querying version": {
			wantFail: true,
			prepareMock: func(t *testing.T, m sqlmock.Sqlmock) {
				mockExpectErr(m, queryShowVersion)
			},
		},
		"fails when error on querying global status": {
			wantFail: true,
			prepareMock: func(t *testing.T, m sqlmock.Sqlmock) {
				mockExpect(t, m, queryShowVersion, dataMariaVer1084Version)
				mockExpect(t, m, queryShowSessionVariables, dataSessionVariables)
				mockExpect(t, m, queryDisableSessionQueryLog, nil)
				mockExpect(t, m, queryDisableSessionSlowQueryLog, nil)
				mockExpectErr(m, queryShowGlobalStatus)
			},
		},
		"fails when error on querying global variables": {
			wantFail: true,
			prepareMock: func(t *testing.T, m sqlmock.Sqlmock) {
				mockExpect(t, m, queryShowVersion, dataMariaVer1084Version)
				mockExpect(t, m, queryShowSessionVariables, dataSessionVariables)
				mockExpect(t, m, queryDisableSessionQueryLog, nil)
				mockExpect(t, m, queryDisableSessionSlowQueryLog, nil)
				mockExpectErr(m, queryShowGlobalStatus)
			},
		},
		"success when error on querying slave status": {
			wantFail: false,
			prepareMock: func(t *testing.T, m sqlmock.Sqlmock) {
				mockExpect(t, m, queryShowVersion, dataMariaVer1084Version)
				mockExpect(t, m, queryShowSessionVariables, dataSessionVariables)
				mockExpect(t, m, queryDisableSessionQueryLog, nil)
				mockExpect(t, m, queryDisableSessionSlowQueryLog, nil)
				mockExpect(t, m, queryShowGlobalStatus, dataMariaVer1084GlobalStatus)
				mockExpect(t, m, queryShowGlobalVariables, dataMariaVer1084GlobalVariables)
				mockExpectErr(m, queryShowAllSlavesStatus)
				mockExpect(t, m, queryShowUserStatistics, dataMariaVer1084UserStatistics)
				mockExpect(t, m, queryShowProcessList, dataMariaVer1084ProcessList)
			},
		},
		"success when error on querying user statistics": {
			wantFail: false,
			prepareMock: func(t *testing.T, m sqlmock.Sqlmock) {
				mockExpect(t, m, queryShowVersion, dataMariaVer1084Version)
				mockExpect(t, m, queryShowSessionVariables, dataSessionVariables)
				mockExpect(t, m, queryDisableSessionQueryLog, nil)
				mockExpect(t, m, queryDisableSessionSlowQueryLog, nil)
				mockExpect(t, m, queryShowGlobalStatus, dataMariaVer1084GlobalStatus)
				mockExpect(t, m, queryShowGlobalVariables, dataMariaVer1084GlobalVariables)
				mockExpect(t, m, queryShowAllSlavesStatus, dataMariaVer1084AllSlavesStatusMultiSource)
				mockExpectErr(m, queryShowUserStatistics)
				mockExpect(t, m, queryShowProcessList, dataMariaVer1084ProcessList)
			},
		},
		"success when error on querying process list": {
			wantFail: false,
			prepareMock: func(t *testing.T, m sqlmock.Sqlmock) {
				mockExpect(t, m, queryShowVersion, dataMariaVer1084Version)
				mockExpect(t, m, queryShowSessionVariables, dataSessionVariables)
				mockExpect(t, m, queryDisableSessionQueryLog, nil)
				mockExpect(t, m, queryDisableSessionSlowQueryLog, nil)
				mockExpect(t, m, queryShowGlobalStatus, dataMariaVer1084GlobalStatus)
				mockExpect(t, m, queryShowGlobalVariables, dataMariaVer1084GlobalVariables)
				mockExpect(t, m, queryShowAllSlavesStatus, dataMariaVer1084AllSlavesStatusMultiSource)
				mockExpect(t, m, queryShowUserStatistics, dataMariaVer1084UserStatistics)
				mockExpectErr(m, queryShowProcessList)
			},
		},
	}

	for name, test := range tests {
		t.Run(name, func(t *testing.T) {
			db, mock, err := sqlmock.New(
				sqlmock.QueryMatcherOption(sqlmock.QueryMatcherEqual),
			)
			require.NoError(t, err)
			my := New()
			my.db = db
			defer func() { _ = db.Close() }()

			require.NoError(t, my.Init())

			test.prepareMock(t, mock)

			if test.wantFail {
				assert.Error(t, my.Check())
			} else {
				assert.NoError(t, my.Check())
			}
			assert.NoError(t, mock.ExpectationsWereMet())
		})
	}
}

func TestMySQL_Collect(t *testing.T) {
	type testCaseStep struct {
		prepareMock func(t *testing.T, m sqlmock.Sqlmock)
		check       func(t *testing.T, my *MySQL)
	}
	tests := map[string][]testCaseStep{
		"MariaDB-Standalone[v5.5.46]: success on all queries": {
			{
				prepareMock: func(t *testing.T, m sqlmock.Sqlmock) {
					mockExpect(t, m, queryShowVersion, dataMariaVer5564Version)
					mockExpect(t, m, queryShowSessionVariables, dataSessionVariables)
					mockExpect(t, m, queryDisableSessionQueryLog, nil)
					mockExpect(t, m, queryDisableSessionSlowQueryLog, nil)
					mockExpect(t, m, queryShowGlobalStatus, dataMariaVer5564GlobalStatus)
					mockExpect(t, m, queryShowGlobalVariables, dataMariaVer5564GlobalVariables)
					mockExpect(t, m, queryShowSlaveStatus, nil)
					mockExpect(t, m, queryShowProcessList, dataMariaVer5564ProcessList)
				},
				check: func(t *testing.T, my *MySQL) {
					mx := my.Collect()

					expected := map[string]int64{
						"aborted_connects":                      0,
						"binlog_cache_disk_use":                 0,
						"binlog_cache_use":                      0,
						"binlog_stmt_cache_disk_use":            0,
						"binlog_stmt_cache_use":                 0,
						"bytes_received":                        639,
						"bytes_sent":                            41620,
						"com_delete":                            0,
						"com_insert":                            0,
						"com_replace":                           0,
						"com_select":                            4,
						"com_update":                            0,
						"connections":                           4,
						"created_tmp_disk_tables":               0,
						"created_tmp_files":                     6,
						"created_tmp_tables":                    5,
						"handler_commit":                        0,
						"handler_delete":                        0,
						"handler_prepare":                       0,
						"handler_read_first":                    0,
						"handler_read_key":                      0,
						"handler_read_next":                     0,
						"handler_read_prev":                     0,
						"handler_read_rnd":                      0,
						"handler_read_rnd_next":                 1264,
						"handler_rollback":                      0,
						"handler_savepoint":                     0,
						"handler_savepoint_rollback":            0,
						"handler_update":                        0,
						"handler_write":                         0,
						"innodb_buffer_pool_bytes_data":         2342912,
						"innodb_buffer_pool_bytes_dirty":        0,
						"innodb_buffer_pool_pages_data":         143,
						"innodb_buffer_pool_pages_dirty":        0,
						"innodb_buffer_pool_pages_flushed":      0,
						"innodb_buffer_pool_pages_free":         16240,
						"innodb_buffer_pool_pages_misc":         0,
						"innodb_buffer_pool_pages_total":        16383,
						"innodb_buffer_pool_read_ahead":         0,
						"innodb_buffer_pool_read_ahead_evicted": 0,
						"innodb_buffer_pool_read_ahead_rnd":     0,
						"innodb_buffer_pool_read_requests":      459,
						"innodb_buffer_pool_reads":              144,
						"innodb_buffer_pool_wait_free":          0,
						"innodb_buffer_pool_write_requests":     0,
						"innodb_data_fsyncs":                    3,
						"innodb_data_pending_fsyncs":            0,
						"innodb_data_pending_reads":             0,
						"innodb_data_pending_writes":            0,
						"innodb_data_read":                      4542976,
						"innodb_data_reads":                     155,
						"innodb_data_writes":                    3,
						"innodb_data_written":                   1536,
						"innodb_deadlocks":                      0,
						"innodb_log_waits":                      0,
						"innodb_log_write_requests":             0,
						"innodb_log_writes":                     1,
						"innodb_os_log_fsyncs":                  3,
						"innodb_os_log_pending_fsyncs":          0,
						"innodb_os_log_pending_writes":          0,
						"innodb_os_log_written":                 512,
						"innodb_row_lock_current_waits":         0,
						"innodb_rows_deleted":                   0,
						"innodb_rows_inserted":                  0,
						"innodb_rows_read":                      0,
						"innodb_rows_updated":                   0,
						"key_blocks_not_flushed":                0,
						"key_blocks_unused":                     107171,
						"key_blocks_used":                       0,
						"key_read_requests":                     0,
						"key_reads":                             0,
						"key_write_requests":                    0,
						"key_writes":                            0,
						"max_connections":                       100,
						"max_used_connections":                  1,
						"open_files":                            21,
						"open_tables":                           26,
						"opened_files":                          84,
						"opened_tables":                         0,
						"process_list_fetch_query_duration":     0,
						"process_list_longest_query_duration":   9,
						"process_list_queries_count_system":     0,
						"process_list_queries_count_user":       2,
						"qcache_free_blocks":                    1,
						"qcache_free_memory":                    67091120,
						"qcache_hits":                           0,
						"qcache_inserts":                        0,
						"qcache_lowmem_prunes":                  0,
						"qcache_not_cached":                     4,
						"qcache_queries_in_cache":               0,
						"qcache_total_blocks":                   1,
						"queries":                               12,
						"questions":                             11,
						"select_full_join":                      0,
						"select_full_range_join":                0,
						"select_range":                          0,
						"select_range_check":                    0,
						"select_scan":                           5,
						"slow_queries":                          0,
						"sort_merge_passes":                     0,
						"sort_range":                            0,
						"sort_scan":                             0,
						"table_locks_immediate":                 36,
						"table_locks_waited":                    0,
						"table_open_cache":                      400,
						"thread_cache_misses":                   2500,
						"threads_cached":                        0,
						"threads_connected":                     1,
						"threads_created":                       1,
						"threads_running":                       1,
					}

					copyProcessListQueryDuration(mx, expected)
					require.Equal(t, expected, mx)
					ensureCollectedHasAllChartsDimsVarsIDs(t, my, mx)
				},
			},
		},
		"MariaDB-Standalone[v10.8.4]: success on all queries": {
			{
				prepareMock: func(t *testing.T, m sqlmock.Sqlmock) {
					mockExpect(t, m, queryShowVersion, dataMariaVer1084Version)
					mockExpect(t, m, queryShowSessionVariables, dataSessionVariables)
					mockExpect(t, m, queryDisableSessionQueryLog, nil)
					mockExpect(t, m, queryDisableSessionSlowQueryLog, nil)
					mockExpect(t, m, queryShowGlobalStatus, dataMariaVer1084GlobalStatus)
					mockExpect(t, m, queryShowGlobalVariables, dataMariaVer1084GlobalVariables)
					mockExpect(t, m, queryShowAllSlavesStatus, nil)
					mockExpect(t, m, queryShowUserStatistics, dataMariaVer1084UserStatistics)
					mockExpect(t, m, queryShowProcessList, dataMariaVer1084ProcessList)
				},
				check: func(t *testing.T, my *MySQL) {
					mx := my.Collect()

					expected := map[string]int64{

						"aborted_connects":                        2,
						"binlog_cache_disk_use":                   0,
						"binlog_cache_use":                        0,
						"binlog_stmt_cache_disk_use":              0,
						"binlog_stmt_cache_use":                   0,
						"bytes_received":                          81392,
						"bytes_sent":                              56794,
						"com_delete":                              0,
						"com_insert":                              0,
						"com_replace":                             0,
						"com_select":                              6,
						"com_update":                              0,
						"connection_errors_accept":                0,
						"connection_errors_internal":              0,
						"connection_errors_max_connections":       0,
						"connection_errors_peer_address":          0,
						"connection_errors_select":                0,
						"connection_errors_tcpwrap":               0,
						"connections":                             12,
						"created_tmp_disk_tables":                 0,
						"created_tmp_files":                       5,
						"created_tmp_tables":                      2,
						"handler_commit":                          30,
						"handler_delete":                          0,
						"handler_prepare":                         0,
						"handler_read_first":                      7,
						"handler_read_key":                        7,
						"handler_read_next":                       3,
						"handler_read_prev":                       0,
						"handler_read_rnd":                        0,
						"handler_read_rnd_next":                   626,
						"handler_rollback":                        0,
						"handler_savepoint":                       0,
						"handler_savepoint_rollback":              0,
						"handler_update":                          3,
						"handler_write":                           13,
						"innodb_buffer_pool_bytes_data":           5062656,
						"innodb_buffer_pool_bytes_dirty":          475136,
						"innodb_buffer_pool_pages_data":           309,
						"innodb_buffer_pool_pages_dirty":          29,
						"innodb_buffer_pool_pages_flushed":        0,
						"innodb_buffer_pool_pages_free":           7755,
						"innodb_buffer_pool_pages_misc":           0,
						"innodb_buffer_pool_pages_total":          8064,
						"innodb_buffer_pool_read_ahead":           0,
						"innodb_buffer_pool_read_ahead_evicted":   0,
						"innodb_buffer_pool_read_ahead_rnd":       0,
						"innodb_buffer_pool_read_requests":        1911,
						"innodb_buffer_pool_reads":                171,
						"innodb_buffer_pool_wait_free":            0,
						"innodb_buffer_pool_write_requests":       148,
						"innodb_data_fsyncs":                      17,
						"innodb_data_pending_fsyncs":              0,
						"innodb_data_pending_reads":               0,
						"innodb_data_pending_writes":              0,
						"innodb_data_read":                        2801664,
						"innodb_data_reads":                       185,
						"innodb_data_writes":                      16,
						"innodb_data_written":                     0,
						"innodb_deadlocks":                        0,
						"innodb_log_waits":                        0,
						"innodb_log_write_requests":               109,
						"innodb_log_writes":                       15,
						"innodb_os_log_written":                   6097,
						"innodb_row_lock_current_waits":           0,
						"innodb_rows_deleted":                     0,
						"innodb_rows_inserted":                    0,
						"innodb_rows_read":                        0,
						"innodb_rows_updated":                     0,
						"key_blocks_not_flushed":                  0,
						"key_blocks_unused":                       107163,
						"key_blocks_used":                         0,
						"key_read_requests":                       0,
						"key_reads":                               0,
						"key_write_requests":                      0,
						"key_writes":                              0,
						"max_connections":                         151,
						"max_used_connections":                    1,
						"open_files":                              29,
						"open_tables":                             10,
						"opened_files":                            100,
						"opened_tables":                           16,
						"process_list_fetch_query_duration":       0,
						"process_list_longest_query_duration":     9,
						"process_list_queries_count_system":       0,
						"process_list_queries_count_user":         2,
						"qcache_free_blocks":                      1,
						"qcache_free_memory":                      1031272,
						"qcache_hits":                             0,
						"qcache_inserts":                          0,
						"qcache_lowmem_prunes":                    0,
						"qcache_not_cached":                       0,
						"qcache_queries_in_cache":                 0,
						"qcache_total_blocks":                     1,
						"queries":                                 33,
						"questions":                               24,
						"select_full_join":                        0,
						"select_full_range_join":                  0,
						"select_range":                            0,
						"select_range_check":                      0,
						"select_scan":                             2,
						"slow_queries":                            0,
						"sort_merge_passes":                       0,
						"sort_range":                              0,
						"sort_scan":                               0,
						"table_locks_immediate":                   60,
						"table_locks_waited":                      0,
						"table_open_cache":                        2000,
						"table_open_cache_overflows":              0,
						"thread_cache_misses":                     1666,
						"threads_cached":                          0,
						"threads_connected":                       1,
						"threads_created":                         2,
						"threads_running":                         3,
						"userstats_netdata_access_denied":         33,
						"userstats_netdata_binlog_bytes_written":  0,
						"userstats_netdata_commit_transactions":   0,
						"userstats_netdata_cpu_time":              77,
						"userstats_netdata_denied_connections":    49698,
						"userstats_netdata_empty_queries":         66,
						"userstats_netdata_lost_connections":      0,
						"userstats_netdata_other_commands":        0,
						"userstats_netdata_rollback_transactions": 0,
						"userstats_netdata_rows_deleted":          0,
						"userstats_netdata_rows_inserted":         0,
						"userstats_netdata_rows_read":             0,
						"userstats_netdata_rows_sent":             99,
						"userstats_netdata_rows_updated":          0,
						"userstats_netdata_select_commands":       33,
						"userstats_netdata_total_connections":     1,
						"userstats_netdata_update_commands":       0,
						"userstats_root_access_denied":            0,
						"userstats_root_binlog_bytes_written":     0,
						"userstats_root_commit_transactions":      0,
						"userstats_root_cpu_time":                 0,
						"userstats_root_denied_connections":       0,
						"userstats_root_empty_queries":            0,
						"userstats_root_lost_connections":         0,
						"userstats_root_other_commands":           0,
						"userstats_root_rollback_transactions":    0,
						"userstats_root_rows_deleted":             0,
						"userstats_root_rows_inserted":            0,
						"userstats_root_rows_read":                0,
						"userstats_root_rows_sent":                2,
						"userstats_root_rows_updated":             0,
						"userstats_root_select_commands":          0,
						"userstats_root_total_connections":        1,
						"userstats_root_update_commands":          0,
						"wsrep_cluster_size":                      0,
						"wsrep_cluster_status_disconnected":       1,
						"wsrep_cluster_status_non_primary":        0,
						"wsrep_cluster_status_primary":            0,
						"wsrep_connected":                         0,
						"wsrep_local_bf_aborts":                   0,
						"wsrep_ready":                             0,
						"wsrep_thread_count":                      0,
					}

					copyProcessListQueryDuration(mx, expected)
					require.Equal(t, expected, mx)
					ensureCollectedHasAllChartsDimsVarsIDs(t, my, mx)
				},
			},
		},
		"MariaDB-SingleSourceReplication[v10.8.4]: success on all queries": {
			{
				prepareMock: func(t *testing.T, m sqlmock.Sqlmock) {
					mockExpect(t, m, queryShowVersion, dataMariaVer1084Version)
					mockExpect(t, m, queryShowSessionVariables, dataSessionVariables)
					mockExpect(t, m, queryDisableSessionQueryLog, nil)
					mockExpect(t, m, queryDisableSessionSlowQueryLog, nil)
					mockExpect(t, m, queryShowGlobalStatus, dataMariaVer1084GlobalStatus)
					mockExpect(t, m, queryShowGlobalVariables, dataMariaVer1084GlobalVariables)
					mockExpect(t, m, queryShowAllSlavesStatus, dataMariaVer1084AllSlavesStatusSingleSource)
					mockExpect(t, m, queryShowUserStatistics, dataMariaVer1084UserStatistics)
					mockExpect(t, m, queryShowProcessList, dataMariaVer1084ProcessList)
				},
				check: func(t *testing.T, my *MySQL) {
					mx := my.Collect()

					expected := map[string]int64{
						"aborted_connects":                        2,
						"binlog_cache_disk_use":                   0,
						"binlog_cache_use":                        0,
						"binlog_stmt_cache_disk_use":              0,
						"binlog_stmt_cache_use":                   0,
						"bytes_received":                          81392,
						"bytes_sent":                              56794,
						"com_delete":                              0,
						"com_insert":                              0,
						"com_replace":                             0,
						"com_select":                              6,
						"com_update":                              0,
						"connection_errors_accept":                0,
						"connection_errors_internal":              0,
						"connection_errors_max_connections":       0,
						"connection_errors_peer_address":          0,
						"connection_errors_select":                0,
						"connection_errors_tcpwrap":               0,
						"connections":                             12,
						"created_tmp_disk_tables":                 0,
						"created_tmp_files":                       5,
						"created_tmp_tables":                      2,
						"handler_commit":                          30,
						"handler_delete":                          0,
						"handler_prepare":                         0,
						"handler_read_first":                      7,
						"handler_read_key":                        7,
						"handler_read_next":                       3,
						"handler_read_prev":                       0,
						"handler_read_rnd":                        0,
						"handler_read_rnd_next":                   626,
						"handler_rollback":                        0,
						"handler_savepoint":                       0,
						"handler_savepoint_rollback":              0,
						"handler_update":                          3,
						"handler_write":                           13,
						"innodb_buffer_pool_bytes_data":           5062656,
						"innodb_buffer_pool_bytes_dirty":          475136,
						"innodb_buffer_pool_pages_data":           309,
						"innodb_buffer_pool_pages_dirty":          29,
						"innodb_buffer_pool_pages_flushed":        0,
						"innodb_buffer_pool_pages_free":           7755,
						"innodb_buffer_pool_pages_misc":           0,
						"innodb_buffer_pool_pages_total":          8064,
						"innodb_buffer_pool_read_ahead":           0,
						"innodb_buffer_pool_read_ahead_evicted":   0,
						"innodb_buffer_pool_read_ahead_rnd":       0,
						"innodb_buffer_pool_read_requests":        1911,
						"innodb_buffer_pool_reads":                171,
						"innodb_buffer_pool_wait_free":            0,
						"innodb_buffer_pool_write_requests":       148,
						"innodb_data_fsyncs":                      17,
						"innodb_data_pending_fsyncs":              0,
						"innodb_data_pending_reads":               0,
						"innodb_data_pending_writes":              0,
						"innodb_data_read":                        2801664,
						"innodb_data_reads":                       185,
						"innodb_data_writes":                      16,
						"innodb_data_written":                     0,
						"innodb_deadlocks":                        0,
						"innodb_log_waits":                        0,
						"innodb_log_write_requests":               109,
						"innodb_log_writes":                       15,
						"innodb_os_log_written":                   6097,
						"innodb_row_lock_current_waits":           0,
						"innodb_rows_deleted":                     0,
						"innodb_rows_inserted":                    0,
						"innodb_rows_read":                        0,
						"innodb_rows_updated":                     0,
						"key_blocks_not_flushed":                  0,
						"key_blocks_unused":                       107163,
						"key_blocks_used":                         0,
						"key_read_requests":                       0,
						"key_reads":                               0,
						"key_write_requests":                      0,
						"key_writes":                              0,
						"max_connections":                         151,
						"max_used_connections":                    1,
						"open_files":                              29,
						"open_tables":                             10,
						"opened_files":                            100,
						"opened_tables":                           16,
						"process_list_fetch_query_duration":       0,
						"process_list_longest_query_duration":     9,
						"process_list_queries_count_system":       0,
						"process_list_queries_count_user":         2,
						"qcache_free_blocks":                      1,
						"qcache_free_memory":                      1031272,
						"qcache_hits":                             0,
						"qcache_inserts":                          0,
						"qcache_lowmem_prunes":                    0,
						"qcache_not_cached":                       0,
						"qcache_queries_in_cache":                 0,
						"qcache_total_blocks":                     1,
						"queries":                                 33,
						"questions":                               24,
						"seconds_behind_master":                   0,
						"select_full_join":                        0,
						"select_full_range_join":                  0,
						"select_range":                            0,
						"select_range_check":                      0,
						"select_scan":                             2,
						"slave_io_running":                        1,
						"slave_sql_running":                       1,
						"slow_queries":                            0,
						"sort_merge_passes":                       0,
						"sort_range":                              0,
						"sort_scan":                               0,
						"table_locks_immediate":                   60,
						"table_locks_waited":                      0,
						"table_open_cache":                        2000,
						"table_open_cache_overflows":              0,
						"thread_cache_misses":                     1666,
						"threads_cached":                          0,
						"threads_connected":                       1,
						"threads_created":                         2,
						"threads_running":                         3,
						"userstats_netdata_access_denied":         33,
						"userstats_netdata_binlog_bytes_written":  0,
						"userstats_netdata_commit_transactions":   0,
						"userstats_netdata_cpu_time":              77,
						"userstats_netdata_denied_connections":    49698,
						"userstats_netdata_empty_queries":         66,
						"userstats_netdata_lost_connections":      0,
						"userstats_netdata_other_commands":        0,
						"userstats_netdata_rollback_transactions": 0,
						"userstats_netdata_rows_deleted":          0,
						"userstats_netdata_rows_inserted":         0,
						"userstats_netdata_rows_read":             0,
						"userstats_netdata_rows_sent":             99,
						"userstats_netdata_rows_updated":          0,
						"userstats_netdata_select_commands":       33,
						"userstats_netdata_total_connections":     1,
						"userstats_netdata_update_commands":       0,
						"userstats_root_access_denied":            0,
						"userstats_root_binlog_bytes_written":     0,
						"userstats_root_commit_transactions":      0,
						"userstats_root_cpu_time":                 0,
						"userstats_root_denied_connections":       0,
						"userstats_root_empty_queries":            0,
						"userstats_root_lost_connections":         0,
						"userstats_root_other_commands":           0,
						"userstats_root_rollback_transactions":    0,
						"userstats_root_rows_deleted":             0,
						"userstats_root_rows_inserted":            0,
						"userstats_root_rows_read":                0,
						"userstats_root_rows_sent":                2,
						"userstats_root_rows_updated":             0,
						"userstats_root_select_commands":          0,
						"userstats_root_total_connections":        1,
						"userstats_root_update_commands":          0,
						"wsrep_cluster_size":                      0,
						"wsrep_cluster_status_disconnected":       1,
						"wsrep_cluster_status_non_primary":        0,
						"wsrep_cluster_status_primary":            0,
						"wsrep_connected":                         0,
						"wsrep_local_bf_aborts":                   0,
						"wsrep_ready":                             0,
						"wsrep_thread_count":                      0,
					}

					copyProcessListQueryDuration(mx, expected)
					require.Equal(t, expected, mx)
					ensureCollectedHasAllChartsDimsVarsIDs(t, my, mx)
				},
			},
		},
		"MariaDB-MultiSourceReplication[v10.8.4]: success on all queries": {
			{
				prepareMock: func(t *testing.T, m sqlmock.Sqlmock) {
					mockExpect(t, m, queryShowVersion, dataMariaVer1084Version)
					mockExpect(t, m, queryShowSessionVariables, dataSessionVariables)
					mockExpect(t, m, queryDisableSessionQueryLog, nil)
					mockExpect(t, m, queryDisableSessionSlowQueryLog, nil)
					mockExpect(t, m, queryShowGlobalStatus, dataMariaVer1084GlobalStatus)
					mockExpect(t, m, queryShowGlobalVariables, dataMariaVer1084GlobalVariables)
					mockExpect(t, m, queryShowAllSlavesStatus, dataMariaVer1084AllSlavesStatusMultiSource)
					mockExpect(t, m, queryShowUserStatistics, dataMariaVer1084UserStatistics)
					mockExpect(t, m, queryShowProcessList, dataMariaVer1084ProcessList)
				},
				check: func(t *testing.T, my *MySQL) {
					mx := my.Collect()

					expected := map[string]int64{
						"aborted_connects":                        2,
						"binlog_cache_disk_use":                   0,
						"binlog_cache_use":                        0,
						"binlog_stmt_cache_disk_use":              0,
						"binlog_stmt_cache_use":                   0,
						"bytes_received":                          81392,
						"bytes_sent":                              56794,
						"com_delete":                              0,
						"com_insert":                              0,
						"com_replace":                             0,
						"com_select":                              6,
						"com_update":                              0,
						"connection_errors_accept":                0,
						"connection_errors_internal":              0,
						"connection_errors_max_connections":       0,
						"connection_errors_peer_address":          0,
						"connection_errors_select":                0,
						"connection_errors_tcpwrap":               0,
						"connections":                             12,
						"created_tmp_disk_tables":                 0,
						"created_tmp_files":                       5,
						"created_tmp_tables":                      2,
						"handler_commit":                          30,
						"handler_delete":                          0,
						"handler_prepare":                         0,
						"handler_read_first":                      7,
						"handler_read_key":                        7,
						"handler_read_next":                       3,
						"handler_read_prev":                       0,
						"handler_read_rnd":                        0,
						"handler_read_rnd_next":                   626,
						"handler_rollback":                        0,
						"handler_savepoint":                       0,
						"handler_savepoint_rollback":              0,
						"handler_update":                          3,
						"handler_write":                           13,
						"innodb_buffer_pool_bytes_data":           5062656,
						"innodb_buffer_pool_bytes_dirty":          475136,
						"innodb_buffer_pool_pages_data":           309,
						"innodb_buffer_pool_pages_dirty":          29,
						"innodb_buffer_pool_pages_flushed":        0,
						"innodb_buffer_pool_pages_free":           7755,
						"innodb_buffer_pool_pages_misc":           0,
						"innodb_buffer_pool_pages_total":          8064,
						"innodb_buffer_pool_read_ahead":           0,
						"innodb_buffer_pool_read_ahead_evicted":   0,
						"innodb_buffer_pool_read_ahead_rnd":       0,
						"innodb_buffer_pool_read_requests":        1911,
						"innodb_buffer_pool_reads":                171,
						"innodb_buffer_pool_wait_free":            0,
						"innodb_buffer_pool_write_requests":       148,
						"innodb_data_fsyncs":                      17,
						"innodb_data_pending_fsyncs":              0,
						"innodb_data_pending_reads":               0,
						"innodb_data_pending_writes":              0,
						"innodb_data_read":                        2801664,
						"innodb_data_reads":                       185,
						"innodb_data_writes":                      16,
						"innodb_data_written":                     0,
						"innodb_deadlocks":                        0,
						"innodb_log_waits":                        0,
						"innodb_log_write_requests":               109,
						"innodb_log_writes":                       15,
						"innodb_os_log_written":                   6097,
						"innodb_row_lock_current_waits":           0,
						"innodb_rows_deleted":                     0,
						"innodb_rows_inserted":                    0,
						"innodb_rows_read":                        0,
						"innodb_rows_updated":                     0,
						"key_blocks_not_flushed":                  0,
						"key_blocks_unused":                       107163,
						"key_blocks_used":                         0,
						"key_read_requests":                       0,
						"key_reads":                               0,
						"key_write_requests":                      0,
						"key_writes":                              0,
						"max_connections":                         151,
						"max_used_connections":                    1,
						"open_files":                              29,
						"open_tables":                             10,
						"opened_files":                            100,
						"opened_tables":                           16,
						"process_list_fetch_query_duration":       0,
						"process_list_longest_query_duration":     9,
						"process_list_queries_count_system":       0,
						"process_list_queries_count_user":         2,
						"qcache_free_blocks":                      1,
						"qcache_free_memory":                      1031272,
						"qcache_hits":                             0,
						"qcache_inserts":                          0,
						"qcache_lowmem_prunes":                    0,
						"qcache_not_cached":                       0,
						"qcache_queries_in_cache":                 0,
						"qcache_total_blocks":                     1,
						"queries":                                 33,
						"questions":                               24,
						"seconds_behind_master_master1":           0,
						"seconds_behind_master_master2":           0,
						"select_full_join":                        0,
						"select_full_range_join":                  0,
						"select_range":                            0,
						"select_range_check":                      0,
						"select_scan":                             2,
						"slave_io_running_master1":                1,
						"slave_io_running_master2":                1,
						"slave_sql_running_master1":               1,
						"slave_sql_running_master2":               1,
						"slow_queries":                            0,
						"sort_merge_passes":                       0,
						"sort_range":                              0,
						"sort_scan":                               0,
						"table_locks_immediate":                   60,
						"table_locks_waited":                      0,
						"table_open_cache":                        2000,
						"table_open_cache_overflows":              0,
						"thread_cache_misses":                     1666,
						"threads_cached":                          0,
						"threads_connected":                       1,
						"threads_created":                         2,
						"threads_running":                         3,
						"userstats_netdata_access_denied":         33,
						"userstats_netdata_binlog_bytes_written":  0,
						"userstats_netdata_commit_transactions":   0,
						"userstats_netdata_cpu_time":              77,
						"userstats_netdata_denied_connections":    49698,
						"userstats_netdata_empty_queries":         66,
						"userstats_netdata_lost_connections":      0,
						"userstats_netdata_other_commands":        0,
						"userstats_netdata_rollback_transactions": 0,
						"userstats_netdata_rows_deleted":          0,
						"userstats_netdata_rows_inserted":         0,
						"userstats_netdata_rows_read":             0,
						"userstats_netdata_rows_sent":             99,
						"userstats_netdata_rows_updated":          0,
						"userstats_netdata_select_commands":       33,
						"userstats_netdata_total_connections":     1,
						"userstats_netdata_update_commands":       0,
						"userstats_root_access_denied":            0,
						"userstats_root_binlog_bytes_written":     0,
						"userstats_root_commit_transactions":      0,
						"userstats_root_cpu_time":                 0,
						"userstats_root_denied_connections":       0,
						"userstats_root_empty_queries":            0,
						"userstats_root_lost_connections":         0,
						"userstats_root_other_commands":           0,
						"userstats_root_rollback_transactions":    0,
						"userstats_root_rows_deleted":             0,
						"userstats_root_rows_inserted":            0,
						"userstats_root_rows_read":                0,
						"userstats_root_rows_sent":                2,
						"userstats_root_rows_updated":             0,
						"userstats_root_select_commands":          0,
						"userstats_root_total_connections":        1,
						"userstats_root_update_commands":          0,
						"wsrep_cluster_size":                      0,
						"wsrep_cluster_status_disconnected":       1,
						"wsrep_cluster_status_non_primary":        0,
						"wsrep_cluster_status_primary":            0,
						"wsrep_connected":                         0,
						"wsrep_local_bf_aborts":                   0,
						"wsrep_ready":                             0,
						"wsrep_thread_count":                      0,
					}

					copyProcessListQueryDuration(mx, expected)
					require.Equal(t, expected, mx)
					ensureCollectedHasAllChartsDimsVarsIDs(t, my, mx)
				},
			},
		},
		"MariaDB-MultiSourceReplication[v10.8.4]: error on slaves status (no permissions)": {
			{
				prepareMock: func(t *testing.T, m sqlmock.Sqlmock) {
					mockExpect(t, m, queryShowVersion, dataMariaVer1084Version)
					mockExpect(t, m, queryShowSessionVariables, dataSessionVariables)
					mockExpect(t, m, queryDisableSessionQueryLog, nil)
					mockExpect(t, m, queryDisableSessionSlowQueryLog, nil)
					mockExpect(t, m, queryShowGlobalStatus, dataMariaVer1084GlobalStatus)
					mockExpect(t, m, queryShowGlobalVariables, dataMariaVer1084GlobalVariables)
					mockExpectErr(m, queryShowAllSlavesStatus)
					mockExpect(t, m, queryShowUserStatistics, dataMariaVer1084UserStatistics)
					mockExpect(t, m, queryShowProcessList, dataMariaVer1084ProcessList)
				},
				check: func(t *testing.T, my *MySQL) {
					mx := my.Collect()

					expected := map[string]int64{
						"aborted_connects":                        2,
						"binlog_cache_disk_use":                   0,
						"binlog_cache_use":                        0,
						"binlog_stmt_cache_disk_use":              0,
						"binlog_stmt_cache_use":                   0,
						"bytes_received":                          81392,
						"bytes_sent":                              56794,
						"com_delete":                              0,
						"com_insert":                              0,
						"com_replace":                             0,
						"com_select":                              6,
						"com_update":                              0,
						"connection_errors_accept":                0,
						"connection_errors_internal":              0,
						"connection_errors_max_connections":       0,
						"connection_errors_peer_address":          0,
						"connection_errors_select":                0,
						"connection_errors_tcpwrap":               0,
						"connections":                             12,
						"created_tmp_disk_tables":                 0,
						"created_tmp_files":                       5,
						"created_tmp_tables":                      2,
						"handler_commit":                          30,
						"handler_delete":                          0,
						"handler_prepare":                         0,
						"handler_read_first":                      7,
						"handler_read_key":                        7,
						"handler_read_next":                       3,
						"handler_read_prev":                       0,
						"handler_read_rnd":                        0,
						"handler_read_rnd_next":                   626,
						"handler_rollback":                        0,
						"handler_savepoint":                       0,
						"handler_savepoint_rollback":              0,
						"handler_update":                          3,
						"handler_write":                           13,
						"innodb_buffer_pool_bytes_data":           5062656,
						"innodb_buffer_pool_bytes_dirty":          475136,
						"innodb_buffer_pool_pages_data":           309,
						"innodb_buffer_pool_pages_dirty":          29,
						"innodb_buffer_pool_pages_flushed":        0,
						"innodb_buffer_pool_pages_free":           7755,
						"innodb_buffer_pool_pages_misc":           0,
						"innodb_buffer_pool_pages_total":          8064,
						"innodb_buffer_pool_read_ahead":           0,
						"innodb_buffer_pool_read_ahead_evicted":   0,
						"innodb_buffer_pool_read_ahead_rnd":       0,
						"innodb_buffer_pool_read_requests":        1911,
						"innodb_buffer_pool_reads":                171,
						"innodb_buffer_pool_wait_free":            0,
						"innodb_buffer_pool_write_requests":       148,
						"innodb_data_fsyncs":                      17,
						"innodb_data_pending_fsyncs":              0,
						"innodb_data_pending_reads":               0,
						"innodb_data_pending_writes":              0,
						"innodb_data_read":                        2801664,
						"innodb_data_reads":                       185,
						"innodb_data_writes":                      16,
						"innodb_data_written":                     0,
						"innodb_deadlocks":                        0,
						"innodb_log_waits":                        0,
						"innodb_log_write_requests":               109,
						"innodb_log_writes":                       15,
						"innodb_os_log_written":                   6097,
						"innodb_row_lock_current_waits":           0,
						"innodb_rows_deleted":                     0,
						"innodb_rows_inserted":                    0,
						"innodb_rows_read":                        0,
						"innodb_rows_updated":                     0,
						"key_blocks_not_flushed":                  0,
						"key_blocks_unused":                       107163,
						"key_blocks_used":                         0,
						"key_read_requests":                       0,
						"key_reads":                               0,
						"key_write_requests":                      0,
						"key_writes":                              0,
						"max_connections":                         151,
						"max_used_connections":                    1,
						"open_files":                              29,
						"open_tables":                             10,
						"opened_files":                            100,
						"opened_tables":                           16,
						"process_list_fetch_query_duration":       0,
						"process_list_longest_query_duration":     9,
						"process_list_queries_count_system":       0,
						"process_list_queries_count_user":         2,
						"qcache_free_blocks":                      1,
						"qcache_free_memory":                      1031272,
						"qcache_hits":                             0,
						"qcache_inserts":                          0,
						"qcache_lowmem_prunes":                    0,
						"qcache_not_cached":                       0,
						"qcache_queries_in_cache":                 0,
						"qcache_total_blocks":                     1,
						"queries":                                 33,
						"questions":                               24,
						"select_full_join":                        0,
						"select_full_range_join":                  0,
						"select_range":                            0,
						"select_range_check":                      0,
						"select_scan":                             2,
						"slow_queries":                            0,
						"sort_merge_passes":                       0,
						"sort_range":                              0,
						"sort_scan":                               0,
						"table_locks_immediate":                   60,
						"table_locks_waited":                      0,
						"table_open_cache":                        2000,
						"table_open_cache_overflows":              0,
						"thread_cache_misses":                     1666,
						"threads_cached":                          0,
						"threads_connected":                       1,
						"threads_created":                         2,
						"threads_running":                         3,
						"userstats_netdata_access_denied":         33,
						"userstats_netdata_binlog_bytes_written":  0,
						"userstats_netdata_commit_transactions":   0,
						"userstats_netdata_cpu_time":              77,
						"userstats_netdata_denied_connections":    49698,
						"userstats_netdata_empty_queries":         66,
						"userstats_netdata_lost_connections":      0,
						"userstats_netdata_other_commands":        0,
						"userstats_netdata_rollback_transactions": 0,
						"userstats_netdata_rows_deleted":          0,
						"userstats_netdata_rows_inserted":         0,
						"userstats_netdata_rows_read":             0,
						"userstats_netdata_rows_sent":             99,
						"userstats_netdata_rows_updated":          0,
						"userstats_netdata_select_commands":       33,
						"userstats_netdata_total_connections":     1,
						"userstats_netdata_update_commands":       0,
						"userstats_root_access_denied":            0,
						"userstats_root_binlog_bytes_written":     0,
						"userstats_root_commit_transactions":      0,
						"userstats_root_cpu_time":                 0,
						"userstats_root_denied_connections":       0,
						"userstats_root_empty_queries":            0,
						"userstats_root_lost_connections":         0,
						"userstats_root_other_commands":           0,
						"userstats_root_rollback_transactions":    0,
						"userstats_root_rows_deleted":             0,
						"userstats_root_rows_inserted":            0,
						"userstats_root_rows_read":                0,
						"userstats_root_rows_sent":                2,
						"userstats_root_rows_updated":             0,
						"userstats_root_select_commands":          0,
						"userstats_root_total_connections":        1,
						"userstats_root_update_commands":          0,
						"wsrep_cluster_size":                      0,
						"wsrep_cluster_status_disconnected":       1,
						"wsrep_cluster_status_non_primary":        0,
						"wsrep_cluster_status_primary":            0,
						"wsrep_connected":                         0,
						"wsrep_local_bf_aborts":                   0,
						"wsrep_ready":                             0,
						"wsrep_thread_count":                      0,
					}

					copyProcessListQueryDuration(mx, expected)
					require.Equal(t, expected, mx)
					ensureCollectedHasAllChartsDimsVarsIDs(t, my, mx)
				},
			},
		},
		"MariaDB-GaleraCluster[v10.8.4]: success on all queries": {
			{
				prepareMock: func(t *testing.T, m sqlmock.Sqlmock) {
					mockExpect(t, m, queryShowVersion, dataMariaGaleraClusterVer1084Version)
					mockExpect(t, m, queryShowSessionVariables, dataSessionVariables)
					mockExpect(t, m, queryDisableSessionQueryLog, nil)
					mockExpect(t, m, queryDisableSessionSlowQueryLog, nil)
					mockExpect(t, m, queryShowGlobalStatus, dataMariaGaleraClusterVer1084GlobalStatus)
					mockExpect(t, m, queryShowGlobalVariables, dataMariaGaleraClusterVer1084GlobalVariables)
					mockExpect(t, m, queryShowAllSlavesStatus, nil)
					mockExpect(t, m, queryShowUserStatistics, dataMariaGaleraClusterVer1084UserStatistics)
					mockExpect(t, m, queryShowProcessList, dataMariaGaleraClusterVer1084ProcessList)
				},
				check: func(t *testing.T, my *MySQL) {
					mx := my.Collect()

					expected := map[string]int64{
						"aborted_connects":                        0,
						"binlog_cache_disk_use":                   0,
						"binlog_cache_use":                        0,
						"binlog_stmt_cache_disk_use":              0,
						"binlog_stmt_cache_use":                   0,
						"bytes_received":                          3009,
						"bytes_sent":                              228856,
						"com_delete":                              6,
						"com_insert":                              0,
						"com_replace":                             0,
						"com_select":                              12,
						"com_update":                              0,
						"connection_errors_accept":                0,
						"connection_errors_internal":              0,
						"connection_errors_max_connections":       0,
						"connection_errors_peer_address":          0,
						"connection_errors_select":                0,
						"connection_errors_tcpwrap":               0,
						"connections":                             15,
						"created_tmp_disk_tables":                 4,
						"created_tmp_files":                       5,
						"created_tmp_tables":                      17,
						"handler_commit":                          37,
						"handler_delete":                          7,
						"handler_prepare":                         0,
						"handler_read_first":                      3,
						"handler_read_key":                        9,
						"handler_read_next":                       1,
						"handler_read_prev":                       0,
						"handler_read_rnd":                        0,
						"handler_read_rnd_next":                   6222,
						"handler_rollback":                        0,
						"handler_savepoint":                       0,
						"handler_savepoint_rollback":              0,
						"handler_update":                          0,
						"handler_write":                           9,
						"innodb_buffer_pool_bytes_data":           5193728,
						"innodb_buffer_pool_bytes_dirty":          2260992,
						"innodb_buffer_pool_pages_data":           317,
						"innodb_buffer_pool_pages_dirty":          138,
						"innodb_buffer_pool_pages_flushed":        0,
						"innodb_buffer_pool_pages_free":           7747,
						"innodb_buffer_pool_pages_misc":           0,
						"innodb_buffer_pool_pages_total":          8064,
						"innodb_buffer_pool_read_ahead":           0,
						"innodb_buffer_pool_read_ahead_evicted":   0,
						"innodb_buffer_pool_read_ahead_rnd":       0,
						"innodb_buffer_pool_read_requests":        2298,
						"innodb_buffer_pool_reads":                184,
						"innodb_buffer_pool_wait_free":            0,
						"innodb_buffer_pool_write_requests":       203,
						"innodb_data_fsyncs":                      15,
						"innodb_data_pending_fsyncs":              0,
						"innodb_data_pending_reads":               0,
						"innodb_data_pending_writes":              0,
						"innodb_data_read":                        3014656,
						"innodb_data_reads":                       201,
						"innodb_data_writes":                      14,
						"innodb_data_written":                     0,
						"innodb_deadlocks":                        0,
						"innodb_log_waits":                        0,
						"innodb_log_write_requests":               65,
						"innodb_log_writes":                       13,
						"innodb_os_log_written":                   4785,
						"innodb_row_lock_current_waits":           0,
						"innodb_rows_deleted":                     0,
						"innodb_rows_inserted":                    0,
						"innodb_rows_read":                        0,
						"innodb_rows_updated":                     0,
						"key_blocks_not_flushed":                  0,
						"key_blocks_unused":                       107163,
						"key_blocks_used":                         0,
						"key_read_requests":                       0,
						"key_reads":                               0,
						"key_write_requests":                      0,
						"key_writes":                              0,
						"max_connections":                         151,
						"max_used_connections":                    1,
						"open_files":                              7,
						"open_tables":                             0,
						"opened_files":                            125,
						"opened_tables":                           24,
						"process_list_fetch_query_duration":       0,
						"process_list_longest_query_duration":     9,
						"process_list_queries_count_system":       0,
						"process_list_queries_count_user":         2,
						"qcache_free_blocks":                      1,
						"qcache_free_memory":                      1031272,
						"qcache_hits":                             0,
						"qcache_inserts":                          0,
						"qcache_lowmem_prunes":                    0,
						"qcache_not_cached":                       0,
						"qcache_queries_in_cache":                 0,
						"qcache_total_blocks":                     1,
						"queries":                                 75,
						"questions":                               62,
						"select_full_join":                        0,
						"select_full_range_join":                  0,
						"select_range":                            0,
						"select_range_check":                      0,
						"select_scan":                             17,
						"slow_queries":                            0,
						"sort_merge_passes":                       0,
						"sort_range":                              0,
						"sort_scan":                               0,
						"table_locks_immediate":                   17,
						"table_locks_waited":                      0,
						"table_open_cache":                        2000,
						"table_open_cache_overflows":              0,
						"thread_cache_misses":                     4000,
						"threads_cached":                          0,
						"threads_connected":                       1,
						"threads_created":                         6,
						"threads_running":                         1,
						"userstats_netdata_access_denied":         33,
						"userstats_netdata_binlog_bytes_written":  0,
						"userstats_netdata_commit_transactions":   0,
						"userstats_netdata_cpu_time":              77,
						"userstats_netdata_denied_connections":    49698,
						"userstats_netdata_empty_queries":         66,
						"userstats_netdata_lost_connections":      0,
						"userstats_netdata_other_commands":        0,
						"userstats_netdata_rollback_transactions": 0,
						"userstats_netdata_rows_deleted":          0,
						"userstats_netdata_rows_inserted":         0,
						"userstats_netdata_rows_read":             0,
						"userstats_netdata_rows_sent":             99,
						"userstats_netdata_rows_updated":          0,
						"userstats_netdata_select_commands":       33,
						"userstats_netdata_total_connections":     1,
						"userstats_netdata_update_commands":       0,
						"userstats_root_access_denied":            0,
						"userstats_root_binlog_bytes_written":     0,
						"userstats_root_commit_transactions":      0,
						"userstats_root_cpu_time":                 0,
						"userstats_root_denied_connections":       0,
						"userstats_root_empty_queries":            0,
						"userstats_root_lost_connections":         0,
						"userstats_root_other_commands":           0,
						"userstats_root_rollback_transactions":    0,
						"userstats_root_rows_deleted":             0,
						"userstats_root_rows_inserted":            0,
						"userstats_root_rows_read":                0,
						"userstats_root_rows_sent":                2,
						"userstats_root_rows_updated":             0,
						"userstats_root_select_commands":          0,
						"userstats_root_total_connections":        1,
						"userstats_root_update_commands":          0,
						"wsrep_cluster_size":                      3,
						"wsrep_cluster_status_disconnected":       0,
						"wsrep_cluster_status_non_primary":        0,
						"wsrep_cluster_status_primary":            1,
						"wsrep_cluster_weight":                    3,
						"wsrep_connected":                         1,
						"wsrep_flow_control_paused_ns":            0,
						"wsrep_local_bf_aborts":                   0,
						"wsrep_local_cert_failures":               0,
						"wsrep_local_recv_queue":                  0,
						"wsrep_local_send_queue":                  0,
						"wsrep_local_state_donor":                 0,
						"wsrep_local_state_error":                 0,
						"wsrep_local_state_joined":                0,
						"wsrep_local_state_joiner":                0,
						"wsrep_local_state_synced":                1,
						"wsrep_local_state_undefined":             0,
						"wsrep_open_transactions":                 0,
						"wsrep_ready":                             1,
						"wsrep_received":                          11,
						"wsrep_received_bytes":                    1410,
						"wsrep_replicated":                        0,
						"wsrep_replicated_bytes":                  0,
						"wsrep_thread_count":                      5,
					}

					copyProcessListQueryDuration(mx, expected)
					require.Equal(t, expected, mx)
					ensureCollectedHasAllChartsDimsVarsIDs(t, my, mx)
				},
			},
		},
		"MySQL-MultiSourceReplication[v8.0.30]: success on all queries": {
			{
				prepareMock: func(t *testing.T, m sqlmock.Sqlmock) {
					mockExpect(t, m, queryShowVersion, dataMySQLVer8030Version)
					mockExpect(t, m, queryShowSessionVariables, dataSessionVariables)
					mockExpect(t, m, queryDisableSessionQueryLog, nil)
					mockExpect(t, m, queryDisableSessionSlowQueryLog, nil)
					mockExpect(t, m, queryShowGlobalStatus, dataMySQLVer8030GlobalStatus)
					mockExpect(t, m, queryShowGlobalVariables, dataMySQLVer8030GlobalVariables)
					mockExpect(t, m, queryShowReplicaStatus, dataMySQLVer8030ReplicaStatusMultiSource)
					mockExpect(t, m, queryShowProcessListPS, dataMySQLVer8030ProcessList)
				},
				check: func(t *testing.T, my *MySQL) {
					mx := my.Collect()

					expected := map[string]int64{
						"aborted_connects":                      0,
						"binlog_cache_disk_use":                 0,
						"binlog_cache_use":                      6,
						"binlog_stmt_cache_disk_use":            0,
						"binlog_stmt_cache_use":                 0,
						"bytes_received":                        5584,
						"bytes_sent":                            70700,
						"com_delete":                            0,
						"com_insert":                            0,
						"com_replace":                           0,
						"com_select":                            2,
						"com_update":                            0,
						"connection_errors_accept":              0,
						"connection_errors_internal":            0,
						"connection_errors_max_connections":     0,
						"connection_errors_peer_address":        0,
						"connection_errors_select":              0,
						"connection_errors_tcpwrap":             0,
						"connections":                           25,
						"created_tmp_disk_tables":               0,
						"created_tmp_files":                     5,
						"created_tmp_tables":                    6,
						"handler_commit":                        720,
						"handler_delete":                        8,
						"handler_prepare":                       24,
						"handler_read_first":                    50,
						"handler_read_key":                      1914,
						"handler_read_next":                     4303,
						"handler_read_prev":                     0,
						"handler_read_rnd":                      0,
						"handler_read_rnd_next":                 4723,
						"handler_rollback":                      1,
						"handler_savepoint":                     0,
						"handler_savepoint_rollback":            0,
						"handler_update":                        373,
						"handler_write":                         1966,
						"innodb_buffer_pool_bytes_data":         17121280,
						"innodb_buffer_pool_bytes_dirty":        0,
						"innodb_buffer_pool_pages_data":         1045,
						"innodb_buffer_pool_pages_dirty":        0,
						"innodb_buffer_pool_pages_flushed":      361,
						"innodb_buffer_pool_pages_free":         7143,
						"innodb_buffer_pool_pages_misc":         4,
						"innodb_buffer_pool_pages_total":        8192,
						"innodb_buffer_pool_read_ahead":         0,
						"innodb_buffer_pool_read_ahead_evicted": 0,
						"innodb_buffer_pool_read_ahead_rnd":     0,
						"innodb_buffer_pool_read_requests":      16723,
						"innodb_buffer_pool_reads":              878,
						"innodb_buffer_pool_wait_free":          0,
						"innodb_buffer_pool_write_requests":     2377,
						"innodb_data_fsyncs":                    255,
						"innodb_data_pending_fsyncs":            0,
						"innodb_data_pending_reads":             0,
						"innodb_data_pending_writes":            0,
						"innodb_data_read":                      14453760,
						"innodb_data_reads":                     899,
						"innodb_data_writes":                    561,
						"innodb_data_written":                   6128128,
						"innodb_log_waits":                      0,
						"innodb_log_write_requests":             1062,
						"innodb_log_writes":                     116,
						"innodb_os_log_fsyncs":                  69,
						"innodb_os_log_pending_fsyncs":          0,
						"innodb_os_log_pending_writes":          0,
						"innodb_os_log_written":                 147968,
						"innodb_row_lock_current_waits":         0,
						"innodb_rows_deleted":                   0,
						"innodb_rows_inserted":                  0,
						"innodb_rows_read":                      0,
						"innodb_rows_updated":                   0,
						"key_blocks_not_flushed":                0,
						"key_blocks_unused":                     6698,
						"key_blocks_used":                       0,
						"key_read_requests":                     0,
						"key_reads":                             0,
						"key_write_requests":                    0,
						"key_writes":                            0,
						"max_connections":                       151,
						"max_used_connections":                  2,
						"open_files":                            8,
						"open_tables":                           127,
						"opened_files":                          8,
						"opened_tables":                         208,
						"process_list_fetch_query_duration":     0,
						"process_list_longest_query_duration":   9,
						"process_list_queries_count_system":     0,
						"process_list_queries_count_user":       2,
						"queries":                               27,
						"questions":                             15,
						"seconds_behind_master_master1":         0,
						"seconds_behind_master_master2":         0,
						"select_full_join":                      0,
						"select_full_range_join":                0,
						"select_range":                          0,
						"select_range_check":                    0,
						"select_scan":                           12,
						"slave_io_running_master1":              1,
						"slave_io_running_master2":              1,
						"slave_sql_running_master1":             1,
						"slave_sql_running_master2":             1,
						"slow_queries":                          0,
						"sort_merge_passes":                     0,
						"sort_range":                            0,
						"sort_scan":                             0,
						"table_locks_immediate":                 6,
						"table_locks_waited":                    0,
						"table_open_cache":                      4000,
						"table_open_cache_overflows":            0,
						"thread_cache_misses":                   800,
						"threads_cached":                        1,
						"threads_connected":                     1,
						"threads_created":                       2,
						"threads_running":                       2,
					}

					copyProcessListQueryDuration(mx, expected)
					require.Equal(t, expected, mx)
					ensureCollectedHasAllChartsDimsVarsIDs(t, my, mx)
				},
			},
		},
		"Percona-Standalone[v8.0.29]: success on all queries": {
			{
				prepareMock: func(t *testing.T, m sqlmock.Sqlmock) {
					mockExpect(t, m, queryShowVersion, dataPerconaVer8029Version)
					mockExpect(t, m, queryShowSessionVariables, dataSessionVariables)
					mockExpect(t, m, queryDisableSessionQueryLog, nil)
					mockExpect(t, m, queryDisableSessionSlowQueryLog, nil)
					mockExpect(t, m, queryShowGlobalStatus, dataPerconaVer8029GlobalStatus)
					mockExpect(t, m, queryShowGlobalVariables, dataPerconaVer8029GlobalVariables)
					mockExpect(t, m, queryShowReplicaStatus, nil)
					mockExpect(t, m, queryShowUserStatistics, dataPerconaVer8029UserStatistics)
					mockExpect(t, m, queryShowProcessListPS, dataPerconaV8029ProcessList)
				},
				check: func(t *testing.T, my *MySQL) {
					mx := my.Collect()

					expected := map[string]int64{
						"aborted_connects":                        1,
						"binlog_cache_disk_use":                   0,
						"binlog_cache_use":                        0,
						"binlog_stmt_cache_disk_use":              0,
						"binlog_stmt_cache_use":                   0,
						"bytes_received":                          682970,
						"bytes_sent":                              33668405,
						"com_delete":                              0,
						"com_insert":                              0,
						"com_replace":                             0,
						"com_select":                              1687,
						"com_update":                              0,
						"connection_errors_accept":                0,
						"connection_errors_internal":              0,
						"connection_errors_max_connections":       0,
						"connection_errors_peer_address":          0,
						"connection_errors_select":                0,
						"connection_errors_tcpwrap":               0,
						"connections":                             13,
						"created_tmp_disk_tables":                 1683,
						"created_tmp_files":                       5,
						"created_tmp_tables":                      5054,
						"handler_commit":                          576,
						"handler_delete":                          0,
						"handler_prepare":                         0,
						"handler_read_first":                      1724,
						"handler_read_key":                        3439,
						"handler_read_next":                       4147,
						"handler_read_prev":                       0,
						"handler_read_rnd":                        0,
						"handler_read_rnd_next":                   2983285,
						"handler_rollback":                        0,
						"handler_savepoint":                       0,
						"handler_savepoint_rollback":              0,
						"handler_update":                          317,
						"handler_write":                           906501,
						"innodb_buffer_pool_bytes_data":           18399232,
						"innodb_buffer_pool_bytes_dirty":          49152,
						"innodb_buffer_pool_pages_data":           1123,
						"innodb_buffer_pool_pages_dirty":          3,
						"innodb_buffer_pool_pages_flushed":        205,
						"innodb_buffer_pool_pages_free":           7064,
						"innodb_buffer_pool_pages_misc":           5,
						"innodb_buffer_pool_pages_total":          8192,
						"innodb_buffer_pool_read_ahead":           0,
						"innodb_buffer_pool_read_ahead_evicted":   0,
						"innodb_buffer_pool_read_ahead_rnd":       0,
						"innodb_buffer_pool_read_requests":        109817,
						"innodb_buffer_pool_reads":                978,
						"innodb_buffer_pool_wait_free":            0,
						"innodb_buffer_pool_write_requests":       77412,
						"innodb_data_fsyncs":                      50,
						"innodb_data_pending_fsyncs":              0,
						"innodb_data_pending_reads":               0,
						"innodb_data_pending_writes":              0,
						"innodb_data_read":                        16094208,
						"innodb_data_reads":                       1002,
						"innodb_data_writes":                      288,
						"innodb_data_written":                     3420160,
						"innodb_log_waits":                        0,
						"innodb_log_write_requests":               651,
						"innodb_log_writes":                       47,
						"innodb_os_log_fsyncs":                    13,
						"innodb_os_log_pending_fsyncs":            0,
						"innodb_os_log_pending_writes":            0,
						"innodb_os_log_written":                   45568,
						"innodb_row_lock_current_waits":           0,
						"innodb_rows_deleted":                     0,
						"innodb_rows_inserted":                    5055,
						"innodb_rows_read":                        5055,
						"innodb_rows_updated":                     0,
						"key_blocks_not_flushed":                  0,
						"key_blocks_unused":                       6698,
						"key_blocks_used":                         0,
						"key_read_requests":                       0,
						"key_reads":                               0,
						"key_write_requests":                      0,
						"key_writes":                              0,
						"max_connections":                         151,
						"max_used_connections":                    3,
						"open_files":                              2,
						"open_tables":                             77,
						"opened_files":                            2,
						"opened_tables":                           158,
						"process_list_fetch_query_duration":       0,
						"process_list_longest_query_duration":     9,
						"process_list_queries_count_system":       0,
						"process_list_queries_count_user":         2,
						"queries":                                 6748,
						"questions":                               6746,
						"select_full_join":                        0,
						"select_full_range_join":                  0,
						"select_range":                            0,
						"select_range_check":                      0,
						"select_scan":                             8425,
						"slow_queries":                            0,
						"sort_merge_passes":                       0,
						"sort_range":                              0,
						"sort_scan":                               1681,
						"table_locks_immediate":                   3371,
						"table_locks_waited":                      0,
						"table_open_cache":                        4000,
						"table_open_cache_overflows":              0,
						"thread_cache_misses":                     2307,
						"threads_cached":                          1,
						"threads_connected":                       2,
						"threads_created":                         3,
						"threads_running":                         2,
						"userstats_netdata_access_denied":         0,
						"userstats_netdata_binlog_bytes_written":  0,
						"userstats_netdata_commit_transactions":   0,
						"userstats_netdata_cpu_time":              0,
						"userstats_netdata_denied_connections":    0,
						"userstats_netdata_empty_queries":         0,
						"userstats_netdata_lost_connections":      0,
						"userstats_netdata_other_commands":        1,
						"userstats_netdata_rollback_transactions": 0,
						"userstats_netdata_rows_fetched":          1,
						"userstats_netdata_rows_updated":          0,
						"userstats_netdata_select_commands":       1,
						"userstats_netdata_total_connections":     1,
						"userstats_netdata_update_commands":       0,
						"userstats_root_access_denied":            0,
						"userstats_root_binlog_bytes_written":     0,
						"userstats_root_commit_transactions":      0,
						"userstats_root_cpu_time":                 151,
						"userstats_root_denied_connections":       1,
						"userstats_root_empty_queries":            36,
						"userstats_root_lost_connections":         0,
						"userstats_root_other_commands":           110,
						"userstats_root_rollback_transactions":    0,
						"userstats_root_rows_fetched":             1,
						"userstats_root_rows_updated":             0,
						"userstats_root_select_commands":          37,
						"userstats_root_total_connections":        2,
						"userstats_root_update_commands":          0,
					}

					copyProcessListQueryDuration(mx, expected)
					require.Equal(t, expected, mx)
					ensureCollectedHasAllChartsDimsVarsIDs(t, my, mx)
				},
			},
		},
	}

	for name, test := range tests {
		t.Run(name, func(t *testing.T) {
			db, mock, err := sqlmock.New(
				sqlmock.QueryMatcherOption(sqlmock.QueryMatcherEqual),
			)
			require.NoError(t, err)
			my := New()
			my.db = db
			defer func() { _ = db.Close() }()

			require.NoError(t, my.Init())

			for i, step := range test {
				t.Run(fmt.Sprintf("step[%d]", i), func(t *testing.T) {
					step.prepareMock(t, mock)
					step.check(t, my)
				})
			}
			assert.NoError(t, mock.ExpectationsWereMet())
		})
	}
}

func ensureCollectedHasAllChartsDimsVarsIDs(t *testing.T, mySQL *MySQL, collected map[string]int64) {
	for _, chart := range *mySQL.Charts() {
		if mySQL.isMariaDB {
			// https://mariadb.com/kb/en/server-status-variables/#connection_errors_accept
			if mySQL.version.LT(semver.Version{Major: 10, Minor: 0, Patch: 4}) && chart.ID == "connection_errors" {
				continue
			}
		}
		for _, dim := range chart.Dims {
			_, ok := collected[dim.ID]
			assert.Truef(t, ok, "collected metrics has no data for dim '%s' chart '%s'", dim.ID, chart.ID)
		}
		for _, v := range chart.Vars {
			_, ok := collected[v.ID]
			assert.Truef(t, ok, "collected metrics has no data for var '%s' chart '%s'", v.ID, chart.ID)
		}
	}
}

func copyProcessListQueryDuration(dst, src map[string]int64) {
	if _, ok := dst["process_list_fetch_query_duration"]; !ok {
		return
	}
	if _, ok := src["process_list_fetch_query_duration"]; !ok {
		return
	}
	dst["process_list_fetch_query_duration"] = src["process_list_fetch_query_duration"]
}

func mustMockRows(t *testing.T, data []byte) *sqlmock.Rows {
	rows, err := prepareMockRows(data)
	require.NoError(t, err)
	return rows
}

func mockExpect(t *testing.T, mock sqlmock.Sqlmock, query string, rows []byte) {
	mock.ExpectQuery(query).WillReturnRows(mustMockRows(t, rows)).RowsWillBeClosed()
}

func mockExpectErr(mock sqlmock.Sqlmock, query string) {
	mock.ExpectQuery(query).WillReturnError(fmt.Errorf("mock error (%s)", query))
}

func prepareMockRows(data []byte) (*sqlmock.Rows, error) {
	if len(data) == 0 {
		return sqlmock.NewRows(nil), nil
	}

	r := bytes.NewReader(data)
	sc := bufio.NewScanner(r)

	var numColumns int
	var rows *sqlmock.Rows

	for sc.Scan() {
		s := strings.TrimSpace(strings.Trim(sc.Text(), "|"))
		switch {
		case s == "",
			strings.HasPrefix(s, "+"),
			strings.HasPrefix(s, "ft_boolean_syntax"):
			continue
		}

		parts := strings.Split(s, "|")
		for i, v := range parts {
			parts[i] = strings.TrimSpace(v)
		}

		if rows == nil {
			numColumns = len(parts)
			rows = sqlmock.NewRows(parts)
			continue
		}

		if len(parts) != numColumns {
			return nil, fmt.Errorf("prepareMockRows(): columns != values (%d/%d)", numColumns, len(parts))
		}

		values := make([]driver.Value, len(parts))
		for i, v := range parts {
			values[i] = v
		}
		rows.AddRow(values...)
	}

	if rows == nil {
		return nil, errors.New("prepareMockRows(): nil rows result")
	}

	return rows, sc.Err()
}