Statistics
| Branch: | Tag: | Revision:

root / test / ganeti.netutils_unittest.py @ 3b877f08

History | View | Annotate | Download (14.3 kB)

1 a744b676 Manuel Franceschini
#!/usr/bin/python
2 a744b676 Manuel Franceschini
#
3 a744b676 Manuel Franceschini
4 a744b676 Manuel Franceschini
# Copyright (C) 2010 Google Inc.
5 a744b676 Manuel Franceschini
#
6 a744b676 Manuel Franceschini
# This program is free software; you can redistribute it and/or modify
7 a744b676 Manuel Franceschini
# it under the terms of the GNU General Public License as published by
8 a744b676 Manuel Franceschini
# the Free Software Foundation; either version 2 of the License, or
9 a744b676 Manuel Franceschini
# (at your option) any later version.
10 a744b676 Manuel Franceschini
#
11 a744b676 Manuel Franceschini
# This program is distributed in the hope that it will be useful, but
12 a744b676 Manuel Franceschini
# WITHOUT ANY WARRANTY; without even the implied warranty of
13 a744b676 Manuel Franceschini
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 a744b676 Manuel Franceschini
# General Public License for more details.
15 a744b676 Manuel Franceschini
#
16 a744b676 Manuel Franceschini
# You should have received a copy of the GNU General Public License
17 a744b676 Manuel Franceschini
# along with this program; if not, write to the Free Software
18 a744b676 Manuel Franceschini
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 a744b676 Manuel Franceschini
# 02110-1301, USA.
20 a744b676 Manuel Franceschini
21 a744b676 Manuel Franceschini
22 a744b676 Manuel Franceschini
"""Script for unittesting the netutils module"""
23 a744b676 Manuel Franceschini
24 a744b676 Manuel Franceschini
import os
25 a744b676 Manuel Franceschini
import shutil
26 a744b676 Manuel Franceschini
import socket
27 a744b676 Manuel Franceschini
import tempfile
28 a744b676 Manuel Franceschini
import unittest
29 a744b676 Manuel Franceschini
30 a744b676 Manuel Franceschini
import testutils
31 a744b676 Manuel Franceschini
from ganeti import constants
32 a744b676 Manuel Franceschini
from ganeti import errors
33 a744b676 Manuel Franceschini
from ganeti import netutils
34 a744b676 Manuel Franceschini
from ganeti import serializer
35 a744b676 Manuel Franceschini
from ganeti import utils
36 a744b676 Manuel Franceschini
37 a744b676 Manuel Franceschini
38 a744b676 Manuel Franceschini
def _GetSocketCredentials(path):
39 a744b676 Manuel Franceschini
  """Connect to a Unix socket and return remote credentials.
40 a744b676 Manuel Franceschini

41 a744b676 Manuel Franceschini
  """
42 a744b676 Manuel Franceschini
  sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
43 a744b676 Manuel Franceschini
  try:
44 a744b676 Manuel Franceschini
    sock.settimeout(10)
45 a744b676 Manuel Franceschini
    sock.connect(path)
46 a744b676 Manuel Franceschini
    return netutils.GetSocketCredentials(sock)
47 a744b676 Manuel Franceschini
  finally:
48 a744b676 Manuel Franceschini
    sock.close()
49 a744b676 Manuel Franceschini
50 a744b676 Manuel Franceschini
51 a744b676 Manuel Franceschini
class TestGetSocketCredentials(unittest.TestCase):
52 a744b676 Manuel Franceschini
  def setUp(self):
53 a744b676 Manuel Franceschini
    self.tmpdir = tempfile.mkdtemp()
54 a744b676 Manuel Franceschini
    self.sockpath = utils.PathJoin(self.tmpdir, "sock")
55 a744b676 Manuel Franceschini
56 a744b676 Manuel Franceschini
    self.listener = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
57 a744b676 Manuel Franceschini
    self.listener.settimeout(10)
58 a744b676 Manuel Franceschini
    self.listener.bind(self.sockpath)
59 a744b676 Manuel Franceschini
    self.listener.listen(1)
60 a744b676 Manuel Franceschini
61 a744b676 Manuel Franceschini
  def tearDown(self):
62 a744b676 Manuel Franceschini
    self.listener.shutdown(socket.SHUT_RDWR)
63 a744b676 Manuel Franceschini
    self.listener.close()
