예제 #1
0
    def test_validateAndExecuteRequest(self):
        '''Test a request for an existing service and method.'''

        # Add a test service
        service = self.registerTestService()

        # Define an RPC request for an existing service and method
        self.rpc_request.service_name = service.DESCRIPTOR.full_name
        self.rpc_request.method_name = "TestMethod"

        # Serialize the request
        (bytestream, sock) = self.serializeRpcRequestToSocket()

        # Construct the expected response from the service
        expected_response = test_pb2.Response()
        expected_response.str_data = service.response_str_data
        expected_response.int_data = service.response_int_data
        serialized_payload = expected_response.SerializeToString()

        expected_rpc = rpc_pb2.Response()
        expected_rpc.callback = True
        expected_rpc.response_proto = serialized_payload

        # Run the method on the server
        handler = server.SocketHandler(sock, self.client_addr,
                                       self.server_addr, self.testserver)
        received_rpc = handler.validateAndExecuteRequest(bytestream)

        # Check the response message error code
        self.assertEqual(received_rpc, expected_rpc, 'Normal response')
예제 #2
0
    def test_retrieveProtoRequest(self):
        '''Test normal return from retrieveMethod.'''

        # Protocol message
        expected_str_data = self.service_request.str_data

        # Add a test service
        expected_service = self.registerTestService()
        expected_method = expected_service.DESCRIPTOR.FindMethodByName(
            "TestMethod")

        # Define an RPC request for an existing service and method
        self.rpc_request.service_name = expected_service.DESCRIPTOR.full_name
        self.rpc_request.method_name = "TestMethod"

         # Serialize the request and create the socket handler
        (bytestream, sock) = self.serializeRpcRequestToSocket()
        handler = server.SocketHandler(sock, self.client_addr,
                                       self.server_addr, self.testserver)

        proto_request = handler.retrieveProtoRequest(
            expected_service, expected_method, self.rpc_request)

        self.assertEqual(proto_request.str_data, expected_str_data,
                         'Normal response')
예제 #3
0
    def test_retrieveProtoRequest_BAD_REQUEST_PROTO(self):
        '''Test exceptional return from retrieveProtoRequest.'''

         # Protocol message
        expected_str_data = self.service_request.str_data

        # Add a test service
        expected_service = self.registerTestService()
        expected_method = expected_service.DESCRIPTOR.FindMethodByName(
            "TestMethod")

        # Define an RPC request for an existing service and method
        self.rpc_request.service_name = expected_service.DESCRIPTOR.full_name
        self.rpc_request.method_name = "TestMethod"

         # Serialize the request and create the socket handler
        (bytestream, sock) = self.serializeRpcRequestToSocket()
        handler = server.SocketHandler(sock, self.client_addr,
                                       self.server_addr, self.testserver)

        # Force a bad protocol message
        self.rpc_request.request_proto = "Bad protocol message"

        # Run the method
        self.assertRaises(error.BadRequestProtoError,
                          handler.retrieveProtoRequest,
                          expected_service, expected_method, self.rpc_request)
예제 #4
0
    def test_callMethod(self):
        ''' Test normal return for callMethod '''

        # Get the service and method
        service = self.registerTestService()
        method = service.DESCRIPTOR.FindMethodByName("TestMethod")

        # Define an RPC request for an existing service and method
        self.rpc_request.service_name = service.DESCRIPTOR.full_name
        self.rpc_request.method_name = "TestMethod"

         # Serialize the request
        (bytestream, sock) = self.serializeRpcRequestToSocket()

        # Construct the expected response from the service
        expected_response = test_pb2.Response()
        expected_response.str_data = service.response_str_data
        expected_response.int_data = service.response_int_data
        serialized_payload = expected_response.SerializeToString()

        # Wrap the expected response in an RPC Response message
        expected_rpc = rpc_pb2.Response()
        expected_rpc.callback = True
        expected_rpc.response_proto = serialized_payload

        handler = server.SocketHandler(sock, self.client_addr,
                                       self.server_addr,
                                       self.testserver)

        response = handler.callMethod(service, method, self.service_request)

        self.assertEquals(response, expected_rpc, 'Normal response')
예제 #5
0
    def test_parseServiceRequest_junk_input(self):
        '''Test the correct error is raised after sending complete crap.'''

        # Bind an arbitrary bytestream to the socket
        bytestream = 'ABCD'
        socket_factory = FakeSocketFactory()
        sock = socket_factory.createSocket()

        # Test the server handler raises the BAD_REQUEST_DATA error code
        handler = server.SocketHandler(sock, self.client_addr,
                                       self.server_addr, self.testserver)
        self.assertRaises(error.BadRequestDataError,
                          handler.parseServiceRequest, bytestream)
예제 #6
0
    def test_parseServiceRequest(self):
        '''Test normal return from parseServiceRequest.'''

        # Define the required fields of the RPC request
        self.rpc_request.service_name = 'service_full_name'
        self.rpc_request.method_name = 'method_name'

        # Serialize the request
        (bytestream, sock) = self.serializeRpcRequestToSocket()

        handler = server.SocketHandler(sock, self.client_addr,
                                       self.server_addr, self.testserver)
        self.assertEqual(handler.parseServiceRequest(bytestream),
                         self.rpc_request, "Parsing request - normal return")
예제 #7
0
    def test_parseServiceRequest_BAD_REQUEST_DATA(self):
        '''
        Test the correct error is raised after sending an invalid
        request.
        '''
        # Define an invalid RPC request (missing required service name)
        self.rpc_request.method_name = 'method_name'

        # Serialize the request (without checking initialisation status)
        (bytestream, sock) = self.serializeRpcRequestToSocket(partial=True)

        # Test the server handler raises the BAD_REQUEST_DATA error code
        handler = server.SocketHandler(sock, self.client_addr,
                                       self.server_addr, self.testserver)
        self.assertRaises(error.BadRequestDataError,
                          handler.parseServiceRequest, bytestream)
