# Copyright (c) 2021 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.
# Auto-generated scripts for harness use only, please review before automation. The endpoints and cluster names are currently set to default

name: 41.3.2. [TC-TSTAT-3.2] Functionality with client as DUT

PICS:
    - TSTAT.C

config:
    nodeId: 0x12344321
    cluster: "Basic"
    endpoint: 0

tests:
    - label:
          "DUT increases the temperature by sending a SetpointRaiseLower command
          to the Test Harness, with a valid Mode argument (0, 1 or 2) and a
          reasonable positive value that is supported by the DUT."
      PICS: TSTAT.C.C00.Tx
      verification: |
          verify on Reference app receives the right Read Request Message for the data sent in the below commands

          ./chip-tool thermostat setpoint-raise-lower 0 10 1 1

          Verify in DUT as client side:Verify that Test Harness(Thermostat app) receives the SetpointRaiseLower command from the DUT

          [1646064221.719107][33190:33190] CHIP:EM: Received message of type 0x8 with protocolId (0, 1) and MessageCounter:4540287 on exchange 31012r
          [1646064221.719148][33190:33190] CHIP:EM: Handling via exchange: 31012r, Delegate: 0xaaaace1730c8
          [1646064221.719450][33190:33190] CHIP:DMG: InvokeRequestMessage =
          [1646064221.719491][33190:33190] CHIP:DMG: {
          [1646064221.719513][33190:33190] CHIP:DMG:         suppressResponse = false,
          [1646064221.719539][33190:33190] CHIP:DMG:         timedRequest = false,
          [1646064221.719564][33190:33190] CHIP:DMG:         InvokeRequests =
          [1646064221.719595][33190:33190] CHIP:DMG:         [
          [1646064221.719619][33190:33190] CHIP:DMG:                 CommandDataIB =
          [1646064221.719650][33190:33190] CHIP:DMG:                 {
          [1646064221.719677][33190:33190] CHIP:DMG:                         CommandPathIB =
          [1646064221.719710][33190:33190] CHIP:DMG:                         {
          [1646064221.719741][33190:33190] CHIP:DMG:                                 EndpointId = 0x1,
          [1646064221.719773][33190:33190] CHIP:DMG:                                 ClusterId = 0x201,
          [1646064221.719802][33190:33190] CHIP:DMG:                                 CommandId = 0x0,
          [1646064221.719832][33190:33190] CHIP:DMG:                         },
          [1646064221.719864][33190:33190] CHIP:DMG:
          [1646064221.719891][33190:33190] CHIP:DMG:                         CommandData =
          [1646064221.719922][33190:33190] CHIP:DMG:                         {
          [1646064221.719955][33190:33190] CHIP:DMG:                                 0x0 = 0,
          [1646064221.719992][33190:33190] CHIP:DMG:                                 0x1 = 10,
          [1646064221.720023][33190:33190] CHIP:DMG:                         },
          [1646064221.720051][33190:33190] CHIP:DMG:                 },
          [1646064221.720082][33190:33190] CHIP:DMG:
          [1646064221.720107][33190:33190] CHIP:DMG:         ],
          [1646064221.720137][33190:33190] CHIP:DMG:
          [1646064221.720161][33190:33190] CHIP:DMG:         InteractionModelRevision = 1
          [1646064221.720184][33190:33190] CHIP:DMG: },
          [1646064221.720243][33190:33190] CHIP:DMG: AccessControl: checking f=1 a=c s=0x000000000001B669 t= c=0x0000_0201 e=1 p=o
          [1646064221.720285][33190:33190] CHIP:DMG: Received command for Endpoint=1 Cluster=0x0000_0201 Command=0x0000_0000
      disabled: true

    - label:
          "DUT lowers the temperature by sending a SetpointRaiseLower command to
          the Test Harness, with a valid Mode argument (0, 1 or 2) and a
          reasonable negative value that is supported by the DUT."
      PICS: TSTAT.C.C00.Tx
      verification: |
          ./chip-tool thermostat setpoint-raise-lower 0 -10 1 1

          Verify in DUT as client side: verify that, Test Harness(thermostat-app) receives the SetpointRaiseLower command from the DUT

          [1646064525.675075][33190:33190] CHIP:EM: Received message of type 0x8 with protocolId (0, 1) and MessageCounter:16717414 on exchange 9698r
          [1646064525.675116][33190:33190] CHIP:EM: Handling via exchange: 9698r, Delegate: 0xaaaace1730c8
          [1646064525.675402][33190:33190] CHIP:DMG: InvokeRequestMessage =
          [1646064525.675444][33190:33190] CHIP:DMG: {
          [1646064525.675471][33190:33190] CHIP:DMG:         suppressResponse = false,
          [1646064525.675497][33190:33190] CHIP:DMG:         timedRequest = false,
          [1646064525.675521][33190:33190] CHIP:DMG:         InvokeRequests =
          [1646064525.675552][33190:33190] CHIP:DMG:         [
          [1646064525.675576][33190:33190] CHIP:DMG:                 CommandDataIB =
          [1646064525.675605][33190:33190] CHIP:DMG:                 {
          [1646064525.675630][33190:33190] CHIP:DMG:                         CommandPathIB =
          [1646064525.675660][33190:33190] CHIP:DMG:                         {
          [1646064525.675692][33190:33190] CHIP:DMG:                                 EndpointId = 0x1,
          [1646064525.675724][33190:33190] CHIP:DMG:                                 ClusterId = 0x201,
          [1646064525.675822][33190:33190] CHIP:DMG:                                 CommandId = 0x0,
          [1646064525.675852][33190:33190] CHIP:DMG:                         },
          [1646064525.675884][33190:33190] CHIP:DMG:
          [1646064525.675911][33190:33190] CHIP:DMG:                         CommandData =
          [1646064525.675941][33190:33190] CHIP:DMG:                         {
          [1646064525.675971][33190:33190] CHIP:DMG:                                 0x0 = 0,
          [1646064525.676005][33190:33190] CHIP:DMG:                                 0x1 = -10,
          [1646064525.676033][33190:33190] CHIP:DMG:                         },
          [1646064525.676060][33190:33190] CHIP:DMG:                 },
          [1646064525.676091][33190:33190] CHIP:DMG:
          [1646064525.676114][33190:33190] CHIP:DMG:         ],
          [1646064525.676143][33190:33190] CHIP:DMG:
          [1646064525.676167][33190:33190] CHIP:DMG:         InteractionModelRevision = 1
          [1646064525.676189][33190:33190] CHIP:DMG: },
          [1646064525.676247][33190:33190] CHIP:DMG: AccessControl: checking f=1 a=c s=0x000000000001B669 t= c=0x0000_0201 e=1 p=o
          [1646064525.676288][33190:33190] CHIP:DMG: Received command for Endpoint=1 Cluster=0x0000_0201 Command=0x0000_0000
      disabled: true

    - label: "DUT sends a GetRelayStatusLog command to the Test Harness."
      PICS: TSTAT.C.C04.Tx
      verification: |
          The GetRelayStatusLogResponse command may not supported in Matter 1.0.
      disabled: true