64 a744b676 Manuel Franceschini
    shutil.rmtree(self.tmpdir)
65 a744b676 Manuel Franceschini
66 a744b676 Manuel Franceschini
  def test(self):
67 a744b676 Manuel Franceschini
    (c2pr, c2pw) = os.pipe()
68 a744b676 Manuel Franceschini
69 a744b676 Manuel Franceschini
    # Start child process
70 a744b676 Manuel Franceschini
    child = os.fork()
71 a744b676 Manuel Franceschini
    if child == 0:
72 a744b676 Manuel Franceschini
      try:
73 a744b676 Manuel Franceschini
        data = serializer.DumpJson(_GetSocketCredentials(self.sockpath))
74 a744b676 Manuel Franceschini
75 a744b676 Manuel Franceschini
        os.write(c2pw, data)
76 a744b676 Manuel Franceschini
        os.close(c2pw)
77 a744b676 Manuel Franceschini
78 a744b676 Manuel Franceschini
        os._exit(0)
79 a744b676 Manuel Franceschini
      finally:
80 a744b676 Manuel Franceschini
        os._exit(1)
81 a744b676 Manuel Franceschini
82 a744b676 Manuel Franceschini
    os.close(c2pw)
83 a744b676 Manuel Franceschini
84 a744b676 Manuel Franceschini
    # Wait for one connection
85 a744b676 Manuel Franceschini
    (conn, _) = self.listener.accept()
86 a744b676 Manuel Franceschini
    conn.recv(1)
87 a744b676 Manuel Franceschini
    conn.close()
88 a744b676 Manuel Franceschini
89 a744b676 Manuel Franceschini
    # Wait for result
90 a744b676 Manuel Franceschini
    result = os.read(c2pr, 4096)
91 a744b676 Manuel Franceschini
    os.close(c2pr)
92 a744b676 Manuel Franceschini
93 a744b676 Manuel Franceschini
    # Check child's exit code
94 a744b676 Manuel Franceschini
    (_, status) = os.waitpid(child, 0)
95 a744b676 Manuel Franceschini
    self.assertFalse(os.WIFSIGNALED(status))
96 a744b676 Manuel Franceschini
    self.assertEqual(os.WEXITSTATUS(status), 0)
97 a744b676 Manuel Franceschini
98 a744b676 Manuel Franceschini
    # Check result
99 a744b676 Manuel Franceschini
    (pid, uid, gid) = serializer.LoadJson(result)
100 a744b676 Manuel Franceschini
    self.assertEqual(pid, os.getpid())
101 a744b676 Manuel Franceschini
    self.assertEqual(uid, os.getuid())
102 a744b676 Manuel Franceschini
    self.assertEqual(gid, os.getgid())
103 a744b676 Manuel Franceschini
104 a744b676 Manuel Franceschini
105 b705c7a6 Manuel Franceschini
class TestHostname(unittest.TestCase):
106 b705c7a6 Manuel Franceschini
  """Testing case for Hostname"""
107 a744b676 Manuel Franceschini
108 a744b676 Manuel Franceschini
  def testUppercase(self):
109 a744b676 Manuel Franceschini
    data = "AbC.example.com"
110 b705c7a6 Manuel Franceschini
    self.assertEqual(netutils.Hostname.GetNormalizedName(data), data.lower())
111 a744b676 Manuel Franceschini
112 a744b676 Manuel Franceschini
  def testTooLongName(self):
113 a744b676 Manuel Franceschini
    data = "a.b." + "c" * 255
114 b705c7a6 Manuel Franceschini
    self.assertRaises(errors.OpPrereqError,
115 b705c7a6 Manuel Franceschini
                      netutils.Hostname.GetNormalizedName, data)
116 a744b676 Manuel Franceschini
117 a744b676 Manuel Franceschini
  def testTrailingDot(self):
118 a744b676 Manuel Franceschini
    data = "a.b.c"
119 b705c7a6 Manuel Franceschini
    self.assertEqual(netutils.Hostname.GetNormalizedName(data + "."), data)
120 a744b676 Manuel Franceschini
121 a744b676 Manuel Franceschini
  def testInvalidName(self):
122 a744b676 Manuel Franceschini
    data = [
123 a744b676 Manuel Franceschini
      "a b",
124 a744b676 Manuel Franceschini
      "a/b",
125 a744b676 Manuel Franceschini
      ".a.b",
126 a744b676 Manuel Franceschini
      "a..b",
127 a744b676 Manuel Franceschini
      ]
