################################################################################
# This test proves credential for recovery can be passed via START GR command.
#
# Test:
# 0. The test requires two servers: M1 and M2.
# 1. Bootstrap M1. And create new users.
# 2. Reset recovery interval to 1 and count to 2 for M2.
# 3. Test START GR works without any option.
# 4. Delete recovery channel and test START GR, it should fail.
# 5. Pass USER as root and test START GR, member should come ONLINE.
#    START GR without parameter fails, credentials are removed on STOP.
# 6. Test wrong credentials do not connect with master.
# 7. Test right credentials in START GR connect with master.
# 8. Cleanup.
################################################################################

--source include/big_test.inc
--source include/have_group_replication_plugin.inc
--let $rpl_skip_group_replication_start= 1
--source include/group_replication.inc

--echo
--echo # 1. Bootstrap M1. And create new users.

--let $rpl_connection_name= server1
--source include/rpl_connection.inc

--source include/start_and_bootstrap_group_replication.inc

SET SQL_LOG_BIN=0;

CREATE USER 'regular_user_p' IDENTIFIED BY 'password';
CREATE USER 'regular_user_wp' IDENTIFIED BY '';

GRANT REPLICATION SLAVE ON *.* TO "regular_user_p";
GRANT REPLICATION SLAVE ON *.* TO "regular_user_wp";

SET SQL_LOG_BIN=1;

--echo
--echo # 2. Reset recovery interval to 1 and count to 2 for M2.

--let $rpl_connection_name= server2
--source include/rpl_connection.inc

SET @saved_group_replication_recovery_reconnect_interval = @@GLOBAL.group_replication_recovery_reconnect_interval;
SET @saved_gr_recovery_retry_count = @@GLOBAL.group_replication_recovery_retry_count;

SET GLOBAL group_replication_recovery_reconnect_interval= 1;
SET GLOBAL group_replication_recovery_retry_count= 2;
--replace_result $group_replication_group_name GROUP_REPLICATION_GROUP_NAME
--eval SET GLOBAL group_replication_group_name= "$group_replication_group_name"

--echo
--echo # 3. Test START GR works without any option.

--source include/start_group_replication.inc
--source include/stop_group_replication.inc

--echo
--echo # 4. Delete recovery channel and test START GR, it should fail.

RESET SLAVE ALL FOR CHANNEL 'group_replication_recovery';
START GROUP_REPLICATION;
--let $group_replication_member_state = ERROR
--source include/gr_wait_for_member_state.inc
--source include/stop_group_replication.inc

--echo
--echo # 5. Pass USER as root and test START GR, member should come ONLINE.
--echo #    START GR without parameter fails, credentials are removed on STOP.

START GROUP_REPLICATION USER='root';
--let $group_replication_member_state = ONLINE
--source include/gr_wait_for_member_state.inc
--source include/stop_group_replication.inc

START GROUP_REPLICATION;
--let $group_replication_member_state = ERROR
--source include/gr_wait_for_member_state.inc
--source include/stop_group_replication.inc

--echo
--echo # 6. Test wrong credentials do not connect with master.

START GROUP_REPLICATION USER='regular_user_p',PASSWORD='wrong';
--let $group_replication_member_state = ERROR
--source include/gr_wait_for_member_state.inc
--source include/stop_group_replication.inc

START GROUP_REPLICATION USER='regular_user_p';
--let $group_replication_member_state = ERROR
--source include/gr_wait_for_member_state.inc
--source include/stop_group_replication.inc

START GROUP_REPLICATION USER='regular_user_p' , PASSWORD='password' , DEFAULT_AUTH='wrong_auth';
--let $group_replication_member_state = ERROR
--source include/gr_wait_for_member_state.inc
--source include/stop_group_replication.inc

START GROUP_REPLICATION USER='regular_user_wp' ,  PASSWORD='password';
--let $group_replication_member_state = ERROR
--source include/gr_wait_for_member_state.inc
--source include/stop_group_replication.inc

--echo
--echo # 7. Test right credentials in START GR connect with master.

START GROUP_REPLICATION USER='regular_user_p' , PASSWORD='password';
--let $group_replication_member_state = ONLINE
--source include/gr_wait_for_member_state.inc
--source include/stop_group_replication.inc

START GROUP_REPLICATION USER='regular_user_p' , PASSWORD='password' , DEFAULT_AUTH= 'auth_test_plugin';
--let $group_replication_member_state = ONLINE
--source include/gr_wait_for_member_state.inc
--source include/stop_group_replication.inc

START GROUP_REPLICATION PASSWORD='password' , USER='regular_user_p', DEFAULT_AUTH='auth_test_plugin';
--let $group_replication_member_state = ONLINE
--source include/gr_wait_for_member_state.inc
--source include/stop_group_replication.inc

START GROUP_REPLICATION USER='regular_user_p' , DEFAULT_AUTH= '' , PASSWORD='password';
--let $group_replication_member_state = ONLINE
--source include/gr_wait_for_member_state.inc
--source include/stop_group_replication.inc

START GROUP_REPLICATION USER='regular_user_wp';
--let $group_replication_member_state = ONLINE
--source include/gr_wait_for_member_state.inc
--source include/stop_group_replication.inc

START GROUP_REPLICATION USER='regular_user_wp' , PASSWORD='';
--let $group_replication_member_state = ONLINE
--source include/gr_wait_for_member_state.inc
--source include/stop_group_replication.inc

--echo
--echo # 8. Cleanup.

CHANGE REPLICATION SOURCE TO SOURCE_USER='root' , SOURCE_PASSWORD='' FOR CHANNEL 'group_replication_recovery';

SET SESSION sql_log_bin = 0;
call mtr.add_suppression("Slave I/O for channel 'group_replication_recovery': Fatal error: Invalid .* username when attempting to connect to the master server.*");
call mtr.add_suppression("There was an error when connecting to the donor server. Please check that group_replication_recovery channel credentials and all MEMBER_HOST column values of performance_schema.replication_group_members table are correct and DNS resolvable.");
call mtr.add_suppression("For details please check performance_schema.replication_connection_status table and error log messages of Slave I/O for channel group_replication_recovery.");
call mtr.add_suppression("Maximum number of retries when trying to connect to a donor reached. Aborting group replication incremental recovery.");
call mtr.add_suppression("Fatal error during the incremental recovery process of Group Replication. The server will leave the group.");
call mtr.add_suppression("The server was automatically set into read only mode after an error was detected.");
call mtr.add_suppression("Skipping leave operation: concurrent attempt to leave the group is on-going.");
call mtr.add_suppression("The server was automatically set into read only mode after an error was detected.");
SET SESSION sql_log_bin = 1;

SET @@GLOBAL.group_replication_recovery_reconnect_interval = @saved_group_replication_recovery_reconnect_interval;
SET @@GLOBAL.group_replication_recovery_retry_count = @saved_gr_recovery_retry_count;

--let $rpl_connection_name= server1
--source include/rpl_connection.inc

SET SQL_LOG_BIN=0;

DROP USER 'regular_user_p';
DROP USER 'regular_user_wp';

SET SQL_LOG_BIN=1;

--source include/group_replication_end.inc
