| ProtoFuzzer is a mutable class, even when seeded by a compile-time constant. | |
| We're trying to avoid the following pitfalls which can arise when assigning a | |
| ProtoFuzzer to a static field: | |
| * Accidental state leakage between unit tests, causing non-deterministic or | |
| flaky behavior. In this scenario, it's recommended to instantiate a distinct | |
| ProtoFuzzer for each relevant unit test, possibly by using a `@Before` | |
| method. | |
| ``` {.good} | |
| private ProtoFuzzer protoFuzzer; | |
| ... | |
| @Before | |
| public void setUp() { | |
| ... | |
| // Customize as appropriate | |
| protoFuzzer = ProtoFuzzer.newBuilder().setSeed(...).build(); | |
| ... | |
| } | |
| ``` | |
| * If a static ProtoFuzzer is used to initialize other static fields, then this | |
| initialization process can have program-order dependency; for example, | |
| re-ordering two such initialized fields can cause their values to change. | |
| This problem can be avoided by using static builder methods to initialize. | |
| ``` {.bad} | |
| private static final ProtoFuzzer protoFuzzer = | |
| ProtoFuzzer.newBuilder() | |
| .setSeed(...) | |
| .build(); | |
| ... | |
| // Re-ordering myFirstCustomProto and mySecondCustomProto can change their values! | |
| private static final MyCustomProto myFirstCustomProto = | |
| protoFuzzer.makeMessageOfType( | |
| MyCustomProto.getDefaultInstance() | |
| ); | |
| private static final MyCustomProto mySecondCustomProto = | |
| protoFuzzer.makeMessageOfType( | |
| MyCustomProto.getDefaultInstance() | |
| ); | |
| ``` | |
| Instead, create a static builder method and replace references to the static | |
| ProtoFuzzer field with calls to the builder: | |
| ``` {.good} | |
| private static final MyCustomProto myFirstCustomProto = | |
| buildMyCustomProtoFuzzer().makeMessageOfType( | |
| MyCustomProto.getDefaultInstance() | |
| ); | |
| private static final MyCustomProto mySecondCustomProto = | |
| buildMyCustomProtoFuzzer().makeMessageOfType( | |
| MyCustomProto.getDefaultInstance() | |
| ); | |
| ... | |
| private static ProtoFuzzer buildMyCustomProtoFuzzer() { | |
| // Customize as appropriate | |
| return ProtoFuzzer.newBuilder().setSeed(...).build(); | |
| } | |
| ``` |