#!/usr/bin/env python3
# Copyright (c) 2007, 2009 Arista Networks, Inc.  All rights reserved.
# Arista Networks, Inc. Confidential and Proprietary.

import os, sys, ManagedSubprocess

intfa = sys.argv[1]
intfb = sys.argv[2]
if len( sys.argv ) >= 4:
   count = int( sys.argv[3] )
else:
   count = 10000

verbose=False
if verbose:
   print( "sending traffic on", intfa, "expecting it to show up on", intfb )

def counters( intf ):
   result = {}
   # pylint: disable-next=redefined-outer-name,consider-using-f-string
   counters = os.listdir( '/sys/class/net/%s/statistics' % intf )
   for i in counters: # pylint: disable=redefined-outer-name
      # pylint: disable-next=consider-using-f-string,consider-using-with
      result[ i ] = int( open( '/sys/class/net/{}/statistics/{}'.format( intf,
         i ) ).read() )
   return result

def macAddress( intf ):
   # read the mac addr and chop the trailing slash
   # pylint: disable-next=consider-using-f-string,consider-using-with
   addr = open( '/sys/class/net/%s/address' % intf ).read()
   return addr[:-1]

a0 = counters( intfa )
b0 = counters( intfb )

addrb = macAddress( intfb )

# guts of ethxmit goes here
cmd = ["ethxmit", "-s","64",intfa,"-D",addrb,
       "-b","100","--sleep",".01","-n", str(count)]
p = ManagedSubprocess.Popen(argv=cmd,prefix="")
p.wait()

a1 = counters( intfa )
b1 = counters( intfb )

adiff = {}
bdiff = {}
# pylint: disable-next=consider-using-dict-items,multiple-statements
for i in a1:  adiff[i] = a1[i] - a0[i]
# pylint: disable-next=consider-using-dict-items,multiple-statements
for i in b1:  bdiff[i] = b1[i] - b0[i]

tx = adiff['tx_packets']
rx = bdiff['rx_packets']

exitCode = 0
if ((tx - rx) / count) > .05:
   print( "Error: packet loss exceeded 5 percent" )
   exitCode = 1

if verbose or exitCode:
   print( f"tx packets on {intfa}: {tx}" )
   print( f"rx packets on {intfb}: {rx}" )

sys.exit( exitCode )
