| | 1 | import re |
| | 2 | |
| | 3 | from twisted.trial import unittest |
| | 4 | from twisted.internet.address import IPv4Address, UNIXAddress |
| | 5 | from twisted.internet.interfaces import IClientEndpoint, IServerEndpoint |
| | 6 | |
| | 7 | |
| | 8 | class AddressTestCaseMixin(object): |
| | 9 | def test_BuildEndpoint(self): |
| | 10 | """Test that the IAddress.buildEndpoint returns a provider of both |
| | 11 | IClientEndpoint and IServerEndpoint""" |
| | 12 | addr = self.buildAddress() |
| | 13 | ep = addr.buildEndpoint() |
| | 14 | self.assertTrue(IClientEndpoint.providedBy(ep)) |
| | 15 | self.assertTrue(IServerEndpoint.providedBy(ep)) |
| | 16 | |
| | 17 | def test_AddressComparison(self): |
| | 18 | """Test that two different address instances, sharing the same |
| | 19 | properties are considered equal.""" |
| | 20 | self.assertEquals(self.buildAddress(), self.buildAddress()) |
| | 21 | |
| | 22 | def test_StringRepresentation(self): |
| | 23 | """Test that when addresses are converted to strings, they adhere to a |
| | 24 | standard pattern. Not sure if it's worth it, but seemed like a bit of |
| | 25 | fun and demonstrates an inconsistency with UNIXAddress.__str__ |
| | 26 | """ |
| | 27 | addr = self.buildAddress() |
| | 28 | pattern = "".join([ |
| | 29 | "^", |
| | 30 | "([^\(]+Address)", # class name, |
| | 31 | "\(", # opening bracket, |
| | 32 | "([^)]+)", # arguments, |
| | 33 | "\)", # closing bracket, |
| | 34 | "$" |
| | 35 | ]) |
| | 36 | m = re.match(pattern, str(addr)) |
| | 37 | self.assertNotEqual(None, m, |
| | 38 | "%s does not match the standard __str__ pattern " |
| | 39 | "ClassName(arg1, arg2, etc)" % str(addr)) |
| | 40 | self.assertEqual(addr.__class__.__name__, m.group(1)) |
| | 41 | |
| | 42 | args = [x.strip() for x in m.group(2).split(",")] |
| | 43 | self.assertEqual(len(args), len(self.addressArgSpec)) |
| | 44 | def checkArg(arg, argSpec): |
| | 45 | self.assertEqual(argSpec[1] % getattr(addr, argSpec[0]), arg) |
| | 46 | map(checkArg, args, self.addressArgSpec) |
| | 47 | |
| | 48 | |
| | 49 | class IPv4AddressTestCaseMixin(AddressTestCaseMixin): |
| | 50 | def setUpClass(self): |
| | 51 | self.addressArgSpec = (("type", "%s"), ("host", "%r"), ("port", "%d")) |
| | 52 | |
| | 53 | |
| | 54 | class IPv4AddressTCPTestCase(unittest.TestCase, IPv4AddressTestCaseMixin): |
| | 55 | def buildAddress(self): |
| | 56 | return IPv4Address("TCP", "127.0.0.1", 0) |
| | 57 | |
| | 58 | |
| | 59 | class IPv4AddressUDPTestCase(unittest.TestCase, IPv4AddressTestCaseMixin): |
| | 60 | def buildAddress(self): |
| | 61 | return IPv4Address("UDP", "127.0.0.1", 0) |
| | 62 | |
| | 63 | def test_BuildEndpoint(self): |
| | 64 | pass |
| | 65 | test_BuildEndpoint.skip = "UDP Endpoints are not yet supported" |
| | 66 | |
| | 67 | |
| | 68 | class UNIXAddressTestCase(unittest.TestCase, AddressTestCaseMixin): |
| | 69 | def setUpClass(self): |
| | 70 | self._socketAddress = self.mktemp() |
| | 71 | self.addressArgSpec = (("name", "%r"),) |
| | 72 | |
| | 73 | def buildAddress(self): |
| | 74 | return UNIXAddress(self._socketAddress) |