# Copyright (c) 2022 Project CHIP Authors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

name: General Commissioning cluster basic tests

config:
    nodeId: 0x12344321
    cluster: "General Commissioning"
    endpoint: 0
    discriminator:
        type: int16u
        defaultValue: 3840
    payload:
        type: char_string
        defaultValue: "MT:-24J0AFN00KA0648G00" # This value needs to be generated automatically

tests:
    - label: "Wait for the commissioned device to be retrieved"
      cluster: "DelayCommands"
      command: "WaitForCommissionee"
      arguments:
          values:
              - name: "nodeId"
                value: nodeId

    - label: "Write Breadcrumb (1/2)"
      command: "writeAttribute"
      attribute: "Breadcrumb"
      arguments:
          value: 137438953472

    - label: "Read back Breadcrumb (1/2)"
      command: "readAttribute"
      attribute: "Breadcrumb"
      response:
          value: 137438953472

    - label: "Write Breadcrumb (2/2)"
      command: "writeAttribute"
      attribute: "Breadcrumb"
      arguments:
          value: 81

    - label: "Read back Breadcrumb (2/2)"
      command: "readAttribute"
      attribute: "Breadcrumb"
      response:
          value: 81

    - label: "Reboot to reset Breadcrumb"
      cluster: "SystemCommands"
      command: "Reboot"

    - label: "Connect to the device again"
      cluster: "DelayCommands"
      command: "WaitForCommissionee"
      arguments:
          values:
              - name: "nodeId"
                value: nodeId

    - label: "Read back Breadcrumb after reboot and ensure it was not persisted"
      command: "readAttribute"
      attribute: "Breadcrumb"
      response:
          value: 0

    - label: "Set Breadcrumb to nonzero value"
      command: "writeAttribute"
      attribute: "Breadcrumb"
      arguments:
          value: 1

    - label: "Check Breadcrumb set worked"
      command: "readAttribute"
      attribute: "Breadcrumb"
      response:
          value: 1

    - label: "Send CommissioningComplete without armed fail-safe"
      command: "CommissioningComplete"
      response:
          values:
              - name: ErrorCode
                value: 3 # NoFailSafe

    - label: "Check Breadcrumb was not touched by invalid CommissioningComplete"
      command: "readAttribute"
      attribute: "Breadcrumb"
      response:
          value: 1

    - label: "Open Commissioning Window from alpha"
      cluster: "Administrator Commissioning"
      command: "OpenBasicCommissioningWindow"
      timedInteractionTimeoutMs: 10000
      arguments:
          values:
              - name: "CommissioningTimeout"
                value: 180

    # Arming a fail-safe over CASE while a commissioning window is open should not work.
    - label: "Try to arm fail-safe"
      command: "ArmFailSafe"
      arguments:
          values:
              - name: ExpiryLengthSeconds
                value: 10
              - name: Breadcrumb
                value: 5000
      response:
          values:
              - name: ErrorCode
                value: 4 # BusyWithOtherAdmin

    - label:
          "Check Breadcrumb was not touched by ArmFailSafe with commissioning
          window open"
      command: "readAttribute"
      attribute: "Breadcrumb"
      response:
          value: 1

    - label: "Reset Breadcrumb to 0 so we can commission"
      command: "writeAttribute"
      attribute: "Breadcrumb"
      arguments:
          value: 0

    - label: "Commission from beta"
      identity: "beta"
      cluster: "CommissionerCommands"
      command: "PairWithCode"
      arguments:
          values:
              - name: "nodeId"
                value: 0x12345
              - name: "payload"
                value: payload

    - label: "Wait for the commissioned device to be retrieved for beta"
      identity: "beta"
      cluster: "DelayCommands"
      command: "WaitForCommissionee"
      arguments:
          values:
              - name: "nodeId"
                value: 0x12345

    - label: "Arm fail-safe"
      command: "ArmFailSafe"
      arguments:
          values:
              - name: ExpiryLengthSeconds
                value: 500
              - name: Breadcrumb
                value: 2
      response:
          values:
              - name: ErrorCode
                value: 0 # OK

    - label: "Check Breadcrumb was properly set by ArmFailSafe"
      command: "readAttribute"
      attribute: "Breadcrumb"
      response:
          value: 2

    - label: "Try to arm fail-safe from wrong fabric"
      command: "ArmFailSafe"
      identity: "beta"
      arguments:
          values:
              - name: ExpiryLengthSeconds
                value: 10
              - name: Breadcrumb
                value: 5000
      response:
          values:
              - name: ErrorCode
                value: 4 # BusyWithOtherAdmin

    - label:
          "Check Breadcrumb was not touched by ArmFailSafe with existing
          fail-safe armed"
      command: "readAttribute"
      attribute: "Breadcrumb"
      response:
          value: 2

    - label: "Send CommissioningComplete from wrong fabric"
      command: "CommissioningComplete"
      identity: "beta"
      response:
          values:
              - name: ErrorCode
                value: 2 # InvalidAuthentication

    - label:
          "Check Breadcrumb was not touched by CommissioningComplete from wrong
          fabric"
      command: "readAttribute"
      attribute: "Breadcrumb"
      response:
          value: 2

    - label: "Close out the fail-safe gracefully"
      command: "CommissioningComplete"
      response:
          values:
              - name: ErrorCode
                value: 0 # Ok

    - label: "Check Breadcrumb was reset to 0 by CommissioningComplete"
      command: "readAttribute"
      attribute: "Breadcrumb"
      response:
          value: 0

    - label: "Arm fail-safe again"
      command: "ArmFailSafe"
      arguments:
          values:
              - name: ExpiryLengthSeconds
                value: 500
              - name: Breadcrumb
                value: 3
      response:
          values:
              - name: ErrorCode
                value: 0 # OK

    - label: "Check Breadcrumb was set by arming fail-safe again"
      command: "readAttribute"
      attribute: "Breadcrumb"
      response:
          value: 3

    - label: "Force-expire the fail-safe"
      command: "ArmFailSafe"
      arguments:
          values:
              - name: ExpiryLengthSeconds
                value: 0
              - name: Breadcrumb
                value: 4
      response:
          values:
              - name: ErrorCode
                value: 0 # OK

    - label: "Check Breadcrumb was reset by expiring the fail-safe"
      command: "readAttribute"
      attribute: "Breadcrumb"
      response:
          value: 0

    - label: "Validate presence of SupportsConcurrentConnection"
      command: "readAttribute"
      attribute: "SupportsConcurrentConnection"
      response:
          constraints:
              type: boolean

    - label: "Read original regulatory location"
      command: "readAttribute"
      attribute: "RegulatoryConfig"
      response:
          saveAs: originalRegulatoryConfig

    - label: "Read original location"
      command: "readAttribute"
      cluster: "Basic Information"
      attribute: "Location"
      response:
          value: "XX"
          saveAs: originalLocation

    - label: "Try to SetRegulatoryConfig with 0-length country code"
      command: "SetRegulatoryConfig"
      arguments:
          values:
              - name: "NewRegulatoryConfig"
                value: 0
              - name: "CountryCode"
                value: ""
              - name: "Breadcrumb"
                value: 0
      response:
          error: CONSTRAINT_ERROR

    - label: "Read back location"
      command: "readAttribute"
      cluster: "Basic Information"
      attribute: "Location"
      response:
          value: originalLocation

    - label: "Try to SetRegulatoryConfig with length-1 country code"
      command: "SetRegulatoryConfig"
      arguments:
          values:
              - name: "NewRegulatoryConfig"
                value: 0
              - name: "CountryCode"
                value: "U"
              - name: "Breadcrumb"
                value: 0
      response:
          error: CONSTRAINT_ERROR

    - label: "Read back location second time"
      command: "readAttribute"
      cluster: "Basic Information"
      attribute: "Location"
      response:
          value: originalLocation

    - label: "Try to SetRegulatoryConfig with length-2 country code"
      command: "SetRegulatoryConfig"
      arguments:
          values:
              - name: "NewRegulatoryConfig"
                value: 0
              - name: "CountryCode"
                value: "US"
              - name: "Breadcrumb"
                value: 0
      response:
          values:
              - name: "ErrorCode"
                value: 0
              - name: "DebugText"
                value: ""

    - label: "Read back location third time"
      command: "readAttribute"
      cluster: "Basic Information"
      attribute: "Location"
      response:
          value: "US"

    - label: "Restore initial values"
      command: "SetRegulatoryConfig"
      arguments:
          values:
              - name: "NewRegulatoryConfig"
                value: originalRegulatoryConfig
              - name: "CountryCode"
                value: originalLocation
              - name: "Breadcrumb"
                value: 0
