示例#1
0
    def testMakePath(self):
        builder = protourlencode.URLEncodedRequestBuilder(SuperSuperMessage(),
                                                          prefix='pre.')

        self.assertEquals(None, builder.make_path(''))
        self.assertEquals(None, builder.make_path('no_such_field'))
        self.assertEquals(None, builder.make_path('pre.no_such_field'))

        # Missing prefix.
        self.assertEquals(None, builder.make_path('sub_message'))

        # Valid parameters.
        self.assertEquals((('sub_message', None), ),
                          builder.make_path('pre.sub_message'))
        self.assertEquals((('sub_message', None), ('sub_messages', 1)),
                          builder.make_path('pre.sub_message.sub_messages-1'))
        self.assertEquals(
            (('sub_message', None), ('sub_messages', 1),
             ('int64_value', None)),
            builder.make_path('pre.sub_message.sub_messages-1.int64_value'))

        # Missing index.
        self.assertEquals(
            None,
            builder.make_path('pre.sub_message.sub_messages.integer_field'))

        # Has unexpected index.
        self.assertEquals(
            None,
            builder.make_path('pre.sub_message.sub_message-1.integer_field'))
示例#2
0
    def testAddParameter_NestedMessages(self):
        message = SuperSuperMessage()
        builder = protourlencode.URLEncodedRequestBuilder(message,
                                                          prefix='pre.')

        # Add a repeated empty message.
        self.assertTrue(
            builder.add_parameter('pre.sub_message.sub_messages-0', ['']))
        sub_message = message.sub_message.sub_messages[0]
        self.assertTrue(1, len(message.sub_message.sub_messages))
        self.assertTrue(isinstance(sub_message, test_util.OptionalMessage))
        self.assertEquals(None, getattr(sub_message, 'int64_value'))
        self.assertEquals(None, getattr(sub_message, 'string_value'))
        self.assertEquals(None, getattr(sub_message, 'enum_value'))

        # Add a repeated message with value.
        self.assertTrue(
            builder.add_parameter('pre.sub_message.sub_messages-1.int64_value',
                                  ['10']))
        self.assertTrue(2, len(message.sub_message.sub_messages))
        self.assertTrue(10, message.sub_message.sub_messages[1].int64_value)

        # Add another value to the same nested message.
        self.assertTrue(
            builder.add_parameter(
                'pre.sub_message.sub_messages-1.string_value', ['a string']))
        self.assertTrue(2, len(message.sub_message.sub_messages))
        self.assertEquals(10, message.sub_message.sub_messages[1].int64_value)
        self.assertEquals('a string',
                          message.sub_message.sub_messages[1].string_value)
示例#3
0
    def testAddParameter_UnexpectedNestedValue(self):
        """Test getting a nested value on a non-message sub-field

    There is an odd corner case where if trying to insert a repeated value
    on an nested repeated message that would normally succeed in being created
    should fail.  This case can only be tested when the first message of the
    nested messages already exists.

    Another case is trying to access an indexed value nested within a
    non-message field.
    """
        class HasRepeated(messages.Message):

            values = messages.IntegerField(1, repeated=True)

        class HasNestedRepeated(messages.Message):

            nested = messages.MessageField(HasRepeated, 1, repeated=True)

        message = HasNestedRepeated()
        builder = protourlencode.URLEncodedRequestBuilder(message,
                                                          prefix='pre.')

        self.assertTrue(builder.add_parameter('pre.nested-0.values-0', ['1']))
        # Try to create an indexed value on a non-message field.
        self.assertFalse(
            builder.add_parameter('pre.nested-0.values-0.unknown-0', ['1']))
        # Try to create an out of range indexed field on an otherwise valid
        # repeated message field.
        self.assertFalse(builder.add_parameter('pre.nested-1.values-1', ['1']))
示例#4
0
    def testAddParameter_UnexpectedNestedValue(self):
        """Test getting a nested value on a non-message sub-field."""
        message = test_util.HasNestedMessage()
        builder = protourlencode.URLEncodedRequestBuilder(message, 'pre.')

        self.assertFalse(
            builder.add_parameter('pre.nested.a_value.whatever', ['1']))