128 a744b676 Manuel Franceschini
    for value in data:
129 b705c7a6 Manuel Franceschini
      self.assertRaises(errors.OpPrereqError,
130 b705c7a6 Manuel Franceschini
                        netutils.Hostname.GetNormalizedName, value)
131 a744b676 Manuel Franceschini
132 a744b676 Manuel Franceschini
  def testValidName(self):
133 a744b676 Manuel Franceschini
    data = [
134 a744b676 Manuel Franceschini
      "a.b",
135 a744b676 Manuel Franceschini
      "a-b",
136 a744b676 Manuel Franceschini
      "a_b",
137 a744b676 Manuel Franceschini
      "a.b.c",
138 a744b676 Manuel Franceschini
      ]
139 a744b676 Manuel Franceschini
    for value in data:
140 b705c7a6 Manuel Franceschini
      self.assertEqual(netutils.Hostname.GetNormalizedName(value), value)
141 a744b676 Manuel Franceschini
142 a744b676 Manuel Franceschini
143 8b312c1d Manuel Franceschini
class TestIPAddress(unittest.TestCase):
144 8b312c1d Manuel Franceschini
  def testIsValid(self):
145 8b312c1d Manuel Franceschini
    self.assert_(netutils.IPAddress.IsValid("0.0.0.0"))
146 8b312c1d Manuel Franceschini
    self.assert_(netutils.IPAddress.IsValid("127.0.0.1"))
147 8b312c1d Manuel Franceschini
    self.assert_(netutils.IPAddress.IsValid("::"))
148 8b312c1d Manuel Franceschini
    self.assert_(netutils.IPAddress.IsValid("::1"))
149 8b312c1d Manuel Franceschini
150 8b312c1d Manuel Franceschini
  def testNotIsValid(self):
151 8b312c1d Manuel Franceschini
    self.assertFalse(netutils.IPAddress.IsValid("0"))
152 8b312c1d Manuel Franceschini
    self.assertFalse(netutils.IPAddress.IsValid("1.1.1.256"))
153 8b312c1d Manuel Franceschini
    self.assertFalse(netutils.IPAddress.IsValid("a:g::1"))
154 8b312c1d Manuel Franceschini
155 8b312c1d Manuel Franceschini
  def testGetAddressFamily(self):
156 8b312c1d Manuel Franceschini
    fn = netutils.IPAddress.GetAddressFamily
157 8b312c1d Manuel Franceschini
    self.assertEqual(fn("127.0.0.1"), socket.AF_INET)
158 8b312c1d Manuel Franceschini
    self.assertEqual(fn("10.2.0.127"), socket.AF_INET)
159 8b312c1d Manuel Franceschini
    self.assertEqual(fn("::1"), socket.AF_INET6)
160 8b312c1d Manuel Franceschini
    self.assertEqual(fn("2001:db8::1"), socket.AF_INET6)
161 8b312c1d Manuel Franceschini
    self.assertRaises(errors.IPAddressError, fn, "0")
162 a744b676 Manuel Franceschini
163 8b312c1d Manuel Franceschini
  def testOwnLoopback(self):
164 8b312c1d Manuel Franceschini
    # FIXME: In a pure IPv6 environment this is no longer true
165 8b312c1d Manuel Franceschini
    self.assert_(netutils.IPAddress.Own("127.0.0.1"),
166 8b312c1d Manuel Franceschini
                 "Should own 127.0.0.1 address")
167 8b312c1d Manuel Franceschini
168 8b312c1d Manuel Franceschini
  def testNotOwnAddress(self):
169 8b312c1d Manuel Franceschini
    self.assertFalse(netutils.IPAddress.Own("2001:db8::1"),
170 8b312c1d Manuel Franceschini
                     "Should not own IP address 2001:db8::1")
171 8b312c1d Manuel Franceschini
    self.assertFalse(netutils.IPAddress.Own("192.0.2.1"),
172 8b312c1d Manuel Franceschini
                     "Should not own IP address 192.0.2.1")
173 8b312c1d Manuel Franceschini
174 8b312c1d Manuel Franceschini
175 8b312c1d Manuel Franceschini
class TestIP4Address(unittest.TestCase):
176 8b312c1d Manuel Franceschini
  def testGetIPIntFromString(self):
