# test code for the mysql_variables module
# (c) 2014,  Wayne Rosario <wrosario@ansible.com>

# This file is part of Ansible
#
# Ansible is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# Ansible is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Ansible.  If not, see <http://www.gnu.org/licenses/>.

# ============================================================
# Verify mysql_variable successfully queries a variable
#
- set_fact: set_name='version'

- name: read mysql variables (expect changed=false)
  mysql_variables: variable={{set_name}}
  register: result

- include: assert_var_output.yml changed=false output={{result}} var_name={{set_name}}

# ============================================================
# Verify mysql_variable successfully updates a variable (issue:4568)
#
- set_fact:
     set_name: 'delay_key_write'
     set_value: 'ON'

- name: set mysql variable
  mysql_variables: variable={{set_name}} value={{set_value}}

- name: update mysql variable to same value (expect changed=false)
  mysql_variables: variable={{set_name}} value={{set_value}}
  register: result

- include: assert_var.yml changed=false output={{result}} var_name={{set_name}} var_value={{set_value}}

# ============================================================
# Verify mysql_variable successfully updates a variable using single quotes
#
- set_fact:
     set_name: 'wait_timeout'
     set_value: '300'

- name: set mysql variable to a temp value
  mysql_variables: variable={{set_name}} value='200'

- name: update mysql variable value (expect changed=true)
  mysql_variables: variable={{set_name}} value={{set_value}}
  register: result

- include: assert_var.yml changed=true output={{result}} var_name={{set_name}} var_value='{{set_value}}'

# ============================================================
# Verify mysql_variable successfully updates a variable using double quotes
#
- set_fact:
     set_name: "wait_timeout"
     set_value: "400"

- name: set mysql variable to a temp value
  mysql_variables: variable={{set_name}} value="200"

- name: update mysql variable value (expect changed=true)
  mysql_variables: variable={{set_name}} value={{set_value}}
  register: result

- include: assert_var.yml changed=true output={{result}} var_name={{set_name}} var_value='{{set_value}}'

# ============================================================
# Verify mysql_variable successfully updates a variable using no quotes
#
- set_fact:
     set_name: wait_timeout
     set_value: 500

- name: set mysql variable to a temp value
  mysql_variables: variable={{set_name}} value=200

- name: update mysql variable value (expect changed=true)
  mysql_variables: variable={{set_name}} value={{set_value}}
  register: result

- include: assert_var.yml changed=true output={{result}} var_name={{set_name}} var_value='{{set_value}}'

# ============================================================
# Verify mysql_variable successfully updates a variable using an expression (e.g. 1024*4)
#
- name: set mysql variable value to an expression
  mysql_variables: variable=max_tmp_tables value="1024*4"
  register: result
  ignore_errors: true

- include: assert_fail_msg.yml output={{result}}  msg='Incorrect argument type to variable'

# ============================================================
# Verify mysql_variable fails when setting an incorrect value (out of range)
#
- name: set mysql variable value to a number out of range
  mysql_variables: variable=max_tmp_tables value=-1
  register: result
  ignore_errors: true

- include: assert_fail_msg.yml output={{result}}  msg='Truncated incorrect'

# ============================================================
# Verify mysql_variable fails when setting an incorrect value (incorrect type)
#
- name: set mysql variable value to a non-valid value number
  mysql_variables: variable=max_tmp_tables value=TEST
  register: result
  ignore_errors: true

- include: assert_fail_msg.yml output={{result}}  msg='Incorrect argument type to variable'

# ============================================================
# Verify mysql_variable fails when setting an unknown variable
#
- name: set a non mysql variable
  mysql_variables: variable=my_sql_variable value=ON
  register: result
  ignore_errors: true

- include: assert_fail_msg.yml output={{result}}  msg='Variable not available'

# ============================================================
# Verify mysql_variable fails when setting a read-only variable
# 
- name: set value of a read only mysql variable
  mysql_variables: variable=character_set_system value=utf16
  register: result
  ignore_errors: true

- include: assert_fail_msg.yml output={{result}}  msg='read only variable'

#=============================================================
# Verify mysql_variable works with the login_user and login_password parameters
#
- name: create mysql user
  mysql_user: name={{user}} password={{password}} state=present priv=*.*:ALL

- set_fact:
     set_name: wait_timeout
     set_value: 77

- name: query mysql_variable using login_user and password_password
  mysql_variables: variable={{set_name}} login_user={{user}} login_password={{password}}
  register: result

- include: assert_var_output.yml changed=false output={{result}} var_name={{set_name}}

- name: set mysql variable to temp value using user login and password (expect changed=true)
  mysql_variables: variable={{set_name}} value=20 login_user={{user}} login_password={{password}}
  register: result

- name: update mysql variable value using user login and password (expect changed=true)
  mysql_variables: variable={{set_name}} value={{set_value}} login_user={{user}} login_password={{password}}
  register: result

- include: assert_var.yml changed=true output={{result}} var_name={{set_name}} var_value='{{set_value}}'

#============================================================
# Verify mysql_variable fails with an incorrect login_password parameter
#
- set_fact:
     set_name: connect_timeout
     set_value: 10

- name: query mysql_variable using incorrect login_password
  mysql_variables: variable={{set_name}} login_user={{user}} login_password=wrongpassword
  register: result
  ignore_errors: true

- include: assert_fail_msg.yml output={{result}}  msg='unable to connect to database'

- name: update mysql variable value using incorrect login_password (expect failed=true)
  mysql_variables: variable={{set_name}} value={{set_value}} login_user={{user}} login_password='this is an incorrect password'
  register: result
  ignore_errors: true

- include: assert_fail_msg.yml output={{result}}  msg='unable to connect to database'

- name: remove mysql_user {{user}}
  mysql_user: name={{user}} state=absent

#============================================================
# Verify mysql_variable fails with an incorrect login_host parameter
#
- name: query mysql_variable using incorrect login_host
  mysql_variables: variable=wait_timeout login_host=12.0.0.9 connect_timeout=5
  register: result
  ignore_errors: true

- include: assert_fail_msg.yml output={{result}}  msg='unable to connect to database'