From 9aeca246ee9cc5337bdcb4e77599fe37a2bf3be4 Mon Sep 17 00:00:00 2001 From: Googler Date: Thu, 9 May 2024 12:46:55 -0700 Subject: [PATCH] Enable random NotNestedSet creation to accept a custom element generator. PiperOrigin-RevId: 632239739 Change-Id: I0079746eb826684ecc3209e8bc02e3445dd8ea0d --- .../lib/skyframe/serialization/NotNestedSet.java | 14 ++++++++------ .../SharedValueDeserializationContextTest.java | 11 +++++++---- .../SharedValueSerializationContextTest.java | 2 +- 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/serialization/NotNestedSet.java b/src/test/java/com/google/devtools/build/lib/skyframe/serialization/NotNestedSet.java index ed2699b9f59dbc..315d262f3c1c18 100644 --- a/src/test/java/com/google/devtools/build/lib/skyframe/serialization/NotNestedSet.java +++ b/src/test/java/com/google/devtools/build/lib/skyframe/serialization/NotNestedSet.java @@ -23,6 +23,7 @@ import java.util.Random; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.CountDownLatch; +import java.util.function.Function; /** A nested-set like class for codec testing. */ final class NotNestedSet { @@ -43,11 +44,11 @@ Object[] getContents() { private static final int MAX_RANDOM_ELEMENTS = 5; /** Helper for constructing contents or nested contents. */ - static Object[] createRandomLeafArray(Random rng) { + static Object[] createRandomLeafArray(Random rng, Function elementFactory) { int count = rng.nextInt(MAX_RANDOM_ELEMENTS - 1) + 1; Object[] array = new Object[count]; for (int i = 0; i < count; i++) { - array[i] = rng.nextInt(); + array[i] = elementFactory.apply(rng); } return array; } @@ -61,7 +62,8 @@ static Object[] createRandomLeafArray(Random rng) { */ private static final double EXTRA_PARENT_PROBABILITY = 0.01; - static NotNestedSet createRandom(Random rng, int maxLayers, int maxNodesPerLayer) { + static NotNestedSet createRandom( + Random rng, int maxLayers, int maxNodesPerLayer, Function elementFactory) { // Creates a random DAG layer by layer. int layerCount = rng.nextInt(maxLayers - 1) + 1; @@ -103,17 +105,17 @@ static NotNestedSet createRandom(Random rng, int maxLayers, int maxNodesPerLayer ArrayList layer = layers.get(i); for (NodeBuilder builder : layer) { if (i == layerCount - 1) { - builder.value = createRandomLeafArray(rng); + builder.value = createRandomLeafArray(rng, elementFactory); continue; } - // Inserts additional random integer elements into each non-leaf node. + // Inserts additional random elements into each non-leaf node. int randomElementCount = rng.nextInt(MAX_RANDOM_ELEMENTS); ArrayList values = new ArrayList<>(builder.children.size() + randomElementCount); for (Coordinate child : builder.children) { values.add(layers.get(child.layer()).get(child.index()).value); } for (int j = 0; j < randomElementCount; j++) { - values.add(rng.nextInt()); + values.add(elementFactory.apply(rng)); } Collections.shuffle(values, rng); builder.value = values.toArray(new Object[0]); diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/serialization/SharedValueDeserializationContextTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/serialization/SharedValueDeserializationContextTest.java index b0befabf73ae1e..e5e9045fc170df 100644 --- a/src/test/java/com/google/devtools/build/lib/skyframe/serialization/SharedValueDeserializationContextTest.java +++ b/src/test/java/com/google/devtools/build/lib/skyframe/serialization/SharedValueDeserializationContextTest.java @@ -60,7 +60,7 @@ public final class SharedValueDeserializationContextTest { @TestParameters("{size: 64, useDeferredCodec: false}") @TestParameters("{size: 128, useDeferredCodec: false}") public void codec_roundTrips(int size, boolean useDeferredCodec) throws Exception { - new SerializationTester(NotNestedSet.createRandom(rng, size, size)) + new SerializationTester(NotNestedSet.createRandom(rng, size, size, Random::nextInt)) .addCodec( useDeferredCodec ? new NotNestedSetDeferredCodec(new NestedArrayCodec()) @@ -125,7 +125,9 @@ public void getsShouldBeConcurrent() throws Exception { NotNestedSet subject = new NotNestedSet( new Object[] { - createRandomLeafArray(rng), createRandomLeafArray(rng), createRandomLeafArray(rng) + createRandomLeafArray(rng, Random::nextInt), + createRandomLeafArray(rng, Random::nextInt), + createRandomLeafArray(rng, Random::nextInt) }); SerializationResult serialized = @@ -284,9 +286,10 @@ public void valueDependsOnFuture( if (doesSecondAliasFirst) { subject = new NotNestedSetContainer( - NotNestedSet.createRandom(rng, 4, 4), NotNestedSet.createRandom(rng, 4, 4)); + NotNestedSet.createRandom(rng, 4, 4, Random::nextInt), + NotNestedSet.createRandom(rng, 4, 4, Random::nextInt)); } else { - NotNestedSet contained = NotNestedSet.createRandom(rng, 5, 5); + NotNestedSet contained = NotNestedSet.createRandom(rng, 5, 5, Random::nextInt); subject = new NotNestedSetContainer(contained, contained); } new SerializationTester(subject) diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/serialization/SharedValueSerializationContextTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/serialization/SharedValueSerializationContextTest.java index 79e4881be03a48..d5dae63e9c604d 100644 --- a/src/test/java/com/google/devtools/build/lib/skyframe/serialization/SharedValueSerializationContextTest.java +++ b/src/test/java/com/google/devtools/build/lib/skyframe/serialization/SharedValueSerializationContextTest.java @@ -308,7 +308,7 @@ private ListenableFuture> serializeWithExecutor( } private Object[] createRandomLeafArray() { - return NotNestedSet.createRandomLeafArray(rng); + return NotNestedSet.createRandomLeafArray(rng, Random::nextInt); } private static final long POLL_MS = 100;