177 8b312c1d Manuel Franceschini
    fn = netutils.IP4Address._GetIPIntFromString
178 8b312c1d Manuel Franceschini
    self.assertEqual(fn("0.0.0.0"), 0)
179 8b312c1d Manuel Franceschini
    self.assertEqual(fn("0.0.0.1"), 1)
180 8b312c1d Manuel Franceschini
    self.assertEqual(fn("127.0.0.1"), 2130706433)
181 8b312c1d Manuel Franceschini
    self.assertEqual(fn("192.0.2.129"), 3221226113)
182 8b312c1d Manuel Franceschini
    self.assertEqual(fn("255.255.255.255"), 2**32 - 1)
183 8b312c1d Manuel Franceschini
    self.assertNotEqual(fn("0.0.0.0"), 1)
184 8b312c1d Manuel Franceschini
    self.assertNotEqual(fn("0.0.0.0"), 1)
185 8b312c1d Manuel Franceschini
186 8b312c1d Manuel Franceschini
  def testIsValid(self):
187 8b312c1d Manuel Franceschini
    self.assert_(netutils.IP4Address.IsValid("0.0.0.0"))
188 8b312c1d Manuel Franceschini
    self.assert_(netutils.IP4Address.IsValid("127.0.0.1"))
189 8b312c1d Manuel Franceschini
    self.assert_(netutils.IP4Address.IsValid("192.0.2.199"))
190 8b312c1d Manuel Franceschini
    self.assert_(netutils.IP4Address.IsValid("255.255.255.255"))
191 8b312c1d Manuel Franceschini
192 8b312c1d Manuel Franceschini
  def testNotIsValid(self):
193 8b312c1d Manuel Franceschini
    self.assertFalse(netutils.IP4Address.IsValid("0"))
194 8b312c1d Manuel Franceschini
    self.assertFalse(netutils.IP4Address.IsValid("1"))
195 8b312c1d Manuel Franceschini
    self.assertFalse(netutils.IP4Address.IsValid("1.1.1"))
196 8b312c1d Manuel Franceschini
    self.assertFalse(netutils.IP4Address.IsValid("255.255.255.256"))
197 8b312c1d Manuel Franceschini
    self.assertFalse(netutils.IP4Address.IsValid("::1"))
198 8b312c1d Manuel Franceschini
199 8b312c1d Manuel Franceschini
  def testInNetwork(self):
200 8b312c1d Manuel Franceschini
    self.assert_(netutils.IP4Address.InNetwork("127.0.0.0/8", "127.0.0.1"))
201 8b312c1d Manuel Franceschini
202 8b312c1d Manuel Franceschini
  def testNotInNetwork(self):
203 8b312c1d Manuel Franceschini
    self.assertFalse(netutils.IP4Address.InNetwork("192.0.2.0/24",
204 8b312c1d Manuel Franceschini
                                                   "127.0.0.1"))
205 8b312c1d Manuel Franceschini
206 8b312c1d Manuel Franceschini
  def testIsLoopback(self):
207 8b312c1d Manuel Franceschini
    self.assert_(netutils.IP4Address.IsLoopback("127.0.0.1"))
208 8b312c1d Manuel Franceschini
209 8b312c1d Manuel Franceschini
  def testNotIsLoopback(self):
210 8b312c1d Manuel Franceschini
    self.assertFalse(netutils.IP4Address.IsLoopback("192.0.2.1"))
211 8b312c1d Manuel Franceschini
212 8b312c1d Manuel Franceschini
213 8b312c1d Manuel Franceschini
class TestIP6Address(unittest.TestCase):
214 8b312c1d Manuel Franceschini
  def testGetIPIntFromString(self):
215 8b312c1d Manuel Franceschini
    fn = netutils.IP6Address._GetIPIntFromString
216 8b312c1d Manuel Franceschini
    self.assertEqual(fn("::"), 0)
217 8b312c1d Manuel Franceschini
    self.assertEqual(fn("::1"), 1)
218 8b312c1d Manuel Franceschini
    self.assertEqual(fn("2001:db8::1"),
219 8b312c1d Manuel Franceschini
                     42540766411282592856903984951653826561L)
220 8b312c1d Manuel Franceschini
    self.assertEqual(fn("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"), 2**128-1)
