3 SLjAV@s(dZdZddlZddlZddlZddlZddlZddlZddlZddl Z y ddl Z Wne k rpddl Z YnXye Wnek rddZ YnXddlmZddlmZddlmZdd lmZdd lmZdd lmZdd lmZdd lmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZej rXe!Z"ddZ#ddZ$ddZ%ddZ&ej'Z'ej(defdefGdd d e'Z)Gd!d"d"e'Z*Gd#d$d$e'Z+Gd%d&d&e'Z,Gd'd(d(e'Z-e j.ej/d)kpej0d0kd,Gd-d.d.e'Z1e2d/kr$e j3dS)1aTests python protocol buffers against the golden message. Note that the golden messages exercise every known field type, thus this test ends up exercising and verifying nearly all of the parsing and serialization code in the whole library. TODO(kenton): Merge with wire_format_test? It doesn't make a whole lot of sense to call this a test of the "message" module, which only declares an abstract interface. z!gps@google.com (Gregory P. Smith)NcCs||k||kS)N)xyrr"/usr/lib/python3.6/message_test.py>sr)map_proto2_unittest_pb2)map_unittest_pb2) unittest_pb2)unittest_proto3_arena_pb2)descriptor_pb2)descriptor_pool)message_factory) text_format)api_implementation)encoder)packed_field_test_pb2) test_util)testing_refleaks)message)_parameterizedcCs||kS)Nr)valrrrisnanVsrcCst| ot|dS)Nr)r)rrrrisinfYsrcCst|o|dkS)Nr)r)rrrrIsPosInf\srcCst|o|dkS)Nr)r)rrrrIsNegInf^srZ_proto2Z_proto3c @s8eZdZddZddZddZddZd d Zd d Zd dZ ddZ ddZ ddZ ddZ ddZddZddZddZdd Zd!d"Zd#d$Zd%d&Zd'd(Zd)d*Zd+d,Zd-d.Zd/d0Zd1d2Zd3d4Zd5d6Zd7d8Zd9d:Zd;d<Z d=d>Z!d?d@Z"dAdBZ#dCdDZ$dEdFZ%dGdHZ&dIdJZ'dKdLZ(dMdNZ)dOdPZ*dQdRZ+dSdTZ,dUdVZ-dWdXZ.dYdZZ/d[d\Z0d]d^d_d`dadbe1gie2g Z3dcddZ4dedfZ5dgdhZ6didjZ7dkdlZ8dmdnZ9dodpZ:Gdqdrdre;ZdwdxZ?dydzZ@d{d|ZAd}d~ZBddZCddZDddZEddZFddZGd]S) MessageTestc CsXtjdkr|jdtjd}|jt}|jj|WdQRX|j dt |j dS)NpythonzSkipping testBadUtf8String, currently only the python api implementation raises UnicodeDecodeError when a string field contains bad utf-8.Zbad_utf8_stringzTestAllTypes.optional_string) rTypeZskipTestrGoldenFileData assertRaisesUnicodeDecodeError TestAllTypes FromStringassertInstr exception)selfmessage_moduleZ bad_utf8_datacontextrrrtestBadUtf8Stringjs     zMessageTest.testBadUtf8StringcCsr|tkrtjd}n tjd}|j}|j||tkrDtj|||j||jtj |}|j||jdS)NZ golden_message_oneof_implementedZgolden_message_proto3) r rrr!ParseFromStringZExpectAllFieldsSet assertEqualSerializeToStringcopydeepcopy)r&r' golden_datagolden_message golden_copyrrrtestGoldenMessagets    zMessageTest.testGoldenMessagecCshtjd}|j}|j||j}tj||j|||j||jtj|}|j||jdS)Ngolden_packed_fields_message) rrTestPackedTypesr*ZSetAllPackedFieldsr+r,r-r.)r&r'r/r0all_setr1rrrtestGoldenPackedMessages     z#MessageTest.testGoldenPackedMessagec Cs|j}|jt|jd|jt|jdtjdd}tjdkrv|jt j }|j|WdQRX|j dt |j nBtjdd0}tjd |j||j d t |d j WdQRXdS) Nr0rzUnexpected end-group tag.T)recordalwaysz4Unexpected end-group tag: Not all data was converted)r!r TypeErrorr" ExceptionrZTagBytesrrr DecodeErrorr+r$r%warningscatch_warnings simplefilter)r&r'msgZend_tagr(wrrrtestParseErrorss    zMessageTest.testParseErrorsc sd}|j}|jjddddg|j||jdd|j||jdd|j||jddGd d d tGfd d d t}|j|j|dWdQRXdS) Ns5 One string Two string Red string Blue stringz One stringz Two stringz Red stringz Blue string) deterministicFTc@s eZdZdS)z:MessageTest.testDeterminismParameters..BadArgErrorN)__name__ __module__ __qualname__rrrr BadArgErrorsrJcs$eZdZfddZfddZdS)z5MessageTest.testDeterminismParameters..BadArgcs dS)Nr)r&)rJrr __nonzero__szAMessageTest.testDeterminismParameters..BadArg.__nonzero__cs dS)Nr)r&)rJrr__bool__sz>MessageTest.testDeterminismParameters..BadArg.__bool__N)rGrHrIrKrLr)rJrrBadArgs rM)r!repeated_stringextendr+r,r>objectr)r&r'r/r0rMr)rJrtestDeterminismParameterss" z%MessageTest.testDeterminismParameterscCs@tjd}|j}|j|tj|}tj|}|j||dS)Nr0)rrr!r*pickledumpsloadsr+)r&r'r/r0pickled_messageunpickled_messagerrrtestPickleSupports     zMessageTest.testPickleSupportcCs|tkrd}nd}|j}|j||jt|j|jt|j|jt|jd|jt|jd|j ||j dS)Ns]as ]ar) r r!r* assertTrueroptional_floatoptional_doublerepeated_floatrepeated_doubler+r,)r&r'r/r0rrrtestPositiveInfinitys z MessageTest.testPositiveInfinitycCs|tkrd}nd}|j}|j||jt|j|jt|j|jt|jd|jt|jd|j ||j dS)Ns]as ]ar) r r!r*rXrrYrZr[r\r+r,)r&r'r/r0rrrtestNegativeInfinitys z MessageTest.testNegativeInfinitycCsd}|j}|j||jt|j|jt|j|jt|jd|jt|jd|j}|j}|j||jt|j|jt|j|jt|jd|jt|jddS)Ns]ar) r!r*rXrrYrZr[r\r,)r&r'r/r0 serializedrrrrtestNotANumbers  zMessageTest.testNotANumbercCsRd}|j}|j||jt|jd|jt|jd|j||jdS)Nsr)r4r*rXr packed_float packed_doubler+r,)r&r'r/r0rrrtestPositiveInfinityPackeds  z&MessageTest.testPositiveInfinityPackedcCsRd}|j}|j||jt|jd|jt|jd|j||jdS)Nsr)r4r*rXrrarbr+r,)r&r'r/r0rrrtestNegativeInfinityPackeds  z&MessageTest.testNegativeInfinityPackedcCsd}|j}|j||jt|jd|jt|jd|j}|j}|j||jt|jd|jt|jddS)Nsr)r4r*rXrrarbr,)r&r'r/r0r_rrrrtestNotANumberPacked%s  z MessageTest.testNotANumberPackedcCst|j}tjdd}||_|j|j|j|j|kdtjdd}||_|j|j|j|j|k| |_|j|j|j|j| k| |_|j|j|j|j| ktjdd}||_|j|j|j|j|kdtjdd}||_|j|j|j|j|k| |_|j|j|j|j| k| |_|j|j|j|j| kdS)Ng?ii)r!mathpowrYr*r,rX)r&r'rkMostPosExponentNoSigBitskMostPosExponentOneSigBitkMostNegExponentNoSigBitskMostNegExponentOneSigBitrrrtestExtremeFloatValues3s:  z"MessageTest.testExtremeFloatValuescCst|j}tjdd}||_|j|j|j|j|kdtjdd}||_|j|j|j|j|k| |_|j|j|j|j| k| |_|j|j|j|j| ktjdd}||_|j|j|j|j|kdtjdd}||_|j|j|j|j|k| |_|j|j|j|j| k| |_|j|j|j|j| kdS)Nrfig?ii)r!rhrirZr*r,rX)r&r'rrjrkrlrmrrrtestExtremeDoubleValues`s:  z#MessageTest.testExtremeDoubleValuescCs"|j}d|_|jt|ddS)Ng@zoptional_float: 2.0 )r!rYr+r$)r&r'rrrrtestFloatPrintingszMessageTest.testFloatPrintingcCs>|j}d|_tjdkr*|jt|dn|jt|ddS)Ng^!7ݚ?z%optional_double: 0.12345678912345678 z optional_double: 0.123456789123 )rq)r!rZsys version_infor+r$)r&r'rrrrtestHighPrecisionFloatPrintings  z*MessageTest.testHighPrecisionFloatPrintingcCs<|j}tj||j}|j|j|jt|ddS)N)r!rZSetAllNonLazyFieldsZTestEmptyMessager*r,r+r$)r&r'Z populatedemptyrrrtestUnknownFieldPrintings  z$MessageTest.testUnknownFieldPrintingcCs|j}|jjdd|jjdd|jjdd|jjdd|jddddgdd|jD|jddddgddt|jD|jddddgd d|jddd DdS) Nr8)bbrfrqr9cSsg|] }|jqSr)rx).0mrrr sz@MessageTest.testRepeatedNestedFieldIteration..cSsg|] }|jqSr)rx)ryrzrrrr{scSsg|] }|jqSr)rx)ryrzrrrr{sr<)r!repeated_nested_messageaddr+reversed)r&r'rCrrr testRepeatedNestedFieldIterationsz,MessageTest.testRepeatedNestedFieldIterationcCs|j}|jjd|jjd|jjd|jj|j|jdd|j|jdd|j|jdd|jt|jtdddg|jjd|jjd|jjd|jj|j|jdd|j|jdd|j|jdd|jjd|jjd |jjd |jj|j|jdd|j|jdd |j|jdd |jt|jtdd d g|j jd |j jd |j jd |j j|j|j dd |j|j dd |j|j dd |jt|j td d d gdS)z7Check some different types with the default comparator.r8rqrfrg?g?g333333?acbacbN) r!repeated_int32appendsortr+r$r[assertAlmostEqualrNZrepeated_bytes)r&r'rrrr0testSortingRepeatedScalarFieldsDefaultComparators@                zMessageTest.testSortingRepeatedCompositeFieldsCustomComparatorcCs|j}d|jj_d|jj_d|jj_d|jj_d|jj_d|jj_d|jj_|jjdd d |jdddddddgd d |jD|j}|j|j||jdddddddgd d |jDdS)zECheck passing a custom comparator to sort a repeated composite field. !  cSs |jdS)Nr)rx)zrrrr szFMessageTest.testSortingRepeatedCompositeFieldsStable..)rcSsg|] }|jqSr)rx)rynrrrr{ szHMessageTest.testSortingRepeatedCompositeFieldsStable..cSsg|] }|jqSr)rx)ryrrrrr{sN) r!r|r}rxrr+r,ClearZMergeFromString)r&r'rpbrrr(testSortingRepeatedCompositeFieldsStables$        z4MessageTest.testSortingRepeatedCompositeFieldsStablecCs@|j}tjd}dd}d|jj_d|jj_d|jj_d|jj_d|jj_d |jj_|jj|d |jd d |jDdddd ddg|jj|d d|jdd |jDddd dddgtj dkrdS|jj|d|jdd |jDdddd ddg|jj|d d|jdd |jDddd dddgdS)zECheck sorting a repeated composite field using list.sort() arguments.rxcSst|j|jS)N)cmprx)rrrrrrszEMessageTest.testRepeatedCompositeFieldSortArguments..r8rqrfrrr9)rcSsg|] }|jqSr)rx)rykrrrr{%szGMessageTest.testRepeatedCompositeFieldSortArguments..T)rreversecSsg|] }|jqSr)rx)ryrrrrr{(sN) sort_functioncSsg|] }|jqSr)rx)ryrrrrr{,s)rrcSsg|] }|jqSr)rx)ryrrrrr{/s)rq) r!rrr|r}rxrr+rrrs)r&r'rZget_bbZcmp_bbrrr'testRepeatedCompositeFieldSortArgumentss.        z3MessageTest.testRepeatedCompositeFieldSortArgumentscCs|j}|jjd|jjd|jjd|jjtd|jt|jdddg|jjtdd|jt|jdddgtjdkrdd}|jj|d |jt|jdddg|jj|dd |jt|jdddg|j jd |j jd |j jd |j jt d|jt|j d d d g|j jt dd|jt|j d d d gtjd krdd}|j j|d |jt|j d d d g|j j|dd |jt|j d d d gdS)!z9Check sorting a scalar field using list.sort() arguments.rqrfr8)rT)rrcSstt|t|S)N)rr)rrrrrr>szBMessageTest.testRepeatedScalarFieldSortArguments..)r)rrrrxrcSstt|t|S)N)rr)rrrrrrLsNrrr<r<rrrrr<)rqr<rrrrr<)rq) r!rrrrr+listrrrsrNr)r&r'rZabs_cmpZlen_cmprrr$testRepeatedScalarFieldSortArguments2s6        z0MessageTest.testRepeatedScalarFieldSortArgumentsc CsJ|j}|j}|jjd|jjd|jjd|jjd|jjd|jjdd|jj_d|jj_d|jj_d|jj_d|jj_d|jj_tjdkrdS||k}|j|jk}|jt ||d|jt |j|jd|jt |jdddgd|jt |j|jd|j t t |j|jddWdQRXdS)Nrr8rfrq)rq) r!rrr|r}rxrrrsr+rrr=)r&r'm1m2_rrrtestRepeatedFieldsComparableRs2                 z(MessageTest.testRepeatedFieldsComparablecCs,|j}|j|jtj|j|jtjdS)N)r!assertIsInstancer collectionsMutableSequencer|)r&r'rzrrrtestRepeatedFieldsAreSequencesusz*MessageTest.testRepeatedFieldsAreSequencescCsL|j}|jtt|jWdQRX|jtt|jWdQRXdS)N)r!rr=hashrr|)r&r'rzrrrtestRepeatedFieldsNotHashable{s   z)MessageTest.testRepeatedFieldsNotHashablecCs*|j}|jjjg|j|jddS)Npayload)NestedTestAllTypesrrrOrXHasField)r&r'rzrrr$testRepeatedFieldInsideNestedMessagesz0MessageTest.testRepeatedFieldInsideNestedMessagecCst|||j|j|dS)zMake sure that a nested message object exists. As soon as a nested message attribute is accessed, it will be present in the _fields dict, without being marked as actually being set. N)getattr assertFalser)r&rCZ attributerrrensureNestedMessageExistss z%MessageTest.ensureNestedMessageExistscCs,|j}|jt|jd|jt|jddS)NZno_such_oneof_fieldr)r!r ValueError WhichOneofr>)r&r'rzrrr testOneofGetCaseNonexistingFieldsz,MessageTest.testOneofGetCaseNonexistingFieldcCs|j}|jd|jd|j|jdd|_|jd|jd|j|jd|j|jdd|_|jd|jd|j|jd|j|jddS)N oneof_field oneof_uint32r oneof_stringru) r!assertIsrrrrr+rXr)r&r'rzrrrtestOneofDefaultValuessz"MessageTest.testOneofDefaultValuescCsb|j}|jd|jdd|_|jd|jd|j|jdd|_|jd|jd|j|jd|j|jd|j |jd|jd|j|jd|j|jd|j j |jd|jd|j|jd|j|jdd|j _ |jd|jd|j|jd|j|jdd|_ |jd|jd|j|jd|j|jddS) Nrrrfooroneof_nested_messagesbb oneof_bytes) r!rrrr+rXrrrrrxr)r&r'rzrrrtestOneofSemanticss2zMessageTest.testOneofSemanticscCs>|j}d|_|j|d|jd|jd|jd|jdS)Nrrrr)r!rrr+r)r&r'rzrrr!testOneofCompositeFieldReadAccesss  z-MessageTest.testOneofCompositeFieldReadAccesscCs|j}|jd|jd|tkr2|j|jdd|_|jd|jd|tkrb|j|jdd|_ |jd|jd|j d|jd|jd|tkr|j|jddS)Nrrrsbbr) r!rrr rrrr+rXr ClearField)r&r'rzrrrtestOneofWhichOneofs zMessageTest.testOneofWhichOneofcCsV|j}d|_|jd|tkr0|j|jd|j|jd|jd|jddS)Nrrr)r!rrr rrrr)r&r'rzrrrtestOneofClearFields zMessageTest.testOneofClearFieldcCsV|j}d|_|jd|tkr0|j|jd|j|jd|jd|jddS)Nrrr)r!rrr rrrr)r&r'rzrrrtestOneofClearSetFields z"MessageTest.testOneofClearSetFieldcCsp|j}d|_|j|d|jd|jd|j|tkrJ|j|jd|j|jd|jd|jddS)Nrrrr) r!rrrr+r rXrr)r&r'rzrrrtestOneofClearUnsetFields  z$MessageTest.testOneofClearUnsetFieldcCs:|j}d|_|j}|j|j|jd|jddS)Nrrr)r!rr*r,r+r)r&r'rzrrrrtestOneofDeserializes z MessageTest.testOneofDeserializecCs6|j}d|_|j}|j||jd|jddS)Nrrr)r!rCopyFromr+r)r&r'rzrrrrtestOneofCopyFroms  zMessageTest.testOneofCopyFromcCsb|j}d|j_|j}d|j_d|jj_|j||jd|jjd|jd|jjjddS)Nrsbbrrr)rrrrchild MergeFromr+r)r&r'rzrrrrtestOneofNestedMergeFroms  z$MessageTest.testOneofNestedMergeFromcCsf|j}d|jj_d|jjj_|j}d|j_|j||jd|jjd|jd|jjjddS)Nr rrr) rrrrxrrrr+r)r&r'rzrrrrtestOneofMessageMergeFroms   z%MessageTest.testOneofMessageMergeFromcCs(|j|jjd}|jd|jddS)N)rrr)r! NestedMessager+r)r&r'rzrrrtestOneofNestedMessageInit$sz&MessageTest.testOneofNestedMessageInitcCsB|j}d|_|j|j|jdd|_|jd|jddS)Nrrsbbr)r!rr assertIsNonerrr+)r&r'rzrrrtestOneofClear)s zMessageTest.testOneofClearcCs&|j}td|_|j|jtjdS)zmAssigning a byte string to a string field should result in the value being converted to a Unicode string.ruN)r!r$optional_stringrsix text_type)r&r'rzrrr"testAssignByteStringToUnicodeField1s z.MessageTest.testAssignByteStringToUnicodeFieldcCs|j}|jjd|jtdtt|j}|jt|jt|d|jj_|jtdtt|j}|jt|jt|dS)z|It should be possible to use long-valued indicies in slices This didn't used to work in the v2 C++ implementation. r8rrqN) r!rrlongrr+r|r}rx)r&r'rzZslrrrtestLongValuedSlice8s  zMessageTest.testLongValuedSlicecCsl|j}|jt }|jjddtdDWdQRX|jt }|jjddtdDWdQRXdS)z5This didn't use to work in the v2 C++ implementation.css|] }tVqdS)N)r)ryirrr MszCMessageTest.testExtendShouldNotSwallowExceptions..rNcss|] }tVqdS)N)r)ryrrrrrPs)r!r NameErrorrrOrangerepeated_nested_enum)r&r'rzrrrr$testExtendShouldNotSwallowExceptionsIs  $ z0MessageTest.testExtendShouldNotSwallowExceptionsNFrgrucCs^|j}|jg|jx(tjD]}|jj||jg|jqW|jjg|jg|jdS)z,Test no-ops extending repeated int32 fields.N)r!assertSequenceEqualrr FALSY_VALUESrO)r&r'rz falsy_valuerrrtestExtendInt32WithNothingTs   z&MessageTest.testExtendInt32WithNothingcCs^|j}|jg|jx(tjD]}|jj||jg|jqW|jjg|jg|jdS)z,Test no-ops extending repeated float fields.N)r!rr[rrrO)r&r'rzrrrrtestExtendFloatWithNothingas   z&MessageTest.testExtendFloatWithNothingcCs^|j}|jg|jx(tjD]}|jj||jg|jqW|jjg|jg|jdS)z-Test no-ops extending repeated string fields.N)r!rrNrrrO)r&r'rzrrrrtestExtendStringWithNothingns   z'MessageTest.testExtendStringWithNothingcCs|j}|jg|j|jjdg|jdg|j|jjddg|jdddg|j|jjddg|jdddddg|jdS)z7Test extending repeated int32 fields with python lists.rr8rfrqr9N)r!rrrO)r&r'rzrrrtestExtendInt32WithPythonList{sz)MessageTest.testExtendInt32WithPythonListcCs|j}|jg|j|jjdg|jdg|j|jjddg|jdddg|j|jjddg|jdddddg|jdS)z7Test extending repeated float fields with python lists.gg?g@g@g@N)r!rr[rO)r&r'rzrrrtestExtendFloatWithPythonListsz)MessageTest.testExtendFloatWithPythonListcCs|j}|jg|j|jjdg|jdg|j|jjddg|jdddg|j|jjddg|jdddddg|jdS)z8Test extending repeated string fields with python lists.ruZ11Z22Z33Z44N)r!rrNrO)r&r'rzrrrtestExtendStringWithPythonListsz*MessageTest.testExtendStringWithPythonListcCs:|j}|jg|j|jjd|jdddg|jdS)zDTest extending repeated string fields with characters from a string.abcrrrN)r!rrNrO)r&r'rzrrrtestExtendStringWithStrings z&MessageTest.testExtendStringWithStringc@s2eZdZdZd ddZddZddZd d ZdS) zMessageTest.TestIterablezThis iterable object mimics the behavior of numpy.array. __nonzero__ fails for length > 1, and returns bool(item[0]) for length == 1. NcCs|pg|_dS)N)_list)r&valuesrrr__init__sz!MessageTest.TestIterable.__init__cCs8t|j}|dkrdS|dkr,t|jdStddS)NrFr8zTruth value is ambiguous.)rrboolr)r&sizerrrrKs  z$MessageTest.TestIterable.__nonzero__cCs t|jS)N)rr)r&rrr__len__sz MessageTest.TestIterable.__len__cCs |jjS)N)r__iter__)r&rrrrsz!MessageTest.TestIterable.__iter__)N)rGrHrI__doc__rrKrrrrrr TestIterables  rcCs|j}|jg|j|jjtjg|jg|j|jjtjdg|jdg|j|jjtjddg|jdddg|j|jjtjddg|jdddddg|jdS)z3Test extending repeated int32 fields with iterable.rr8rfrqr9N)r!rrrOrr)r&r'rzrrrtestExtendInt32WithIterablesz'MessageTest.testExtendInt32WithIterablecCs|j}|jg|j|jjtjg|jg|j|jjtjdg|jdg|j|jjtjddg|jdddg|j|jjtjddg|jdddddg|jdS)z3Test extending repeated float fields with iterable.gg?g@g@g@N)r!rr[rOrr)r&r'rzrrrtestExtendFloatWithIterablesz'MessageTest.testExtendFloatWithIterablecCs|j}|jg|j|jjtjg|jg|j|jjtjdg|jdg|j|jjtjddg|jdddg|j|jjtjddg|jdddddg|jdS)z4Test extending repeated string fields with iterable.ru1234N)r!rrNrOrr)r&r'rzrrrtestExtendStringWithIterablesz(MessageTest.testExtendStringWithIterablec CsPtjdkstjdkrdS|j}|jtj}tj|jtj WdQRXdS)Ncpprf) rrZVersionr!rrRZ PickleErrorrSrZHIGHEST_PROTOCOL)r&r'rzrrrr!testPickleRepeatedScalarContainers   z-MessageTest.testPickleRepeatedScalarContainercCs|j}|jjdS)z?Exercise a scenario that has led to segfaults in the past. N)r!r|r)r&r'rzrrr'testSortEmptyRepeatedCompositeContainersz3MessageTest.testSortEmptyRepeatedCompositeContainerc Cs,|j}|jt}|jdWdQRXdS)zBUsing HasField on a repeated field should raise an exception. rN)r!rrr)r&r'rzrrrrtestHasFieldOnRepeatedFields z'MessageTest.testHasFieldOnRepeatedFieldc Cs|j}|jt}|jjWdQRX|jjtd|jd|jj|jd|jjd|jd|jjd|jddg|jdS)Nrr9rrfr8rq)r!r IndexErrorrpoprOrr+)r&r'rzrrrrtestRepeatedScalarFieldPops z&MessageTest.testRepeatedScalarFieldPopcCs|j}|jt}|jjWdQRX|jt}|jjdWdQRXx tdD]}|jj}||_qTW|j d|jjj|j d|jjdj|j d|jjdj|j ddgdd |jDdS) Nr7rr9rrfr8rqcSsg|] }|jqSr)rx)ryrrrrr{sz=MessageTest.testRepeatedCompositeFieldPop..) r!rrr|rr=rr}rxr+)r&r'rzrrrrrrtestRepeatedCompositeFieldPops    z)MessageTest.testRepeatedCompositeFieldPopcCs\|j}x.tdD]"}|jj|||jj}||_qW|j|j|j|j|j|jdS)Nr) r!rrinsertr|r}rxrr+)r&r'rzrrrrrtestRepeatedCompareWithSelfs  z'MessageTest.testRepeatedCompareWithSelfcCs6|j}|jj}|j}|jj}|j|jjddS)zwA case that lead to a segfault when a message detached from its parent container has itself a child container. rN)rZrepeated_childr}rr+roptional_int32)r&r'rzrrrtestReleasedNestedMessagess   z&MessageTest.testReleasedNestedMessagescCsz|j}|jt g|_WdQRX|jjdtjdkrZ|jt g|_WdQRXn|jt g|_WdQRXdS)Nr8r)r!rAttributeErrorrrrrr=)r&r'rzrrrtestSetRepeatedComposite(s     z$MessageTest.testSetRepeatedComposite)HrGrHrIr)r2r6rErQrWr]r^r`rcrdrernrorprtrwrrrrrrrrrrrrrrrrrrrrrrrrrrrrr bytearraysetrrrrrrrrrPrrrrrrrrrr r rrrrrres  $   --( # #                  rc@sTeZdZddZddZddZddZd d Zd d Zd dZ ddZ ddZ dS) Proto2TestcCstj}|j|jd|j|jd|j|jd|jt|jdWdQRX|jt|jdWdQRX|jt|jdWdQRX|jd|j|jd|j|jd|j j d|_d|_d|j _ |j |jd|j |jd|j |jdd |_d |_d |j _ |j |jd|j |jd|j |jd|j d|j d|j d|j|jd|j|jd|j|jd|jd|j|jd|j|jd|j j dS) Nr  optional_booloptional_nested_messagefield_doesnt_existrr|rFrT) r r!rrrrr+r rrrxrXr)r&rrrrtestFieldPresence:sD      zProto2Test.testFieldPresencecCs tj}|jt }d|_WdQRX|jt|jjd|jjdd|jd<|jtd|jd<WdQRXtj}d|_|jjd|j}tj}|j ||j |j d|j d|j|j dt |j|j|j |j|j d|j|j d|jddS) z:Assigning an invalid enum number is not allowed in proto2.iNrfri@itoptional_nested_enumr8)r r!rrrrrr r,r*rrr+rr)r&rzrrr_Zm3rrrtestAssignInvalidEnumjs*      z Proto2Test.testAssignInvalidEnumc Cs6tj}d|jd<|jtd|jd<WdQRXdS)Nr{r8)rZ TestEnumMapZknown_map_fieldrrZunknown_map_field)r&rzrrrtestUnknownEnumMaps  zProto2Test.testUnknownEnumMapcCstj}|jtt|ddS)N Extensions)r r!rr r)r&rCrrrtestExtensionsErrorsszProto2Test.testExtensionsErrorscCshtjd}tj}|j|tj}tj||j|||j||jtj |}|j||jdS)Nr0) rrr ZTestAllExtensionsr*ZSetAllExtensionsr+r,r-r.)r&r/r0r5r1rrrtestGoldenExtensionss     zProto2Test.testGoldenExtensionscCshtjd}tj}|j|tj}tj||j|||j||jtj |}|j||jdS)Nr3) rrr ZTestPackedExtensionsr*ZSetAllPackedExtensionsr+r,r-r.)r&r/r0r5r1rrrtestGoldenPackedExtensionss     z%Proto2Test.testGoldenPackedExtensionscCsNtjdd}tj|}tj|}|j|||j|jd|jtj |j dS)Nr8)r) r Z TestRequiredrRrSrTr+rrrZ EncodeErrorr,)r&r0rUrVrrrtestPickleIncompleteProtos     z$Proto2Test.testPickleIncompleteProtocCstjtjtjg}d|d_d|d_d|d_d|d_tj}d|_d|_d|_tjj}|jj||j j||j j||j j||j j||j jjj|d|j jjj|d|j jjj|d|jjjj|d|jjjj|d|jjjj|d|j}tj}|j||j|j||j|j||j|jj||j|jtjj||jt|jd|jt|jd|jt|jtjjddS)zcCheck the merge behavior when a required or optional field appears multiple times in the input.r8rrfrqZhelloN)r r!r optional_int64rZTestParsingMergeZRepeatedFieldsGeneratorZfield1rOZfield2Zfield3Zext1Zext2Zgroup1r}rZgroup2r,r*r+Zrequired_all_typesZoptional_all_types optionalgroupZoptional_group_all_typesrZ optional_extrZrepeated_all_types repeatedgroupZ repeated_ext)r&ZmessagesZmerged_message generatordataZ parsing_mergerrrtestParsingMergesJ              zProto2Test.testParsingMergecCs`tjddddddiddiid dd idd igd tjjgd dd }|j|tj|jd|j|jd|j|jd|j|jd|j|jd|j j |j|j tjj |jd|j j |j|jd|j|jtj|jtjj|j|jdt|j|jd |jdj |jd |jdj |jdt|j|jtjj|jd|jtjj|jd|jd |j|jd|j|j|jd|jdt|j|jd|jtjd d}|jtjj|j|jttjddidWdQRX|jttjddidWdQRX|jttjddWdQRX|jttjd dWdQRXdS)Ndgr@xrirxiBAZiXiFOOi r) r optional_fixed32rYoptional_bytesr!roptional_foreign_messagerr"r default_int32rr-rfrr8r *)rZINVALID_NESTED_FIELD)rZINVALID_VALUE_TYPEZ INVALID_LABEL)r) r r!ZBARrr+r r+rYr,r!rrrrxrXrr-ForeignMessager)rrr"rr*r.rrr[Z default_int64rrr=)r&rrrrtestPythonicInitsl              zProto2Test.testPythonicInitN) rGrHrIrrrrrrrr%r2rrrrr8s0  1rc@s eZdZddZddZddZddZd d Zd d Zd dZ ddZ ddZ ddZ ddZ ddZddZddZddZdd Zd!d"Zd#d$Zd%d&Zd'd(Zd)d*Zd+d,Zd-d.Zd/d0Zd1d2Zd3d4Zd5d6Zd7d8Zd9d:Zd;d<Z d=d>Z!d?d@Z"dAS)B Proto3TestcCs@t|}x&|D]\}}|j|||||=qW|ji|dS)N)dictr+)r&Zmap_iterZ dict_valuervrrrassertMapIterEquals+s  zProto3Test.assertMapIterEqualsc4Cstj}|jt|jdWdQRX|jt|jdWdQRX|jt|jdWdQRX|jt|jdWdQRX|j|jd|jt|jdWdQRX|jt|jdWdQRX|jt|jdWdQRX|jd |j|jd |j|jd |j |jd |j |jd |j j d |j _ |j |jdd |_d |_d|_ d|_ d|j _ |jd|jd|jd|jd|jd|jd |j|jd |j|jd |j |jd |j |jd |j j dS)Nr rYrrrrrr|rruFrg?rTr)r r!rrrrr+r rYrrrrxrXr)r&rrrrr5sL            zProto3Test.testFieldPresencecCstj}d|_|jd|j|jjd|jd|jdd|jd<|jd|jd|j}tj}|j||jd|j|jd|jddS)zCAssigning an unknown enum value is allowed and preserves the value.iiTritN)r r!rr+rrr,r*)r&rzr_rrrrtestAssignUnknownEnumns   z Proto3Test.testAssignUnknownEnumcCsNtj}|jd |jk|jd|jk|jd|jk|jd|jk|jd|jk|jd|jk|jd|j k|jd|j k|jd|j k|j d|jd|j d|jd|j d|jd|j d|jd|j d |jd|j t|jdt|j d|jd|j t|jdt|j d |j d|j d |j d|j d|j d|j d|jk|j d|jk|j d|jk|j d|jk|j d|jk|j d|jk|j d|j k|j d|j k|j d|j k|j|j dtj|jt|j dWdQRX|jtd|j kWdQRXdS)NrrfrFroixrgrurilllilllilll)rTestMaprmap_int32_int32map_int64_int64map_uint32_uint32map_uint64_uint64map_int32_double map_bool_boolmap_string_stringZmap_int32_bytesmap_int32_enumr+rX isinstancefloatrrrrrr=)r&rCrrrtestScalarMapDefaultssF  z Proto3Test.testScalarMapDefaultscCs&tj}|j|jjd|jd|jjdd|j|jjdd|jd<|jd|jjd|jd|jjd|jt|jjdWdQRX|j|jjd|jd|jjdd|jd}|j ||jjdt j dkr|jt|jjdWdQRXn|jd|jjddS)Nrrrrur) rr9rr:getr+rr=map_int32_foreign_messagerrr)r&rCsubmsgrrr testMapGets"    zProto3Test.testMapGetc!Cs4tj}|jdt|j|jd|jkd|jd<d|jd<d|jd<d|jd<d|j d<d |j d <d |j d <d |j d <d|j d<d|j d<|jg|j|jd t|j |jtd |j d<WdQRX|jd t|j |jtd|j d <WdQRX|j}tj}|j||jtd |j d<WdQRX|jtd|j d <WdQRX|jd|jd|jd|jd|jd|jd|jd|jd |jd|j d|jd |j d |jd |j d |jd |j d |jd|j d|jd|j dtjdkr0|jdt|jdS)!Nrrirrf"rg333333?gffffff @r8123rTixrz {-123: -456}i8illlllli8illllll)rr9r+rr:rr;r<r=Zmap_int32_floatr>r@r?rAFindInitializationErrorsrr=r,r*rrrr$)r&rCr_msg2rrr testScalarMapsP               zProto3Test.testScalarMapcCs@tj}d|jd<d|jd<|j|jd|jd|jdS)Nrrurs r )rr9r:r@r+ByteSizer,)r&rCrrrtestMapEntryAlwaysSerializeds   z'Proto3Test.testMapEntryAlwaysSerializedcCsntj}d}|jd}||j|<t|jjd\}}|j|||j|||j|tj |j|tj dS)Nuሴutf8r) rr9encoder@ritemsr+rrr)r&rCZ unicode_objZ bytes_objrvaluerrr testStringUnicodeConversionInMaps    z+Proto3Test.testStringUnicodeConversionInMapcCsZtj}|jdt|j|jd|jk|jd|jjd |jdt|j|jd|j|jd |j|jdt|j|jt |jdWdQRX|jt |jd|jd<WdQRX|jdt|j|j }tj}|j ||jdt|j|jd|j|jd |j|jdt|jt jdkrV|jd tt|jdS) NrrrirfrJirri8i8i8)rr9r+rrFrZ get_or_creater#rr=rr,r*rrr$)r&rCr_rLrrrtestMessageMap&s0     zProto3Test.testMessageMapcCstj}d|jdj_|jd=d|jdj_|jdt|jd|jdj_|jdt|j|j}tj}|j|ddg}x|D] }|j|=qWdS)Nr8rf) rr9map_int32_all_typesrrxr+rr,r*)r&rCr_rLkeysrrrrtestNestedMessageMapItemDeleteOs  z)Proto3Test.testNestedMessageMapItemDeletecCsptj}d|jd<|j}d|jd<|j|j|dd|jd_|j}d|jd_|j|j|ddS)Nr8)rr9r:rNr+rFr)r&rCrrrrtestMapByteSize`s    zProto3Test.testMapByteSizec Cstj}d|jd<d|jd<d|jd<d|jd_d |jd _tj}d |jd<d |jd <d|jd _d|jd _|jd }|j||jd|jd|jd|jd|jd|jd|jd |jd |jd|jdj|jd |jd j|j |jd j dt j dkr(|jd|ji}x.|jD]$}|j ||k|j|j||<q4W|jdd d||jd=|j d|jk|jd =|j d |jkt j dkr|j t|jd=WdQRXn|j t|jd=WdQRXdS)NrIrN8rrr8r7cXrrdr)r8r_ru)rr9r:r;rFrrcrr+rrrrrr=KeyError)r&rCrLZ old_map_valueZas_dictrrrr testMergeFromlsH              zProto3Test.testMergeFromc Cs.tj}|jtd|jdWdQRXdS)NzWParameter to MergeFrom\(\) must be instance of same class: expected .*TestMap got int\.r8)rr9assertRaisesRegexpr=r)r&rCrrrtestMergeFromBadTypes zProto3Test.testMergeFromBadTypec Cs.tj}|jtd|jdWdQRXdS)Nz[Parameter to [A-Za-z]*From\(\) must be instance of same class: expected .*TestMap got int\.r8)rr9rfr=r)r&rCrrrtestCopyFromBadTypes zProto3Test.testCopyFromBadTypecCstj}td|jtd<td |jtd <td|jtd<td |jtd <|j}tj}|j||j d|jd|j d|jd|j d|jd|j d|jddS)NirrfrIri8illlllli8illllll) rr9rr:r;r<r=r,r*r+)r&rCr_rLrrrtestIntegerMapWithLongss z"Proto3Test.testIntegerMapWithLongscCstj}d|jjd<|j}tj}|j||j||d|jjd<|j}|j||j|||jjj|j}|j||j||dS)Niriix)rTestMapSubmessagetest_mapr:r,r*r+clear)r&rCr_rLrrrtestMapAssignmentCausesPresences        z*Proto3Test.testMapAssignmentCausesPresencecCstj}d|jjd_|j}tj}|j||j||d|jjd_|j}|j||j|||jjdj|jjd|j}|j||j|||jjj |j}|j||j||dS)Nrrix) rrjrkrFrr,r*r+rrl)r&rCr_rLrrr-testMapAssignmentCausesPresenceForSubmessagess&         z8Proto3Test.testMapAssignmentCausesPresenceForSubmessagescCs~tj}t|j}t|j}d|jd<d|jd_|jtx |D]}qDWWdQRX|jtx |D]}qhWWdQRXdS)NrJrr)rr9iterr@rFrr RuntimeError)r&rCZstring_string_iterZint32_foreign_iterrrrrtestModifyMapWhileIteratings        z&Proto3Test.testModifyMapWhileIteratingc Cstj}|jd}|j||jd|j|tjd|_|j}tj}|j ||j d|jdj|j t tj|jd<WdQRXdS)Nr8rrb) rr9rFrrr r1rr,r*r+rr)r&rCrGr_rLrrrtestSubmessageMap s   zProto3Test.testSubmessageMapcCs|tj}x |jjD]\}}|jdqWd|jd<d|jd<d|jd<|jdt|jdddd}|j|jj|dS)NFr9rfrrq)rfrqr9)rr9r:rRrXr+rr6)r&rCrr5 matching_dictrrrtestMapIterations    zProto3Test.testMapIterationcstjdkr tj}d|jd<d|jd<d|jd<d|jd<|j}jdt|tj}|j|jfdd }||j |j ||j |j ||j |jjd|jdjd|jd jd|jdjd |jdjdt||j\}}jd||jdt||jjd t|jt|jWdQRXjd |jdjd t||j|jjdt|jt|j|j|jWdQRXjt|jd WdQRXjt|jd dWdQRXdS)Nrqr9rfrrtrrcs0jt||djt||dddS)Nrr8)r+nextr)seqiterator)r&rr CheckItems9sz-Proto3Test.testPython2Map..CheckItemsirr8r)rS)rq)rrrsrr9r:r+rr*r,rRZ iteritemsrWZiterkeysrZ itervaluesrErpopitemrlrrd setdefaultupdater=)r&rCZ map_int32rLrzrrSr)r&rtestPython2Map-sJ            zProto3Test.testPython2MapcCs^tj}d|jd<d|jd<d|jd<d|jd<d|jd<|jj}|jj}|j||dS)Nru local_init_optrainable_variables variablesinit_op summaries)rr9r@rRr+)r&rCZitems1Zitems2rrr testMapItems]s       zProto3Test.testMapItemscCs~d}tj}d|jd<d|jd<d|jd<d|jd <d |jd <d |jd <d |jd<d|jd<d|jd<|j||jdddS)Nsr init_opdr item1er item2fr item3gr item4QQr local_init_opar summarieser trainable_variablesbr variablescrrrrrrrcrerZitem1fZitem2gZitem3ZQQZitem4T)rF)rr9r@r+r,)r&r/rCrrr!testMapDeterministicSerializationls          z,Proto3Test.testMapDeterministicSerializationcCsNtj}d|jd<d|jd<d|jd<|jj}~dddd}|j||dS)Nr9rfrrqrt)rfrqr9)rr9r:rRr6)r&rCitrurrrtestMapIterationClearMessages     z'Proto3Test.testMapIterationClearMessagecCsftjdddd}|jd|jd|jd|jdtjdtjddid }|jd|jdjdS) Nrfr9)r8rq)r:r8rqr)r)rF)rr9r+r:r r1rFr)r&rCrrrtestMapConstructions zProto3Test.testMapConstructioncCs`tj}|j}d|d<d|d<d|d<|jd|jd|jdddd}|j|j|dS) Nr9rfrrqrtr:r)rfrqr9)rr9r:rr+r,r6rR)r&rCZ int32_maprurrrtestMapValidAfterFieldCleareds  z(Proto3Test.testMapValidAfterFieldClearedcCsHtj}|j}d|d_|jd|jd|j|jd|jkdS)NrrfrFr) rr9rFrrr+r,rXrW)r&rCZint32_foreign_messagerrr$testMessageMapValidAfterFieldCleareds   z/Proto3Test.testMessageMapValidAfterFieldClearedcCs|tj}t|j}|jd|jtx |D]}q.WWdQRXt|j}|jd|jtx |D]}qfWWdQRXdS)Nr:rF)rr9rpr:rrrqrF)r&rCrrrrr"testMapIterInvalidatedByClearFields        z-Proto3Test.testMapIterInvalidatedByClearFieldcCstj}|jdt|jd|jd<|jdt|j|jt|jd=WdQRX|jd=|jdt|j|jt|jd=WdQRXdS)Nrrr9r8rb )rr9r+rr:rrdrV)r&rCrrr testMapDeletes   zProto3Test.testMapDeletecCsLtj}|j|jtj|j|jtj|j|jtj|j|jtjdS)N)rr9rr:rMappingMutableMappingrF)r&rCrrrtestMapsAreMappings zProto3Test.testMapsAreMappingcCsDtj}d|jd<|j|j|j|j|j|j|j|jddS)Nirri8i)rr9r:r+rFZassertNotEqual)r&rCrrrtestMapsCompares  zProto3Test.testMapsComparecCs@tj}d|jd<d|jd<d|jd_|jdt|jdS)NrJr@#rrr) rr9r@r:Zmap_string_foreign_messagerr+rrK)r&rCrrr(testMapFindInitializationErrorsSmokeTests    z3Proto3Test.testMapFindInitializationErrorsSmokeTestN)#rGrHrIr6rr7rDrHrMrOrTrUrXr[rergrhrirmrorrrsrvr~rrrrrrrrrrrrrrrr3(s@ 90=) <0  r3c@seZdZddZddZdS)ValidTypeNamesTestcstt|jddd|d|f}|jtfdd|Dd|fjd}|d }dj|dd }t||gd dS) N'r8zRepeated%sContainerzRepeated%sFieldContainerc3s|]}j|VqdS)N)endswith)ryr5)tp_namerrrsz:ValidTypeNamesTest.assertImportFromName..z%r does end with any of %r.)fromlistr<r<)r$typesplitrXanyjoin __import__)r&rCZ base_nameZ valid_namesparts class_nameZ module_namer)rrassertImportFromNames  z'ValidTypeNamesTest.assertImportFromNamecCs(tj}|j|jd|j|jddS)NZScalarZ Composite)r r!rrr|)r&rrrrtestTypeNamesCanBeImported sz-ValidTypeNamesTest.testTypeNamesCanBeImportedN)rGrHrIrrrrrrrs rc@s$eZdZddZddZddZdS)PackedFieldTestcCs|jjd|jjd|jjd|jjd|jjd|jjd|jjd|jjd|j jd|j jd|j jd|j jd|j jd|jjddS)Nr8g?T)rrZrepeated_int64Zrepeated_uint32Zrepeated_uint64Zrepeated_sint32Zrepeated_sint64Zrepeated_fixed32Zrepeated_fixed64Zrepeated_sfixed32Zrepeated_sfixed64r[r\Z repeated_boolr)r&rrrr setMessages             zPackedFieldTest.setMessagecCs*tj}|j|d}|j||jdS)NsH "*2:BJRZ?b?jr)rr4rr+r,)r&rr/rrrtestPackedFields"s z PackedFieldTest.testPackedFieldscCs*tj}|j|d}|j||jdS)Ns: (0=AMQ]?a?hp)rZTestUnpackedTypesrr+r,)r&rr/rrrtestUnpackedFields5s z"PackedFieldTest.testUnpackedFieldsN)rGrHrIrrrrrrrrsrrrfrnz;explicit tests of the C++ implementation for PY27 and abovec@s0eZdZeddZddZddZddZd S) OversizeProtosTestcCsFd}tj}tj}tj|||j|tj|j |j d|_ dS)Na name: "f/f.msg2" package: "f" message_type { name: "msg1" field { name: "payload" number: 1 label: LABEL_OPTIONAL type: TYPE_STRING } } message_type { name: "msg2" field { name: "field" number: 1 label: LABEL_OPTIONAL type: TYPE_MESSAGE type_name: "msg1" } } zf.msg2) r ZDescriptorPoolr ZFileDescriptorProtorZParseZAddr ZMessageFactoryZ GetPrototypeZFindMessageTypeByName proto_cls)clsZ file_descZpoolZdescrrr setUpClassNs   zOversizeProtosTest.setUpClasscCs(|j|_dd|jj_|jj|_dS)Nrirr8iii)rpfieldrr, p_serialized)r&rrrsetUpqs zOversizeProtosTest.setUpcCsfddlm}|d|j}y|j|jWn4tjk r`}z|jt|dWYdd}~XnXdS)Nr)SetAllowOversizeProtosFzError parsing message) google.protobuf.pyext._messagerrr*rrr?r+r$)r&rqrrrrtestAssertOversizeProtovs z*OversizeProtosTest.testAssertOversizeProtocCsBddlm}|d|j}|j|j|j|jjj|jjdS)Nr)rT) rrrr*rr+rrr)r&rrrrrtestSucceedOversizeProtos   z+OversizeProtosTest.testSucceedOversizeProtoN)rGrHrI classmethodrrrrrrrrrIs # r__main__)rfrn)4r __author__rr-rhrrRrrrr@Z unittest2Zunittest ImportErrorrrZgoogle.protobufrrr r r r r rZgoogle.protobuf.internalrrrrrrrZPY3intrrrrrZ BaseTestCaseZNamedParametersrrr3rrZskipIfrrsrrGmainrrrr)s                WqX9: