[
    {
        "id": "e89a",
        "name": "Add valid pass action",
        "category": [
            "actions",
            "gact"
        ],
        "plugins": {
           "requires": "nsPlugin"
        },
        "setup": [
            [
                "$TC actions flush action gact",
                0,
                1,
                255
            ]
        ],
        "cmdUnderTest": "$TC actions add action pass index 8",
        "expExitCode": "0",
        "verifyCmd": "$TC actions list action gact",
        "matchPattern": "action order [0-9]*: gact action pass.*index 8 ref",
        "matchCount": "1",
        "teardown": [
            "$TC actions flush action gact"
        ]
    },
    {
        "id": "a02c",
        "name": "Add valid pipe action",
        "category": [
            "actions",
            "gact"
        ],
        "plugins": {
           "requires": "nsPlugin"
        },
        "setup": [
            [
                "$TC actions flush action gact",
                0,
                1,
                255
            ]
        ],
        "cmdUnderTest": "$TC actions add action pipe index 6",
        "expExitCode": "0",
        "verifyCmd": "$TC actions list action gact",
        "matchPattern": "action order [0-9]*: gact action pipe.*index 6 ref",
        "matchCount": "1",
        "teardown": [
            "$TC actions flush action gact"
        ]
    },
    {
        "id": "feef",
        "name": "Add valid reclassify action",
        "category": [
            "actions",
            "gact"
        ],
        "plugins": {
           "requires": "nsPlugin"
        },
        "setup": [
            [
                "$TC actions flush action gact",
                0,
                1,
                255
            ]
        ],
        "cmdUnderTest": "$TC actions add action reclassify index 5",
        "expExitCode": "0",
        "verifyCmd": "$TC actions list action gact",
        "matchPattern": "action order [0-9]*: gact action reclassify.*index 5 ref",
        "matchCount": "1",
        "teardown": [
            "$TC actions flush action gact"
        ]
    },
    {
        "id": "8a7a",
        "name": "Add valid drop action",
        "category": [
            "actions",
            "gact"
        ],
        "plugins": {
           "requires": "nsPlugin"
        },
        "setup": [
            [
                "$TC actions flush action gact",
                0,
                1,
                255
            ]
        ],
        "cmdUnderTest": "$TC actions add action drop index 30",
        "expExitCode": "0",
        "verifyCmd": "$TC actions list action gact",
        "matchPattern": "action order [0-9]*: gact action drop.*index 30 ref",
        "matchCount": "1",
        "teardown": [
            "$TC actions flush action gact"
        ]
    },
    {
        "id": "9a52",
        "name": "Add valid continue action",
        "category": [
            "actions",
            "gact"
        ],
        "plugins": {
           "requires": "nsPlugin"
        },
        "setup": [
            [
                "$TC actions flush action gact",
                0,
                1,
                255
            ]
        ],
        "cmdUnderTest": "$TC actions add action continue index 432",
        "expExitCode": "0",
        "verifyCmd": "$TC actions list action gact",
        "matchPattern": "action order [0-9]*: gact action continue.*index 432 ref",
        "matchCount": "1",
        "teardown": [
            "$TC actions flush action gact"
        ]
    },
    {
        "id": "d700",
        "name": "Add invalid action",
        "category": [
            "actions",
            "gact"
        ],
        "plugins": {
           "requires": "nsPlugin"
        },
        "setup": [
            [
                "$TC actions flush action gact",
                0,
                1,
                255
            ]
        ],
        "cmdUnderTest": "$TC actions add action pump index 386",
        "expExitCode": "255",
        "verifyCmd": "$TC actions list action gact",
        "matchPattern": "action order [0-9]*: gact action.*index 386 ref",
        "matchCount": "0",
        "teardown": [
            "$TC actions flush action gact"
        ]
    },
    {
        "id": "9215",
        "name": "Add action with duplicate index",
        "category": [
            "actions",
            "gact"
        ],
        "plugins": {
           "requires": "nsPlugin"
        },
        "setup": [
            [
                "$TC actions flush action gact",
                0,
                1,
                255
            ],
            "$TC actions add action pipe index 15"
        ],
        "cmdUnderTest": "$TC actions add action drop index 15",
        "expExitCode": "255",
        "verifyCmd": "$TC actions list action gact",
        "matchPattern": "action order [0-9]*: gact action drop.*index 15 ref",
        "matchCount": "0",
        "teardown": [
            "$TC actions flush action gact"
        ]
    },
    {
        "id": "798e",
        "name": "Add action with index exceeding 32-bit maximum",
        "category": [
            "actions",
            "gact"
        ],
        "plugins": {
           "requires": "nsPlugin"
        },
        "setup": [
            [
                "$TC actions flush action gact",
                0,
                1,
                255
            ]
        ],
        "cmdUnderTest": "$TC actions add action drop index 4294967296",
        "expExitCode": "255",
        "verifyCmd": "actions list action gact",
        "matchPattern": "action order [0-9]*: gact action drop.*index 4294967296 ref",
        "matchCount": "0",
        "teardown": [
            "$TC actions flush action gact"
        ]
    },
    {
        "id": "22be",
        "name": "Add action with index at 32-bit maximum",
        "category": [
            "actions",
            "gact"
        ],
        "plugins": {
           "requires": "nsPlugin"
        },
        "setup": [
            [
                "$TC actions flush action gact",
                0,
                1,
                255
            ]
        ],
        "cmdUnderTest": "$TC actions add action drop index 4294967295",
        "expExitCode": "0",
        "verifyCmd": "$TC actions list action gact",
        "matchPattern": "action order [0-9]*: gact action drop.*index 4294967295 ref",
        "matchCount": "1",
        "teardown": [
            "$TC actions flush action gact"
        ]
    },
    {
        "id": "ac2a",
        "name": "List actions",
        "category": [
            "actions",
            "gact"
        ],
        "plugins": {
           "requires": "nsPlugin"
        },
        "setup": [
            [
                "$TC actions flush action gact",
                0,
                1,
                255
            ],
            "$TC actions add action reclassify index 101",
            "$TC actions add action reclassify index 102",
            "$TC actions add action reclassify index 103",
            "$TC actions add action reclassify index 104",
            "$TC actions add action reclassify index 105"
        ],
        "cmdUnderTest": "$TC actions list action gact",
        "expExitCode": "0",
        "verifyCmd": "$TC actions list action gact",
        "matchPattern": "action order [0-9]*: gact action reclassify",
        "matchCount": "5",
        "teardown": [
            "$TC actions flush action gact"
        ]
    },
    {
        "id": "3edf",
        "name": "Flush gact actions",
        "category": [
            "actions",
            "gact"
        ],
        "plugins": {
           "requires": "nsPlugin"
        },
        "setup": [
            "$TC actions add action reclassify index 101",
            "$TC actions add action reclassify index 102",
            "$TC actions add action reclassify index 103",
            "$TC actions add action reclassify index 104",
            "$TC actions add action reclassify index 105"
        ],
        "cmdUnderTest": "$TC actions flush action gact",
        "expExitCode": "0",
        "verifyCmd": "$TC actions list action gact",
        "matchPattern": "action order [0-9]*: gact action reclassify",
        "matchCount": "0",
        "teardown": []
    },
    {
        "id": "63ec",
        "name": "Delete pass action",
        "category": [
            "actions",
            "gact"
        ],
        "plugins": {
           "requires": "nsPlugin"
        },
        "setup": [
            [
                "$TC actions flush action gact",
                0,
                1,
                255
            ],
            "$TC actions add action pass index 1"
        ],
        "cmdUnderTest": "$TC actions del action gact index 1",
        "expExitCode": "0",
        "verifyCmd": "$TC actions list action gact",
        "matchPattern": "action order [0-9]*: gact action pass.*index 1 ref",
        "matchCount": "0",
        "teardown": [
            "$TC actions flush action gact"
        ]
    },
    {
        "id": "46be",
        "name": "Delete pipe action",
        "category": [
            "actions",
            "gact"
        ],
        "plugins": {
           "requires": "nsPlugin"
        },
        "setup": [
            [
                "$TC actions flush action gact",
                0,
                1,
                255
            ],
            "$TC actions add action pipe index 9"
        ],
        "cmdUnderTest": "$TC actions del action gact index 9",
        "expExitCode": "0",
        "verifyCmd": "$TC actions list action gact",
        "matchPattern": "action order [0-9]*: gact action pipe.*index 9 ref",
        "matchCount": "0",
        "teardown": [
            "$TC actions flush action gact"
        ]
    },
    {
        "id": "2e08",
        "name": "Delete reclassify action",
        "category": [
            "actions",
            "gact"
        ],
        "plugins": {
           "requires": "nsPlugin"
        },
        "setup": [
            [
                "$TC actions flush action gact",
                0,
                1,
                255
            ],
            "$TC actions add action reclassify index 65536"
        ],
        "cmdUnderTest": "$TC actions del action gact index 65536",
        "expExitCode": "0",
        "verifyCmd": "$TC actions list action gact",
        "matchPattern": "action order [0-9]*: gact action reclassify.*index 65536 ref",
        "matchCount": "0",
        "teardown": [
            "$TC actions flush action gact"
        ]
    },
    {
        "id": "99c4",
        "name": "Delete drop action",
        "category": [
            "actions",
            "gact"
        ],
        "plugins": {
           "requires": "nsPlugin"
        },
        "setup": [
            [
                "$TC actions flush action gact",
                0,
                1,
                255
            ],
            "$TC actions add action drop index 16"
        ],
        "cmdUnderTest": "$TC actions del action gact index 16",
        "expExitCode": "0",
        "verifyCmd": "$TC actions list action gact",
        "matchPattern": "action order [0-9]*: gact action drop.*index 16 ref",
        "matchCount": "0",
        "teardown": [
            "$TC actions flush action gact"
        ]
    },
    {
        "id": "fb6b",
        "name": "Delete continue action",
        "category": [
            "actions",
            "gact"
        ],
        "plugins": {
           "requires": "nsPlugin"
        },
        "setup": [
            [
                "$TC actions flush action gact",
                0,
                1,
                255
            ],
            "$TC actions add action continue index 32"
        ],
        "cmdUnderTest": "$TC actions del action gact index 32",
        "expExitCode": "0",
        "verifyCmd": "actions list action gact",
        "matchPattern": "action order [0-9]*: gact action continue.*index 32 ref",
        "matchCount": "0",
        "teardown": [
            "$TC actions flush action gact"
        ]
    },
    {
        "id": "0eb3",
        "name": "Delete non-existent action",
        "category": [
            "actions",
            "gact"
        ],
        "plugins": {
           "requires": "nsPlugin"
        },
        "setup": [
            [
                "$TC actions flush action gact",
                0,
                1,
                255
            ]
        ],
        "cmdUnderTest": "$TC actions del action gact index 2",
        "expExitCode": "255",
        "verifyCmd": "$TC actions list action gact",
        "matchPattern": "action order [0-9]*: gact action",
        "matchCount": "0",
        "teardown": [
            "$TC actions flush action gact"
        ]
    },
    {
        "id": "f02c",
        "name": "Replace gact action",
        "category": [
            "actions",
            "gact"
        ],
        "plugins": {
           "requires": "nsPlugin"
        },
        "setup": [
            [
                "$TC actions flush action gact",
                0,
                1,
                255
            ],
            "$TC actions add action drop index 10",
            "$TC actions add action drop index 12"
        ],
        "cmdUnderTest": "$TC actions replace action ok index 12",
        "expExitCode": "0",
        "verifyCmd": "$TC actions ls action gact",
        "matchPattern": "action order [0-9]*: gact action pass",
        "matchCount": "1",
        "teardown": [
            "$TC actions flush action gact"
        ]
    },
    {
        "id": "525f",
        "name": "Get gact action by index",
        "category": [
            "actions",
            "gact"
        ],
        "plugins": {
           "requires": "nsPlugin"
        },
        "setup": [
            [
                "$TC actions flush action gact",
                0,
                1,
                255
            ],
            "$TC actions add action drop index 3900800700"
        ],
        "cmdUnderTest": "$TC actions get action gact index 3900800700",
        "expExitCode": "0",
        "verifyCmd": "$TC actions get action gact index 3900800700",
        "matchPattern": "index 3900800700",
        "matchCount": "1",
        "teardown": [
            "$TC actions flush action gact"
        ]
    },
    {
        "id": "1021",
        "name": "Add batch of 32 gact pass actions",
        "category": [
            "actions",
            "gact"
        ],
        "plugins": {
           "requires": "nsPlugin"
        },
        "setup": [
            [
                "$TC actions flush action gact",
                0,
                1,
                255
            ]
        ],
        "cmdUnderTest": "bash -c \"for i in \\`seq 1 32\\`; do cmd=\\\"action pass index \\$i \\\"; args=\"\\$args\\$cmd\"; done && $TC actions add \\$args\"",
        "expExitCode": "0",
        "verifyCmd": "$TC actions list action gact",
        "matchPattern": "^[ \t]+index [0-9]+ ref",
        "matchCount": "32",
        "teardown": [
            "$TC actions flush action gact"
        ]
    },
    {
        "id": "da7a",
        "name": "Add batch of 32 gact continue actions with cookie",
        "category": [
            "actions",
            "gact"
        ],
        "plugins": {
           "requires": "nsPlugin"
        },
        "setup": [
            [
                "$TC actions flush action gact",
                0,
                1,
                255
            ]
        ],
        "cmdUnderTest": "bash -c \"for i in \\`seq 1 32\\`; do cmd=\\\"action continue index \\$i cookie aabbccddeeff112233445566778800a1 \\\"; args=\"\\$args\\$cmd\"; done && $TC actions add \\$args\"",
        "expExitCode": "0",
        "verifyCmd": "$TC actions list action gact",
        "matchPattern": "^[ \t]+index [0-9]+ ref",
        "matchCount": "32",
        "teardown": [
            "$TC actions flush action gact"
        ]
    },
    {
        "id": "8aa3",
        "name": "Delete batch of 32 gact continue actions",
        "category": [
            "actions",
            "gact"
        ],
        "plugins": {
           "requires": "nsPlugin"
        },
        "setup": [
            [
                "$TC actions flush action gact",
                0,
                1,
                255
            ],
            "bash -c \"for i in \\`seq 1 32\\`; do cmd=\\\"action continue index \\$i \\\"; args=\\\"\\$args\\$cmd\\\"; done && $TC actions add \\$args\""
        ],
        "cmdUnderTest": "bash -c \"for i in \\`seq 1 32\\`; do cmd=\\\"action gact index \\$i \\\"; args=\"\\$args\\$cmd\"; done && $TC actions del \\$args\"",
        "expExitCode": "0",
        "verifyCmd": "$TC actions list action gact",
        "matchPattern": "^[ \t]+index [0-9]+ ref",
        "matchCount": "0",
        "teardown": []
    },
    {
        "id": "8e47",
        "name": "Add gact action with random determ goto chain control action",
        "category": [
            "actions",
            "gact"
        ],
        "plugins": {
           "requires": "nsPlugin"
        },
        "setup": [
            [
                "$TC actions flush action gact",
                0,
                1,
                255
            ]
        ],
        "cmdUnderTest": "$TC actions add action pass random determ goto chain 1 2 index 90",
        "expExitCode": "255",
        "verifyCmd": "$TC actions list action gact",
        "matchPattern": "action order [0-9]*: gact action pass random type determ goto chain 1 val 2.*index 90 ref",
        "matchCount": "0",
        "teardown": [
            "$TC actions flush action gact"
        ]
    },
    {
        "id": "ca89",
        "name": "Replace gact action with invalid goto chain control",
        "category": [
            "actions",
            "gact"
        ],
        "plugins": {
           "requires": "nsPlugin"
        },
        "setup": [
            [
                "$TC actions flush action gact",
                0,
                1,
                255
            ],
            "$TC actions add action pass random determ drop 2 index 90"
        ],
        "cmdUnderTest": "$TC actions replace action goto chain 42 random determ drop 5 index 90 cookie c1a0c1a0",
        "expExitCode": "255",
        "verifyCmd": "$TC actions list action gact",
        "matchPattern": "action order [0-9]*: gact action pass.*random type determ drop val 2.*index 90 ref",
        "matchCount": "1",
        "teardown": [
            "$TC actions flush action gact"
        ]
    },
    {
        "id": "95ad",
        "name": "Add gact pass action with no_percpu flag",
        "category": [
            "actions",
            "gact"
        ],
        "plugins": {
           "requires": "nsPlugin"
        },
        "setup": [
            [
                "$TC actions flush action gact",
                0,
                1,
                255
            ]
        ],
        "cmdUnderTest": "$TC actions add action pass no_percpu",
        "expExitCode": "0",
        "verifyCmd": "$TC actions list action gact",
        "matchPattern": "action order [0-9]*: gact action pass.*no_percpu",
        "matchCount": "1",
        "teardown": [
            "$TC actions flush action gact"
        ]
    },
    {
        "id": "7f52",
        "name": "Try to flush action which is referenced by filter",
        "category": [
            "actions",
            "gact"
        ],
        "plugins": {
            "requires": "nsPlugin"
        },
        "setup": [
            [
                "$TC actions flush action gact",
                0,
                1,
                255
            ],
            "$TC qdisc add dev $DEV1 ingress",
            "$TC actions add action pass index 1",
            "$TC filter add dev $DEV1 protocol all ingress prio 1 handle 0x1234 matchall action gact index 1"
        ],
        "cmdUnderTest": "$TC actions flush action gact",
        "expExitCode": "1",
        "verifyCmd": "$TC actions ls action gact",
        "matchPattern": "total acts 1.*action order [0-9]*: gact action pass.*index 1 ref 2 bind 1",
        "matchCount": "1",
        "teardown": [
            "$TC qdisc del dev $DEV1 ingress",
            [
                "sleep 1; $TC actions flush action gact",
                0,
                1
            ]
        ]
    },
    {
        "id": "ae1e",
        "name": "Try to flush actions when last one is referenced by filter",
        "category": [
            "actions",
            "gact"
        ],
        "plugins": {
            "requires": "nsPlugin"
        },
        "setup": [
            [
                "$TC actions flush action gact",
                0,
                1,
                255
            ],
            "$TC qdisc add dev $DEV1 ingress",
	    [
                "$TC actions add action pass index 1",
		0,
		1,
		255
	    ],
            "$TC actions add action reclassify index 2",
            "$TC actions add action drop index 3",
            "$TC filter add dev $DEV1 protocol all ingress prio 1 handle 0x1234 matchall action gact index 3"
        ],
        "cmdUnderTest": "$TC actions flush action gact",
        "expExitCode": "0",
        "verifyCmd": "$TC actions ls action gact",
        "matchPattern": "total acts 1.*action order [0-9]*: gact action drop.*index 3 ref 2 bind 1",
        "matchCount": "1",
        "teardown": [
            "$TC qdisc del dev $DEV1 ingress",
            [
                "sleep 1; $TC actions flush action gact",
                0,
                1
            ]
        ]
    }
]