221 8b312c1d Manuel Franceschini
    self.assertNotEqual(netutils.IP6Address._GetIPIntFromString("::2"), 1)
222 8b312c1d Manuel Franceschini
223 8b312c1d Manuel Franceschini
  def testIsValid(self):
224 8b312c1d Manuel Franceschini
    self.assert_(netutils.IP6Address.IsValid("::"))
225 8b312c1d Manuel Franceschini
    self.assert_(netutils.IP6Address.IsValid("::1"))
226 8b312c1d Manuel Franceschini
    self.assert_(netutils.IP6Address.IsValid("1" + (":1" * 7)))
227 8b312c1d Manuel Franceschini
    self.assert_(netutils.IP6Address.IsValid("ffff" + (":ffff" * 7)))
228 8b312c1d Manuel Franceschini
    self.assert_(netutils.IP6Address.IsValid("::"))
229 8b312c1d Manuel Franceschini
230 8b312c1d Manuel Franceschini
  def testNotIsValid(self):
231 8b312c1d Manuel Franceschini
    self.assertFalse(netutils.IP6Address.IsValid("0"))
232 8b312c1d Manuel Franceschini
    self.assertFalse(netutils.IP6Address.IsValid(":1"))
233 8b312c1d Manuel Franceschini
    self.assertFalse(netutils.IP6Address.IsValid("f" + (":f" * 6)))
234 8b312c1d Manuel Franceschini
    self.assertFalse(netutils.IP6Address.IsValid("fffg" + (":ffff" * 7)))
235 8b312c1d Manuel Franceschini
    self.assertFalse(netutils.IP6Address.IsValid("fffff" + (":ffff" * 7)))
236 8b312c1d Manuel Franceschini
    self.assertFalse(netutils.IP6Address.IsValid("1" + (":1" * 8)))
237 8b312c1d Manuel Franceschini
    self.assertFalse(netutils.IP6Address.IsValid("127.0.0.1"))
238 8b312c1d Manuel Franceschini
239 8b312c1d Manuel Franceschini
  def testInNetwork(self):
240 8b312c1d Manuel Franceschini
    self.assert_(netutils.IP6Address.InNetwork("::1/128", "::1"))
241 8b312c1d Manuel Franceschini
242 8b312c1d Manuel Franceschini
  def testNotInNetwork(self):
243 8b312c1d Manuel Franceschini
    self.assertFalse(netutils.IP6Address.InNetwork("2001:db8::1/128", "::1"))
244 8b312c1d Manuel Franceschini
245 8b312c1d Manuel Franceschini
  def testIsLoopback(self):
246 8b312c1d Manuel Franceschini
    self.assert_(netutils.IP6Address.IsLoopback("::1"))
247 8b312c1d Manuel Franceschini
248 8b312c1d Manuel Franceschini
  def testNotIsLoopback(self):
249 8b312c1d Manuel Franceschini
    self.assertFalse(netutils.IP6Address.IsLoopback("2001:db8::1"))
250 a744b676 Manuel Franceschini
251 a744b676 Manuel Franceschini
252 a744b676 Manuel Franceschini
class _BaseTcpPingTest:
253 a744b676 Manuel Franceschini
  """Base class for TcpPing tests against listen(2)ing port"""
254 a744b676 Manuel Franceschini
  family = None
255 a744b676 Manuel Franceschini
  address = None
256 a744b676 Manuel Franceschini
257 a744b676 Manuel Franceschini
  def setUp(self):
258 a744b676 Manuel Franceschini
    self.listener = socket.socket(self.family, socket.SOCK_STREAM)
259 a744b676 Manuel Franceschini
    self.listener.bind((self.address, 0))
260 a744b676 Manuel Franceschini
    self.listenerport = self.listener.getsockname()[1]
261 a744b676 Manuel Franceschini
    self.listener.listen(1)
262 a744b676 Manuel Franceschini
263 a744b676 Manuel Franceschini
  def tearDown(self):
264 a744b676 Manuel Franceschini
    self.listener.shutdown(socket.SHUT_RDWR)
265 a744b676 Manuel Franceschini
    del self.listener
266 a744b676 Manuel Franceschini
    del self.listenerport
267 a744b676 Manuel Franceschini
268 a744b676 Manuel Franceschini
  def testTcpPingToLocalHostAccept(self):
