Statistics
| Branch: | Tag: | Revision:

root / test / ganeti.netutils_unittest.py @ 37531236

History | View | Annotate | Download (17.8 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 37531236 Andrea Spadaccini
import re
26 a744b676 Manuel Franceschini
import shutil
27 a744b676 Manuel Franceschini
import socket
28 a744b676 Manuel Franceschini
import tempfile
29 a744b676 Manuel Franceschini
import unittest
30 a744b676 Manuel Franceschini
31 a744b676 Manuel Franceschini
import testutils
32 a744b676 Manuel Franceschini
from ganeti import constants
33 a744b676 Manuel Franceschini
from ganeti import errors
34 a744b676 Manuel Franceschini
from ganeti import netutils
35 a744b676 Manuel Franceschini
from ganeti import serializer
36 a744b676 Manuel Franceschini
from ganeti import utils
37 a744b676 Manuel Franceschini
38 a744b676 Manuel Franceschini
39 a744b676 Manuel Franceschini
def _GetSocketCredentials(path):
40 a744b676 Manuel Franceschini
  """Connect to a Unix socket and return remote credentials.
41 a744b676 Manuel Franceschini

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