Skip to content

Commit 36c65d9

Browse files
committed
Enable random sampling by day-of-month
This enables random sampling using the day of the month as a seed for the RNG. This means that, in principle, we can recreate any failures by looking up on which day the test failed. At the same time, we benefit from wider testing over a period of time. A default sample size is given individually for each test, and this can be overridden using a single environment variable PRC_CALLTESTS_SAMPLE_SIZE. Hopefully, this provides the level of flexibility needed.
1 parent 10bf9c6 commit 36c65d9

File tree

15 files changed

+89
-48
lines changed

15 files changed

+89
-48
lines changed

.github/workflows/gradle-prc-call-tests.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
name: Weekly Precompile Call Tests
22

33
on:
4-
pull_request:
54
schedule:
65
- cron: "0 4 * * 1"
76
workflow_dispatch:
@@ -24,10 +23,11 @@ jobs:
2423
uses: ./.github/actions/setup-environment
2524

2625
- name: Run Precompile Call tests
27-
run: GOMAXPROCS=1 GOMEMLIMIT=5GiB ./gradlew prcCallTests
26+
run: GOMAXPROCS=2 GOMEMLIMIT=5GiB ./gradlew prcCallTests
2827
env:
2928
JAVA_OPTS: -Dorg.gradle.daemon=false
30-
PRC_CALL_TESTS_PARALLELISM: 24
29+
PRC_CALLTESTS_PARALLELISM: 26
30+
PRC_CALLTESTS_SAMPLE_SIZE: 1500
3131
GOCORSET_FLAGS: -vw -b1024 --ansi-escapes=false --report --hir
3232

3333
- name: Upload prc calls test report

arithmetization/src/test/java/net/consensys/linea/zktracer/instructionprocessing/callTests/Utilities.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,10 @@
1818
import static net.consensys.linea.zktracer.Trace.WORD_SIZE;
1919
import static net.consensys.linea.zktracer.opcode.OpCode.*;
2020

21+
import java.util.Calendar;
22+
import java.util.Collections;
2123
import java.util.List;
24+
import java.util.Random;
2225

2326
import net.consensys.linea.UnitTestWatcher;
2427
import net.consensys.linea.testing.BytecodeCompiler;
@@ -304,4 +307,27 @@ public static void pushSeveral(BytecodeCompiler program, int... values) {
304307
program.push(value);
305308
}
306309
}
310+
311+
/**
312+
* Sample exactly n items at random from a given input list. If that list has fewer than n items,
313+
* then the list is returned unchanged. The Random Number Generated (RNG) is seeded with the
314+
* day-of-the-month. The idea here is that we benefit from different seeds (i.e. by testing
315+
* different inputs), but should a failure occur we can (in principle) recreate it (provided we
316+
* know what day of the month it failed on).
317+
*
318+
* @param n Number of items to sample
319+
* @param items Source of items to sample from
320+
* @param <T>
321+
* @return
322+
*/
323+
public static <T> List<T> randomSampleByDayOfMonth(int n, List<T> items) {
324+
// Determine day of month
325+
int dayOfMonth = Calendar.getInstance().get(Calendar.DAY_OF_MONTH);
326+
// See rng with day of month.
327+
Random rng = new Random(dayOfMonth);
328+
// Randomly shuffle the items
329+
Collections.shuffle(items, rng);
330+
//
331+
return items.subList(0, n);
332+
}
307333
}

arithmetization/src/test/java/net/consensys/linea/zktracer/instructionprocessing/callTests/prc/ecadd/ParameterGeneration.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919

2020
import java.util.ArrayList;
2121
import java.util.List;
22-
import java.util.stream.Stream;
2322

2423
import net.consensys.linea.zktracer.instructionprocessing.callTests.prc.GasParameter;
2524
import net.consensys.linea.zktracer.instructionprocessing.callTests.prc.ReturnAtParameter;
@@ -52,7 +51,7 @@ public class ParameterGeneration {
5251
* <p>- <b>ReturnAtParameter</b> the return at parameter to be tested; return data will be written
5352
* on the aforementioned blackened word in RAM;
5453
*/
55-
public static Stream<Arguments> parameterGeneration() {
54+
public static List<Arguments> parameterGeneration() {
5655
List<OpCode> CallOpCodes = List.of(CALL, CALLCODE, DELEGATECALL, STATICCALL);
5756
List<GasParameter> GasParameters =
5857
List.of(GasParameter.ZERO, GasParameter.COST_MO, GasParameter.COST, GasParameter.PLENTY);
@@ -79,6 +78,6 @@ public static Stream<Arguments> parameterGeneration() {
7978
}
8079
}
8180
}
82-
return argumentsList.stream();
81+
return argumentsList;
8382
}
8483
}

arithmetization/src/test/java/net/consensys/linea/zktracer/instructionprocessing/callTests/prc/ecadd/Tests.java

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
*/
1515
package net.consensys.linea.zktracer.instructionprocessing.callTests.prc.ecadd;
1616

