# 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:
    12.4.3. [TC-CNET-4.3] [Ethernet] Verification for attributes check
    [DUT-Server]

PICS:
    - CNET.S.F02

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

tests:
    - label: "Factory reset the DUT"
      verification: |

      disabled: true

    - label: "Commmission TH and DUT on Ethernet setup"
      verification: |

      disabled: true

    - label:
          "TH reads Descriptor Cluster from the DUT with EP0 TH reads ServerList
          from the DUT"
      verification: |
          ./chip-tool descriptor read server-list 1 0

          Verify "server list" on the TH(Chip-tool) Log:

          [1646226258.250313][2446:2451] CHIP:DMG:        SuppressResponse = true,
          [1646226258.250337][2446:2451] CHIP:DMG:        InteractionModelRevision = 1
          [1646226258.250359][2446:2451] CHIP:DMG: }
          [1646226258.252027][2446:2451] CHIP:TOO: Endpoint: 0 Cluster: 0x0000_001D Attribute 0x0000_0001DataVersion: 3582931896
          [1646226258.252128][2446:2451] CHIP:TOO:   server list: 25 entries
          [1646226258.252183][2446:2451] CHIP:TOO:     [1]: 3
          [1646226258.252208][2446:2451] CHIP:TOO:     [2]: 4
          [1646226258.252232][2446:2451] CHIP:TOO:     [3]: 29
          [1646226258.252256][2446:2451] CHIP:TOO:     [4]: 30
          [1646226258.252280][2446:2451] CHIP:TOO:     [5]: 31
          [1646226258.252303][2446:2451] CHIP:TOO:     [6]: 40
          [1646226258.252326][2446:2451] CHIP:TOO:     [7]: 42
          [1646226258.252349][2446:2451] CHIP:TOO:     [8]: 43
          [1646226258.252373][2446:2451] CHIP:TOO:     [9]: 44
          [1646226258.252396][2446:2451] CHIP:TOO:     [10]: 45
          [1646226258.252420][2446:2451] CHIP:TOO:     [11]: 46
          [1646226258.252443][2446:2451] CHIP:TOO:     [12]: 48
          [1646226258.252466][2446:2451] CHIP:TOO:     [13]: 49
          [1646226258.252489][2446:2451] CHIP:TOO:     [14]: 50
          [1646226258.252512][2446:2451] CHIP:TOO:     [15]: 51
          [1646226258.252536][2446:2451] CHIP:TOO:     [16]: 52
          [1646226258.252559][2446:2451] CHIP:TOO:     [17]: 53
          [1646226258.252582][2446:2451] CHIP:TOO:     [18]: 54
          [1646226258.252605][2446:2451] CHIP:TOO:     [19]: 55
          [1646226258.252629][2446:2451] CHIP:TOO:     [20]: 60
          [1646226258.252652][2446:2451] CHIP:TOO:     [21]: 62
          [1646226258.252675][2446:2451] CHIP:TOO:     [22]: 63
          [1646226258.252698][2446:2451] CHIP:TOO:     [23]: 64
          [1646226258.252721][2446:2451] CHIP:TOO:     [24]: 65
          [1646226258.252745][2446:2451] CHIP:TOO:     [25]: 1029
          [1646226258.255517][2446:2451] CHIP:EM: Sending Standalone Ack for MessageCounter:10627940 on exchange 21443i
      disabled: true

    - label: "TH reads FeatureMap attribute from the DUT"
      verification: |
          ./chip-tool networkcommissioning read feature-map 1 0

          Verify "FeatureMap: 4 on the TH(Chip-tool) Log:


          [1649309323.273092][2611:2617] CHIP:DMG: }
          [1649309323.273466][2611:2617] CHIP:TOO: Endpoint: 0 Cluster: 0x0000_0031 Attribute 0x0000_FFFC DataVersion: 3138976789
          [1649309323.278715][2611:2617] CHIP:TOO:   FeatureMap: 4
          [1649309323.278863][2611:2617] CHIP:EM: Sending Standalone Ack for MessageCounter:532597 on exchange 51560i
      disabled: true

    - label: "TH reads the MaxNetworks attribute from the DUT"
      PICS: CNET.S.A0000
      verification: |
          ./chip-tool networkcommissioning read max-networks 1 0

          Verify "MaxNetworks" on the TH(Chip-tool) Log:

          [1646226441.815782][2475:2480] CHIP:DMG:        SuppressResponse = true,
          [1646226441.815849][2475:2480] CHIP:DMG:        InteractionModelRevision = 1
          [1646226441.815889][2475:2480] CHIP:DMG: }
          [1646226441.816092][2475:2480] CHIP:TOO: Endpoint: 0 Cluster: 0x0000_0031 Attribute 0x0000_0000DataVersion: 3622667250
          [1646226441.816191][2475:2480] CHIP:TOO:   MaxNetworks: 1
          [1646226441.816288][2475:2480] CHIP:EM: Sending Standalone Ack for MessageCounter:14864333 on exchange 39473i
      disabled: true

    - label:
          "TH saves the MaxNetworks attribute value as MaxNetworksValue for
          future use"
      verification: |
          TH saves MaxNetworks attribute value
      disabled: true

    - label: "TH reads the Networks attribute list from the DUT"
      PICS: CNET.S.A0001
      verification: |
          ./chip-tool networkcommissioning read networks 1 0

          Verify "Networks entiries and its status" on the TH(Chip-tool) Log:

          [1654076774.294361][33659:33664] CHIP:TOO: Endpoint: 0 Cluster: 0x0000_0031 Attribute 0x0000_0001 DataVersion: 609053543
          [1654076774.294505][33659:33664] CHIP:TOO:   Networks: 1 entries
          [1654076774.294625][33659:33664] CHIP:TOO:     [1]: {
          [1654076774.294679][33659:33664] CHIP:TOO:       NetworkID: 6368697035
          [1654076774.294726][33659:33664] CHIP:TOO:       Connected: TRUE
          [1654076774.294774][33659:33664] CHIP:TOO:      }
      disabled: true

    - label: "TH reads InterfaceEnabled attribute from the DUT"
      PICS: CNET.S.A0004
      verification: |

      disabled: true

    - label: "TH reads LastNetworkingStatus attribute from the DUT"
      PICS: CNET.S.A0005
      verification: |
          ./chip-tool networkcommissioning read last-networking-status 1 0

          Verify "LastNetworkingStatus" on the TH(Chip-tool) Log:

          [1659609891.611493][3877:3882] CHIP:TOO: Endpoint: 0 Cluster: 0x0000_0031 Attribute 0x0000_0005 DataVersion: 4108508964
          [1659609891.611559][3877:3882] CHIP:TOO:   LastNetworkingStatus: null
          [1659609891.611689][3877:3882] CHIP:EM: Sending Standalone Ack for MessageCounter:172102677 on exchange 50438i
      disabled: true

    - label:
          "TH reads the LastNetworkID attribute from the DUT TH reads the
          Networks attribute from the DUT"
      PICS: CNET.S.A0006
      verification: |
          ./chip-tool networkcommissioning read last-network-id 1 0

          Verify "LastNetworkID" on the TH(Chip-tool) Log:

          [1659610135.589352][3895:3900] CHIP:TOO: Endpoint: 0 Cluster: 0x0000_0031 Attribute 0x0000_0006 DataVersion: 4108508964
          [1659610135.589410][3895:3900] CHIP:TOO:   LastNetworkID: null
          [1659610135.589549][3895:3900] CHIP:EM: Sending Standalone Ack for MessageCounter:28696356 on exchange 52969i
      disabled: true

    - label: "TH reads the LastConnectErrorValue attribute from the DUT"
      PICS: CNET.S.A0007
      verification: |
          ./chip-tool networkcommissioning read last-connect-error-value 1 0

          Verify "LastConnectErrorValue" on the TH(Chip-tool) Log:

          [1653483224.839873][28189:28194] CHIP:TOO: Endpoint: 0 Cluster: 0x0000_0031 Attribute 0x0000_0007 DataVersion: 3189790698
          [1653483224.839927][28189:28194] CHIP:TOO:   LastConnectErrorValue: null
          [1653483224.840028][28189:28194] CHIP:EM: Sending Standalone Ack for MessageCounter:289132 on exchange 60682i
      disabled: true