예제 #8
0
    def test_validateAndExecuteRequest_SERVICE_NOT_FOUND(self):
        '''Test a request for a non-existent service.'''

        # Define an RPC request for a non-existent service
        self.rpc_request.service_name = "Non-existent service"
        self.rpc_request.method_name = "Dummy method"

        # Serialize the request
        (bytestream, sock) = self.serializeRpcRequestToSocket()

        # Run the method on the server
        handler = server.SocketHandler(sock, self.client_addr,
                                       self.server_addr, self.testserver)
        response = handler.validateAndExecuteRequest(bytestream)

        # Check the response message error code
        self.assertEqual(response.error_reason, rpc_pb2.SERVICE_NOT_FOUND,
                         'Unexpected error code')
예제 #9
0
    def test_retrieveService_SERVICE_NOT_FOUND(self):
        '''Test exceptional return from retrieveService.'''

        # Add a test service
        expected_service = self.registerTestService()

        # Define an RPC request for a non-existent service and method
        self.rpc_request.service_name = "Non-existent service"
        self.rpc_request.method_name = "Dummy method"

        # Serialize the request and create the socket handler
        (bytestream, sock) = self.serializeRpcRequestToSocket()
        handler = server.SocketHandler(sock, self.client_addr,
                                       self.server_addr, self.testserver)

        # Run the method on the server
        self.assertRaises(error.ServiceNotFoundError, handler.retrieveService,
                          self.rpc_request.service_name)
예제 #10
0
    def test_retrieveService(self):
        '''Test normal return from retrieveService.'''

        # Add a test service
        expected_service = self.registerTestService()

        # Define an RPC request for an existing service and method
        self.rpc_request.service_name = expected_service.DESCRIPTOR.full_name
        self.rpc_request.method_name = "TestMethod"

        # Serialize the request and create the socket handler
        (bytestream, sock) = self.serializeRpcRequestToSocket()
        handler = server.SocketHandler(sock, self.client_addr,
                                       self.server_addr, self.testserver)

        # Run the method on the server
        received_service = handler.retrieveService(
            self.rpc_request.service_name)
        self.assertEqual(received_service, expected_service, 'Service found')
예제 #11
0
    def test_retrieveMethod_METHOD_NOT_FOUND(self):
        '''Test exceptional return from retrieveMethod.'''

        # Add a test service
        expected_service = self.registerTestService()
        expected_method = expected_service.DESCRIPTOR.FindMethodByName(
            "TestMethod")

        # Define an RPC request for an existing service and method
        self.rpc_request.service_name = expected_service.DESCRIPTOR.full_name
        self.rpc_request.method_name = "Non-existent method"

        # Serialize the request and create the socket handler
        (bytestream, sock) = self.serializeRpcRequestToSocket()
        handler = server.SocketHandler(sock, self.client_addr,
                                       self.server_addr, self.testserver)

        # Run the method on the server
        self.assertRaises(error.MethodNotFoundError, handler.retrieveMethod,
                          expected_service, self.rpc_request.method_name)
예제 #12
0
    def test_validateAndExecuteRequest_METHOD_NOT_FOUND(self):
        '''Test a request for a non-existent method.'''

        # Add a test service
        service = self.registerTestService()

        # Define an RPC request for an existing service but non-existent method
        self.rpc_request.service_name = service.DESCRIPTOR.full_name
        self.rpc_request.method_name = 'Dummy method'

        # Serialize the request
        (bytestream, sock) = self.serializeRpcRequestToSocket()

        # Run the method on the server
        handler = server.SocketHandler(sock, self.client_addr,
                                       self.server_addr, self.testserver)
        response = handler.validateAndExecuteRequest(bytestream)

        # Check the response message error code
        self.assertEqual(response.error_reason, rpc_pb2.METHOD_NOT_FOUND,
                         'Unexpected error code')
예제 #13
0
    def test_callMethod_RPC_ERROR(self):
        '''Test for RPCERROR state.'''

        # Get the service and method
        exception = Exception('An exception has been raised')
        service = self.registerTestService(exception)
        method = service.DESCRIPTOR.FindMethodByName("TestMethod")

        # Define an RPC request for an existing service and method
        self.rpc_request.service_name = service.DESCRIPTOR.full_name
        self.rpc_request.method_name = "TestMethod"

         # Serialize the request
        (bytestream, sock) = self.serializeRpcRequestToSocket()

        handler = server.SocketHandler(sock, self.client_addr,
                                       self.server_addr,
                                       self.testserver)

        self.assertRaises(
            error.RpcError, handler.callMethod, service, method,
            self.service_request)
예제 #14
0
    def test_callMethod_RPC_FAILED(self):
        '''Test for RPCFAILED state.'''

        # Get the service and method
        failmsg = "User defined error"
        service = self.registerTestService(None, failmsg)
        method = service.DESCRIPTOR.FindMethodByName("TestMethod")

        # Define an RPC request for an existing service and method
        self.rpc_request.service_name = service.DESCRIPTOR.full_name
        self.rpc_request.method_name = "TestMethod"

         # Serialize the request
        (bytestream, sock) = self.serializeRpcRequestToSocket()

        handler = server.SocketHandler(sock, self.client_addr,
                                       self.server_addr,
                                       self.testserver)

        response = handler.callMethod(service, method, self.service_request)

        self.assertEquals(response.error_reason, rpc_pb2.RPC_FAILED,
                          'RPC_FAILED - error code')
        self.assertEquals(response.error, failmsg, 'RPC_FAILED - messsage')