diff --git a/Lib/test/test_imaplib.py b/Lib/test/test_imaplib.py --- a/Lib/test/test_imaplib.py +++ b/Lib/test/test_imaplib.py @@ -172,6 +172,76 @@ self._send_tagged(tag, 'OK', 'LOGIN completed') +class NewIMAPTests(unittest.TestCase): + + def _setup(self, imap_server): + """ + Setups imap_server (which should inherit SimpleIMAPHandler) for tests. + Returns (client, server). + """ + class TestTCPServer(socketserver.TCPServer): + def handle_error(self, request, client_address): + """ + End request and raise the error if one occurs. + """ + self.close_request(request) + self.server_close() + raise + + server = TestTCPServer((support.HOST, 0), imap_server) + thread = threading.Thread( + name=server.__class__.__name__, + target=server.serve_forever, + # Short poll interval to make the test finish quickly. + # Time between requests is short enough that we won't wake + # up spuriously too many times. + kwargs={'poll_interval': 0.01}) + thread.daemon = True # In case this function raises. + thread.start() + + client = imaplib.IMAP4(*server.server_address) + + # cleaning up (LIFO order) + self.addCleanup(thread.join) + self.addCleanup(server.server_close) + self.addCleanup(server.shutdown) + # if logout was called already we'd raise an exception trying to + # shutdown the client once again + self.addCleanup(lambda c: c.shutdown() if c.state != 'LOGOUT' + else None, client) + + return client, server + + + def test_login(self): + client, _ = self._setup(SimpleIMAPHandler) + typ, data = client.login('user', 'pass') + self.assertEqual(typ, 'OK') + self.assertEqual(data[0], b'LOGIN completed') + self.assertEqual(client.state, 'AUTH') + + def test_logout(self): + client, _ = self._setup(SimpleIMAPHandler) + typ, data = client.login('user', 'pass') + self.assertEqual(typ, 'OK') + self.assertEqual(data[0], b'LOGIN completed') + typ, data = client.logout() + self.assertEqual(typ, 'BYE') + self.assertEqual(data[0], b'IMAP4ref1 Server logging out') + self.assertEqual(client.state, 'LOGOUT') + + def test_lsub(self): + class LsubCmd(SimpleIMAPHandler): + def cmd_LSUB(self, tag, args): + self._send_textline('* LSUB () "." directoryA') + return self._send_tagged(tag, 'OK', 'LSUB completed') + client, _ = self._setup(LsubCmd) + client.login('user', 'pass') + typ, data = client.lsub() + self.assertEqual(typ, 'OK') + self.assertEqual(data[0], b'() "." directoryA') + + class ThreadedNetworkedTests(unittest.TestCase): server_class = socketserver.TCPServer imap_class = imaplib.IMAP4 @@ -615,5 +685,9 @@ keyfile=CERTFILE, ssl_context=self.create_ssl_context()) -if __name__ == "__main__": - unittest.main() +@support.reap_threads +def test_main(verbose=None): + support.run_unittest(NewIMAPTests) + +if __name__ == '__main__': + test_main()