---
- name: fail with incorrect DSC resource name
  win_dsc:
    resource_name: FakeResource
  register: fail_invalid_resource
  failed_when: fail_invalid_resource.msg != "Resource 'FakeResource' not found."

- name: fail with invalid DSC version
  win_dsc:
    resource_name: xTestResource
    module_version: 0.0.1
  register: fail_invalid_version
  failed_when: 'fail_invalid_version.msg != "Resource ''xTestResource'' with version ''0.0.1'' not found. Versions installed: ''1.0.0'', ''1.0.1''."'

- name: fail with mandatory option not set
  win_dsc:
    resource_name: xSetReboot
    Value: yes
  register: fail_man_key
  failed_when: 'fail_man_key.msg != "missing required arguments: KeyParam"'

- name: fail with mandatory option not set in sub dict
  win_dsc:
    resource_name: xTestResource
    Path: C:\path
    Ensure: Present
    CimInstanceParam:  # Missing KeyValue in dict
      Choice: Choice1
  register: fail_man_key_sub_dict
  failed_when: 'fail_man_key_sub_dict.msg != "missing required arguments: KeyValue found in CimInstanceParam"'

- name: fail invalid option
  win_dsc:
    resource_name: xSetReboot
    KeyParam: key
    OtherParam: invalid
  register: fail_invalid_option
  failed_when: 'fail_invalid_option.msg != "Unsupported parameters for (win_dsc) module: OtherParam. Supported parameters include: KeyParam, PsDscRunAsCredential_username, module_version, Value, PsDscRunAsCredential_password, resource_name, DependsOn"'

- name: fail invalid option in sub dict
  win_dsc:
    resource_name: xTestResource
    Path: C:\path
    Ensure: Present
    NestedCimInstanceParam:
      KeyValue: key
      CimValue:
        KeyValue: other key
        InvalidKey: invalid
  register: fail_invalid_option_sub_dict
  failed_when: 'fail_invalid_option_sub_dict.msg != "Unsupported parameters for (win_dsc) module: InvalidKey found in NestedCimInstanceParam -> CimValue. Supported parameters include: IntValue, KeyValue, StringArrayValue, Choice, StringValue"'

- name: fail invalid read only option
  win_dsc:
    resource_name: xTestResource
    Path: C:\path
    Ensure: Present
    ReadParam: abc
  register: fail_invalid_option_read_only
  failed_when: '"Unsupported parameters for (win_dsc) module: ReadParam" not in fail_invalid_option_read_only.msg'

- name: fail invalid choice
  win_dsc:
    resource_name: xTestResource
    Path: C:\path
    Ensure: invalid
  register: fail_invalid_choice
  failed_when: 'fail_invalid_choice.msg != "value of Ensure must be one of: Present, Absent. Got no match for: invalid"'

- name: fail invalid choice in sub dict
  win_dsc:
    resource_name: xTestResource
    Path: C:\path
    Ensure: Present
    CimInstanceArrayParam:
    - KeyValue: key
    - KeyValue: key2
      Choice: Choice3
  register: fail_invalid_choice_sub_dict
  failed_when: 'fail_invalid_choice_sub_dict.msg != "value of Choice must be one of: Choice1, Choice2. Got no match for: Choice3 found in CimInstanceArrayParam"'

- name: fail old version missing new option
  win_dsc:
    resource_name: xTestResource
    module_version: 1.0.0
    Path: C:\path
    Ensure: Present
    CimInstanceParam:  # CimInstanceParam does not exist in the 1.0.0 version
      Key: key
  register: fail_invalid_option_old
  failed_when: '"Unsupported parameters for (win_dsc) module: CimInstanceParam" not in fail_invalid_option_old.msg'

- name: fail old version missing new option sub dict
  win_dsc:
    resource_name: xTestResource
    module_version: 1.0.0
    Path: C:\path
    Ensure: Present
    CimInstanceArrayParam:
    - Key: key
      Choice: Choice1
  register: fail_invalid_option_old_sub_dict
  failed_when: 'fail_invalid_option_old_sub_dict.msg != "Unsupported parameters for (win_dsc) module: Choice found in CimInstanceArrayParam. Supported parameters include: Key, IntValue, StringArrayValue, StringValue"'

- name: create test file (check mode)
  win_dsc:
    resource_name: File
    DestinationPath: '{{ remote_tmp_dir }}\dsc-file'
    Contents: file contents
    Attributes:
    - Hidden
    - ReadOnly
    Ensure: Present
    Type: File
  register: create_file_check
  check_mode: yes

- name: get result of create test file (check mode)
  win_stat:
    path: '{{ remote_tmp_dir }}\dsc-file'
  register: create_file_actual_check

- name: assert create test file (check mode)
  assert:
    that:
    - create_file_check is changed
    - create_file_check.module_version == None  # Some built in modules don't have a version set
    - not create_file_check.reboot_required
    - not create_file_actual_check.stat.exists

- name: assert create test file verbosity (check mode)
  assert:
    that:
    - create_file_check.verbose_test is defined
    - not create_file_check.verbose_set is defined
  when: ansible_verbosity >= 3

- name: create test file
  win_dsc:
    resource_name: File
    DestinationPath: '{{ remote_tmp_dir }}\dsc-file'
    Contents: file contents
    Attributes:
    - Hidden
    - ReadOnly
    Ensure: Present
    Type: File
  register: create_file

- name: get result of create test file
  win_stat:
    path: '{{ remote_tmp_dir }}\dsc-file'
  register: create_file_actual

- name: assert create test file verbosity
  assert:
    that:
    - create_file.verbose_test is defined
    - create_file.verbose_set is defined
  when: ansible_verbosity >= 3

- name: assert create test file
  assert:
    that:
    - create_file is changed
    - create_file.module_version == None
    - not create_file.reboot_required
    - create_file_actual.stat.exists
    - create_file_actual.stat.attributes == "ReadOnly, Hidden, Archive"
    - create_file_actual.stat.checksum == 'd48daab51112b49ecabd917adc345b8ba257055e'

- name: create test file (idempotent)
  win_dsc:
    resource_name: File
    DestinationPath: '{{ remote_tmp_dir }}\dsc-file'
    Contents: file contents
    Attributes:
    - Hidden
    - ReadOnly
    Ensure: Present
    Type: File
  register: create_file_again

- name: assert create test file (idempotent)
  assert:
    that:
    - not create_file_again is changed
    - create_file.module_version == None
    - not create_file.reboot_required

- name: get SID of the current Ansible user
  win_shell: |
    Add-Type -AssemblyName System.DirectoryServices.AccountManagement
    [System.DirectoryServices.AccountManagement.UserPrincipal]::Current.Sid.Value
  register: actual_sid

- name: run DSC process as another user
  win_dsc:
    resource_name: Script
    GetScript: '@{ Result= "" }'
    SetScript: |
      Add-Type -AssemblyName System.DirectoryServices.AccountManagement
      $sid = [System.DirectoryServices.AccountManagement.UserPrincipal]::Current.Sid.Value
      Set-Content -Path "{{ remote_tmp_dir }}\runas.txt" -Value $sid
    TestScript: $false
    PsDscRunAsCredential_username: '{{ ansible_user }}'
    PsDscRunAsCredential_password: '{{ ansible_password }}'
  register: runas_user

- name: get result of run DSC process as another user
  slurp:
    path: '{{ remote_tmp_dir }}\runas.txt'
  register: runas_user_result

- name: assert run DSC process as another user
  assert:
    that:
    - runas_user is changed
    - runas_user.module_version != None  # Can't reliably set the version but we can test it is set
    - not runas_user.reboot_required
    - runas_user_result.content|b64decode == actual_sid.stdout

- name: run DSC that sets reboot_required with defaults
  win_dsc:
    resource_name: xSetReboot
    KeyParam: value  # Just to satisfy the Resource with key validation
  register: set_reboot_defaults

- name: assert run DSC that sets reboot_required with defaults
  assert:
    that:
    - set_reboot_defaults.reboot_required

- name: run DSC that sets reboot_required with False
  win_dsc:
    resource_name: xSetReboot
    KeyParam: value
    Value: no
  register: set_reboot_false

- name: assert run DSC that sets reboot_required with False
  assert:
    that:
    - not set_reboot_false.reboot_required

- name: run DSC that sets reboot_required with True
  win_dsc:
    resource_name: xSetReboot
    KeyParam: value
    Value: yes
  register: set_reboot_true

- name: assert run DSC that sets reboot_required with True
  assert:
    that:
    - set_reboot_true.reboot_required

