| #!/usr/bin/python |
| """Fake minissdpd for unit tests. |
| |
| """ |
| |
| import BaseHTTPServer |
| import socket |
| import SocketServer |
| import sys |
| import threading |
| |
| |
| text_device_xml = """<root> |
| <specVersion><major>1</major><minor>0</minor></specVersion> |
| <device><friendlyName>Test Device</friendlyName> |
| <manufacturer>Google Fiber</manufacturer> |
| <modelDescription>Unit Test</modelDescription> |
| <modelName>ssdptax</modelName> |
| </device></root>""" |
| |
| |
| email_address_xml = """<root> |
| <specVersion><major>1</major><minor>0</minor></specVersion> |
| <device><friendlyName>FOOBAR: foo@example.com:</friendlyName> |
| <manufacturer>Google Fiber</manufacturer> |
| <modelDescription>Unit Test</modelDescription> |
| <modelName>ssdptax</modelName> |
| </device></root>""" |
| |
| |
| no_friendlyname_xml = """<root> |
| <specVersion><major>1</major><minor>0</minor></specVersion> |
| <device></device></root>""" |
| |
| |
| ssdp_device_xml = """<root> |
| <specVersion><major>1</major><minor>0</minor></specVersion> |
| <device><friendlyName>Test Device</friendlyName> |
| <manufacturer>Google Fiber</manufacturer> |
| <modelDescription>Unit Test</modelDescription> |
| <modelName>ssdptax multicast</modelName> |
| </device></root>""" |
| |
| |
| notify_template = 'NOTIFY\r\nHOST:239.255.255.250:1900\r\nLOCATION:%s\r\n' |
| notify_text = [''] |
| |
| |
| minissdpd_response = [''] |
| keep_running = [True] |
| |
| |
| class HttpHandler(BaseHTTPServer.BaseHTTPRequestHandler): |
| """Respond to an HHTP GET for SSDP DeviceInfo.""" |
| |
| def do_GET(self): |
| self.send_response(200) |
| self.send_header('Content-type','text/xml') |
| self.end_headers() |
| if self.path.endswith('text_device_xml'): |
| self.wfile.write(text_device_xml) |
| if self.path.endswith('email_address_xml'): |
| self.wfile.write(email_address_xml) |
| if self.path.endswith('no_friendlyname_xml'): |
| self.wfile.write(no_friendlyname_xml) |
| if self.path.endswith('ssdp_device_xml'): |
| self.wfile.write(ssdp_device_xml) |
| |
| |
| class ThreadingHTTPServer(SocketServer.ThreadingMixIn, BaseHTTPServer.HTTPServer): |
| pass |
| |
| |
| class UnixHandler(SocketServer.StreamRequestHandler): |
| """Respond to a command on MiniSSDPd's Unix socket.""" |
| |
| def handle(self): |
| data = self.request.recv(8192) |
| if 'quitquitquit' in data: |
| print 'Received quitquitquit, exiting...' |
| keep_running[0] = False |
| return |
| else: |
| self.request.sendall(bytearray(minissdpd_response[0])) |
| |
| |
| class UdpHandler(SocketServer.DatagramRequestHandler): |
| def handle(self): |
| self.request[1].sendto(bytearray(notify_text[0]), self.client_address) |
| |
| |
| class ThreadingUdpServer(SocketServer.ThreadingUDPServer): |
| allow_reuse_address = True |
| |
| |
| def main(): |
| socketpath = sys.argv[1] |
| testnum = int(sys.argv[2]) |
| if testnum == 1: |
| pathend = 'text_device_xml' |
| if testnum == 2: |
| pathend = 'email_address_xml' |
| if testnum == 3: |
| pathend = 'no_friendlyname_xml' |
| if testnum == 4: |
| pathend = 'ssdp_device_xml' |
| |
| h = ThreadingHTTPServer(("", 0), HttpHandler) |
| sn = h.socket.getsockname() |
| port = sn[1] |
| url = 'http://127.0.0.1:%d/%s' % (port, pathend) |
| st = 'server type' |
| uuid = 'uuid goes here' |
| if testnum == 4: |
| minissdpd_response[0] = [0] |
| else: |
| minissdpd_response[0] = [1] |
| minissdpd_response[0].extend([len(url)] + list(url)) |
| minissdpd_response[0].extend([len(st)] + list(st)) |
| minissdpd_response[0].extend([len(uuid)] + list(uuid)) |
| notify_text[0] = notify_template % url |
| |
| h_thread = threading.Thread(target=h.serve_forever) |
| h_thread.daemon = True |
| h_thread.start() |
| |
| d = ThreadingUdpServer(('', 1900), UdpHandler) |
| d.socket.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, |
| socket.inet_aton('239.255.255.250') + socket.inet_aton('0.0.0.0')) |
| d_thread = threading.Thread(target=d.serve_forever) |
| d_thread.daemon = True |
| d_thread.start() |
| |
| u = SocketServer.UnixStreamServer(socketpath, UnixHandler) |
| while keep_running[0]: |
| u.handle_request() |
| |
| |
| if __name__ == '__main__': |
| main() |