#!/usr/bin/env python3
# Copyright (C) 2023 The Android Open Source Project
#
# 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 a
#
#      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.

from python.generators.diff_tests.testing import Path, DataPath, Metric
from python.generators.diff_tests.testing import Csv, Json, TextProto
from python.generators.diff_tests.testing import DiffTestBlueprint
from python.generators.diff_tests.testing import TestSuite


class Network(TestSuite):
  # Network performance
  def test_netif_receive_skb(self):
    return DiffTestBlueprint(
        trace=Path('netif_receive_skb.textproto'),
        query="""
        SELECT
          ts,
          REPLACE(name, " Received KB", "") AS dev,
          EXTRACT_ARG(arg_set_id, 'cpu') AS cpu,
          EXTRACT_ARG(arg_set_id, 'len') AS len
        FROM
          counter AS c
        LEFT JOIN
          counter_track AS t
          ON c.track_id = t.id
        WHERE
          name GLOB "* Received KB"
        ORDER BY ts;
        """,
        out=Csv("""
        "ts","dev","cpu","len"
        10000,"rmnet0",0,1000
        10000,"rmnet0",1,1000
        10010,"rmnet0",0,1000
        10011,"rmnet0",1,1000
        12000,"wlan",4,1300
        """))

  def test_net_dev_xmit(self):
    return DiffTestBlueprint(
        trace=Path('net_dev_xmit.textproto'),
        query="""
        SELECT
          ts,
          REPLACE(name, " Transmitted KB", "") AS dev,
          EXTRACT_ARG(arg_set_id, 'cpu') AS cpu,
          EXTRACT_ARG(arg_set_id, 'len') AS len
        FROM
          counter AS c
        LEFT JOIN
          counter_track AS t
          ON c.track_id = t.id
        WHERE
          name GLOB "* Transmitted KB"
        ORDER BY ts;
        """,
        out=Csv("""
        "ts","dev","cpu","len"
        10000,"rmnet0",0,1000
        10000,"rmnet0",1,1000
        10010,"rmnet0",0,1000
        12000,"wlan0",4,1300
        """))

  def test_netperf_metric(self):
    return DiffTestBlueprint(
        trace=Path('netperf_metric.textproto'),
        query=Metric('android_netperf'),
        out=Path('netperf_metric.out'))

  def test_inet_sock_set_state(self):
    return DiffTestBlueprint(
        trace=Path('inet_sock_set_state.textproto'),
        query="""
        SELECT
          ts,
          s.name,
          dur,
          t.name
        FROM
          slice AS s
        LEFT JOIN track AS t
          ON s.track_id = t.id
        WHERE
          t.name GLOB "TCP stream#*"
        ORDER BY ts;
        """,
        out=Csv("""
        "ts","name","dur","name"
        10000000,"TCP_SYN_SENT(pid=123)",100000000,"TCP stream#1"
        110000000,"TCP_ESTABLISHED(sport=56789,dport=5001)",500000000,"TCP stream#1"
        610000000,"TCP_CLOSE_WAIT",-1,"TCP stream#1"
        710000000,"TCP_SYN_SENT(pid=567)",10000000,"TCP stream#2"
        720000000,"TCP_ESTABLISHED(sport=56790,dport=5002)",300000000,"TCP stream#2"
        1020000000,"TCP_CLOSE_WAIT",-1,"TCP stream#2"
        """))

  def test_tcp_retransmit_skb(self):
    return DiffTestBlueprint(
        trace=TextProto(r"""
        packet {
          ftrace_events {
            cpu: 1
            event {
              timestamp: 110000000
              pid: 234
              tcp_retransmit_skb {
                daddr: 19216801
                saddr: 127001
                dport: 5001
                sport: 56789
                state: 1
                skaddr: 77889900
              }
            }
          }
        }
        packet {
          ftrace_events {
            cpu: 1
            event {
              timestamp: 720000000
              pid: 234
              tcp_retransmit_skb {
                daddr: 0
                saddr: 0
                dport: 5002
                sport: 56790
                state: 2
                skaddr: 33445566
              }
            }
          }
        }
        """),
        query="""
        SELECT
          ts,
          s.name,
          dur
        FROM
          slice AS s
        LEFT JOIN track AS t
          ON s.track_id = t.id
        WHERE
          t.name = "TCP Retransmit Skb"
        ORDER BY ts;
        """,
        out=Csv("""
        "ts","name","dur"
        110000000,"sport=56789,dport=5001",0
        720000000,"sport=56790,dport=5002",0
        """))

  def test_napi_gro_receive(self):
    return DiffTestBlueprint(
        trace=Path('napi_gro_receive.textproto'),
        query="""
        SELECT
          ts,
          s.name,
          dur,
          cat,
          t.name,
          EXTRACT_ARG(arg_set_id, 'ret') AS ret,
          EXTRACT_ARG(arg_set_id, 'len') AS len
        FROM
          slice AS s
        LEFT JOIN
          track AS t
          ON s.track_id = t.id
        WHERE
          t.name GLOB "Napi Gro Cpu *"
        ORDER BY ts;
        """,
        out=Csv("""
        "ts","name","dur","cat","name","ret","len"
        10000,"rmnet0",20,"napi_gro","Napi Gro Cpu 2",2,1000
        20000,"rmnet0",20,"napi_gro","Napi Gro Cpu 2",1,1000
        30000,"wlan",20,"napi_gro","Napi Gro Cpu 4",3,500
        """))

  def test_kfree_skb(self):
    return DiffTestBlueprint(
        trace=TextProto(r"""
        packet {
          ftrace_events {
            cpu: 2
            event {
              timestamp: 10000
              pid: 200
              kfree_skb {
                protocol: 2048
              }
            }
          }
        }
        packet {
          ftrace_events {
            cpu: 2
            event {
              timestamp: 10020
              pid: 300
              kfree_skb {
                protocol: 34525
              }
            }
          }
        }
        packet {
          ftrace_events {
            cpu: 2
            event {
              timestamp: 20000
              pid: 200
              kfree_skb {
                protocol: 1536
              }
            }
          }
        }
        packet {
          ftrace_events {
            cpu: 2
            event {
              timestamp: 20020
              pid: 300
              kfree_skb {
                protocol: 2048
              }
            }
          }
        }
        """),
        query="""
        SELECT
          ts,
          value,
          EXTRACT_ARG(arg_set_id, 'protocol') AS prot
        FROM
          counter AS c
        LEFT JOIN
          counter_track AS t
          ON c.track_id = t.id
        WHERE
          name GLOB "Kfree Skb IP Prot"
        ORDER BY ts;
        """,
        out=Csv("""
        "ts","value","prot"
        10000,1.000000,"IP"
        10020,2.000000,"IPV6"
        20020,3.000000,"IP"
        """))
