# SPDX-License-Identifier: BSD-3-Clause
---
- hosts: all
  vars:
    interface: lsrfeat1
    type: veth
  tasks:
    - name: "INIT: Ethtool feeatures tests"
      debug:
        msg: "##################################################"
    - include_tasks: tasks/show-interfaces.yml
    - include_tasks: tasks/manage-test-interface.yml
      vars:
        state: present
    - include_tasks: tasks/assert-device_present.yml
    - name: Install ethtool (test dependency)
      package:
        name: ethtool
        state: present
    - block:
        - name: "TEST: I can create a profile without changing the ethtool features."
          debug:
            msg: "##################################################"
        - name: Get current device features
          command: "ethtool --show-features {{ interface }}"
          register: original_ethtool_features
        - import_role:
            name: linux-system-roles.network
          vars:
            network_connections:
              - name: "{{ interface }}"
                state: up
                type: ethernet
                ip:
                  dhcp4: "no"
                  auto6: "no"
        - name: Get current device features
          command: "ethtool --show-features {{ interface }}"
          register: ethtool_features
        - name: "ASSERT: The profile does not change the ethtool features"
          assert:
            that:
              - original_ethtool_features.stdout == ethtool_features.stdout
        - name: "TEST: I can disable gro and tx-tcp-segmentation and enable gso."
          debug:
            msg: "##################################################"
        - import_role:
            name: linux-system-roles.network
          vars:
            network_connections:
              - name: "{{ interface }}"
                state: up
                type: ethernet
                ip:
                  dhcp4: "no"
                  auto6: "no"
                ethtool:
                  features:
                    gro: "no"
                    gso: "yes"
                    tx-tcp-segmentation: "no"
        - name: Get current device features
          command: "ethtool --show-features {{ interface }}"
          register: ethtool_features
        - name:
          debug:
            var: ethtool_features.stdout_lines
        - name: Assert device features
          assert:
            that:
              - "'generic-receive-offload: off' in ethtool_features.stdout_lines"
              - "'generic-segmentation-offload: on' in ethtool_features.stdout_lines"
              - "'tx-tcp-segmentation: off' in ethtool_features.stdout_lines | map('trim')"
        - name: "TEST: I can reset features to their original value."
          debug:
            msg: "##################################################"
        - import_role:
            name: linux-system-roles.network
          vars:
            network_connections:
              - name: "{{ interface }}"
                state: up
                type: ethernet
                ip:
                  dhcp4: "no"
                  auto6: "no"
        - name: Get current device features
          command: "ethtool --show-features {{ interface }}"
          register: ethtool_features
        # Resetting the ethtools only works with NetworkManager
        - name: "ASSERT: The profile does not change the ethtool features"
          assert:
            that:
              - original_ethtool_features.stdout == ethtool_features.stdout
          when:
            network_provider == 'nm'
      always:
        - block:
            - import_role:
                name: linux-system-roles.network
              vars:
                network_connections:
                  - name: "{{ interface }}"
                    persistent_state: absent
                    state: down
              ignore_errors: true
            - include_tasks: tasks/manage-test-interface.yml
              vars:
                state: absent
          tags:
            - "tests::cleanup"
