def testDurationSerializeAndParse(self): message = duration_pb2.Duration() # Generated output should contain 3, 6, or 9 fractional digits. message.seconds = 0 message.nanos = 0 self.CheckDurationConversion(message, '0s') message.nanos = 10000000 self.CheckDurationConversion(message, '0.010s') message.nanos = 10000 self.CheckDurationConversion(message, '0.000010s') message.nanos = 10 self.CheckDurationConversion(message, '0.000000010s') # Test min and max message.seconds = 315576000000 message.nanos = 999999999 self.CheckDurationConversion(message, '315576000000.999999999s') message.seconds = -315576000000 message.nanos = -999999999 self.CheckDurationConversion(message, '-315576000000.999999999s') # Parsing accepts an fractional digits as long as they fit into nano # precision. message.FromJsonString('0.1s') self.assertEqual(100000000, message.nanos) message.FromJsonString('0.0000001s') self.assertEqual(100, message.nanos)
def testTimedeltaConversion(self): message = duration_pb2.Duration() message.FromNanoseconds(1999999999) td = message.ToTimedelta() self.assertEqual(1, td.seconds) self.assertEqual(999999, td.microseconds) message.FromNanoseconds(-1999999999) td = message.ToTimedelta() self.assertEqual(-1, td.days) self.assertEqual(86398, td.seconds) self.assertEqual(1, td.microseconds) message.FromMicroseconds(-1) td = message.ToTimedelta() self.assertEqual(-1, td.days) self.assertEqual(86399, td.seconds) self.assertEqual(999999, td.microseconds) converted_message = duration_pb2.Duration() converted_message.FromTimedelta(td) self.assertEqual(message, converted_message)
def testDurationIntegerConversion(self): message = duration_pb2.Duration() message.FromNanoseconds(1) self.assertEqual('0.000000001s', message.ToJsonString()) self.assertEqual(1, message.ToNanoseconds()) message.FromNanoseconds(-1) self.assertEqual('-0.000000001s', message.ToJsonString()) self.assertEqual(-1, message.ToNanoseconds()) message.FromMicroseconds(1) self.assertEqual('0.000001s', message.ToJsonString()) self.assertEqual(1, message.ToMicroseconds()) message.FromMicroseconds(-1) self.assertEqual('-0.000001s', message.ToJsonString()) self.assertEqual(-1, message.ToMicroseconds()) message.FromMilliseconds(1) self.assertEqual('0.001s', message.ToJsonString()) self.assertEqual(1, message.ToMilliseconds()) message.FromMilliseconds(-1) self.assertEqual('-0.001s', message.ToJsonString()) self.assertEqual(-1, message.ToMilliseconds()) message.FromSeconds(1) self.assertEqual('1s', message.ToJsonString()) self.assertEqual(1, message.ToSeconds()) message.FromSeconds(-1) self.assertEqual('-1s', message.ToJsonString()) self.assertEqual(-1, message.ToSeconds()) # Test truncation behavior. message.FromNanoseconds(1999) self.assertEqual(1, message.ToMicroseconds()) # For negative values, Duration will be rounded towards 0. message.FromNanoseconds(-1999) self.assertEqual(-1, message.ToMicroseconds())
def testInvalidDuration(self): message = duration_pb2.Duration() self.assertRaisesRegex( well_known_types.ParseError, 'Duration must end with letter "s": 1.', message.FromJsonString, '1') self.assertRaisesRegex( well_known_types.ParseError, 'Couldn\'t parse duration: 1...2s.', message.FromJsonString, '1...2s') text = '-315576000001.000000000s' self.assertRaisesRegex( well_known_types.Error, r'Duration is not valid\: Seconds -315576000001 must be in range' r' \[-315576000000\, 315576000000\].', message.FromJsonString, text) text = '315576000001.000000000s' self.assertRaisesRegex( well_known_types.Error, r'Duration is not valid\: Seconds 315576000001 must be in range' r' \[-315576000000\, 315576000000\].', message.FromJsonString, text) message.seconds = -315576000001 message.nanos = 0 self.assertRaisesRegex( well_known_types.Error, r'Duration is not valid\: Seconds -315576000001 must be in range' r' \[-315576000000\, 315576000000\].', message.ToJsonString) message.seconds = 0 message.nanos = 999999999 + 1 self.assertRaisesRegex( well_known_types.Error, r'Duration is not valid\: Nanos 1000000000 must be in range' r' \[-999999999\, 999999999\].', message.ToJsonString) message.seconds = -1 message.nanos = 1 self.assertRaisesRegex( well_known_types.Error, r'Duration is not valid\: Sign mismatch.', message.ToJsonString)
def testWellKnownInAnyMessage(self): message = any_pb2.Any() int32_value = wrappers_pb2.Int32Value() int32_value.value = 1234 message.Pack(int32_value) self.assertEqual( json.loads(json_format.MessageToJson(message, True)), json.loads( '{\n' ' "@type": \"type.googleapis.com/dis_sdk_python.dependency.google.protobuf.Int32Value\",\n' ' "value": 1234\n' '}\n')) parsed_message = any_pb2.Any() self.CheckParseBack(message, parsed_message) timestamp = timestamp_pb2.Timestamp() message.Pack(timestamp) self.assertEqual( json.loads(json_format.MessageToJson(message, True)), json.loads( '{\n' ' "@type": "type.googleapis.com/dis_sdk_python.dependency.google.protobuf.Timestamp",\n' ' "value": "1970-01-01T00:00:00Z"\n' '}\n')) self.CheckParseBack(message, parsed_message) duration = duration_pb2.Duration() duration.seconds = 1 message.Pack(duration) self.assertEqual( json.loads(json_format.MessageToJson(message, True)), json.loads( '{\n' ' "@type": "type.googleapis.com/dis_sdk_python.dependency.google.protobuf.Duration",\n' ' "value": "1s"\n' '}\n')) self.CheckParseBack(message, parsed_message) field_mask = field_mask_pb2.FieldMask() field_mask.paths.append('foo.bar') field_mask.paths.append('bar') message.Pack(field_mask) self.assertEqual( json.loads(json_format.MessageToJson(message, True)), json.loads( '{\n' ' "@type": "type.googleapis.com/dis_sdk_python.dependency.google.protobuf.FieldMask",\n' ' "value": "foo.bar,bar"\n' '}\n')) self.CheckParseBack(message, parsed_message) struct_message = struct_pb2.Struct() struct_message['name'] = 'Jim' message.Pack(struct_message) self.assertEqual( json.loads(json_format.MessageToJson(message, True)), json.loads( '{\n' ' "@type": "type.googleapis.com/dis_sdk_python.dependency.google.protobuf.Struct",\n' ' "value": {"name": "Jim"}\n' '}\n')) self.CheckParseBack(message, parsed_message) nested_any = any_pb2.Any() int32_value.value = 5678 nested_any.Pack(int32_value) message.Pack(nested_any) self.assertEqual( json.loads(json_format.MessageToJson(message, True)), json.loads( '{\n' ' "@type": "type.googleapis.com/dis_sdk_python.dependency.google.protobuf.Any",\n' ' "value": {\n' ' "@type": "type.googleapis.com/dis_sdk_python.dependency.google.protobuf.Int32Value",\n' ' "value": 5678\n' ' }\n' '}\n')) self.CheckParseBack(message, parsed_message)
def CheckDurationConversion(self, message, text): self.assertEqual(text, message.ToJsonString()) parsed_message = duration_pb2.Duration() parsed_message.FromJsonString(text) self.assertEqual(message, parsed_message)