269 a744b676 Manuel Franceschini
    self.assert_(netutils.TcpPing(self.address,
270 a744b676 Manuel Franceschini
                                  self.listenerport,
271 a744b676 Manuel Franceschini
                                  timeout=constants.TCP_PING_TIMEOUT,
272 a744b676 Manuel Franceschini
                                  live_port_needed=True,
273 a744b676 Manuel Franceschini
                                  source=self.address,
274 a744b676 Manuel Franceschini
                                  ),
275 a744b676 Manuel Franceschini
                 "failed to connect to test listener")
276 a744b676 Manuel Franceschini
277 a744b676 Manuel Franceschini
    self.assert_(netutils.TcpPing(self.address, self.listenerport,
278 a744b676 Manuel Franceschini
                                  timeout=constants.TCP_PING_TIMEOUT,
279 a744b676 Manuel Franceschini
                                  live_port_needed=True),
280 a744b676 Manuel Franceschini
                 "failed to connect to test listener (no source)")
281 a744b676 Manuel Franceschini
282 a744b676 Manuel Franceschini
283 a744b676 Manuel Franceschini
class TestIP4TcpPing(unittest.TestCase, _BaseTcpPingTest):
284 a744b676 Manuel Franceschini
  """Testcase for IPv4 TCP version of ping - against listen(2)ing port"""
285 a744b676 Manuel Franceschini
  family = socket.AF_INET
286 a744b676 Manuel Franceschini
  address = constants.IP4_ADDRESS_LOCALHOST
287 a744b676 Manuel Franceschini
288 a744b676 Manuel Franceschini
  def setUp(self):
289 a744b676 Manuel Franceschini
    unittest.TestCase.setUp(self)
290 a744b676 Manuel Franceschini
    _BaseTcpPingTest.setUp(self)
291 a744b676 Manuel Franceschini
292 a744b676 Manuel Franceschini
  def tearDown(self):
293 a744b676 Manuel Franceschini
    unittest.TestCase.tearDown(self)
294 a744b676 Manuel Franceschini
    _BaseTcpPingTest.tearDown(self)
295 a744b676 Manuel Franceschini
296 a744b676 Manuel Franceschini
297 a744b676 Manuel Franceschini
class TestIP6TcpPing(unittest.TestCase, _BaseTcpPingTest):
298 a744b676 Manuel Franceschini
  """Testcase for IPv6 TCP version of ping - against listen(2)ing port"""
299 a744b676 Manuel Franceschini
  family = socket.AF_INET6
300 a744b676 Manuel Franceschini
  address = constants.IP6_ADDRESS_LOCALHOST
301 a744b676 Manuel Franceschini
302 a744b676 Manuel Franceschini
  def setUp(self):
303 a744b676 Manuel Franceschini
    unittest.TestCase.setUp(self)
304 a744b676 Manuel Franceschini
    _BaseTcpPingTest.setUp(self)
305 a744b676 Manuel Franceschini
306 a744b676 Manuel Franceschini
  def tearDown(self):
307 a744b676 Manuel Franceschini
    unittest.TestCase.tearDown(self)
308 a744b676 Manuel Franceschini
    _BaseTcpPingTest.tearDown(self)
309 a744b676 Manuel Franceschini
310 a744b676 Manuel Franceschini
311 a744b676 Manuel Franceschini
class _BaseTcpPingDeafTest:
312 a744b676 Manuel Franceschini
  """Base class for TcpPing tests against non listen(2)ing port"""
313 a744b676 Manuel Franceschini
  family = None
314 a744b676 Manuel Franceschini
  address = None
315 a744b676 Manuel Franceschini
316 a744b676 Manuel Franceschini
  def setUp(self):
317 a744b676 Manuel Franceschini
    self.deaflistener = socket.socket(self.family, socket.SOCK_STREAM)
318 a744b676 Manuel Franceschini
    self.deaflistener.bind((self.address, 0))
319 a744b676 Manuel Franceschini
    self.deaflistenerport = self.deaflistener.getsockname()[1]
320 a744b676 Manuel Franceschini
321 a744b676 Manuel Franceschini
  def tearDown(self):
322 a744b676 Manuel Franceschini
    del self.deaflistener
323 a744b676 Manuel Franceschini
    del self.deaflistenerport
324 a744b676 Manuel Franceschini
325 a744b676 Manuel Franceschini
  def testTcpPingToLocalHostAcceptDeaf(self):
