# 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:
    55.2.1. [TC-DLOG-2.1] Diagnostic Logs Cluster Commands Checks with BDX
    [DUT-Server]

PICS:
    - DLOG.S

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

tests:
    - label: "Precondition"
      verification: |
          DUT supports BDX
      disabled: true

    - label: "Reboot DUT"
      verification: |

      disabled: true

    - label: "Commission DUT to TH"
      verification: |

      disabled: true

    - label:
          "TH sends RetrieveLogsRequest Command (Intent =
          EndUserSupport,TransferFileDesignator = 'test.txt', RequestedProtocol=
          BDX) to DUT"
      verification: |
          sudo ./chip-tool diagnosticlogs retrieve-logs-request 0 1 "test.txt" 1 0


          [1651207333.385887][2441:2446] CHIP:DMG:                                StatusIB =
          [1651207333.385937][2441:2446] CHIP:DMG:                                {
          [1651207333.385985][2441:2446] CHIP:DMG:                                        status = 0x00 (SUCCESS),
          [1651207333.386037][2441:2446] CHIP:DMG:                                },
      disabled: true

    - label:
          "Verify that the DUT initiates a BDX Transfer, sending a BDX SendInit
          message with the File Designator field of the message set to the value
          of the TransferFileDesignator field of the RetrieveLogsRequest"
      verification: |
          Not Verifiable
      disabled: true

    - label: "TH Sends BDX SendAccept message"
      PICS: DLOG.S.C01.Tx
      verification: |
          Not Verifiable
      disabled: true

    - label:
          "Verify that DUT sends RetrieveLogsResponse Command,Verify that the
          Status field is set to Success,If LogContent size < 1024 octets,Verify
          that the BDX transfer is not initiated from DUT Verify that DUT sends
          RetrieveLogsResponse command with a Status field set to Exhausted
          Note: In this case steps 5 and 6 does not hold good. else Verify that
          the BDX transfer is initiated from DUT Verify that the LogContent
          field of RetrieveLogsResponse is empty Verify that DUT sends
          RetrieveLogsResponse command with a Status field set to Success Verify
          that UTCTimeStamp is included in the RetrieveLogsResponse command
          Verify that TimeSinceBoot is included in the RetrieveLogsResponse
          command Note: In this case steps 5 and 6 holds good."
      verification: |
          sudo ./chip-tool diagnosticlogs retrieve-logs-request 0 1 "test.txt" 1 0

          [1651207369.743117][2450:2455] CHIP:DMG:                                StatusIB =
          [1651207369.743155][2450:2455] CHIP:DMG:                                {
          [1651207369.743192][2450:2455] CHIP:DMG:                                        status = 0x00 (SUCCESS),
          [1651207369.743228][2450:2455] CHIP:DMG:                                },
      disabled: true

    - label:
          "TH sends RetrieveLogsRequest Command (Intent =
          EndUserSupport,TransferFileDesignator = 'test.txt', RequestedProtocol=
          BDX) to DUT"
      verification: |
          sudo ./chip-tool diagnosticlogs retrieve-logs-request 0 1 "test.txt" 1 0

          [1651207386.883337][2457:2462] CHIP:DMG:
          [1651207386.883383][2457:2462] CHIP:DMG:                                StatusIB =
          [1651207386.883443][2457:2462] CHIP:DMG:                                {
          [1651207386.883498][2457:2462] CHIP:DMG:                                        status = 0x00 (SUCCESS),
          [1651207386.883563][2457:2462] CHIP:DMG:                                },
      disabled: true

    - label:
          "Verify that the DUT initiates a BDX Transfer, sending a BDX SendInit
          message with the File Designator field of the message set to the value
          of the TransferFileDesignator field of the RetrieveLogsRequest"
      PICS: DLOG.S.C01.Tx
      verification: |
          Not Verifiable
      disabled: true

    - label:
          "TH Sends StatusReport(GeneralCode: FAILURE, ProtocolId: BDX,
          ProtocolCode: TRANSFER_METHOD_NOT_SUPPORTED)"
      verification: |
          Not Verifiable
      disabled: true

    - label:
          "Verify that DUT sends RetrieveLogsResponse command with a Status
          field set to Denied"
      verification: |
          Not Verifiable
      disabled: true

    - label:
          "TH sends RetrieveLogsRequest Command (Intent = EndUserSupport,
          RequestedProtocol = ResponsePayload) to DUT"
      verification: |
          sudo ./chip-tool diagnosticlogs retrieve-logs-request 0 0 "test.txt" 1 0

          [1651207416.783607][2465:2470] CHIP:DMG:                                StatusIB =
          [1651207416.783676][2465:2470] CHIP:DMG:                                {
          [1651207416.783722][2465:2470] CHIP:DMG:                                        status = 0x00 (SUCCESS),
          [1651207416.783766][2465:2470] CHIP:DMG:                                },
      disabled: true

    - label:
          "Verify that the BDX transfer is not initiated from DUT, Verify that
          the LogContent field of RetrieveLogsResponse has the size < = 1024
          octets"
      verification: |
          Not Verifiable
      disabled: true

    - label:
          "Verify that DUT sends RetrieveLogsResponse command with a Status
          field set to Success, Verify that UTCTimeStamp is included in the
          RetrieveLogsResponse command,Verify that TimeSinceBoot is included in
          the RetrieveLogsResponse command"
      verification: |
          sudo ./chip-tool diagnosticlogs retrieve-logs-request 0 1 "test.txt" 1 0

          [1651207438.423557][2475:2480] CHIP:DMG:                                StatusIB =
          [1651207438.423594][2475:2480] CHIP:DMG:                                {
          [1651207438.423648][2475:2480] CHIP:DMG:                                        status = 0x00 (SUCCESS),
          [1651207438.423708][2475:2480] CHIP:DMG:                                },
      disabled: true