- name: test DSC with all types
  win_dsc:
    resource_name: xTestResource
    Path: '{{ remote_tmp_dir }}\test-types.json'
    Ensure: Present
    StringParam: string param
    StringArrayParam:
    - string 1
    - string 2
    Int8Param: 127  # [SByte]::MaxValue
    Int8ArrayParam:
    - 127
    - '127'
    UInt8Param: 255  # [Byte]::MaxValue
    UInt8ArrayParam:
    - 255
    - '255'
    Int16Param: 32767  # [Int16]::MaxValue
    Int16ArrayParam: 32767, 32767
    UInt16Param: '65535'  # [UInt16]::MaxValue
    UInt16ArrayParam: 65535
    Int32Param: 2147483647  # [Int32]::MaxValue
    Int32ArrayParam: '2147483647'
    UInt32Param: '4294967295'  # [UInt32]::MaxValue
    UInt32ArrayParam:
    - '4294967295'
    - 4294967295
    Int64Param: 9223372036854775807  # [Int64]::MaxValue
    Int64ArrayParam:
    - -9223372036854775808  # [Int64]::MinValue
    - 9223372036854775807
    UInt64Param: 18446744073709551615  # [UInt64]::MaxValue
    UInt64ArrayParam:
    - 0  # [UInt64]::MinValue
    - 18446744073709551615
    BooleanParam: True
    BooleanArrayParam:
    - True
    - 'True'
    - 'true'
    - 'y'
    - 'yes'
    - 1
    - False
    - 'False'
    - 'false'
    - 'n'
    - 'no'
    - 0
    CharParam: c
    CharArrayParam:
    - c
    - h
    - a
    - r
    SingleParam: 3.402823E+38
    SingleArrayParam:
    - '3.402823E+38'
    - 1.2393494
    DoubleParam: 1.79769313486232E+300
    DoubleArrayParam:
    - '1.79769313486232E+300'
    - 3.56821831681516
    DateTimeParam: '2019-02-22T13:57:31.2311892-04:00'
    DateTimeArrayParam:
    - '2019-02-22T13:57:31.2311892+00:00'
    - '2019-02-22T13:57:31.2311892+04:00'
    PSCredentialParam_username: username1
    PSCredentialParam_password: password1
    HashtableParam:
      key1: string 1
      key2: ''
      key3: 1
    CimInstanceParam:
      KeyValue: a
    CimInstanceArrayParam:
    - KeyValue: b
      Choice: Choice1
      StringValue: string 1
      IntValue: 1
      StringArrayValue:
      - abc
      - def
    - KeyValue: c
      Choice: Choice2
      StringValue: string 2
      IntValue: '2'
      StringArrayValue:
      - ghi
      - jkl
    NestedCimInstanceParam:
      KeyValue: key value
      CimValue:
        KeyValue: d
      CimArrayValue:
      - KeyValue: e
        Choice: Choice2
      HashValue:
        a: a
      IntValue: '300'
  register: dsc_types

- name: get result of test DSC with all types
  slurp:
    path: '{{ remote_tmp_dir }}\test-types.json'
  register: dsc_types_raw

- name: convert result of test DSC with all types to dict
  set_fact:
    dsc_types_actual: '{{ dsc_types_raw.content | b64decode | from_json }}'