326 a744b676 Manuel Franceschini
    self.assertFalse(netutils.TcpPing(self.address,
327 a744b676 Manuel Franceschini
                                      self.deaflistenerport,
328 a744b676 Manuel Franceschini
                                      timeout=constants.TCP_PING_TIMEOUT,
329 a744b676 Manuel Franceschini
                                      live_port_needed=True,
330 a744b676 Manuel Franceschini
                                      source=self.address,
331 a744b676 Manuel Franceschini
                                      ), # need successful connect(2)
332 a744b676 Manuel Franceschini
                     "successfully connected to deaf listener")
333 a744b676 Manuel Franceschini
334 a744b676 Manuel Franceschini
    self.assertFalse(netutils.TcpPing(self.address,
335 a744b676 Manuel Franceschini
                                      self.deaflistenerport,
336 a744b676 Manuel Franceschini
                                      timeout=constants.TCP_PING_TIMEOUT,
337 a744b676 Manuel Franceschini
                                      live_port_needed=True,
338 a744b676 Manuel Franceschini
                                      ), # need successful connect(2)
339 a744b676 Manuel Franceschini
                     "successfully connected to deaf listener (no source)")
340 a744b676 Manuel Franceschini
341 a744b676 Manuel Franceschini
  def testTcpPingToLocalHostNoAccept(self):
342 a744b676 Manuel Franceschini
    self.assert_(netutils.TcpPing(self.address,
343 a744b676 Manuel Franceschini
                                  self.deaflistenerport,
344 a744b676 Manuel Franceschini
                                  timeout=constants.TCP_PING_TIMEOUT,
345 a744b676 Manuel Franceschini
                                  live_port_needed=False,
346 a744b676 Manuel Franceschini
                                  source=self.address,
347 a744b676 Manuel Franceschini
                                  ), # ECONNREFUSED is OK
348 a744b676 Manuel Franceschini
                 "failed to ping alive host on deaf port")
349 a744b676 Manuel Franceschini
350 a744b676 Manuel Franceschini
    self.assert_(netutils.TcpPing(self.address,
351 a744b676 Manuel Franceschini
                                  self.deaflistenerport,
352 a744b676 Manuel Franceschini
                                  timeout=constants.TCP_PING_TIMEOUT,
353 a744b676 Manuel Franceschini
                                  live_port_needed=False,
354 a744b676 Manuel Franceschini
                                  ), # ECONNREFUSED is OK
355 a744b676 Manuel Franceschini
                 "failed to ping alive host on deaf port (no source)")
356 a744b676 Manuel Franceschini
357 a744b676 Manuel Franceschini
358 a744b676 Manuel Franceschini
class TestIP4TcpPingDeaf(unittest.TestCase, _BaseTcpPingDeafTest):
359 a744b676 Manuel Franceschini
  """Testcase for IPv4 TCP version of ping - against non listen(2)ing port"""
360 a744b676 Manuel Franceschini
  family = socket.AF_INET
361 a744b676 Manuel Franceschini
  address = constants.IP4_ADDRESS_LOCALHOST
362 a744b676 Manuel Franceschini
363 a744b676 Manuel Franceschini
  def setUp(self):
364 a744b676 Manuel Franceschini
    self.deaflistener = socket.socket(self.family, socket.SOCK_STREAM)
365 a744b676 Manuel Franceschini
    self.deaflistener.bind((self.address, 0))
366 a744b676 Manuel Franceschini
    self.deaflistenerport = self.deaflistener.getsockname()[1]
367 a744b676 Manuel Franceschini
368 a744b676 Manuel Franceschini
  def tearDown(self):
369 a744b676 Manuel Franceschini
    del self.deaflistener
370 a744b676 Manuel Franceschini
    del self.deaflistenerport
371 a744b676 Manuel Franceschini
372 a744b676 Manuel Franceschini
373 a744b676 Manuel Franceschini
class TestIP6TcpPingDeaf(unittest.TestCase, _BaseTcpPingDeafTest):
374 a744b676 Manuel Franceschini
  """Testcase for IPv6 TCP version of ping - against non listen(2)ing port"""
375 a744b676 Manuel Franceschini
  family = socket.AF_INET6
376 a744b676 Manuel Franceschini
  address = constants.IP6_ADDRESS_LOCALHOST
377 a744b676 Manuel Franceschini
378 a744b676 Manuel Franceschini
  def setUp(self):
