harness: devif test gethostip sometimes fails, fallback added.
[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("sfn5122f", ["auto", "function=0"])
66         modules.add_module("devif_idc", ["core=1"])
67
68         hostname = '%s.in.barrelfish.org' % subprocess.check_output('hostname -s', shell=True).rstrip()
69         src_ip = self.get_decimal_ip(hostname)
70
71         if 'ziger2' in machine.name:
72             dst_ip = self.get_decimal_ip('%s-sf.in.barrelfish.org' % machine.name)
73         else:
74             dst_ip = self.get_decimal_ip('%s-e10k.in.barrelfish.org' % machine.name)
75
76         modules.add_module(self.get_module_name(), ["core=2", self.OP, src_ip, dst_ip, self.CARD])
77         return modules
78
79     def get_finish_string(self):
80         return "SUCCESS"
81
82
83     def thread_func (self, dummy, dummy2):
84         s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
85         while True:
86             s.sendto("Data Data Data", (self.ip, 7))
87             
88     def start_loop(self):
89         self.thread = thread.start_new_thread(self.thread_func, (self, 0))
90
91     def process_line(self, line):
92         m = re.match(r'# IP Addr (\d+\.\d+\.\d+\.\d+)', line)
93         if m:
94             self.start_loop()
95             self.ip = m.group(1)
96
97
98     def process_data(self, testdir, rawiter):
99         for line in rawiter:
100             if "SUCCESS" in line:
101                 return PassFailResult(True)
102
103         return PassFailResult(False)
104
105
106 @tests.add_test
107 class DevifNetTxSF(DevifTests):
108     ''' Devif Net TX Test'''
109     name = "devif_nettx_sf"
110     OP = "net_tx"
111     CARD = "sfn5122f"
112
113 @tests.add_test
114 class DevifNetTxE10k(DevifTests):
115     ''' Devif Net TX Test'''
116     name = "devif_nettx_e10k"
117     OP = "net_tx"
118     CARD = "e10k"
119
120 @tests.add_test
121 class DevifNetRxSF(DevifTests):
122     ''' Devif Net RX Test'''
123     name = "devif_netrx_sf"
124     OP = "net_rx"
125     CARD = "sfn5122f"
126
127 @tests.add_test
128 class DevifNetRxE10k(DevifTests):
129     ''' Devif Net RX Test'''
130     name = "devif_netrx_e10k"
131     OP = "net_rx"
132     CARD = "e10k"
133
134 @tests.add_test
135 class DevifIdcTest(DevifTests):
136     ''' Devif IDC Test'''
137     name = "devif_idc_test"
138     OP = "idc"
139     CARD = "none"
140
141 @tests.add_test
142 class DevifDebug(DevifTests):
143     ''' Devif Debug Backend Test'''
144     name = "devif_debug"
145
146     def get_modules(self, build, machine):
147         self.machine = machine.name
148         modules = super(DevifTests, self).get_modules(build, machine)
149         modules.add_module("devif_idc", ["core=1"])
150         modules.add_module("devif_debug_test")
151
152         return modules
153
154 @tests.add_test
155 class DevifUDP(DevifTests):
156     ''' Devif UDP Backend Test'''
157     name = "devif_udp"
158     data = ("Data Data Data Data")
159
160     def get_module_name(self):
161         return "devif_udp"
162
163     def get_modules(self, build, machine):
164         self.machine = machine.name
165         modules = super(DevifTests, self).get_modules(build, machine)
166         hostname = '%s.in.barrelfish.org' % subprocess.check_output('hostname -s', shell=True).rstrip()
167         dst_ip = self.get_decimal_ip(hostname)
168         dst_mac = self.get_local_mac('eno2')
169
170         if 'ziger2' in machine.name:
171             src_ip = self.get_decimal_ip('%s-sf.in.barrelfish.org' % machine.name)
172             modules.add_module("sfn5122f", ["auto", "function=0"])
173             self.cardname = "sfn5122f"
174         else:
175             modules.add_module("e10k", ["auto", "function=0"])
176             src_ip = self.get_decimal_ip('%s-e10k.in.barrelfish.org' % machine.name)
177             self.cardname = "e10k"
178
179         src_mac =  mac[machine.name]
180
181         modules.add_module(self.get_module_name(), ["core=2", dst_ip, dst_mac, 20000, 20000, self.cardname])
182         return modules
183
184     def thread_func (self, dummy, dummy2):
185         s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
186         while True:
187             s.sendto(self.data, (self.ip, 20000))
188
189     def start_loop(self):
190         self.thread = thread.start_new_thread(self.thread_func, (self, 0))
191
192     def process_line(self, line):
193         m = re.match(r'# IP Addr (\d+\.\d+\.\d+\.\d+)', line)
194         if m:
195             self.ip = m.group(1)
196
197         m1 = re.match(r'Testing receiving UDP packets', line)
198         if m1:
199             self.start_loop()
200
201     def process_data(self, testdir, rawiter):
202         for line in rawiter:
203             if "SUCCESS" in line:
204                 return PassFailResult(True)
205
206         return PassFailResult(False)
207
208 #@tests.add_test
209 #class DevifUPDecho(DevifUDP):
210 #    ''' Devif Debug Backend Test'''
211 #    name = "devif_udp_echo"
212 #
213 #    def get_module_name(self):
214 #        return "devif_echo"
215
216
217