Skip to content

Commit 8d38060

Browse files
authored
Add test to verify nested builder fix.
Verify fix for #10624
1 parent f616e70 commit 8d38060

File tree

1 file changed

+22
-0
lines changed

1 file changed

+22
-0
lines changed

java/core/src/test/java/com/google/protobuf/NestedBuildersTest.java

+22
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import static com.google.common.truth.Truth.assertThat;
3434

3535
import protobuf_unittest.Engine;
36+
import protobuf_unittest.TimingBelt;
3637
import protobuf_unittest.Vehicle;
3738
import protobuf_unittest.Wheel;
3839
import java.util.ArrayList;
@@ -48,6 +49,27 @@
4849
@RunWith(JUnit4.class)
4950
public class NestedBuildersTest {
5051

52+
@Test
53+
public void test3LayerPropagationWithIntermediateClear() {
54+
Vehicle.Builder vehicleBuilder = Vehicle.newBuilder();
55+
vehicleBuilder.getEngineBuilder().getTimingBeltBuilder();
56+
57+
// This step detaches the TimingBelt.Builder (though it leaves a SingleFieldBuilder in place)
58+
vehicleBuilder.getEngineBuilder().clear();
59+
60+
// These steps build the middle and top level messages, it used to leave the vestigial
61+
// TimingBelt.Builder in a state where further changes didn't propagate anymore
62+
Object unused = vehicleBuilder.getEngineBuilder().build();
63+
unused = vehicleBuilder.build();
64+
65+
TimingBelt expected = TimingBelt.newBuilder().setNumberOfTeeth(124).build();
66+
vehicleBuilder.getEngineBuilder().setTimingBelt(expected);
67+
// Testing that b/254158939 is fixed. It used to be that the setTimingBelt call above didn't
68+
// propagate a change notification and the call below would return a stale version of the timing
69+
// belt.
70+
assertThat(vehicleBuilder.getEngine().getTimingBelt()).isEqualTo(expected);
71+
}
72+
5173
@Test
5274
public void testMessagesAndBuilders() {
5375
Vehicle.Builder vehicleBuilder = Vehicle.newBuilder();

0 commit comments

Comments
 (0)