Test the state of UDP sockets after SOCK_DESTROY.
Test: This *is* a test.
Change-Id: I5e54ff6a950479e2a200964c1a2518270e0a753c
diff --git a/net/test/sock_diag_test.py b/net/test/sock_diag_test.py
index 5d33810..28a1a20 100755
--- a/net/test/sock_diag_test.py
+++ b/net/test/sock_diag_test.py
@@ -643,15 +643,68 @@
def testClosesUdpSockets(self):
self.socketpairs = self._CreateLotsOfSockets(SOCK_DGRAM)
- for (addr, sport, dport), socketpair in self.socketpairs.iteritems():
+ for _, socketpair in self.socketpairs.iteritems():
s1, s2 = socketpair
+
self.assertSocketConnected(s1)
self.sock_diag.CloseSocketFromFd(s1)
self.assertSocketClosed(s1)
+
self.assertSocketConnected(s2)
self.sock_diag.CloseSocketFromFd(s2)
self.assertSocketClosed(s2)
+ def BindToRandomPort(self, s, addr):
+ ATTEMPTS = 20
+ for i in xrange(20):
+ port = random.randrange(1024, 65535)
+ try:
+ s.bind((addr, port))
+ return port
+ except error, e:
+ if e.errno != EADDRINUSE:
+ raise e
+ raise ValueError("Could not find a free port on %s after %d attempts" %
+ (addr, ATTEMPTS))
+
+ def testSocketAddressesAfterClose(self):
+ for version in 4, 5, 6:
+ netid = random.choice(self.NETIDS)
+ dst = self.GetRemoteAddress(version)
+ family = {4: AF_INET, 5: AF_INET6, 6: AF_INET6}[version]
+ unspec = {4: "0.0.0.0", 5: "::", 6: "::"}[version]
+
+ # Closing a socket that was not explicitly bound (i.e., bound via
+ # connect(), not bind()) clears the source address and port.
+ s = self.BuildSocket(version, net_test.UDPSocket, netid, "mark")
+ self.SelectInterface(s, netid, "mark")
+ s.connect((dst, 53))
+ self.sock_diag.CloseSocketFromFd(s)
+ self.assertEqual((unspec, 0), s.getsockname()[:2])
+
+ # Closing a socket bound to an IP address leaves the address as is.
+ s = self.BuildSocket(version, net_test.UDPSocket, netid, "mark")
+ src = self.MyAddress(version, netid)
+ s.bind((src, 0))
+ s.connect((dst, 53))
+ port = s.getsockname()[1]
+ self.sock_diag.CloseSocketFromFd(s)
+ self.assertEqual((src, 0), s.getsockname()[:2])
+
+ # Closing a socket bound to a port leaves the port as is.
+ s = self.BuildSocket(version, net_test.UDPSocket, netid, "mark")
+ port = self.BindToRandomPort(s, "")
+ s.connect((dst, 53))
+ self.sock_diag.CloseSocketFromFd(s)
+ self.assertEqual((unspec, port), s.getsockname()[:2])
+
+ # Closing a socket bound to IP address and port leaves both as is.
+ s = self.BuildSocket(version, net_test.UDPSocket, netid, "mark")
+ src = self.MyAddress(version, netid)
+ port = self.BindToRandomPort(s, src)
+ self.sock_diag.CloseSocketFromFd(s)
+ self.assertEqual((src, port), s.getsockname()[:2])
+
def testReadInterrupted(self):
"""Tests that read() is interrupted by SOCK_DESTROY."""
for version in [4, 5, 6]: