Statistics
| Branch: | Tag: | Revision:

root / test / py / ganeti.netutils_unittest.py @ 560ef132

History | View | Annotate | Download (19.1 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 7df2c4f0 Andrea Spadaccini
  def testValidateNetmask(self):
165 7df2c4f0 Andrea Spadaccini
    for netmask in [0, 33]:
166 7df2c4f0 Andrea Spadaccini
      self.assertFalse(netutils.IP4Address.ValidateNetmask(netmask))
167 7df2c4f0 Andrea Spadaccini
168 7df2c4f0 Andrea Spadaccini
    for netmask in [1, 32]:
169 7df2c4f0 Andrea Spadaccini
      self.assertTrue(netutils.IP4Address.ValidateNetmask(netmask))
170 7df2c4f0 Andrea Spadaccini
171 7df2c4f0 Andrea Spadaccini
    for netmask in [0, 129]:
172 7df2c4f0 Andrea Spadaccini
      self.assertFalse(netutils.IP6Address.ValidateNetmask(netmask))
173 7df2c4f0 Andrea Spadaccini
174 7df2c4f0 Andrea Spadaccini
    for netmask in [1, 128]:
175 7df2c4f0 Andrea Spadaccini
      self.assertTrue(netutils.IP6Address.ValidateNetmask(netmask))
176 7df2c4f0 Andrea Spadaccini
177 7df2c4f0 Andrea Spadaccini
  def testGetClassFromX(self):
178 7df2c4f0 Andrea Spadaccini
    self.assert_(
179 7df2c4f0 Andrea Spadaccini
        netutils.IPAddress.GetClassFromIpVersion(constants.IP4_VERSION) ==
180 7df2c4f0 Andrea Spadaccini
        netutils.IP4Address)
181 7df2c4f0 Andrea Spadaccini
    self.assert_(
182 7df2c4f0 Andrea Spadaccini
        netutils.IPAddress.GetClassFromIpVersion(constants.IP6_VERSION) ==
183 7df2c4f0 Andrea Spadaccini
        netutils.IP6Address)
184 7df2c4f0 Andrea Spadaccini
    self.assert_(
185 7df2c4f0 Andrea Spadaccini
        netutils.IPAddress.GetClassFromIpFamily(socket.AF_INET) ==
186 7df2c4f0 Andrea Spadaccini
        netutils.IP4Address)
187 7df2c4f0 Andrea Spadaccini
    self.assert_(
188 7df2c4f0 Andrea Spadaccini
        netutils.IPAddress.GetClassFromIpFamily(socket.AF_INET6) ==
189 7df2c4f0 Andrea Spadaccini
        netutils.IP6Address)
190 7df2c4f0 Andrea Spadaccini
191 8b312c1d Manuel Franceschini
  def testOwnLoopback(self):
192 8b312c1d Manuel Franceschini
    # FIXME: In a pure IPv6 environment this is no longer true
193 8b312c1d Manuel Franceschini
    self.assert_(netutils.IPAddress.Own("127.0.0.1"),
194 8b312c1d Manuel Franceschini
                 "Should own 127.0.0.1 address")
195 8b312c1d Manuel Franceschini
196 8b312c1d Manuel Franceschini
  def testNotOwnAddress(self):
197 8b312c1d Manuel Franceschini
    self.assertFalse(netutils.IPAddress.Own("2001:db8::1"),
198 8b312c1d Manuel Franceschini
                     "Should not own IP address 2001:db8::1")
199 8b312c1d Manuel Franceschini
    self.assertFalse(netutils.IPAddress.Own("192.0.2.1"),
200 8b312c1d Manuel Franceschini
                     "Should not own IP address 192.0.2.1")
201 8b312c1d Manuel Franceschini
202 37531236 Andrea Spadaccini
  def testFamilyVersionConversions(self):
203 37531236 Andrea Spadaccini
    # IPAddress.GetAddressFamilyFromVersion
204 37531236 Andrea Spadaccini
    self.assertEqual(
205 37531236 Andrea Spadaccini
        netutils.IPAddress.GetAddressFamilyFromVersion(constants.IP4_VERSION),
206 37531236 Andrea Spadaccini
        socket.AF_INET)
207 37531236 Andrea Spadaccini
    self.assertEqual(
208 37531236 Andrea Spadaccini
        netutils.IPAddress.GetAddressFamilyFromVersion(constants.IP6_VERSION),
209 37531236 Andrea Spadaccini
        socket.AF_INET6)
210 37531236 Andrea Spadaccini
    self.assertRaises(errors.ProgrammerError,
211 37531236 Andrea Spadaccini
        netutils.IPAddress.GetAddressFamilyFromVersion, 3)
212 37531236 Andrea Spadaccini
213 37531236 Andrea Spadaccini
    # IPAddress.GetVersionFromAddressFamily
214 37531236 Andrea Spadaccini
    self.assertEqual(
215 37531236 Andrea Spadaccini
        netutils.IPAddress.GetVersionFromAddressFamily(socket.AF_INET),
216 37531236 Andrea Spadaccini
        constants.IP4_VERSION)
217 37531236 Andrea Spadaccini
    self.assertEqual(
218 37531236 Andrea Spadaccini
        netutils.IPAddress.GetVersionFromAddressFamily(socket.AF_INET6),
219 37531236 Andrea Spadaccini
        constants.IP6_VERSION)
220 37531236 Andrea Spadaccini
    self.assertRaises(errors.ProgrammerError,
221 37531236 Andrea Spadaccini
        netutils.IPAddress.GetVersionFromAddressFamily, socket.AF_UNIX)
222 37531236 Andrea Spadaccini
223 8b312c1d Manuel Franceschini
224 8b312c1d Manuel Franceschini
class TestIP4Address(unittest.TestCase):
225 8b312c1d Manuel Franceschini
  def testGetIPIntFromString(self):
226 8b312c1d Manuel Franceschini
    fn = netutils.IP4Address._GetIPIntFromString
227 8b312c1d Manuel Franceschini
    self.assertEqual(fn("0.0.0.0"), 0)
228 8b312c1d Manuel Franceschini
    self.assertEqual(fn("0.0.0.1"), 1)
229 8b312c1d Manuel Franceschini
    self.assertEqual(fn("127.0.0.1"), 2130706433)
230 8b312c1d Manuel Franceschini
    self.assertEqual(fn("192.0.2.129"), 3221226113)
231 8b312c1d Manuel Franceschini
    self.assertEqual(fn("255.255.255.255"), 2**32 - 1)
232 8b312c1d Manuel Franceschini
    self.assertNotEqual(fn("0.0.0.0"), 1)
233 8b312c1d Manuel Franceschini
    self.assertNotEqual(fn("0.0.0.0"), 1)
234 8b312c1d Manuel Franceschini
235 8b312c1d Manuel Franceschini
  def testIsValid(self):
236 8b312c1d Manuel Franceschini
    self.assert_(netutils.IP4Address.IsValid("0.0.0.0"))
237 8b312c1d Manuel Franceschini
    self.assert_(netutils.IP4Address.IsValid("127.0.0.1"))
238 8b312c1d Manuel Franceschini
    self.assert_(netutils.IP4Address.IsValid("192.0.2.199"))
239 8b312c1d Manuel Franceschini
    self.assert_(netutils.IP4Address.IsValid("255.255.255.255"))
240 8b312c1d Manuel Franceschini
241 8b312c1d Manuel Franceschini
  def testNotIsValid(self):
242 8b312c1d Manuel Franceschini
    self.assertFalse(netutils.IP4Address.IsValid("0"))
243 8b312c1d Manuel Franceschini
    self.assertFalse(netutils.IP4Address.IsValid("1"))
244 8b312c1d Manuel Franceschini
    self.assertFalse(netutils.IP4Address.IsValid("1.1.1"))
245 8b312c1d Manuel Franceschini
    self.assertFalse(netutils.IP4Address.IsValid("255.255.255.256"))
246 8b312c1d Manuel Franceschini
    self.assertFalse(netutils.IP4Address.IsValid("::1"))
247 8b312c1d Manuel Franceschini
248 8b312c1d Manuel Franceschini
  def testInNetwork(self):
249 8b312c1d Manuel Franceschini
    self.assert_(netutils.IP4Address.InNetwork("127.0.0.0/8", "127.0.0.1"))
250 8b312c1d Manuel Franceschini
251 8b312c1d Manuel Franceschini
  def testNotInNetwork(self):
252 8b312c1d Manuel Franceschini
    self.assertFalse(netutils.IP4Address.InNetwork("192.0.2.0/24",
253 8b312c1d Manuel Franceschini
                                                   "127.0.0.1"))
254 8b312c1d Manuel Franceschini
255 8b312c1d Manuel Franceschini
  def testIsLoopback(self):
256 8b312c1d Manuel Franceschini
    self.assert_(netutils.IP4Address.IsLoopback("127.0.0.1"))
257 8b312c1d Manuel Franceschini
258 8b312c1d Manuel Franceschini
  def testNotIsLoopback(self):
259 8b312c1d Manuel Franceschini
    self.assertFalse(netutils.IP4Address.IsLoopback("192.0.2.1"))
260 8b312c1d Manuel Franceschini
261 8b312c1d Manuel Franceschini
262 8b312c1d Manuel Franceschini
class TestIP6Address(unittest.TestCase):
263 8b312c1d Manuel Franceschini
  def testGetIPIntFromString(self):
264 8b312c1d Manuel Franceschini
    fn = netutils.IP6Address._GetIPIntFromString
265 8b312c1d Manuel Franceschini
    self.assertEqual(fn("::"), 0)
266 8b312c1d Manuel Franceschini
    self.assertEqual(fn("::1"), 1)
267 8b312c1d Manuel Franceschini
    self.assertEqual(fn("2001:db8::1"),
268 8b312c1d Manuel Franceschini
                     42540766411282592856903984951653826561L)
269 8b312c1d Manuel Franceschini
    self.assertEqual(fn("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"), 2**128-1)
270 8b312c1d Manuel Franceschini
    self.assertNotEqual(netutils.IP6Address._GetIPIntFromString("::2"), 1)
271 8b312c1d Manuel Franceschini
272 8b312c1d Manuel Franceschini
  def testIsValid(self):
273 8b312c1d Manuel Franceschini
    self.assert_(netutils.IP6Address.IsValid("::"))
274 8b312c1d Manuel Franceschini
    self.assert_(netutils.IP6Address.IsValid("::1"))
275 8b312c1d Manuel Franceschini
    self.assert_(netutils.IP6Address.IsValid("1" + (":1" * 7)))
276 8b312c1d Manuel Franceschini
    self.assert_(netutils.IP6Address.IsValid("ffff" + (":ffff" * 7)))
277 8b312c1d Manuel Franceschini
    self.assert_(netutils.IP6Address.IsValid("::"))
278 8b312c1d Manuel Franceschini
279 8b312c1d Manuel Franceschini
  def testNotIsValid(self):
280 8b312c1d Manuel Franceschini
    self.assertFalse(netutils.IP6Address.IsValid("0"))
281 8b312c1d Manuel Franceschini
    self.assertFalse(netutils.IP6Address.IsValid(":1"))
282 8b312c1d Manuel Franceschini
    self.assertFalse(netutils.IP6Address.IsValid("f" + (":f" * 6)))
283 8b312c1d Manuel Franceschini
    self.assertFalse(netutils.IP6Address.IsValid("fffg" + (":ffff" * 7)))
284 8b312c1d Manuel Franceschini
    self.assertFalse(netutils.IP6Address.IsValid("fffff" + (":ffff" * 7)))
285 8b312c1d Manuel Franceschini
    self.assertFalse(netutils.IP6Address.IsValid("1" + (":1" * 8)))
286 8b312c1d Manuel Franceschini
    self.assertFalse(netutils.IP6Address.IsValid("127.0.0.1"))
287 8b312c1d Manuel Franceschini
288 8b312c1d Manuel Franceschini
  def testInNetwork(self):
289 8b312c1d Manuel Franceschini
    self.assert_(netutils.IP6Address.InNetwork("::1/128", "::1"))
290 8b312c1d Manuel Franceschini
291 8b312c1d Manuel Franceschini
  def testNotInNetwork(self):
292 8b312c1d Manuel Franceschini
    self.assertFalse(netutils.IP6Address.InNetwork("2001:db8::1/128", "::1"))
293 8b312c1d Manuel Franceschini
294 8b312c1d Manuel Franceschini
  def testIsLoopback(self):
295 8b312c1d Manuel Franceschini
    self.assert_(netutils.IP6Address.IsLoopback("::1"))
296 8b312c1d Manuel Franceschini
297 8b312c1d Manuel Franceschini
  def testNotIsLoopback(self):
298 8b312c1d Manuel Franceschini
    self.assertFalse(netutils.IP6Address.IsLoopback("2001:db8::1"))
299 a744b676 Manuel Franceschini
300 a744b676 Manuel Franceschini
301 a744b676 Manuel Franceschini
class _BaseTcpPingTest:
302 a744b676 Manuel Franceschini
  """Base class for TcpPing tests against listen(2)ing port"""
303 a744b676 Manuel Franceschini
  family = None
304 a744b676 Manuel Franceschini
  address = None
305 a744b676 Manuel Franceschini
306 a744b676 Manuel Franceschini
  def setUp(self):
307 a744b676 Manuel Franceschini
    self.listener = socket.socket(self.family, socket.SOCK_STREAM)
308 a744b676 Manuel Franceschini
    self.listener.bind((self.address, 0))
309 a744b676 Manuel Franceschini
    self.listenerport = self.listener.getsockname()[1]
310 a744b676 Manuel Franceschini
    self.listener.listen(1)
311 a744b676 Manuel Franceschini
312 a744b676 Manuel Franceschini
  def tearDown(self):
313 a744b676 Manuel Franceschini
    self.listener.shutdown(socket.SHUT_RDWR)
314 a744b676 Manuel Franceschini
    del self.listener
315 a744b676 Manuel Franceschini
    del self.listenerport
316 a744b676 Manuel Franceschini
317 a744b676 Manuel Franceschini
  def testTcpPingToLocalHostAccept(self):
318 a744b676 Manuel Franceschini
    self.assert_(netutils.TcpPing(self.address,
319 a744b676 Manuel Franceschini
                                  self.listenerport,
320 a744b676 Manuel Franceschini
                                  timeout=constants.TCP_PING_TIMEOUT,
321 a744b676 Manuel Franceschini
                                  live_port_needed=True,
322 a744b676 Manuel Franceschini
                                  source=self.address,
323 a744b676 Manuel Franceschini
                                  ),
324 a744b676 Manuel Franceschini
                 "failed to connect to test listener")
325 a744b676 Manuel Franceschini
326 a744b676 Manuel Franceschini
    self.assert_(netutils.TcpPing(self.address, self.listenerport,
327 a744b676 Manuel Franceschini
                                  timeout=constants.TCP_PING_TIMEOUT,
328 a744b676 Manuel Franceschini
                                  live_port_needed=True),
329 a744b676 Manuel Franceschini
                 "failed to connect to test listener (no source)")
330 a744b676 Manuel Franceschini
331 a744b676 Manuel Franceschini
332 a744b676 Manuel Franceschini
class TestIP4TcpPing(unittest.TestCase, _BaseTcpPingTest):
333 a744b676 Manuel Franceschini
  """Testcase for IPv4 TCP version of ping - against listen(2)ing port"""
334 a744b676 Manuel Franceschini
  family = socket.AF_INET
335 a744b676 Manuel Franceschini
  address = constants.IP4_ADDRESS_LOCALHOST
336 a744b676 Manuel Franceschini
337 a744b676 Manuel Franceschini
  def setUp(self):
338 a744b676 Manuel Franceschini
    unittest.TestCase.setUp(self)
339 a744b676 Manuel Franceschini
    _BaseTcpPingTest.setUp(self)
340 a744b676 Manuel Franceschini
341 a744b676 Manuel Franceschini
  def tearDown(self):
342 a744b676 Manuel Franceschini
    unittest.TestCase.tearDown(self)
343 a744b676 Manuel Franceschini
    _BaseTcpPingTest.tearDown(self)
344 a744b676 Manuel Franceschini
345 a744b676 Manuel Franceschini
346 a744b676 Manuel Franceschini
class TestIP6TcpPing(unittest.TestCase, _BaseTcpPingTest):
347 a744b676 Manuel Franceschini
  """Testcase for IPv6 TCP version of ping - against listen(2)ing port"""
348 a744b676 Manuel Franceschini
  family = socket.AF_INET6
349 a744b676 Manuel Franceschini
  address = constants.IP6_ADDRESS_LOCALHOST
350 a744b676 Manuel Franceschini
351 a744b676 Manuel Franceschini
  def setUp(self):
352 a744b676 Manuel Franceschini
    unittest.TestCase.setUp(self)
353 a744b676 Manuel Franceschini
    _BaseTcpPingTest.setUp(self)
354 a744b676 Manuel Franceschini
355 a744b676 Manuel Franceschini
  def tearDown(self):
356 a744b676 Manuel Franceschini
    unittest.TestCase.tearDown(self)
357 a744b676 Manuel Franceschini
    _BaseTcpPingTest.tearDown(self)
358 a744b676 Manuel Franceschini
359 a744b676 Manuel Franceschini
360 a744b676 Manuel Franceschini
class _BaseTcpPingDeafTest:
361 a744b676 Manuel Franceschini
  """Base class for TcpPing tests against non listen(2)ing port"""
362 a744b676 Manuel Franceschini
  family = None
363 a744b676 Manuel Franceschini
  address = None
364 a744b676 Manuel Franceschini
365 a744b676 Manuel Franceschini
  def setUp(self):
366 a744b676 Manuel Franceschini
    self.deaflistener = socket.socket(self.family, socket.SOCK_STREAM)
367 a744b676 Manuel Franceschini
    self.deaflistener.bind((self.address, 0))
368 a744b676 Manuel Franceschini
    self.deaflistenerport = self.deaflistener.getsockname()[1]
369 a744b676 Manuel Franceschini
370 a744b676 Manuel Franceschini
  def tearDown(self):
371 a744b676 Manuel Franceschini
    del self.deaflistener
372 a744b676 Manuel Franceschini
    del self.deaflistenerport
373 a744b676 Manuel Franceschini
374 a744b676 Manuel Franceschini
  def testTcpPingToLocalHostAcceptDeaf(self):
375 a744b676 Manuel Franceschini
    self.assertFalse(netutils.TcpPing(self.address,
376 a744b676 Manuel Franceschini
                                      self.deaflistenerport,
377 a744b676 Manuel Franceschini
                                      timeout=constants.TCP_PING_TIMEOUT,
378 a744b676 Manuel Franceschini
                                      live_port_needed=True,
379 a744b676 Manuel Franceschini
                                      source=self.address,
380 a744b676 Manuel Franceschini
                                      ), # need successful connect(2)
381 a744b676 Manuel Franceschini
                     "successfully connected to deaf listener")
382 a744b676 Manuel Franceschini
383 a744b676 Manuel Franceschini
    self.assertFalse(netutils.TcpPing(self.address,
384 a744b676 Manuel Franceschini
                                      self.deaflistenerport,
385 a744b676 Manuel Franceschini
                                      timeout=constants.TCP_PING_TIMEOUT,
386 a744b676 Manuel Franceschini
                                      live_port_needed=True,
387 a744b676 Manuel Franceschini
                                      ), # need successful connect(2)
388 a744b676 Manuel Franceschini
                     "successfully connected to deaf listener (no source)")
389 a744b676 Manuel Franceschini
390 a744b676 Manuel Franceschini
  def testTcpPingToLocalHostNoAccept(self):
391 a744b676 Manuel Franceschini
    self.assert_(netutils.TcpPing(self.address,
392 a744b676 Manuel Franceschini
                                  self.deaflistenerport,
393 a744b676 Manuel Franceschini
                                  timeout=constants.TCP_PING_TIMEOUT,
394 a744b676 Manuel Franceschini
                                  live_port_needed=False,
395 a744b676 Manuel Franceschini
                                  source=self.address,
396 a744b676 Manuel Franceschini
                                  ), # ECONNREFUSED is OK
397 a744b676 Manuel Franceschini
                 "failed to ping alive host on deaf port")
398 a744b676 Manuel Franceschini
399 a744b676 Manuel Franceschini
    self.assert_(netutils.TcpPing(self.address,
400 a744b676 Manuel Franceschini
                                  self.deaflistenerport,
401 a744b676 Manuel Franceschini
                                  timeout=constants.TCP_PING_TIMEOUT,
402 a744b676 Manuel Franceschini
                                  live_port_needed=False,
403 a744b676 Manuel Franceschini
                                  ), # ECONNREFUSED is OK
404 a744b676 Manuel Franceschini
                 "failed to ping alive host on deaf port (no source)")
405 a744b676 Manuel Franceschini
406 a744b676 Manuel Franceschini
407 a744b676 Manuel Franceschini
class TestIP4TcpPingDeaf(unittest.TestCase, _BaseTcpPingDeafTest):
408 a744b676 Manuel Franceschini
  """Testcase for IPv4 TCP version of ping - against non listen(2)ing port"""
409 a744b676 Manuel Franceschini
  family = socket.AF_INET
410 a744b676 Manuel Franceschini
  address = constants.IP4_ADDRESS_LOCALHOST
411 a744b676 Manuel Franceschini
412 a744b676 Manuel Franceschini
  def setUp(self):
413 a744b676 Manuel Franceschini
    self.deaflistener = socket.socket(self.family, socket.SOCK_STREAM)
414 a744b676 Manuel Franceschini
    self.deaflistener.bind((self.address, 0))
415 a744b676 Manuel Franceschini
    self.deaflistenerport = self.deaflistener.getsockname()[1]
416 a744b676 Manuel Franceschini
417 a744b676 Manuel Franceschini
  def tearDown(self):
418 a744b676 Manuel Franceschini
    del self.deaflistener
419 a744b676 Manuel Franceschini
    del self.deaflistenerport
420 a744b676 Manuel Franceschini
421 a744b676 Manuel Franceschini
422 a744b676 Manuel Franceschini
class TestIP6TcpPingDeaf(unittest.TestCase, _BaseTcpPingDeafTest):
423 a744b676 Manuel Franceschini
  """Testcase for IPv6 TCP version of ping - against non listen(2)ing port"""
424 a744b676 Manuel Franceschini
  family = socket.AF_INET6
425 a744b676 Manuel Franceschini
  address = constants.IP6_ADDRESS_LOCALHOST
426 a744b676 Manuel Franceschini
427 a744b676 Manuel Franceschini
  def setUp(self):
428 a744b676 Manuel Franceschini
    unittest.TestCase.setUp(self)
429 a744b676 Manuel Franceschini
    _BaseTcpPingDeafTest.setUp(self)
430 a744b676 Manuel Franceschini
431 a744b676 Manuel Franceschini
  def tearDown(self):
432 a744b676 Manuel Franceschini
    unittest.TestCase.tearDown(self)
433 a744b676 Manuel Franceschini
    _BaseTcpPingDeafTest.tearDown(self)
434 a744b676 Manuel Franceschini
435 a744b676 Manuel Franceschini
436 1a8337f2 Manuel Franceschini
class TestFormatAddress(unittest.TestCase):
437 1a8337f2 Manuel Franceschini
  """Testcase for FormatAddress"""
438 1a8337f2 Manuel Franceschini
439 1a8337f2 Manuel Franceschini
  def testFormatAddressUnixSocket(self):
440 981732fb Manuel Franceschini
    res1 = netutils.FormatAddress(("12352", 0, 0), family=socket.AF_UNIX)
441 1a8337f2 Manuel Franceschini
    self.assertEqual(res1, "pid=12352, uid=0, gid=0")
442 1a8337f2 Manuel Franceschini
443 1a8337f2 Manuel Franceschini
  def testFormatAddressIP4(self):
444 981732fb Manuel Franceschini
    res1 = netutils.FormatAddress(("127.0.0.1", 1234), family=socket.AF_INET)
445 1a8337f2 Manuel Franceschini
    self.assertEqual(res1, "127.0.0.1:1234")
446 981732fb Manuel Franceschini
    res2 = netutils.FormatAddress(("192.0.2.32", None), family=socket.AF_INET)
447 1a8337f2 Manuel Franceschini
    self.assertEqual(res2, "192.0.2.32")
448 1a8337f2 Manuel Franceschini
449 1a8337f2 Manuel Franceschini
  def testFormatAddressIP6(self):
450 981732fb Manuel Franceschini
    res1 = netutils.FormatAddress(("::1", 1234), family=socket.AF_INET6)
451 1a8337f2 Manuel Franceschini
    self.assertEqual(res1, "[::1]:1234")
452 981732fb Manuel Franceschini
    res2 = netutils.FormatAddress(("::1", None), family=socket.AF_INET6)
453 1a8337f2 Manuel Franceschini
    self.assertEqual(res2, "[::1]")
454 981732fb Manuel Franceschini
    res2 = netutils.FormatAddress(("2001:db8::beef", "80"),
455 981732fb Manuel Franceschini
                                  family=socket.AF_INET6)
456 1a8337f2 Manuel Franceschini
    self.assertEqual(res2, "[2001:db8::beef]:80")
457 1a8337f2 Manuel Franceschini
458 981732fb Manuel Franceschini
  def testFormatAddressWithoutFamily(self):
459 981732fb Manuel Franceschini
    res1 = netutils.FormatAddress(("127.0.0.1", 1234))
460 981732fb Manuel Franceschini
    self.assertEqual(res1, "127.0.0.1:1234")
461 981732fb Manuel Franceschini
    res2 = netutils.FormatAddress(("::1", 1234))
462 981732fb Manuel Franceschini
    self.assertEqual(res2, "[::1]:1234")
463 981732fb Manuel Franceschini
464 981732fb Manuel Franceschini
465 1a8337f2 Manuel Franceschini
  def testInvalidFormatAddress(self):
466 981732fb Manuel Franceschini
    self.assertRaises(errors.ParameterError, netutils.FormatAddress,
467 981732fb Manuel Franceschini
                      "127.0.0.1")
468 981732fb Manuel Franceschini
    self.assertRaises(errors.ParameterError, netutils.FormatAddress,
469 981732fb Manuel Franceschini
                      "127.0.0.1", family=socket.AF_INET)
470 981732fb Manuel Franceschini
    self.assertRaises(errors.ParameterError, netutils.FormatAddress,
471 981732fb Manuel Franceschini
                      ("::1"), family=socket.AF_INET )
472 1a8337f2 Manuel Franceschini
473 37531236 Andrea Spadaccini
class TestIpParsing(testutils.GanetiTestCase):
474 37531236 Andrea Spadaccini
  """Test the code that parses the ip command output"""
475 37531236 Andrea Spadaccini
476 37531236 Andrea Spadaccini
  def testIp4(self):
477 37531236 Andrea Spadaccini
    valid_addresses = [constants.IP4_ADDRESS_ANY,
478 37531236 Andrea Spadaccini
                       constants.IP4_ADDRESS_LOCALHOST,
479 37531236 Andrea Spadaccini
                       "192.0.2.1",     # RFC5737, IPv4 address blocks for docs
480 37531236 Andrea Spadaccini
                       "198.51.100.1",
481 37531236 Andrea Spadaccini
                       "203.0.113.1",
482 37531236 Andrea Spadaccini
                      ]
483 37531236 Andrea Spadaccini
    for addr in valid_addresses:
484 37531236 Andrea Spadaccini
      self.failUnless(re.search(netutils._IP_RE_TEXT, addr))
485 37531236 Andrea Spadaccini
486 37531236 Andrea Spadaccini
  def testIp6(self):
487 37531236 Andrea Spadaccini
    valid_addresses = [constants.IP6_ADDRESS_ANY,
488 37531236 Andrea Spadaccini
                       constants.IP6_ADDRESS_LOCALHOST,
489 37531236 Andrea Spadaccini
                       "0:0:0:0:0:0:0:1", # other form for IP6_ADDRESS_LOCALHOST
490 37531236 Andrea Spadaccini
                       "0:0:0:0:0:0:0:0", # other form for IP6_ADDRESS_ANY
491 37531236 Andrea Spadaccini
                       "2001:db8:85a3::8a2e:370:7334", # RFC3849 IP6 docs block
492 37531236 Andrea Spadaccini
                       "2001:0db8:85a3:0000:0000:8a2e:0370:7334",
493 37531236 Andrea Spadaccini
                       "0:0:0:0:0:FFFF:192.0.2.1",  # IPv4-compatible IPv6
494 37531236 Andrea Spadaccini
                       "::FFFF:192.0.2.1",
495 37531236 Andrea Spadaccini
                       "0:0:0:0:0:0:203.0.113.1",   # IPv4-mapped IPv6
496 37531236 Andrea Spadaccini
                       "::203.0.113.1",
497 37531236 Andrea Spadaccini
                      ]
498 37531236 Andrea Spadaccini
    for addr in valid_addresses:
499 37531236 Andrea Spadaccini
      self.failUnless(re.search(netutils._IP_RE_TEXT, addr))
500 37531236 Andrea Spadaccini
501 37531236 Andrea Spadaccini
  def testParseIpCommandOutput(self):
502 37531236 Andrea Spadaccini
    # IPv4-only, fake loopback interface
503 37531236 Andrea Spadaccini
    tests = ["ip-addr-show-lo-ipv4.txt", "ip-addr-show-lo-oneline-ipv4.txt"]
504 37531236 Andrea Spadaccini
    for test_file in tests:
505 00ef625c Michael Hanselmann
      data = testutils.ReadTestData(test_file)
506 37531236 Andrea Spadaccini
      addr = netutils._GetIpAddressesFromIpOutput(data)
507 37531236 Andrea Spadaccini
      self.failUnless(len(addr[4]) == 1 and addr[4][0] == "127.0.0.1" and not
508 37531236 Andrea Spadaccini
                      addr[6])
509 37531236 Andrea Spadaccini
510 37531236 Andrea Spadaccini
    # IPv6-only, fake loopback interface
511 37531236 Andrea Spadaccini
    tests = ["ip-addr-show-lo-ipv6.txt", "ip-addr-show-lo-ipv6.txt"]
512 37531236 Andrea Spadaccini
    for test_file in tests:
513 00ef625c Michael Hanselmann
      data = testutils.ReadTestData(test_file)
514 37531236 Andrea Spadaccini
      addr = netutils._GetIpAddressesFromIpOutput(data)
515 37531236 Andrea Spadaccini
      self.failUnless(len(addr[6]) == 1 and addr[6][0] == "::1" and not addr[4])
516 37531236 Andrea Spadaccini
517 37531236 Andrea Spadaccini
    # IPv4 and IPv6, fake loopback interface
518 37531236 Andrea Spadaccini
    tests = ["ip-addr-show-lo.txt", "ip-addr-show-lo-oneline.txt"]
519 37531236 Andrea Spadaccini
    for test_file in tests:
520 00ef625c Michael Hanselmann
      data = testutils.ReadTestData(test_file)
521 37531236 Andrea Spadaccini
      addr = netutils._GetIpAddressesFromIpOutput(data)
522 37531236 Andrea Spadaccini
      self.failUnless(len(addr[6]) == 1 and addr[6][0] == "::1" and
523 37531236 Andrea Spadaccini
                      len(addr[4]) == 1 and addr[4][0] == "127.0.0.1")
524 37531236 Andrea Spadaccini
525 37531236 Andrea Spadaccini
    # IPv4 and IPv6, dummy interface
526 00ef625c Michael Hanselmann
    data = testutils.ReadTestData("ip-addr-show-dummy0.txt")
527 37531236 Andrea Spadaccini
    addr = netutils._GetIpAddressesFromIpOutput(data)
528 37531236 Andrea Spadaccini
    self.failUnless(len(addr[6]) == 1 and
529 37531236 Andrea Spadaccini
                    addr[6][0] == "2001:db8:85a3::8a2e:370:7334" and
530 37531236 Andrea Spadaccini
                    len(addr[4]) == 1 and
531 37531236 Andrea Spadaccini
                    addr[4][0] == "192.0.2.1")
532 37531236 Andrea Spadaccini
533 1a8337f2 Manuel Franceschini
534 05edafd3 Santi Raffa
class TestValidatePortNumber(unittest.TestCase):
535 05edafd3 Santi Raffa
  """Test netutils.ValidatePortNumber"""
536 05edafd3 Santi Raffa
537 05edafd3 Santi Raffa
  def testPortNumberInt(self):
538 05edafd3 Santi Raffa
    self.assertRaises(ValueError, lambda: \
539 05edafd3 Santi Raffa
      netutils.ValidatePortNumber(500000))
540 05edafd3 Santi Raffa
    self.assertEqual(netutils.ValidatePortNumber(5000), 5000)
541 05edafd3 Santi Raffa
542 05edafd3 Santi Raffa
  def testPortNumberStr(self):
543 05edafd3 Santi Raffa
    self.assertRaises(ValueError, lambda: \
544 05edafd3 Santi Raffa
      netutils.ValidatePortNumber("pinky bunny"))
545 05edafd3 Santi Raffa
    self.assertEqual(netutils.ValidatePortNumber("5000"), 5000)
546 05edafd3 Santi Raffa
547 a744b676 Manuel Franceschini
if __name__ == "__main__":
548 a744b676 Manuel Franceschini
  testutils.GanetiTestProgram()