- name: assert test DSC with all types
  assert:
    that:
    - dsc_types is changed
    - dsc_types.module_version == '1.0.1'
    - not dsc_types.reboot_required
    - dsc_types_actual.Version == '1.0.1'
    - dsc_types_actual.Verbose.Value.IsPresent
    - dsc_types_actual.DefaultParam.Value == 'Default'  # ensures that the default is set in the engine if we don't set it outselves
    - dsc_types_actual.Ensure.Value == 'Present'
    - dsc_types_actual.Path.Value == remote_tmp_dir + "\\test-types.json"
    - dsc_types_actual.StringParam.Type == 'System.String'
    - dsc_types_actual.StringParam.Value == 'string param'
    - dsc_types_actual.StringArrayParam.Type == 'System.String[]'
    - dsc_types_actual.StringArrayParam.Value == ['string 1', 'string 2']
    - dsc_types_actual.Int8Param.Type == 'System.SByte'
    - dsc_types_actual.Int8Param.Value == 127
    - dsc_types_actual.Int8ArrayParam.Type == 'System.SByte[]'
    - dsc_types_actual.Int8ArrayParam.Value == [127, 127]
    - dsc_types_actual.UInt8Param.Type == 'System.Byte'
    - dsc_types_actual.UInt8Param.Value == 255
    - dsc_types_actual.UInt8ArrayParam.Type == 'System.Byte[]'
    - dsc_types_actual.UInt8ArrayParam.Value == [255, 255]
    - dsc_types_actual.Int16Param.Type == 'System.Int16'
    - dsc_types_actual.Int16Param.Value == 32767
    - dsc_types_actual.Int16ArrayParam.Type == 'System.Int16[]'
    - dsc_types_actual.Int16ArrayParam.Value == [32767, 32767]
    - dsc_types_actual.UInt16Param.Type == 'System.UInt16'
    - dsc_types_actual.UInt16Param.Value == 65535
    - dsc_types_actual.UInt16ArrayParam.Type == 'System.UInt16[]'
    - dsc_types_actual.UInt16ArrayParam.Value == [65535]
    - dsc_types_actual.Int32Param.Type == 'System.Int32'
    - dsc_types_actual.Int32Param.Value == 2147483647
    - dsc_types_actual.Int32ArrayParam.Type == 'System.Int32[]'
    - dsc_types_actual.Int32ArrayParam.Value == [2147483647]
    - dsc_types_actual.UInt32Param.Type == 'System.UInt32'
    - dsc_types_actual.UInt32Param.Value == 4294967295
    - dsc_types_actual.UInt32ArrayParam.Type == 'System.UInt32[]'
    - dsc_types_actual.UInt32ArrayParam.Value == [4294967295, 4294967295]
    - dsc_types_actual.Int64Param.Type == 'System.Int64'
    - dsc_types_actual.Int64Param.Value == 9223372036854775807
    - dsc_types_actual.Int64ArrayParam.Type == 'System.Int64[]'
    - dsc_types_actual.Int64ArrayParam.Value == [-9223372036854775808, 9223372036854775807]
    - dsc_types_actual.UInt64Param.Type == 'System.UInt64'
    - dsc_types_actual.UInt64Param.Value == 18446744073709551615
    - dsc_types_actual.UInt64ArrayParam.Type == 'System.UInt64[]'
    - dsc_types_actual.UInt64ArrayParam.Value == [0, 18446744073709551615]
    - dsc_types_actual.BooleanParam.Type == 'System.Boolean'
    - dsc_types_actual.BooleanParam.Value == True
    - dsc_types_actual.BooleanArrayParam.Type == 'System.Boolean[]'
    - dsc_types_actual.BooleanArrayParam.Value == [True, True, True, True, True, True, False, False, False, False, False, False]
    - dsc_types_actual.CharParam.Type == 'System.Char'
    - dsc_types_actual.CharParam.Value == 'c'
    - dsc_types_actual.CharArrayParam.Type == 'System.Char[]'
    - dsc_types_actual.CharArrayParam.Value == ['c', 'h', 'a', 'r']
    - dsc_types_actual.SingleParam.Type == 'System.Single'
    - dsc_types_actual.SingleParam.Value|string == '3.402823e+38'
    - dsc_types_actual.SingleArrayParam.Type == 'System.Single[]'
    - dsc_types_actual.SingleArrayParam.Value|length == 2
    - dsc_types_actual.SingleArrayParam.Value[0]|string == '3.402823e+38'
    - dsc_types_actual.SingleArrayParam.Value[1]|string == '1.23934937'
    - dsc_types_actual.DoubleParam.Type == 'System.Double'
    - dsc_types_actual.DoubleParam.Value == '1.79769313486232E+300'
    - dsc_types_actual.DoubleArrayParam.Type == 'System.Double[]'
    - dsc_types_actual.DoubleArrayParam.Value|length == 2
    - dsc_types_actual.DoubleArrayParam.Value[0] == '1.79769313486232E+300'
    - dsc_types_actual.DoubleArrayParam.Value[1] == '3.56821831681516'
    - dsc_types_actual.DateTimeParam.Type == 'System.DateTime'
    - dsc_types_actual.DateTimeParam.Value == '2019-02-22T17:57:31.2311890+00:00'
    - dsc_types_actual.DateTimeArrayParam.Type == 'System.DateTime[]'
    - dsc_types_actual.DateTimeArrayParam.Value == ['2019-02-22T13:57:31.2311890+00:00', '2019-02-22T09:57:31.2311890+00:00']
    - dsc_types_actual.PSCredentialParam.Type == 'System.Management.Automation.PSCredential'
    - dsc_types_actual.PSCredentialParam.Value.username == 'username1'
    - dsc_types_actual.PSCredentialParam.Value.password == 'password1'
    # Hashtable is actually a CimInstance[] of MSFT_KeyValuePairs
    - dsc_types_actual.HashtableParam.Type == 'Microsoft.Management.Infrastructure.CimInstance[]'
    - dsc_types_actual.HashtableParam.Value|length == 3
    # Can't guarantee the order of the keys so just check they are the values they could be
    - dsc_types_actual.HashtableParam.Value[0].Key in ["key1", "key2", "key3"]
    - dsc_types_actual.HashtableParam.Value[0].Value in ["string 1", "1", ""]
    - dsc_types_actual.HashtableParam.Value[0]._cim_instance == 'MSFT_KeyValuePair'
    - dsc_types_actual.HashtableParam.Value[1].Key in ["key1", "key2", "key3"]
    - dsc_types_actual.HashtableParam.Value[1].Value in ["string 1", "1", ""]
    - dsc_types_actual.HashtableParam.Value[1]._cim_instance == 'MSFT_KeyValuePair'
    - dsc_types_actual.HashtableParam.Value[2].Key in ["key1", "key2", "key3"]
    - dsc_types_actual.HashtableParam.Value[2].Value in ["string 1", "1", ""]
    - dsc_types_actual.HashtableParam.Value[2]._cim_instance == 'MSFT_KeyValuePair'
    - dsc_types_actual.CimInstanceParam.Type == 'Microsoft.Management.Infrastructure.CimInstance'
    - dsc_types_actual.CimInstanceParam.Value.Choice == None
    - dsc_types_actual.CimInstanceParam.Value.IntValue == None
    - dsc_types_actual.CimInstanceParam.Value.KeyValue == 'a'
    - dsc_types_actual.CimInstanceParam.Value.StringArrayValue == None
    - dsc_types_actual.CimInstanceParam.Value.StringValue == None
    - dsc_types_actual.CimInstanceParam.Value._cim_instance == "ANSIBLE_xTestClass"
    - dsc_types_actual.CimInstanceArrayParam.Type == 'Microsoft.Management.Infrastructure.CimInstance[]'
    - dsc_types_actual.CimInstanceArrayParam.Value|length == 2
    - dsc_types_actual.CimInstanceArrayParam.Value[0].Choice == 'Choice1'
    - dsc_types_actual.CimInstanceArrayParam.Value[0].IntValue == 1
    - dsc_types_actual.CimInstanceArrayParam.Value[0].KeyValue == 'b'
    - dsc_types_actual.CimInstanceArrayParam.Value[0].StringArrayValue == ['abc', 'def']
    - dsc_types_actual.CimInstanceArrayParam.Value[0].StringValue == 'string 1'
    - dsc_types_actual.CimInstanceArrayParam.Value[0]._cim_instance == 'ANSIBLE_xTestClass'
    - dsc_types_actual.CimInstanceArrayParam.Value[1].Choice == 'Choice2'
    - dsc_types_actual.CimInstanceArrayParam.Value[1].IntValue == 2
    - dsc_types_actual.CimInstanceArrayParam.Value[1].KeyValue == 'c'
    - dsc_types_actual.CimInstanceArrayParam.Value[1].StringArrayValue == ['ghi', 'jkl']
    - dsc_types_actual.CimInstanceArrayParam.Value[1].StringValue == 'string 2'
    - dsc_types_actual.CimInstanceArrayParam.Value[1]._cim_instance == 'ANSIBLE_xTestClass'
    - dsc_types_actual.NestedCimInstanceParam.Type == 'Microsoft.Management.Infrastructure.CimInstance'
    - dsc_types_actual.NestedCimInstanceParam.Value.CimArrayValue|length == 1
    - dsc_types_actual.NestedCimInstanceParam.Value.CimArrayValue[0].Choice == 'Choice2'
    - dsc_types_actual.NestedCimInstanceParam.Value.CimArrayValue[0].IntValue == None
    - dsc_types_actual.NestedCimInstanceParam.Value.CimArrayValue[0].KeyValue == 'e'
    - dsc_types_actual.NestedCimInstanceParam.Value.CimArrayValue[0].StringArrayValue == None
    - dsc_types_actual.NestedCimInstanceParam.Value.CimArrayValue[0].StringValue == None
    - dsc_types_actual.NestedCimInstanceParam.Value.CimArrayValue[0]._cim_instance == 'ANSIBLE_xTestClass'
    - dsc_types_actual.NestedCimInstanceParam.Value.CimValue.Choice == None
    - dsc_types_actual.NestedCimInstanceParam.Value.CimValue.IntValue == None
    - dsc_types_actual.NestedCimInstanceParam.Value.CimValue.KeyValue == 'd'
    - dsc_types_actual.NestedCimInstanceParam.Value.CimValue.StringArrayValue == None
    - dsc_types_actual.NestedCimInstanceParam.Value.CimValue.StringValue == None
    - dsc_types_actual.NestedCimInstanceParam.Value.CimValue._cim_instance == 'ANSIBLE_xTestClass'
    - dsc_types_actual.NestedCimInstanceParam.Value.HashValue|length == 1
    - dsc_types_actual.NestedCimInstanceParam.Value.HashValue[0].Key == 'a'
    - dsc_types_actual.NestedCimInstanceParam.Value.HashValue[0].Value == 'a'
    - dsc_types_actual.NestedCimInstanceParam.Value.HashValue[0]._cim_instance == 'MSFT_KeyValuePair'
    - dsc_types_actual.NestedCimInstanceParam.Value.IntValue == 300
    - dsc_types_actual.NestedCimInstanceParam.Value.KeyValue == 'key value'
    - dsc_types_actual.NestedCimInstanceParam.Value._cim_instance == 'ANSIBLE_xNestedClass'

