Skip to content

Conversation

@219sansim
Copy link
Owner

@219sansim 219sansim commented Nov 6, 2023

Purpose

This PR fixes the following tests detected as flaky

com.google.gson.functional.CustomTypeAdaptersTest.testCustomNestedSerializers
com.google.gson.functional.EnumTest.testClassWithEnumFieldSerialization
com.google.gson.functional.FieldNamingTest.testIdentity
com.google.gson.functional.FieldNamingTest.testLowerCaseWithDashes
com.google.gson.functional.FieldNamingTest.testLowerCaseWithUnderscores
com.google.gson.functional.FieldNamingTest.testUpperCamelCase
com.google.gson.functional.FieldNamingTest.testUpperCamelCaseWithSpaces
com.google.gson.functional.FieldNamingTest.testUpperCaseWithUnderscores
com.google.gson.functional.JsonAdapterAnnotationOnFieldsTest.testExcludeDeserializePrecedence
com.google.gson.functional.JsonAdapterSerializerDeserializerTest.testJsonSerializerDeserializerBasedJsonAdapterOnFields
com.google.gson.functional.MapAsArrayTypeAdapterTest.testMapWithTypeVariableSerialization
com.google.gson.functional.MapAsArrayTypeAdapterTest.testMultipleEnableComplexKeyRegistrationHasNoEffect
com.google.gson.functional.MapAsArrayTypeAdapterTest.testSerializeComplexMapWithTypeAdapter
com.google.gson.functional.MapTest.testInterfaceTypeMap
com.google.gson.functional.MapTest.testInterfaceTypeMapWithSerializer
com.google.gson.functional.NamingPolicyTest.testGsonDuplicateNameDueToBadNamingPolicy
com.google.gson.functional.NamingPolicyTest.testGsonWithSerializedNameFieldNamingPolicySerialization
com.google.gson.functional.ObjectTest.testArrayOfArraysSerialization
com.google.gson.functional.ObjectTest.testArrayOfObjectsSerialization
com.google.gson.functional.ObjectTest.testBagOfPrimitivesSerialization
com.google.gson.functional.ObjectTest.testBagOfPrimitiveWrappersSerialization
com.google.gson.functional.ObjectTest.testNestedSerialization
com.google.gson.functional.ObjectTest.testNullFieldsSerialization
com.google.gson.functional.PrettyPrintingTest.testEmptyMapField
com.google.gson.functional.ReadersWritersTest.testWriterForSerialization
com.google.gson.functional.ReflectionAccessFilterTest.testBlockInaccessibleJavaExtendingJdkClass
com.google.gson.functional.SerializedNameTest.testFirstNameIsChosenForSerialization
com.google.gson.functional.StreamingTypeAdaptersTest.testSerializeNullObject
com.google.gson.functional.StreamingTypeAdaptersTest.testSerializeRecursive
com.google.gson.functional.VersioningTest.testVersionedClassesSerialization
com.google.gson.functional.VersioningTest.testVersionedGsonWithUnversionedClassesSerialization
com.google.gson.graph.GraphAdapterBuilderTest.testSerialization
com.google.gson.graph.GraphAdapterBuilderTest.testSerializationWithMultipleTypes
com.google.gson.MixedStreamTest.testWriteMixedStreamed
com.google.gson.ObjectTypeAdapterTest.testSerialize
com.google.gson.typeadapters.PostConstructAdapterFactoryTest.testList

Description

This line of code does not return the fields in a consistent order causing the tests to be flaky. The fix sorts these fields using the field names as a comparator.

Reason:
The gson.toJson() internally calls com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields which makes a call to getDeclaredFields

https://github.com/google/gson/blob/e685705b2bf3ae174958612a185bd231c0e0c5d9/gson/src/main/java/com/google/gson/internal/bind/ReflectiveTypeAdapterFactory.java#L265

And according to this stackoverlow discussion, getDeclaredFields in Java 8 does not return elements in a consistent order.

Reproduction of error

Command to reproduce the failure:
mvn -pl gson edu.illinois:nondex-maven-plugin:2.1.1:nondex -Dtest=<testclass>#<testname>

Example - test case FieldNamingTest.testLowerCaseWithUnderscores

mvn -pl gson edu.illinois:nondex-maven-plugin:2.1.1:nondex -Dtest=com.google.gson.functional.FieldNamingTest#testLowerCaseWithUnderscores

Error Message:

[ERROR] com.google.gson.functional.FieldNamingTest.testLowerCaseWithUnderscores -- Time elapsed: 0.003 s <<< FAILURE!
value of: replace(...)
expected: {'lower_camel':1,'upper_camel':2,'_lower_camel_leading_underscore':3,'__upper_camel_leading_underscore':4,'lower_words':5,'u_p_p_e_r__w_o_r_d_s':6,'annotatedName':7,'lower_id':8,'_9':9}
but was : {'annotatedName':7,'__upper_camel_leading_underscore':4,'lower_id':8,'upper_camel':2,'u_p_p_e_r__w_o_r_d_s':6,'lower_camel':1,'_9':9,'lower_words':5,'_lower_camel_leading_underscore':3}
	at com.google.gson.functional.FieldNamingTest.testLowerCaseWithUnderscores(FieldNamingTest.java:74)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants