net_sockets: change service so it can be used for all the NICS.
[barrelfish] / tools / harness / tests / devif_test.py
1 ##########################################################################
2 # Copyright (c) 2017, ETH Zurich.
3 # All rights reserved.
4 #
5 # This file is distributed under the terms in the attached LICENSE file.
6 # If you do not find this file, copies can be found by writing to:
7 # ETH Zurich D-INFK, Haldeneggsteig 4, CH-8092 Zurich. Attn: Systems Group.
8 ##########################################################################
9
10 import re, datetime
11 import debug, tests
12 import subprocess
13 import os
14 import socket, struct, fcntl
15 import thread
16 from common import TestCommon, TimeoutError
17 from results import RowResults, PassFailResult
18
19 TEST_TIMEOUT = datetime.timedelta(minutes=8)
20
21 mac = {'babybel1': 130587495626, 
22        'babybel2': 130587510022,
23        'babybel3': 130587512798,
24        'babybel4': 130589790232,
25        'ziger2': 65817495764,
26        'ziger1': 116527143012, }
27
28 # Fallback if gethostip does not work
29 ip = {'babybel1': 174982272, 
30        'babybel2': 174982270,
31        'babybel3': 174982271,
32        'ziger2': 174982183,
33        'ziger1': 174982183, }
34
35
36 class DevifTests(TestCommon):
37
38     def __init__(self, options):
39         super(DevifTests, self).__init__(options)
40
41     def get_module_name(self):
42         return "devif_test"
43
44     def boot(self, *args):
45         super(DevifTests, self).boot(*args)
46         self.set_timeout(TEST_TIMEOUT)
47
48     def get_decimal_ip(self, hostname):
49         try:
50             iphex = subprocess.check_output('gethostip -x %s' % hostname, shell=True)
51             return '%d' % int(iphex, 16)
52         except:
53             return ip[hostname.split('-')[0]]
54       
55     def get_local_mac(self, ifname):
56         s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
57         info = fcntl.ioctl(s.fileno(), 0x8927,  struct.pack('256s', ifname[:15]))
58         hexmac = ''.join(['%02x' % ord(char) for char in info[18:24]])
59         return '%d' % int(hexmac, 16)
60
61     def get_modules(self, build, machine):
62         self.machine = machine.name
63         modules = super(DevifTests, self).get_modules(build, machine)
64         modules.add_module("e10k", ["auto", "function=0"])
65         modules.add_module("net_sockets_server", ["auto"])
66         modules.add_module("sfn5122f", ["auto", "function=0"])
67         modules.add_module("devif_idc", ["core=1"])
68
69         hostname = '%s.in.barrelfish.org' % subprocess.check_output('hostname -s', shell=True).rstrip()
70         src_ip = self.get_decimal_ip(hostname)
71
72         if 'ziger2' in machine.name:
73             dst_ip = self.get_decimal_ip('%s-sf.in.barrelfish.org' % machine.name)
74         else:
75             dst_ip = self.get_decimal_ip('%s-e10k.in.barrelfish.org' % machine.name)
76
77         modules.add_module(self.get_module_name(), ["core=2", self.OP, src_ip, dst_ip, self.CARD])
78         return modules
79
80     def get_finish_string(self):
81         return "SUCCESS"
82
83
84     def thread_func (self, dummy, dummy2):
85         s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
86         while True:
87             s.sendto("Data Data Data", (self.ip, 7))
88             
89     def start_loop(self):
90         self.thread = thread.start_new_thread(self.thread_func, (self, 0))
91
92     def process_line(self, line):
93         m = re.match(r'# IP Addr (\d+\.\d+\.\d+\.\d+)', line)
94         if m:
95             self.start_loop()
96             self.ip = m.group(1)
97
98
99     def process_data(self, testdir, rawiter):
100         for line in rawiter:
101             if "SUCCESS" in line:
102                 return PassFailResult(True)
103
104         return PassFailResult(False)
105
106
107 @tests.add_test
108 class DevifNetTxSF(DevifTests):
109     ''' Devif Net TX Test'''
110     name = "devif_nettx_sf"
111     OP = "net_tx"
112     CARD = "sfn5122f"
113
114 @tests.add_test
115 class DevifNetTxE10k(DevifTests):
116     ''' Devif Net TX Test'''
117     name = "devif_nettx_e10k"
118     OP = "net_tx"
119     CARD = "e10k"
120
121 @tests.add_test
122 class DevifNetRxSF(DevifTests):
123     ''' Devif Net RX Test'''
124     name = "devif_netrx_sf"
125     OP = "net_rx"
126     CARD = "sfn5122f"
127
128 @tests.add_test
129 class DevifNetRxE10k(DevifTests):
130     ''' Devif Net RX Test'''
131     name = "devif_netrx_e10k"
132     OP = "net_rx"
133     CARD = "e10k"
134
135 @tests.add_test
136 class DevifIdcTest(DevifTests):
137     ''' Devif IDC Test'''
138     name = "devif_idc_test"
139     OP = "idc"
140     CARD = "none"
141
142 @tests.add_test
143 class DevifDebug(DevifTests):
144     ''' Devif Debug Backend Test'''
145     name = "devif_debug"
146
147     def get_modules(self, build, machine):
148         self.machine = machine.name
149         modules = super(DevifTests, self).get_modules(build, machine)
150         modules.add_module("devif_idc", ["core=1"])
151         modules.add_module("devif_debug_test")
152
153         return modules
154
155 @tests.add_test
156 class DevifUDP(DevifTests):
157     ''' Devif UDP Backend Test'''
158     name = "devif_udp"
159     data = ("Data Data Data Data")
160
161     def get_module_name(self):
162         return "devif_udp"
163
164     def get_modules(self, build, machine):
165         self.machine = machine.name
166         modules = super(DevifTests, self).get_modules(build, machine)
167         modules.add_module("net_sockets_server", ["auto"])
168         hostname = '%s.in.barrelfish.org' % subprocess.check_output('hostname -s', shell=True).rstrip()
169         dst_ip = self.get_decimal_ip(hostname)
170         dst_mac = self.get_local_mac('eno2')
171
172         if 'ziger2' in machine.name:
173             src_ip = self.get_decimal_ip('%s-sf.in.barrelfish.org' % machine.name)
174             modules.add_module("sfn5122f", ["auto", "function=0"])
175             self.cardname = "sfn5122f"
176         else:
177             modules.add_module("e10k", ["auto", "function=0"])
178             src_ip = self.get_decimal_ip('%s-e10k.in.barrelfish.org' % machine.name)
179             self.cardname = "e10k"
180
181         src_mac =  mac[machine.name]
182
183         modules.add_module(self.get_module_name(), ["core=2", dst_ip, dst_mac, 20000, 20000, self.cardname])
184         return modules
185
186     def thread_func (self, dummy, dummy2):
187         s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
188         while True:
189             s.sendto(self.data, (self.ip, 20000))
190
191     def start_loop(self):
192         self.thread = thread.start_new_thread(self.thread_func, (self, 0))
193
194     def process_line(self, line):
195         m = re.match(r'# IP Addr (\d+\.\d+\.\d+\.\d+)', line)
196         if m:
197             self.ip = m.group(1)
198
199         m1 = re.match(r'Testing receiving UDP packets', line)
200         if m1:
201             self.start_loop()
202
203     def process_data(self, testdir, rawiter):
204         for line in rawiter:
205             if "SUCCESS" in line:
206                 return PassFailResult(True)
207
208         return PassFailResult(False)
209
210 #@tests.add_test
211 #class DevifUPDecho(DevifUDP):
212 #    ''' Devif Debug Backend Test'''
213 #    name = "devif_udp_echo"
214 #
215 #    def get_module_name(self):
216 #        return "devif_echo"
217
218
219