示例#5
0
    def build_request(self, handler, request_type):
        """Build request from URL encoded HTTP request.

    Constructs message from names of URL encoded parameters.  If this service
    handler has a parameter prefix, parameters must begin with it or are
    ignored.

    Args:
      handler: RequestHandler instance that is servicing request.
      request_type: Message type to build.

    Returns:
      Instance of request_type populated by protocol buffer in request
        parameters.

    Raises:
      RequestError if message type contains nested message field or repeated
      message field.  Will raise RequestError if there are any repeated
      parameters.
    """
        request = request_type()
        builder = protourlencode.URLEncodedRequestBuilder(
            request, prefix=self.__parameter_prefix)
        for argument in sorted(handler.request.arguments()):
            values = handler.request.get_all(argument)
            try:
                builder.add_parameter(argument, values)
            except messages.DecodeError, err:
                raise RequestError(str(err))
示例#6
0
    def testAddParameter_RepeatedParameters(self):
        message = test_util.OptionalMessage()
        builder = protourlencode.URLEncodedRequestBuilder(message,
                                                          prefix='pre.')

        self.assertRaises(messages.DecodeError, builder.add_parameter,
                          'pre.int64_value', [1, 2, 3])
        self.assertRaises(messages.DecodeError, builder.add_parameter,
                          'pre.int64_value', [])
示例#7
0
    def testAddParameter_SimpleAttributes(self):
        message = test_util.OptionalMessage()
        builder = protourlencode.URLEncodedRequestBuilder(message,
                                                          prefix='pre.')

        self.assertTrue(builder.add_parameter('pre.int64_value', ['10']))
        self.assertTrue(builder.add_parameter('pre.string_value',
                                              ['a string']))
        self.assertTrue(builder.add_parameter('pre.enum_value', ['VAL1']))
        self.assertEquals(10, message.int64_value)
        self.assertEquals('a string', message.string_value)
        self.assertEquals(test_util.OptionalMessage.SimpleEnum.VAL1,
                          message.enum_value)
示例#8
0
    def testAddParameter_RepeatedValues(self):
        message = test_util.RepeatedMessage()
        builder = protourlencode.URLEncodedRequestBuilder(message,
                                                          prefix='pre.')

        self.assertTrue(builder.add_parameter('pre.int64_value-0', ['20']))
        self.assertTrue(builder.add_parameter('pre.int64_value-1', ['30']))
        self.assertEquals([20, 30], message.int64_value)

        self.assertTrue(builder.add_parameter('pre.string_value-0', ['hi']))
        self.assertTrue(builder.add_parameter('pre.string_value-1', ['lo']))
        self.assertTrue(
            builder.add_parameter('pre.string_value-1', ['dups overwrite']))
        self.assertEquals(['hi', 'dups overwrite'], message.string_value)
示例#9
0
    def testAddParameter_InvalidAttributes(self):
        message = SuperSuperMessage()
        builder = protourlencode.URLEncodedRequestBuilder(message,
                                                          prefix='pre.')

        def assert_empty():
            self.assertEquals(None, getattr(message, 'sub_message'))
            self.assertEquals([], getattr(message, 'sub_messages'))

        self.assertFalse(builder.add_parameter('pre.nothing', ['x']))
        assert_empty()

        self.assertFalse(builder.add_parameter('pre.sub_messages', ['x']))
        self.assertFalse(
            builder.add_parameter('pre.sub_messages-1.nothing', ['x']))
        assert_empty()
示例#10
0
    def testAddParameter_NestedAttributes(self):
        message = SuperSuperMessage()
        builder = protourlencode.URLEncodedRequestBuilder(message,
                                                          prefix='pre.')

        # Set an empty message fields.
        self.assertTrue(builder.add_parameter('pre.sub_message', ['']))
        self.assertTrue(isinstance(message.sub_message, SuperMessage))

        # Add a basic attribute.
        self.assertTrue(
            builder.add_parameter('pre.sub_message.sub_message.int64_value',
                                  ['10']))
        self.assertTrue(
            builder.add_parameter('pre.sub_message.sub_message.string_value',
                                  ['hello']))

        self.assertTrue(10, message.sub_message.sub_message.int64_value)
        self.assertTrue('hello', message.sub_message.sub_message.string_value)
示例#11
0
    def testInvalidFieldFormat(self):
        message = test_util.OptionalMessage()
        builder = protourlencode.URLEncodedRequestBuilder(message,
                                                          prefix='pre.')

        self.assertFalse(builder.add_parameter('pre.illegal%20', ['1']))
示例#12
0
    def testAddParameter_InvalidValuesMayRepeat(self):
        message = test_util.OptionalMessage()
        builder = protourlencode.URLEncodedRequestBuilder(message,
                                                          prefix='pre.')

        self.assertFalse(builder.add_parameter('nothing', [1, 2, 3]))