379 a744b676 Manuel Franceschini
    unittest.TestCase.setUp(self)
380 a744b676 Manuel Franceschini
    _BaseTcpPingDeafTest.setUp(self)
381 a744b676 Manuel Franceschini
382 a744b676 Manuel Franceschini
  def tearDown(self):
383 a744b676 Manuel Franceschini
    unittest.TestCase.tearDown(self)
384 a744b676 Manuel Franceschini
    _BaseTcpPingDeafTest.tearDown(self)
385 a744b676 Manuel Franceschini
386 a744b676 Manuel Franceschini
387 1a8337f2 Manuel Franceschini
class TestFormatAddress(unittest.TestCase):
388 1a8337f2 Manuel Franceschini
  """Testcase for FormatAddress"""
389 1a8337f2 Manuel Franceschini
390 1a8337f2 Manuel Franceschini
  def testFormatAddressUnixSocket(self):
391 981732fb Manuel Franceschini
    res1 = netutils.FormatAddress(("12352", 0, 0), family=socket.AF_UNIX)
392 1a8337f2 Manuel Franceschini
    self.assertEqual(res1, "pid=12352, uid=0, gid=0")
393 1a8337f2 Manuel Franceschini
394 1a8337f2 Manuel Franceschini
  def testFormatAddressIP4(self):
395 981732fb Manuel Franceschini
    res1 = netutils.FormatAddress(("127.0.0.1", 1234), family=socket.AF_INET)
396 1a8337f2 Manuel Franceschini
    self.assertEqual(res1, "127.0.0.1:1234")
397 981732fb Manuel Franceschini
    res2 = netutils.FormatAddress(("192.0.2.32", None), family=socket.AF_INET)
398 1a8337f2 Manuel Franceschini
    self.assertEqual(res2, "192.0.2.32")
399 1a8337f2 Manuel Franceschini
400 1a8337f2 Manuel Franceschini
  def testFormatAddressIP6(self):
401 981732fb Manuel Franceschini
    res1 = netutils.FormatAddress(("::1", 1234), family=socket.AF_INET6)
402 1a8337f2 Manuel Franceschini
    self.assertEqual(res1, "[::1]:1234")
403 981732fb Manuel Franceschini
    res2 = netutils.FormatAddress(("::1", None), family=socket.AF_INET6)
404 1a8337f2 Manuel Franceschini
    self.assertEqual(res2, "[::1]")
405 981732fb Manuel Franceschini
    res2 = netutils.FormatAddress(("2001:db8::beef", "80"),
406 981732fb Manuel Franceschini
                                  family=socket.AF_INET6)
407 1a8337f2 Manuel Franceschini
    self.assertEqual(res2, "[2001:db8::beef]:80")
408 1a8337f2 Manuel Franceschini
409 981732fb Manuel Franceschini
  def testFormatAddressWithoutFamily(self):
410 981732fb Manuel Franceschini
    res1 = netutils.FormatAddress(("127.0.0.1", 1234))
411 981732fb Manuel Franceschini
    self.assertEqual(res1, "127.0.0.1:1234")
412 981732fb Manuel Franceschini
    res2 = netutils.FormatAddress(("::1", 1234))
413 981732fb Manuel Franceschini
    self.assertEqual(res2, "[::1]:1234")
414 981732fb Manuel Franceschini
415 981732fb Manuel Franceschini
416 1a8337f2 Manuel Franceschini
  def testInvalidFormatAddress(self):
417 981732fb Manuel Franceschini
    self.assertRaises(errors.ParameterError, netutils.FormatAddress,
418 981732fb Manuel Franceschini
                      "127.0.0.1")
419 981732fb Manuel Franceschini
    self.assertRaises(errors.ParameterError, netutils.FormatAddress,
420 981732fb Manuel Franceschini
                      "127.0.0.1", family=socket.AF_INET)
421 981732fb Manuel Franceschini
    self.assertRaises(errors.ParameterError, netutils.FormatAddress,
422 981732fb Manuel Franceschini
                      ("::1"), family=socket.AF_INET )
423 1a8337f2 Manuel Franceschini
424 1a8337f2 Manuel Franceschini
425 a744b676 Manuel Franceschini
if __name__ == "__main__":
426 a744b676 Manuel Franceschini
  testutils.GanetiTestProgram()