17+
import static net.consensys.linea.zktracer.instructionprocessing.callTests.Utilities.randomSampleByDayOfMonth;
1718
import static net.consensys.linea.zktracer.instructionprocessing.callTests.prc.CodeExecutionMethods.*;
1819
import static net.consensys.linea.zktracer.instructionprocessing.callTests.prc.GasParameter.COST_MO;
1920
import static net.consensys.linea.zktracer.instructionprocessing.callTests.prc.ecadd.MemoryContents.WELL_FORMED_POINTS;
@@ -24,14 +25,20 @@
2425
import net.consensys.linea.testing.BytecodeCompiler;
2526
import net.consensys.linea.zktracer.instructionprocessing.callTests.prc.ReturnAtParameter;
2627
import net.consensys.linea.zktracer.instructionprocessing.callTests.prc.framework.PrecompileCallTests;
27-
import org.junit.jupiter.api.Disabled;
2828
import org.junit.jupiter.api.Tag;
2929
import org.junit.jupiter.api.Test;
3030
import org.junit.jupiter.params.provider.Arguments;
3131

32-
//@Disabled
3332
@Tag("prc-calltests")
3433
public class Tests extends PrecompileCallTests<CallParameters> {
34+
// Set sample size with potential for override.
35+
private static final int ECADD_SAMPLE_SIZE =
36+
Integer.parseInt(System.getenv().getOrDefault("PRC_CALLTESTS_SAMPLE_SIZE", "500"));
37+
38+
public static Stream<Arguments> parameterGeneration() {
39+
return randomSampleByDayOfMonth(ECADD_SAMPLE_SIZE, ParameterGeneration.parameterGeneration())
40+
.stream();
41+
}
3542

3643
/** Non-parametric test to make sure things are working as expected. */
3744
@Test
@@ -48,8 +55,4 @@ public void singleMessageCallTransactionTest() {
4855
BytecodeCompiler rootCode = params.customPrecompileCallsSeparatedByReturnDataWipingOperation();
4956
runMessageCallTransactionWithProvidedCodeAsRootCode(rootCode);
5057
}
51-
52-
public static Stream<Arguments> parameterGeneration() {
53-
return ParameterGeneration.parameterGeneration();
54-
}
5558
}

arithmetization/src/test/java/net/consensys/linea/zktracer/instructionprocessing/callTests/prc/ecmul/ParameterGeneration.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020

2121
import java.util.ArrayList;
2222
import java.util.List;
23-
import java.util.stream.Stream;
2423

2524
import net.consensys.linea.zktracer.instructionprocessing.callTests.prc.GasParameter;
2625
import net.consensys.linea.zktracer.instructionprocessing.callTests.prc.ReturnAtParameter;
@@ -29,7 +28,7 @@
2928

3029
public class ParameterGeneration {
3130

32-
public static Stream<Arguments> parameterGeneration() {
31+
public static List<Arguments> parameterGeneration() {
3332
List<OpCode> CallOpCodes = List.of(CALL, CALLCODE, DELEGATECALL, STATICCALL);
3433
List<GasParameter> GasParameters = List.of(ZERO, COST_MO, COST, PLENTY);
3534
List<ReturnAtParameter> ReturnAtParameters =
@@ -55,6 +54,6 @@ public static Stream<Arguments> parameterGeneration() {
5554
}
5655
}
5756
}
58-
return argumentsList.stream();
57+
return argumentsList;
5958
}
6059
}

arithmetization/src/test/java/net/consensys/linea/zktracer/instructionprocessing/callTests/prc/ecmul/Tests.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,17 +26,19 @@
2626
import net.consensys.linea.testing.BytecodeCompiler;
2727
import net.consensys.linea.zktracer.instructionprocessing.callTests.prc.ReturnAtParameter;
2828
import net.consensys.linea.zktracer.instructionprocessing.callTests.prc.framework.PrecompileCallTests;
29-
import org.junit.jupiter.api.Disabled;
3029
import org.junit.jupiter.api.Tag;
3130
import org.junit.jupiter.api.Test;
3231
import org.junit.jupiter.params.provider.Arguments;
3332

34-
@Disabled
3533
@Tag("prc-calltests")
3634
public class Tests extends PrecompileCallTests<CallParameters> {
35+
// Set sample size with potential for override.
36+
private static final int ECMUL_SAMPLE_SIZE =
37+
Integer.parseInt(System.getenv().getOrDefault("PRC_CALLTESTS_SAMPLE_SIZE", "500"));
3738

3839
public static Stream<Arguments> parameterGeneration() {
39-
return ParameterGeneration.parameterGeneration();
40+
return randomSampleByDayOfMonth(ECMUL_SAMPLE_SIZE, ParameterGeneration.parameterGeneration())
41+
.stream();
4042
}
4143

4244
/** Non-parametric test to make sure things are working as expected. */

arithmetization/src/test/java/net/consensys/linea/zktracer/instructionprocessing/callTests/prc/ecpairing/ParameterGeneration.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323

2424
import java.util.ArrayList;
2525
import java.util.List;
26-
import java.util.stream.Stream;
2726

2827
import net.consensys.linea.zktracer.instructionprocessing.callTests.prc.GasParameter;
2928
import net.consensys.linea.zktracer.instructionprocessing.callTests.prc.ReturnAtParameter;
@@ -32,7 +31,7 @@
3231

3332
public class ParameterGeneration {
3433

35-
public static Stream<Arguments> parameterGeneration() {
34+
public static List<Arguments> parameterGeneration() {
3635
List<OpCode> CallOpCodes = List.of(CALL, STATICCALL);
3736
List<GasParameter> GasParameters = List.of(COST_MO, COST, PLENTY);
3837
List<ReturnAtParameter> ReturnAtParameters = List.of(PARTIAL, FULL);
@@ -88,6 +87,6 @@ public static Stream<Arguments> parameterGeneration() {
8887
}
8988
}
9089
}
91-
return argumentsList.stream();
90+
return argumentsList;
9291
}
9392
}

