xref: /vim-8.2.3635/src/testdir/test_netbeans.py (revision 321efdd7)
1*321efdd7SBram Moolenaar#!/usr/bin/python
2*321efdd7SBram Moolenaar#
3*321efdd7SBram Moolenaar# Server that will communicate with Vim through the netbeans interface.
4*321efdd7SBram Moolenaar# Used by test_netbeans.vim.
5*321efdd7SBram Moolenaar#
6*321efdd7SBram Moolenaar# This requires Python 2.6 or later.
7*321efdd7SBram Moolenaar
8*321efdd7SBram Moolenaarfrom __future__ import print_function
9*321efdd7SBram Moolenaarimport socket
10*321efdd7SBram Moolenaarimport sys
11*321efdd7SBram Moolenaarimport time
12*321efdd7SBram Moolenaarimport threading
13*321efdd7SBram Moolenaar
14*321efdd7SBram Moolenaartry:
15*321efdd7SBram Moolenaar    # Python 3
16*321efdd7SBram Moolenaar    import socketserver
17*321efdd7SBram Moolenaarexcept ImportError:
18*321efdd7SBram Moolenaar    # Python 2
19*321efdd7SBram Moolenaar    import SocketServer as socketserver
20*321efdd7SBram Moolenaar
21*321efdd7SBram Moolenaarclass ThreadedTCPRequestHandler(socketserver.BaseRequestHandler):
22*321efdd7SBram Moolenaar
23*321efdd7SBram Moolenaar    def handle(self):
24*321efdd7SBram Moolenaar        print("=== socket opened ===")
25*321efdd7SBram Moolenaar        while True:
26*321efdd7SBram Moolenaar            try:
27*321efdd7SBram Moolenaar                received = self.request.recv(4096).decode('utf-8')
28*321efdd7SBram Moolenaar            except socket.error:
29*321efdd7SBram Moolenaar                print("=== socket error ===")
30*321efdd7SBram Moolenaar                break
31*321efdd7SBram Moolenaar            except IOError:
32*321efdd7SBram Moolenaar                print("=== socket closed ===")
33*321efdd7SBram Moolenaar                break
34*321efdd7SBram Moolenaar            if received == '':
35*321efdd7SBram Moolenaar                print("=== socket closed ===")
36*321efdd7SBram Moolenaar                break
37*321efdd7SBram Moolenaar            print("received: {0}".format(received))
38*321efdd7SBram Moolenaar
39*321efdd7SBram Moolenaar            # Write the received line into the file, so that the test can check
40*321efdd7SBram Moolenaar            # what happened.
41*321efdd7SBram Moolenaar            with open("Xnetbeans", "a") as myfile:
42*321efdd7SBram Moolenaar                myfile.write(received)
43*321efdd7SBram Moolenaar
44*321efdd7SBram Moolenaar            response = ''
45*321efdd7SBram Moolenaar            if received.find('Makefile') > 0:
46*321efdd7SBram Moolenaar                name = received.split('"')[1]
47*321efdd7SBram Moolenaar                response = '5:putBufferNumber!33 "' + name + '"\n'
48*321efdd7SBram Moolenaar                response += '5:setDot!1 2/19\n'
49*321efdd7SBram Moolenaar            elif received.find('disconnect') > 0:
50*321efdd7SBram Moolenaar                # we're done
51*321efdd7SBram Moolenaar                self.server.shutdown()
52*321efdd7SBram Moolenaar                return
53*321efdd7SBram Moolenaar
54*321efdd7SBram Moolenaar            if len(response) > 0:
55*321efdd7SBram Moolenaar                self.request.sendall(response)
56*321efdd7SBram Moolenaar                # Write the respoinse into the file, so that the test can knows
57*321efdd7SBram Moolenaar                # the command was sent.
58*321efdd7SBram Moolenaar                with open("Xnetbeans", "a") as myfile:
59*321efdd7SBram Moolenaar                    myfile.write('send: ' + response)
60*321efdd7SBram Moolenaar
61*321efdd7SBram Moolenaarclass ThreadedTCPServer(socketserver.ThreadingMixIn, socketserver.TCPServer):
62*321efdd7SBram Moolenaar    pass
63*321efdd7SBram Moolenaar
64*321efdd7SBram Moolenaardef writePortInFile(port):
65*321efdd7SBram Moolenaar    # Write the port number in Xportnr, so that the test knows it.
66*321efdd7SBram Moolenaar    f = open("Xportnr", "w")
67*321efdd7SBram Moolenaar    f.write("{0}".format(port))
68*321efdd7SBram Moolenaar    f.close()
69*321efdd7SBram Moolenaar
70*321efdd7SBram Moolenaarif __name__ == "__main__":
71*321efdd7SBram Moolenaar    HOST, PORT = "localhost", 0
72*321efdd7SBram Moolenaar
73*321efdd7SBram Moolenaar    server = ThreadedTCPServer((HOST, PORT), ThreadedTCPRequestHandler)
74*321efdd7SBram Moolenaar    ip, port = server.server_address
75*321efdd7SBram Moolenaar
76*321efdd7SBram Moolenaar    # Start a thread with the server.  That thread will then start a new thread
77*321efdd7SBram Moolenaar    # for each connection.
78*321efdd7SBram Moolenaar    server_thread = threading.Thread(target=server.serve_forever)
79*321efdd7SBram Moolenaar    server_thread.start()
80*321efdd7SBram Moolenaar
81*321efdd7SBram Moolenaar    writePortInFile(port)
82*321efdd7SBram Moolenaar
83*321efdd7SBram Moolenaar    print("Listening on port {0}".format(port))
84*321efdd7SBram Moolenaar
85*321efdd7SBram Moolenaar    # Main thread terminates, but the server continues running
86*321efdd7SBram Moolenaar    # until server.shutdown() is called.
87*321efdd7SBram Moolenaar    try:
88*321efdd7SBram Moolenaar        while server_thread.isAlive():
89*321efdd7SBram Moolenaar            server_thread.join(1)
90*321efdd7SBram Moolenaar    except (KeyboardInterrupt, SystemExit):
91*321efdd7SBram Moolenaar        server.shutdown()
92