- name: test DSC with all types older version
  win_dsc:
    resource_name: xTestResource
    module_version: 1.0.0
    Path: '{{ remote_tmp_dir }}\test-types.json'
    Ensure: Absent
    StringParam: string param old
    CimInstanceArrayParam:
    - Key: old key
      StringValue: string old 1
      IntValue: 0
      StringArrayValue:
      - zyx
      - wvu
  register: dsc_types_old

- name: get result of test DSC with all types older version
  slurp:
    path: '{{ remote_tmp_dir }}\test-types.json'
  register: dsc_types_old_raw

- name: convert result of test DSC with all types to dict
  set_fact:
    dsc_types_old_actual: '{{ dsc_types_old_raw.content | b64decode | from_json }}'

- name: assert test DSC with all types older version
  assert:
    that:
    - dsc_types_old is changed
    - dsc_types_old.module_version == '1.0.0'
    - not dsc_types_old.reboot_required
    - dsc_types_old_actual.Version == '1.0.0'
    - dsc_types_old_actual.Verbose.Value.IsPresent
    - dsc_types_old_actual.DefaultParam.Value == 'Default'
    - dsc_types_old_actual.Ensure.Value == 'Absent'
    - dsc_types_old_actual.Path.Value == remote_tmp_dir + "\\test-types.json"
    - dsc_types_old_actual.StringParam.Type == 'System.String'
    - dsc_types_old_actual.StringParam.Value == 'string param old'
    - dsc_types_old_actual.CimInstanceArrayParam.Type == 'Microsoft.Management.Infrastructure.CimInstance[]'
    - dsc_types_old_actual.CimInstanceArrayParam.Value|length == 1
    - not dsc_types_old_actual.CimInstanceArrayParam.Value[0].Choice is defined  # 1.0.0 does not have a Choice option
    - dsc_types_old_actual.CimInstanceArrayParam.Value[0].IntValue == 0
    - dsc_types_old_actual.CimInstanceArrayParam.Value[0].Key == 'old key'
    - dsc_types_old_actual.CimInstanceArrayParam.Value[0].StringArrayValue == ['zyx', 'wvu']
    - dsc_types_old_actual.CimInstanceArrayParam.Value[0].StringValue == 'string old 1'
    - dsc_types_old_actual.CimInstanceArrayParam.Value[0]._cim_instance == 'ANSIBLE_xTestClass'