arithmetization/src/test/java/net/consensys/linea/zktracer/instructionprocessing/callTests/prc/ecpairing/Tests.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,19 +14,24 @@
1414
*/
1515
package net.consensys.linea.zktracer.instructionprocessing.callTests.prc.ecpairing;
1616

17+
import static net.consensys.linea.zktracer.instructionprocessing.callTests.Utilities.randomSampleByDayOfMonth;
18+
1719
import java.util.stream.Stream;
1820

1921
import net.consensys.linea.zktracer.instructionprocessing.callTests.prc.framework.PrecompileCallTests;
20-
import org.junit.jupiter.api.Disabled;
2122
import org.junit.jupiter.api.Tag;
2223
import org.junit.jupiter.params.provider.Arguments;
2324

24-
@Disabled
2525
@Tag("prc-calltests")
2626
public class Tests extends PrecompileCallTests<CallParameters> {
27+
// Set sample size with potential for override.
28+
private static final int ECPAIRING_SAMPLE_SIZE =
29+
Integer.parseInt(System.getenv().getOrDefault("PRC_CALLTESTS_SAMPLE_SIZE", "500"));
2730

2831
public static Stream<Arguments> parameterGeneration() {
29-
return ParameterGeneration.parameterGeneration();
32+
return randomSampleByDayOfMonth(
33+
ECPAIRING_SAMPLE_SIZE, ParameterGeneration.parameterGeneration())
34+
.stream();
3035
}
3136

3237
// @Test

arithmetization/src/test/java/net/consensys/linea/zktracer/instructionprocessing/callTests/prc/ecrecover/ParameterGeneration.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919

2020
import java.util.ArrayList;
2121
import java.util.List;
22-
import java.util.stream.Stream;
2322

2423
import net.consensys.linea.zktracer.instructionprocessing.callTests.prc.GasParameter;
2524
import net.consensys.linea.zktracer.instructionprocessing.callTests.prc.ReturnAtParameter;
@@ -28,7 +27,7 @@
2827

2928
public class ParameterGeneration {
3029

31-
public static Stream<Arguments> parameterGeneration() {
30+
public static List<Arguments> parameterGeneration() {
3231
List<OpCode> CallOpCodes = List.of(CALL, CALLCODE, DELEGATECALL, STATICCALL);
3332
List<GasParameter> GasParameters = List.of(ZERO, COST_MO, COST, PLENTY);
3433
List<ReturnAtParameter> ReturnAtParameters =
@@ -54,6 +53,6 @@ public static Stream<Arguments> parameterGeneration() {
5453
}
5554
}
5655
}
57-
return argumentsList.stream();
56+
return argumentsList;
5857
}
5958
}

arithmetization/src/test/java/net/consensys/linea/zktracer/instructionprocessing/callTests/prc/ecrecover/Tests.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,17 +14,23 @@
1414
*/
1515
package net.consensys.linea.zktracer.instructionprocessing.callTests.prc.ecrecover;
1616

17+
import static net.consensys.linea.zktracer.instructionprocessing.callTests.Utilities.randomSampleByDayOfMonth;
18+
1719
import java.util.stream.Stream;
1820

1921
import net.consensys.linea.zktracer.instructionprocessing.callTests.prc.framework.PrecompileCallTests;
20-
import org.junit.jupiter.api.Disabled;
2122
import org.junit.jupiter.api.Tag;
2223
import org.junit.jupiter.params.provider.Arguments;
2324

24-
@Disabled
2525
@Tag("prc-calltests")
2626
public class Tests extends PrecompileCallTests<CallParameters> {
27+
// Set sample size with potential for override.
28+
private static int ECRECOVER_SAMPLE_SIZE =
29+
Integer.parseInt(System.getenv().getOrDefault("PRC_CALLTESTS_SAMPLE_SIZE", "500"));
30+
2731
public static Stream<Arguments> parameterGeneration() {
28-
return ParameterGeneration.parameterGeneration();
32+
return randomSampleByDayOfMonth(
33+
ECRECOVER_SAMPLE_SIZE, ParameterGeneration.parameterGeneration())
34+
.stream();
2935
}
3036
}

0 commit comments

Comments
 (0)