From 41e46d1178116eb7421fe2adbf2eaa7ef97b0f8b Mon Sep 17 00:00:00 2001 From: Stephen Buttolph Date: Wed, 12 Jun 2024 13:05:20 -0400 Subject: [PATCH 1/3] Update versions for v1.11.8 (#3103) --- RELEASES.md | 27 +++++++++++++++++++++++++++ version/compatibility.json | 3 ++- version/constants.go | 2 +- 3 files changed, 30 insertions(+), 2 deletions(-) diff --git a/RELEASES.md b/RELEASES.md index 01521a2b4498..e616850e816c 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -1,5 +1,32 @@ # Release Notes +## [v1.11.8](https://github.com/ava-labs/avalanchego/releases/tag/v1.11.8) + +This version is backwards compatible to [v1.11.0](https://github.com/ava-labs/avalanchego/releases/tag/v1.11.0). It is optional, but encouraged. + +The plugin version is unchanged at `35` and is compatible with versions `v1.11.3-v1.11.7`. + +### APIs + +- Redesigned metrics to use labels rather than custom namespaces. + +### What's Changed + +- Remove avalanche metrics registerer from consensus context by @StephenButtolph in https://github.com/ava-labs/avalanchego/pull/3087 +- Remove rejection from `consensus.Add` by @StephenButtolph in https://github.com/ava-labs/avalanchego/pull/3084 +- [vms/platformvm] Rename `txstest.Builder` to `txstest.WalletFactory` by @dhrubabasu in https://github.com/ava-labs/avalanchego/pull/2890 +- Small metrics cleanup by @StephenButtolph in https://github.com/ava-labs/avalanchego/pull/3088 +- Fix race in test by @StephenButtolph in https://github.com/ava-labs/avalanchego/pull/3089 +- Implement error driven snowflake hardcoded to support a single beta by @aaronbuchwald in https://github.com/ava-labs/avalanchego/pull/2978 +- Replace all chain namespaces with labels by @StephenButtolph in https://github.com/ava-labs/avalanchego/pull/3053 +- add a metrics gauge for built block slot by @tsachiherman in https://github.com/ava-labs/avalanchego/pull/3048 +- [ci] Switch to gh workers for arm64 by @marun in https://github.com/ava-labs/avalanchego/pull/3090 +- [ci] Ensure focal arm64 builds all have their required dependencies by @marun in https://github.com/ava-labs/avalanchego/pull/3091 +- X-chain - consolidate tx creation in unit tests by @abi87 in https://github.com/ava-labs/avalanchego/pull/2736 +- Use netip.AddrPort rather than ips.IPPort by @StephenButtolph in https://github.com/ava-labs/avalanchego/pull/3094 + +**Full Changelog**: https://github.com/ava-labs/avalanchego/compare/v1.11.7...v1.11.8 + ## [v1.11.7](https://github.com/ava-labs/avalanchego/releases/tag/v1.11.7) This version is backwards compatible to [v1.11.0](https://github.com/ava-labs/avalanchego/releases/tag/v1.11.0). It is optional, but encouraged. diff --git a/version/compatibility.json b/version/compatibility.json index c2d3525a0393..a1596351f373 100644 --- a/version/compatibility.json +++ b/version/compatibility.json @@ -4,7 +4,8 @@ "v1.11.4", "v1.11.5", "v1.11.6", - "v1.11.7" + "v1.11.7", + "v1.11.8" ], "34": [ "v1.11.2" diff --git a/version/constants.go b/version/constants.go index 1e2b809d5a7a..2899b37fac6b 100644 --- a/version/constants.go +++ b/version/constants.go @@ -26,7 +26,7 @@ var ( Current = &Semantic{ Major: 1, Minor: 11, - Patch: 7, + Patch: 8, } CurrentApp = &Application{ Name: Client, From 5002b8244de7fb6e325a6e322ece5c6d2a1f8149 Mon Sep 17 00:00:00 2001 From: aaronbuchwald Date: Wed, 12 Jun 2024 15:27:13 -0400 Subject: [PATCH 2/3] Error driven snowflake multi counter (#3092) --- snow/consensus/snowball/binary_snowball.go | 4 +- .../snowball/binary_snowball_test.go | 23 +- snow/consensus/snowball/binary_snowflake.go | 19 +- .../snowball/binary_snowflake_test.go | 44 ++- snow/consensus/snowball/factory.go | 8 +- snow/consensus/snowball/flat_test.go | 2 +- snow/consensus/snowball/nnary_snowball.go | 4 +- .../consensus/snowball/nnary_snowball_test.go | 14 +- snow/consensus/snowball/nnary_snowflake.go | 19 +- .../snowball/nnary_snowflake_test.go | 52 ++- snow/consensus/snowball/parameters.go | 9 + snow/consensus/snowball/test_snowflake.go | 145 ++++++++ snow/consensus/snowball/tree_test.go | 326 +++++++++--------- snow/consensus/snowball/unary_snowball.go | 4 +- .../consensus/snowball/unary_snowball_test.go | 7 +- snow/consensus/snowball/unary_snowflake.go | 17 +- .../snowball/unary_snowflake_test.go | 39 ++- 17 files changed, 503 insertions(+), 233 deletions(-) create mode 100644 snow/consensus/snowball/test_snowflake.go diff --git a/snow/consensus/snowball/binary_snowball.go b/snow/consensus/snowball/binary_snowball.go index e8a424378a89..16649c3252a9 100644 --- a/snow/consensus/snowball/binary_snowball.go +++ b/snow/consensus/snowball/binary_snowball.go @@ -7,9 +7,9 @@ import "fmt" var _ Binary = (*binarySnowball)(nil) -func newBinarySnowball(alphaPreference int, alphaConfidence int, beta int, choice int) binarySnowball { +func newBinarySnowball(alphaPreference int, terminationConditions []terminationCondition, choice int) binarySnowball { return binarySnowball{ - binarySnowflake: newBinarySnowflake(alphaPreference, alphaConfidence, beta, choice), + binarySnowflake: newBinarySnowflake(alphaPreference, terminationConditions, choice), preference: choice, } } diff --git a/snow/consensus/snowball/binary_snowball_test.go b/snow/consensus/snowball/binary_snowball_test.go index 118b3c7913a7..968743ef36a8 100644 --- a/snow/consensus/snowball/binary_snowball_test.go +++ b/snow/consensus/snowball/binary_snowball_test.go @@ -17,8 +17,9 @@ func TestBinarySnowball(t *testing.T) { alphaPreference, alphaConfidence := 2, 3 beta := 2 + terminationConditions := newSingleTerminationCondition(alphaConfidence, beta) - sb := newBinarySnowball(alphaPreference, alphaConfidence, beta, red) + sb := newBinarySnowball(alphaPreference, terminationConditions, red) require.Equal(red, sb.Preference()) require.False(sb.Finalized()) @@ -47,8 +48,9 @@ func TestBinarySnowballRecordPollPreference(t *testing.T) { alphaPreference, alphaConfidence := 1, 2 beta := 2 + terminationConditions := newSingleTerminationCondition(alphaConfidence, beta) - sb := newBinarySnowball(alphaPreference, alphaConfidence, beta, red) + sb := newBinarySnowball(alphaPreference, terminationConditions, red) require.Equal(red, sb.Preference()) require.False(sb.Finalized()) @@ -72,7 +74,7 @@ func TestBinarySnowballRecordPollPreference(t *testing.T) { require.Equal(red, sb.Preference()) require.True(sb.Finalized()) - expected := "SB(Preference = 0, PreferenceStrength[0] = 4, PreferenceStrength[1] = 1, SF(Confidence = 2, Finalized = true, SL(Preference = 0)))" + expected := "SB(Preference = 0, PreferenceStrength[0] = 4, PreferenceStrength[1] = 1, SF(Confidence = [2], Finalized = true, SL(Preference = 0)))" require.Equal(expected, sb.String()) } @@ -84,8 +86,9 @@ func TestBinarySnowballRecordUnsuccessfulPoll(t *testing.T) { alphaPreference, alphaConfidence := 1, 2 beta := 2 + terminationConditions := newSingleTerminationCondition(alphaConfidence, beta) - sb := newBinarySnowball(alphaPreference, alphaConfidence, beta, red) + sb := newBinarySnowball(alphaPreference, terminationConditions, red) require.Equal(red, sb.Preference()) require.False(sb.Finalized()) @@ -103,7 +106,7 @@ func TestBinarySnowballRecordUnsuccessfulPoll(t *testing.T) { require.Equal(blue, sb.Preference()) require.True(sb.Finalized()) - expected := "SB(Preference = 1, PreferenceStrength[0] = 0, PreferenceStrength[1] = 3, SF(Confidence = 2, Finalized = true, SL(Preference = 1)))" + expected := "SB(Preference = 1, PreferenceStrength[0] = 0, PreferenceStrength[1] = 3, SF(Confidence = [2], Finalized = true, SL(Preference = 1)))" require.Equal(expected, sb.String()) } @@ -115,8 +118,9 @@ func TestBinarySnowballAcceptWeirdColor(t *testing.T) { alphaPreference, alphaConfidence := 1, 2 beta := 2 + terminationConditions := newSingleTerminationCondition(alphaConfidence, beta) - sb := newBinarySnowball(alphaPreference, alphaConfidence, beta, red) + sb := newBinarySnowball(alphaPreference, terminationConditions, red) require.Equal(red, sb.Preference()) require.False(sb.Finalized()) @@ -144,7 +148,7 @@ func TestBinarySnowballAcceptWeirdColor(t *testing.T) { require.Equal(blue, sb.Preference()) require.True(sb.Finalized()) - expected := "SB(Preference = 1, PreferenceStrength[0] = 2, PreferenceStrength[1] = 2, SF(Confidence = 2, Finalized = true, SL(Preference = 0)))" + expected := "SB(Preference = 1, PreferenceStrength[0] = 2, PreferenceStrength[1] = 2, SF(Confidence = [2], Finalized = true, SL(Preference = 0)))" require.Equal(expected, sb.String()) } @@ -156,8 +160,9 @@ func TestBinarySnowballLockColor(t *testing.T) { alphaPreference, alphaConfidence := 1, 2 beta := 1 + terminationConditions := newSingleTerminationCondition(alphaConfidence, beta) - sb := newBinarySnowball(alphaPreference, alphaConfidence, beta, red) + sb := newBinarySnowball(alphaPreference, terminationConditions, red) sb.RecordPoll(alphaConfidence, red) @@ -175,6 +180,6 @@ func TestBinarySnowballLockColor(t *testing.T) { require.Equal(red, sb.Preference()) require.True(sb.Finalized()) - expected := "SB(Preference = 1, PreferenceStrength[0] = 1, PreferenceStrength[1] = 3, SF(Confidence = 1, Finalized = true, SL(Preference = 0)))" + expected := "SB(Preference = 1, PreferenceStrength[0] = 1, PreferenceStrength[1] = 3, SF(Confidence = [1], Finalized = true, SL(Preference = 0)))" require.Equal(expected, sb.String()) } diff --git a/snow/consensus/snowball/binary_snowflake.go b/snow/consensus/snowball/binary_snowflake.go index 81cca1ce8501..6dc856a7bc7c 100644 --- a/snow/consensus/snowball/binary_snowflake.go +++ b/snow/consensus/snowball/binary_snowflake.go @@ -7,17 +7,12 @@ import "fmt" var _ Binary = (*binarySnowflake)(nil) -func newBinarySnowflake(alphaPreference, alphaConfidence, beta, choice int) binarySnowflake { +func newBinarySnowflake(alphaPreference int, terminationConditions []terminationCondition, choice int) binarySnowflake { return binarySnowflake{ - binarySlush: newBinarySlush(choice), - alphaPreference: alphaPreference, - terminationConditions: []terminationCondition{ - { - alphaConfidence: alphaConfidence, - beta: beta, - }, - }, - confidence: make([]int, 1), + binarySlush: newBinarySlush(choice), + alphaPreference: alphaPreference, + terminationConditions: terminationConditions, + confidence: make([]int, len(terminationConditions)), } } @@ -94,8 +89,8 @@ func (sf *binarySnowflake) Finalized() bool { } func (sf *binarySnowflake) String() string { - return fmt.Sprintf("SF(Confidence = %d, Finalized = %v, %s)", - sf.confidence[0], + return fmt.Sprintf("SF(Confidence = %v, Finalized = %v, %s)", + sf.confidence, sf.finalized, &sf.binarySlush) } diff --git a/snow/consensus/snowball/binary_snowflake_test.go b/snow/consensus/snowball/binary_snowflake_test.go index 16944b5b2082..ca2347aa086d 100644 --- a/snow/consensus/snowball/binary_snowflake_test.go +++ b/snow/consensus/snowball/binary_snowflake_test.go @@ -17,8 +17,9 @@ func TestBinarySnowflake(t *testing.T) { alphaPreference, alphaConfidence := 1, 2 beta := 2 + terminationConditions := newSingleTerminationCondition(alphaConfidence, beta) - sf := newBinarySnowflake(alphaPreference, alphaConfidence, beta, red) + sf := newBinarySnowflake(alphaPreference, terminationConditions, red) require.Equal(red, sf.Preference()) require.False(sf.Finalized()) @@ -50,3 +51,44 @@ func TestBinarySnowflake(t *testing.T) { require.Equal(blue, sf.Preference()) require.True(sf.Finalized()) } + +type binarySnowflakeTest struct { + require *require.Assertions + + binarySnowflake +} + +func newBinarySnowflakeTest(t *testing.T, alphaPreference int, terminationConditions []terminationCondition) snowflakeTest[int] { + require := require.New(t) + + return &binarySnowflakeTest{ + require: require, + binarySnowflake: newBinarySnowflake(alphaPreference, terminationConditions, 0), + } +} + +func (sf *binarySnowflakeTest) RecordPoll(count int, choice int) { + sf.binarySnowflake.RecordPoll(count, choice) +} + +func (sf *binarySnowflakeTest) AssertEqual(expectedConfidences []int, expectedFinalized bool, expectedPreference int) { + sf.require.Equal(expectedPreference, sf.Preference()) + sf.require.Equal(expectedConfidences, sf.binarySnowflake.confidence) + sf.require.Equal(expectedFinalized, sf.Finalized()) +} + +func TestBinarySnowflakeErrorDrivenSingleChoice(t *testing.T) { + for _, test := range getErrorDrivenSnowflakeSingleChoiceSuite[int]() { + t.Run(test.name, func(t *testing.T) { + test.f(t, newBinarySnowflakeTest, 0) + }) + } +} + +func TestBinarySnowflakeErrorDrivenMultiChoice(t *testing.T) { + for _, test := range getErrorDrivenSnowflakeMultiChoiceSuite[int]() { + t.Run(test.name, func(t *testing.T) { + test.f(t, newBinarySnowflakeTest, 0, 1) + }) + } +} diff --git a/snow/consensus/snowball/factory.go b/snow/consensus/snowball/factory.go index eea827202bc3..e9ae98180e6e 100644 --- a/snow/consensus/snowball/factory.go +++ b/snow/consensus/snowball/factory.go @@ -13,23 +13,23 @@ var ( type snowballFactory struct{} func (snowballFactory) NewNnary(params Parameters, choice ids.ID) Nnary { - sb := newNnarySnowball(params.AlphaPreference, params.AlphaConfidence, params.Beta, choice) + sb := newNnarySnowball(params.AlphaPreference, newSingleTerminationCondition(params.AlphaConfidence, params.Beta), choice) return &sb } func (snowballFactory) NewUnary(params Parameters) Unary { - sb := newUnarySnowball(params.AlphaPreference, params.AlphaConfidence, params.Beta) + sb := newUnarySnowball(params.AlphaPreference, newSingleTerminationCondition(params.AlphaConfidence, params.Beta)) return &sb } type snowflakeFactory struct{} func (snowflakeFactory) NewNnary(params Parameters, choice ids.ID) Nnary { - sf := newNnarySnowflake(params.AlphaPreference, params.AlphaConfidence, params.Beta, choice) + sf := newNnarySnowflake(params.AlphaPreference, newSingleTerminationCondition(params.AlphaConfidence, params.Beta), choice) return &sf } func (snowflakeFactory) NewUnary(params Parameters) Unary { - sf := newUnarySnowflake(params.AlphaPreference, params.AlphaConfidence, params.Beta) + sf := newUnarySnowflake(params.AlphaPreference, newSingleTerminationCondition(params.AlphaConfidence, params.Beta)) return &sf } diff --git a/snow/consensus/snowball/flat_test.go b/snow/consensus/snowball/flat_test.go index b4b8d1c6f308..51b7390bb88d 100644 --- a/snow/consensus/snowball/flat_test.go +++ b/snow/consensus/snowball/flat_test.go @@ -56,6 +56,6 @@ func TestFlat(t *testing.T) { require.Equal(Green, f.Preference()) require.True(f.Finalized()) - expected := "SB(Preference = 2mcwQKiD8VEspmMJpL1dc7okQQ5dDVAWeCBZ7FWBFAbxpv3t7w, PreferenceStrength = 4, SF(Confidence = 2, Finalized = true, SL(Preference = 2mcwQKiD8VEspmMJpL1dc7okQQ5dDVAWeCBZ7FWBFAbxpv3t7w)))" + expected := "SB(Preference = 2mcwQKiD8VEspmMJpL1dc7okQQ5dDVAWeCBZ7FWBFAbxpv3t7w, PreferenceStrength = 4, SF(Confidence = [2], Finalized = true, SL(Preference = 2mcwQKiD8VEspmMJpL1dc7okQQ5dDVAWeCBZ7FWBFAbxpv3t7w)))" require.Equal(expected, f.String()) } diff --git a/snow/consensus/snowball/nnary_snowball.go b/snow/consensus/snowball/nnary_snowball.go index 98b63cd9dbcb..dfecaf3450fe 100644 --- a/snow/consensus/snowball/nnary_snowball.go +++ b/snow/consensus/snowball/nnary_snowball.go @@ -11,9 +11,9 @@ import ( var _ Nnary = (*nnarySnowball)(nil) -func newNnarySnowball(alphaPreference, alphaConfidence, beta int, choice ids.ID) nnarySnowball { +func newNnarySnowball(alphaPreference int, terminationConditions []terminationCondition, choice ids.ID) nnarySnowball { return nnarySnowball{ - nnarySnowflake: newNnarySnowflake(alphaPreference, alphaConfidence, beta, choice), + nnarySnowflake: newNnarySnowflake(alphaPreference, terminationConditions, choice), preference: choice, preferenceStrength: make(map[ids.ID]int), } diff --git a/snow/consensus/snowball/nnary_snowball_test.go b/snow/consensus/snowball/nnary_snowball_test.go index 466337bc00d5..8a5e66143db2 100644 --- a/snow/consensus/snowball/nnary_snowball_test.go +++ b/snow/consensus/snowball/nnary_snowball_test.go @@ -14,8 +14,9 @@ func TestNnarySnowball(t *testing.T) { alphaPreference, alphaConfidence := 1, 2 beta := 2 + terminationConditions := newSingleTerminationCondition(alphaConfidence, beta) - sb := newNnarySnowball(alphaPreference, alphaConfidence, beta, Red) + sb := newNnarySnowball(alphaPreference, terminationConditions, Red) sb.Add(Blue) sb.Add(Green) @@ -56,8 +57,9 @@ func TestVirtuousNnarySnowball(t *testing.T) { alphaPreference, alphaConfidence := 1, 2 beta := 1 + terminationConditions := newSingleTerminationCondition(alphaConfidence, beta) - sb := newNnarySnowball(alphaPreference, alphaConfidence, beta, Red) + sb := newNnarySnowball(alphaPreference, terminationConditions, Red) require.Equal(Red, sb.Preference()) require.False(sb.Finalized()) @@ -72,8 +74,9 @@ func TestNarySnowballRecordUnsuccessfulPoll(t *testing.T) { alphaPreference, alphaConfidence := 1, 2 beta := 2 + terminationConditions := newSingleTerminationCondition(alphaConfidence, beta) - sb := newNnarySnowball(alphaPreference, alphaConfidence, beta, Red) + sb := newNnarySnowball(alphaPreference, terminationConditions, Red) sb.Add(Blue) require.Equal(Red, sb.Preference()) @@ -95,7 +98,7 @@ func TestNarySnowballRecordUnsuccessfulPoll(t *testing.T) { require.Equal(Blue, sb.Preference()) require.True(sb.Finalized()) - expected := "SB(Preference = TtF4d2QWbk5vzQGTEPrN48x6vwgAoAmKQ9cbp79inpQmcRKES, PreferenceStrength = 3, SF(Confidence = 2, Finalized = true, SL(Preference = TtF4d2QWbk5vzQGTEPrN48x6vwgAoAmKQ9cbp79inpQmcRKES)))" + expected := "SB(Preference = TtF4d2QWbk5vzQGTEPrN48x6vwgAoAmKQ9cbp79inpQmcRKES, PreferenceStrength = 3, SF(Confidence = [2], Finalized = true, SL(Preference = TtF4d2QWbk5vzQGTEPrN48x6vwgAoAmKQ9cbp79inpQmcRKES)))" require.Equal(expected, sb.String()) for i := 0; i < 4; i++ { @@ -111,8 +114,9 @@ func TestNarySnowballDifferentSnowflakeColor(t *testing.T) { alphaPreference, alphaConfidence := 1, 2 beta := 2 + terminationConditions := newSingleTerminationCondition(alphaConfidence, beta) - sb := newNnarySnowball(alphaPreference, alphaConfidence, beta, Red) + sb := newNnarySnowball(alphaPreference, terminationConditions, Red) sb.Add(Blue) require.Equal(Red, sb.Preference()) diff --git a/snow/consensus/snowball/nnary_snowflake.go b/snow/consensus/snowball/nnary_snowflake.go index ab3c4f462c29..3fe9f517c0e7 100644 --- a/snow/consensus/snowball/nnary_snowflake.go +++ b/snow/consensus/snowball/nnary_snowflake.go @@ -11,17 +11,12 @@ import ( var _ Nnary = (*nnarySnowflake)(nil) -func newNnarySnowflake(alphaPreference, alphaConfidence, beta int, choice ids.ID) nnarySnowflake { +func newNnarySnowflake(alphaPreference int, terminationConditions []terminationCondition, choice ids.ID) nnarySnowflake { return nnarySnowflake{ - nnarySlush: newNnarySlush(choice), - alphaPreference: alphaPreference, - terminationConditions: []terminationCondition{ - { - alphaConfidence: alphaConfidence, - beta: beta, - }, - }, - confidence: make([]int, 1), + nnarySlush: newNnarySlush(choice), + alphaPreference: alphaPreference, + terminationConditions: terminationConditions, + confidence: make([]int, len(terminationConditions)), } } @@ -101,8 +96,8 @@ func (sf *nnarySnowflake) Finalized() bool { } func (sf *nnarySnowflake) String() string { - return fmt.Sprintf("SF(Confidence = %d, Finalized = %v, %s)", - sf.confidence[0], + return fmt.Sprintf("SF(Confidence = %v, Finalized = %v, %s)", + sf.confidence, sf.finalized, &sf.nnarySlush) } diff --git a/snow/consensus/snowball/nnary_snowflake_test.go b/snow/consensus/snowball/nnary_snowflake_test.go index 714a6bae9b07..ad090ee0f0df 100644 --- a/snow/consensus/snowball/nnary_snowflake_test.go +++ b/snow/consensus/snowball/nnary_snowflake_test.go @@ -7,6 +7,8 @@ import ( "testing" "github.com/stretchr/testify/require" + + "github.com/ava-labs/avalanchego/ids" ) func TestNnarySnowflake(t *testing.T) { @@ -14,8 +16,9 @@ func TestNnarySnowflake(t *testing.T) { alphaPreference, alphaConfidence := 1, 2 beta := 2 + terminationConditions := newSingleTerminationCondition(alphaConfidence, beta) - sf := newNnarySnowflake(alphaPreference, alphaConfidence, beta, Red) + sf := newNnarySnowflake(alphaPreference, terminationConditions, Red) sf.Add(Blue) sf.Add(Green) @@ -52,8 +55,9 @@ func TestNnarySnowflakeConfidenceReset(t *testing.T) { alphaPreference, alphaConfidence := 1, 2 beta := 4 + terminationConditions := newSingleTerminationCondition(alphaConfidence, beta) - sf := newNnarySnowflake(alphaPreference, alphaConfidence, beta, Red) + sf := newNnarySnowflake(alphaPreference, terminationConditions, Red) sf.Add(Blue) sf.Add(Green) @@ -85,8 +89,9 @@ func TestVirtuousNnarySnowflake(t *testing.T) { alphaPreference, alphaConfidence := 1, 2 beta := 2 + terminationConditions := newSingleTerminationCondition(alphaConfidence, beta) - sb := newNnarySnowflake(alphaPreference, alphaConfidence, beta, Red) + sb := newNnarySnowflake(alphaPreference, terminationConditions, Red) require.Equal(Red, sb.Preference()) require.False(sb.Finalized()) @@ -98,3 +103,44 @@ func TestVirtuousNnarySnowflake(t *testing.T) { require.Equal(Red, sb.Preference()) require.True(sb.Finalized()) } + +type nnarySnowflakeTest struct { + require *require.Assertions + + nnarySnowflake +} + +func newNnarySnowflakeTest(t *testing.T, alphaPreference int, terminationConditions []terminationCondition) snowflakeTest[ids.ID] { + require := require.New(t) + + return &nnarySnowflakeTest{ + require: require, + nnarySnowflake: newNnarySnowflake(alphaPreference, terminationConditions, Red), + } +} + +func (sf *nnarySnowflakeTest) RecordPoll(count int, choice ids.ID) { + sf.nnarySnowflake.RecordPoll(count, choice) +} + +func (sf *nnarySnowflakeTest) AssertEqual(expectedConfidences []int, expectedFinalized bool, expectedPreference ids.ID) { + sf.require.Equal(expectedPreference, sf.Preference()) + sf.require.Equal(expectedConfidences, sf.nnarySnowflake.confidence) + sf.require.Equal(expectedFinalized, sf.Finalized()) +} + +func TestNnarySnowflakeErrorDrivenSingleChoice(t *testing.T) { + for _, test := range getErrorDrivenSnowflakeSingleChoiceSuite[ids.ID]() { + t.Run(test.name, func(t *testing.T) { + test.f(t, newNnarySnowflakeTest, Red) + }) + } +} + +func TestNnarySnowflakeErrorDrivenMultiChoice(t *testing.T) { + for _, test := range getErrorDrivenSnowflakeMultiChoiceSuite[ids.ID]() { + t.Run(test.name, func(t *testing.T) { + test.f(t, newNnarySnowflakeTest, Red, Green) + }) + } +} diff --git a/snow/consensus/snowball/parameters.go b/snow/consensus/snowball/parameters.go index a13d99c27565..3e2ba03f2081 100644 --- a/snow/consensus/snowball/parameters.go +++ b/snow/consensus/snowball/parameters.go @@ -127,3 +127,12 @@ type terminationCondition struct { alphaConfidence int beta int } + +func newSingleTerminationCondition(alphaConfidence int, beta int) []terminationCondition { + return []terminationCondition{ + { + alphaConfidence: alphaConfidence, + beta: beta, + }, + } +} diff --git a/snow/consensus/snowball/test_snowflake.go b/snow/consensus/snowball/test_snowflake.go new file mode 100644 index 000000000000..78ce95b27e3d --- /dev/null +++ b/snow/consensus/snowball/test_snowflake.go @@ -0,0 +1,145 @@ +// Copyright (C) 2019-2024, Ava Labs, Inc. All rights reserved. +// See the file LICENSE for licensing terms. + +package snowball + +import "testing" + +const alphaPreference = 3 + +var terminationConditions = []terminationCondition{ + { + alphaConfidence: 3, + beta: 4, + }, + { + alphaConfidence: 4, + beta: 3, + }, + { + alphaConfidence: 5, + beta: 2, + }, +} + +type snowflakeTestConstructor[T comparable] func(t *testing.T, alphaPreference int, terminationConditions []terminationCondition) snowflakeTest[T] + +type snowflakeTest[T comparable] interface { + RecordPoll(count int, optionalMode T) + RecordUnsuccessfulPoll() + AssertEqual(expectedConfidences []int, expectedFinalized bool, expectedPreference T) +} + +func executeErrorDrivenTerminatesInBetaPolls[T comparable](t *testing.T, newSnowflakeTest snowflakeTestConstructor[T], choice T) { + for i, terminationCondition := range terminationConditions { + sfTest := newSnowflakeTest(t, alphaPreference, terminationConditions) + + for poll := 0; poll < terminationCondition.beta; poll++ { + sfTest.RecordPoll(terminationCondition.alphaConfidence, choice) + + expectedConfidences := make([]int, len(terminationConditions)) + for j := 0; j < i+1; j++ { + expectedConfidences[j] = poll + 1 + } + sfTest.AssertEqual(expectedConfidences, poll+1 >= terminationCondition.beta, choice) + } + } +} + +func executeErrorDrivenReset[T comparable](t *testing.T, newSnowflakeTest snowflakeTestConstructor[T], choice T) { + for i, terminationCondition := range terminationConditions { + sfTest := newSnowflakeTest(t, alphaPreference, terminationConditions) + + // Accumulate confidence up to 1 less than beta, reset, and confirm + // expected behavior from fresh state. + for poll := 0; poll < terminationCondition.beta-1; poll++ { + sfTest.RecordPoll(terminationCondition.alphaConfidence, choice) + } + sfTest.RecordUnsuccessfulPoll() + zeroConfidence := make([]int, len(terminationConditions)) + sfTest.AssertEqual(zeroConfidence, false, choice) + + for poll := 0; poll < terminationCondition.beta; poll++ { + sfTest.RecordPoll(terminationCondition.alphaConfidence, choice) + + expectedConfidences := make([]int, len(terminationConditions)) + for j := 0; j < i+1; j++ { + expectedConfidences[j] = poll + 1 + } + sfTest.AssertEqual(expectedConfidences, poll+1 >= terminationCondition.beta, choice) + } + } +} + +func executeErrorDrivenResetHighestAlphaConfidence[T comparable](t *testing.T, newSnowflakeTest snowflakeTestConstructor[T], choice T) { + sfTest := newSnowflakeTest(t, alphaPreference, terminationConditions) + + sfTest.RecordPoll(5, choice) + sfTest.AssertEqual([]int{1, 1, 1}, false, choice) + sfTest.RecordPoll(4, choice) + sfTest.AssertEqual([]int{2, 2, 0}, false, choice) + sfTest.RecordPoll(3, choice) + sfTest.AssertEqual([]int{3, 0, 0}, false, choice) + sfTest.RecordPoll(5, choice) + sfTest.AssertEqual([]int{4, 0, 0}, true, choice) +} + +type snowflakeTestSingleChoice[T comparable] struct { + name string + f func(*testing.T, snowflakeTestConstructor[T], T) +} + +func getErrorDrivenSnowflakeSingleChoiceSuite[T comparable]() []snowflakeTestSingleChoice[T] { + return []snowflakeTestSingleChoice[T]{ + { + name: "TerminateInBetaPolls", + f: executeErrorDrivenTerminatesInBetaPolls[T], + }, + { + name: "Reset", + f: executeErrorDrivenReset[T], + }, + { + name: "ResetHighestAlphaConfidence", + f: executeErrorDrivenResetHighestAlphaConfidence[T], + }, + } +} + +func executeErrorDrivenSwitchChoices[T comparable](t *testing.T, newSnowflakeTest snowflakeTestConstructor[T], choice0, choice1 T) { + sfTest := newSnowflakeTest(t, alphaPreference, terminationConditions) + + sfTest.RecordPoll(3, choice0) + sfTest.AssertEqual([]int{1, 0, 0}, false, choice0) + + sfTest.RecordPoll(2, choice1) + sfTest.AssertEqual([]int{0, 0, 0}, false, choice0) + + sfTest.RecordPoll(3, choice0) + sfTest.AssertEqual([]int{1, 0, 0}, false, choice0) + + sfTest.RecordPoll(0, choice0) + sfTest.AssertEqual([]int{0, 0, 0}, false, choice0) + + sfTest.RecordPoll(3, choice1) + sfTest.AssertEqual([]int{1, 0, 0}, false, choice1) + + sfTest.RecordPoll(5, choice1) + sfTest.AssertEqual([]int{2, 1, 1}, false, choice1) + sfTest.RecordPoll(5, choice1) + sfTest.AssertEqual([]int{3, 2, 2}, true, choice1) +} + +type snowflakeTestMultiChoice[T comparable] struct { + name string + f func(*testing.T, snowflakeTestConstructor[T], T, T) +} + +func getErrorDrivenSnowflakeMultiChoiceSuite[T comparable]() []snowflakeTestMultiChoice[T] { + return []snowflakeTestMultiChoice[T]{ + { + name: "SwitchChoices", + f: executeErrorDrivenSwitchChoices[T], + }, + } +} diff --git a/snow/consensus/snowball/tree_test.go b/snow/consensus/snowball/tree_test.go index 687f948fa783..fc9c8944b768 100644 --- a/snow/consensus/snowball/tree_test.go +++ b/snow/consensus/snowball/tree_test.go @@ -15,7 +15,7 @@ import ( "github.com/ava-labs/avalanchego/utils/bag" ) -const initialUnaryDescription = "SB(PreferenceStrength = 0, SF(Confidence = 0, Finalized = false)) Bits = [0, 256)" +const initialUnaryDescription = "SB(PreferenceStrength = 0, SF(Confidence = [0], Finalized = false)) Bits = [0, 256)" func TestSnowballSingleton(t *testing.T) { require := require.New(t) @@ -143,8 +143,8 @@ func TestSnowballLastBinary(t *testing.T) { // Should do nothing tree.Add(one) - expected := `SB(PreferenceStrength = 0, SF(Confidence = 0, Finalized = false)) Bits = [0, 255) - SB(Preference = 0, PreferenceStrength[0] = 0, PreferenceStrength[1] = 0, SF(Confidence = 0, Finalized = false, SL(Preference = 0))) Bit = 255` + expected := `SB(PreferenceStrength = 0, SF(Confidence = [0], Finalized = false)) Bits = [0, 255) + SB(Preference = 0, PreferenceStrength[0] = 0, PreferenceStrength[1] = 0, SF(Confidence = [0], Finalized = false, SL(Preference = 0))) Bit = 255` require.Equal(expected, tree.String()) require.Equal(zero, tree.Preference()) require.False(tree.Finalized()) @@ -154,15 +154,15 @@ func TestSnowballLastBinary(t *testing.T) { require.Equal(one, tree.Preference()) require.False(tree.Finalized()) - expected = `SB(PreferenceStrength = 1, SF(Confidence = 1, Finalized = false)) Bits = [0, 255) - SB(Preference = 1, PreferenceStrength[0] = 0, PreferenceStrength[1] = 1, SF(Confidence = 1, Finalized = false, SL(Preference = 1))) Bit = 255` + expected = `SB(PreferenceStrength = 1, SF(Confidence = [1], Finalized = false)) Bits = [0, 255) + SB(Preference = 1, PreferenceStrength[0] = 0, PreferenceStrength[1] = 1, SF(Confidence = [1], Finalized = false, SL(Preference = 1))) Bit = 255` require.Equal(expected, tree.String()) require.True(tree.RecordPoll(oneBag)) require.Equal(one, tree.Preference()) require.True(tree.Finalized()) - expected = "SB(Preference = 1, PreferenceStrength[0] = 0, PreferenceStrength[1] = 2, SF(Confidence = 2, Finalized = true, SL(Preference = 1))) Bit = 255" + expected = "SB(Preference = 1, PreferenceStrength[0] = 0, PreferenceStrength[1] = 2, SF(Confidence = [2], Finalized = true, SL(Preference = 1))) Bit = 255" require.Equal(expected, tree.String()) } @@ -181,9 +181,9 @@ func TestSnowballFirstBinary(t *testing.T) { tree := NewTree(SnowballFactory, params, zero) tree.Add(one) - expected := `SB(Preference = 0, PreferenceStrength[0] = 0, PreferenceStrength[1] = 0, SF(Confidence = 0, Finalized = false, SL(Preference = 0))) Bit = 0 - SB(PreferenceStrength = 0, SF(Confidence = 0, Finalized = false)) Bits = [1, 256) - SB(PreferenceStrength = 0, SF(Confidence = 0, Finalized = false)) Bits = [1, 256)` + expected := `SB(Preference = 0, PreferenceStrength[0] = 0, PreferenceStrength[1] = 0, SF(Confidence = [0], Finalized = false, SL(Preference = 0))) Bit = 0 + SB(PreferenceStrength = 0, SF(Confidence = [0], Finalized = false)) Bits = [1, 256) + SB(PreferenceStrength = 0, SF(Confidence = [0], Finalized = false)) Bits = [1, 256)` require.Equal(expected, tree.String()) require.Equal(zero, tree.Preference()) require.False(tree.Finalized()) @@ -193,16 +193,16 @@ func TestSnowballFirstBinary(t *testing.T) { require.Equal(one, tree.Preference()) require.False(tree.Finalized()) - expected = `SB(Preference = 1, PreferenceStrength[0] = 0, PreferenceStrength[1] = 1, SF(Confidence = 1, Finalized = false, SL(Preference = 1))) Bit = 0 - SB(PreferenceStrength = 0, SF(Confidence = 0, Finalized = false)) Bits = [1, 256) - SB(PreferenceStrength = 1, SF(Confidence = 1, Finalized = false)) Bits = [1, 256)` + expected = `SB(Preference = 1, PreferenceStrength[0] = 0, PreferenceStrength[1] = 1, SF(Confidence = [1], Finalized = false, SL(Preference = 1))) Bit = 0 + SB(PreferenceStrength = 0, SF(Confidence = [0], Finalized = false)) Bits = [1, 256) + SB(PreferenceStrength = 1, SF(Confidence = [1], Finalized = false)) Bits = [1, 256)` require.Equal(expected, tree.String()) require.True(tree.RecordPoll(oneBag)) require.Equal(one, tree.Preference()) require.True(tree.Finalized()) - expected = `SB(PreferenceStrength = 2, SF(Confidence = 2, Finalized = true)) Bits = [1, 256)` + expected = `SB(PreferenceStrength = 2, SF(Confidence = [2], Finalized = true)) Bits = [1, 256)` require.Equal(expected, tree.String()) } @@ -224,11 +224,11 @@ func TestSnowballAddDecidedFirstBit(t *testing.T) { tree.Add(c1000) tree.Add(c1100) - expected := `SB(Preference = 0, PreferenceStrength[0] = 0, PreferenceStrength[1] = 0, SF(Confidence = 0, Finalized = false, SL(Preference = 0))) Bit = 0 - SB(PreferenceStrength = 0, SF(Confidence = 0, Finalized = false)) Bits = [1, 256) - SB(Preference = 0, PreferenceStrength[0] = 0, PreferenceStrength[1] = 0, SF(Confidence = 0, Finalized = false, SL(Preference = 0))) Bit = 1 - SB(PreferenceStrength = 0, SF(Confidence = 0, Finalized = false)) Bits = [2, 256) - SB(PreferenceStrength = 0, SF(Confidence = 0, Finalized = false)) Bits = [2, 256)` + expected := `SB(Preference = 0, PreferenceStrength[0] = 0, PreferenceStrength[1] = 0, SF(Confidence = [0], Finalized = false, SL(Preference = 0))) Bit = 0 + SB(PreferenceStrength = 0, SF(Confidence = [0], Finalized = false)) Bits = [1, 256) + SB(Preference = 0, PreferenceStrength[0] = 0, PreferenceStrength[1] = 0, SF(Confidence = [0], Finalized = false, SL(Preference = 0))) Bit = 1 + SB(PreferenceStrength = 0, SF(Confidence = [0], Finalized = false)) Bits = [2, 256) + SB(PreferenceStrength = 0, SF(Confidence = [0], Finalized = false)) Bits = [2, 256)` require.Equal(expected, tree.String()) require.Equal(zero, tree.Preference()) require.False(tree.Finalized()) @@ -238,11 +238,11 @@ func TestSnowballAddDecidedFirstBit(t *testing.T) { require.Equal(c1000, tree.Preference()) require.False(tree.Finalized()) - expected = `SB(Preference = 1, PreferenceStrength[0] = 0, PreferenceStrength[1] = 1, SF(Confidence = 1, Finalized = false, SL(Preference = 1))) Bit = 0 - SB(PreferenceStrength = 0, SF(Confidence = 0, Finalized = false)) Bits = [1, 256) - SB(Preference = 0, PreferenceStrength[0] = 1, PreferenceStrength[1] = 0, SF(Confidence = 1, Finalized = false, SL(Preference = 0))) Bit = 1 - SB(PreferenceStrength = 1, SF(Confidence = 1, Finalized = false)) Bits = [2, 256) - SB(PreferenceStrength = 0, SF(Confidence = 0, Finalized = false)) Bits = [2, 256)` + expected = `SB(Preference = 1, PreferenceStrength[0] = 0, PreferenceStrength[1] = 1, SF(Confidence = [1], Finalized = false, SL(Preference = 1))) Bit = 0 + SB(PreferenceStrength = 0, SF(Confidence = [0], Finalized = false)) Bits = [1, 256) + SB(Preference = 0, PreferenceStrength[0] = 1, PreferenceStrength[1] = 0, SF(Confidence = [1], Finalized = false, SL(Preference = 0))) Bit = 1 + SB(PreferenceStrength = 1, SF(Confidence = [1], Finalized = false)) Bits = [2, 256) + SB(PreferenceStrength = 0, SF(Confidence = [0], Finalized = false)) Bits = [2, 256)` require.Equal(expected, tree.String()) threeBag := bag.Of(c1100) @@ -250,9 +250,9 @@ func TestSnowballAddDecidedFirstBit(t *testing.T) { require.Equal(c1000, tree.Preference()) require.False(tree.Finalized()) - expected = `SB(Preference = 0, PreferenceStrength[0] = 1, PreferenceStrength[1] = 1, SF(Confidence = 1, Finalized = false, SL(Preference = 1))) Bit = 1 - SB(PreferenceStrength = 1, SF(Confidence = 1, Finalized = false)) Bits = [2, 256) - SB(PreferenceStrength = 1, SF(Confidence = 1, Finalized = false)) Bits = [2, 256)` + expected = `SB(Preference = 0, PreferenceStrength[0] = 1, PreferenceStrength[1] = 1, SF(Confidence = [1], Finalized = false, SL(Preference = 1))) Bit = 1 + SB(PreferenceStrength = 1, SF(Confidence = [1], Finalized = false)) Bits = [2, 256) + SB(PreferenceStrength = 1, SF(Confidence = [1], Finalized = false)) Bits = [2, 256)` require.Equal(expected, tree.String()) // Adding six should have no effect because the first bit is already decided @@ -277,10 +277,10 @@ func TestSnowballAddPreviouslyRejected(t *testing.T) { tree.Add(two) { - expected := `SB(PreferenceStrength = 0, SF(Confidence = 0, Finalized = false)) Bits = [0, 1) - SB(Preference = 0, PreferenceStrength[0] = 0, PreferenceStrength[1] = 0, SF(Confidence = 0, Finalized = false, SL(Preference = 0))) Bit = 1 - SB(PreferenceStrength = 0, SF(Confidence = 0, Finalized = false)) Bits = [2, 256) - SB(PreferenceStrength = 0, SF(Confidence = 0, Finalized = false)) Bits = [2, 256)` + expected := `SB(PreferenceStrength = 0, SF(Confidence = [0], Finalized = false)) Bits = [0, 1) + SB(Preference = 0, PreferenceStrength[0] = 0, PreferenceStrength[1] = 0, SF(Confidence = [0], Finalized = false, SL(Preference = 0))) Bit = 1 + SB(PreferenceStrength = 0, SF(Confidence = [0], Finalized = false)) Bits = [2, 256) + SB(PreferenceStrength = 0, SF(Confidence = [0], Finalized = false)) Bits = [2, 256)` require.Equal(expected, tree.String()) require.Equal(zero, tree.Preference()) require.False(tree.Finalized()) @@ -290,10 +290,10 @@ func TestSnowballAddPreviouslyRejected(t *testing.T) { require.True(tree.RecordPoll(zeroBag)) { - expected := `SB(PreferenceStrength = 1, SF(Confidence = 1, Finalized = false)) Bits = [0, 1) - SB(Preference = 0, PreferenceStrength[0] = 1, PreferenceStrength[1] = 0, SF(Confidence = 1, Finalized = false, SL(Preference = 0))) Bit = 1 - SB(PreferenceStrength = 1, SF(Confidence = 1, Finalized = false)) Bits = [2, 256) - SB(PreferenceStrength = 0, SF(Confidence = 0, Finalized = false)) Bits = [2, 256)` + expected := `SB(PreferenceStrength = 1, SF(Confidence = [1], Finalized = false)) Bits = [0, 1) + SB(Preference = 0, PreferenceStrength[0] = 1, PreferenceStrength[1] = 0, SF(Confidence = [1], Finalized = false, SL(Preference = 0))) Bit = 1 + SB(PreferenceStrength = 1, SF(Confidence = [1], Finalized = false)) Bits = [2, 256) + SB(PreferenceStrength = 0, SF(Confidence = [0], Finalized = false)) Bits = [2, 256)` require.Equal(expected, tree.String()) require.Equal(zero, tree.Preference()) require.False(tree.Finalized()) @@ -303,9 +303,9 @@ func TestSnowballAddPreviouslyRejected(t *testing.T) { require.True(tree.RecordPoll(twoBag)) { - expected := `SB(Preference = 0, PreferenceStrength[0] = 1, PreferenceStrength[1] = 1, SF(Confidence = 1, Finalized = false, SL(Preference = 1))) Bit = 1 - SB(PreferenceStrength = 1, SF(Confidence = 1, Finalized = false)) Bits = [2, 256) - SB(PreferenceStrength = 1, SF(Confidence = 1, Finalized = false)) Bits = [2, 256)` + expected := `SB(Preference = 0, PreferenceStrength[0] = 1, PreferenceStrength[1] = 1, SF(Confidence = [1], Finalized = false, SL(Preference = 1))) Bit = 1 + SB(PreferenceStrength = 1, SF(Confidence = [1], Finalized = false)) Bits = [2, 256) + SB(PreferenceStrength = 1, SF(Confidence = [1], Finalized = false)) Bits = [2, 256)` require.Equal(expected, tree.String()) require.Equal(zero, tree.Preference()) require.False(tree.Finalized()) @@ -314,9 +314,9 @@ func TestSnowballAddPreviouslyRejected(t *testing.T) { tree.Add(one) { - expected := `SB(Preference = 0, PreferenceStrength[0] = 1, PreferenceStrength[1] = 1, SF(Confidence = 1, Finalized = false, SL(Preference = 1))) Bit = 1 - SB(PreferenceStrength = 1, SF(Confidence = 1, Finalized = false)) Bits = [2, 256) - SB(PreferenceStrength = 1, SF(Confidence = 1, Finalized = false)) Bits = [2, 256)` + expected := `SB(Preference = 0, PreferenceStrength[0] = 1, PreferenceStrength[1] = 1, SF(Confidence = [1], Finalized = false, SL(Preference = 1))) Bit = 1 + SB(PreferenceStrength = 1, SF(Confidence = [1], Finalized = false)) Bits = [2, 256) + SB(PreferenceStrength = 1, SF(Confidence = [1], Finalized = false)) Bits = [2, 256)` require.Equal(expected, tree.String()) require.Equal(zero, tree.Preference()) require.False(tree.Finalized()) @@ -339,9 +339,9 @@ func TestSnowballNewUnary(t *testing.T) { tree.Add(one) { - expected := `SB(Preference = 0, PreferenceStrength[0] = 0, PreferenceStrength[1] = 0, SF(Confidence = 0, Finalized = false, SL(Preference = 0))) Bit = 0 - SB(PreferenceStrength = 0, SF(Confidence = 0, Finalized = false)) Bits = [1, 256) - SB(PreferenceStrength = 0, SF(Confidence = 0, Finalized = false)) Bits = [1, 256)` + expected := `SB(Preference = 0, PreferenceStrength[0] = 0, PreferenceStrength[1] = 0, SF(Confidence = [0], Finalized = false, SL(Preference = 0))) Bit = 0 + SB(PreferenceStrength = 0, SF(Confidence = [0], Finalized = false)) Bits = [1, 256) + SB(PreferenceStrength = 0, SF(Confidence = [0], Finalized = false)) Bits = [1, 256)` require.Equal(expected, tree.String()) require.Equal(zero, tree.Preference()) require.False(tree.Finalized()) @@ -351,9 +351,9 @@ func TestSnowballNewUnary(t *testing.T) { require.True(tree.RecordPoll(oneBag)) { - expected := `SB(Preference = 1, PreferenceStrength[0] = 0, PreferenceStrength[1] = 1, SF(Confidence = 1, Finalized = false, SL(Preference = 1))) Bit = 0 - SB(PreferenceStrength = 0, SF(Confidence = 0, Finalized = false)) Bits = [1, 256) - SB(PreferenceStrength = 1, SF(Confidence = 1, Finalized = false)) Bits = [1, 256)` + expected := `SB(Preference = 1, PreferenceStrength[0] = 0, PreferenceStrength[1] = 1, SF(Confidence = [1], Finalized = false, SL(Preference = 1))) Bit = 0 + SB(PreferenceStrength = 0, SF(Confidence = [0], Finalized = false)) Bits = [1, 256) + SB(PreferenceStrength = 1, SF(Confidence = [1], Finalized = false)) Bits = [1, 256)` require.Equal(expected, tree.String()) require.Equal(one, tree.Preference()) require.False(tree.Finalized()) @@ -362,9 +362,9 @@ func TestSnowballNewUnary(t *testing.T) { require.True(tree.RecordPoll(oneBag)) { - expected := `SB(Preference = 1, PreferenceStrength[0] = 0, PreferenceStrength[1] = 2, SF(Confidence = 2, Finalized = false, SL(Preference = 1))) Bit = 0 - SB(PreferenceStrength = 0, SF(Confidence = 0, Finalized = false)) Bits = [1, 256) - SB(PreferenceStrength = 2, SF(Confidence = 2, Finalized = false)) Bits = [1, 256)` + expected := `SB(Preference = 1, PreferenceStrength[0] = 0, PreferenceStrength[1] = 2, SF(Confidence = [2], Finalized = false, SL(Preference = 1))) Bit = 0 + SB(PreferenceStrength = 0, SF(Confidence = [0], Finalized = false)) Bits = [1, 256) + SB(PreferenceStrength = 2, SF(Confidence = [2], Finalized = false)) Bits = [1, 256)` require.Equal(expected, tree.String()) require.Equal(one, tree.Preference()) require.False(tree.Finalized()) @@ -389,13 +389,13 @@ func TestSnowballTransitiveReset(t *testing.T) { tree.Add(eight) { - expected := `SB(PreferenceStrength = 0, SF(Confidence = 0, Finalized = false)) Bits = [0, 1) - SB(Preference = 0, PreferenceStrength[0] = 0, PreferenceStrength[1] = 0, SF(Confidence = 0, Finalized = false, SL(Preference = 0))) Bit = 1 - SB(PreferenceStrength = 0, SF(Confidence = 0, Finalized = false)) Bits = [2, 3) - SB(Preference = 0, PreferenceStrength[0] = 0, PreferenceStrength[1] = 0, SF(Confidence = 0, Finalized = false, SL(Preference = 0))) Bit = 3 - SB(PreferenceStrength = 0, SF(Confidence = 0, Finalized = false)) Bits = [4, 256) - SB(PreferenceStrength = 0, SF(Confidence = 0, Finalized = false)) Bits = [4, 256) - SB(PreferenceStrength = 0, SF(Confidence = 0, Finalized = false)) Bits = [2, 256)` + expected := `SB(PreferenceStrength = 0, SF(Confidence = [0], Finalized = false)) Bits = [0, 1) + SB(Preference = 0, PreferenceStrength[0] = 0, PreferenceStrength[1] = 0, SF(Confidence = [0], Finalized = false, SL(Preference = 0))) Bit = 1 + SB(PreferenceStrength = 0, SF(Confidence = [0], Finalized = false)) Bits = [2, 3) + SB(Preference = 0, PreferenceStrength[0] = 0, PreferenceStrength[1] = 0, SF(Confidence = [0], Finalized = false, SL(Preference = 0))) Bit = 3 + SB(PreferenceStrength = 0, SF(Confidence = [0], Finalized = false)) Bits = [4, 256) + SB(PreferenceStrength = 0, SF(Confidence = [0], Finalized = false)) Bits = [4, 256) + SB(PreferenceStrength = 0, SF(Confidence = [0], Finalized = false)) Bits = [2, 256)` require.Equal(expected, tree.String()) require.Equal(zero, tree.Preference()) require.False(tree.Finalized()) @@ -405,13 +405,13 @@ func TestSnowballTransitiveReset(t *testing.T) { require.True(tree.RecordPoll(zeroBag)) { - expected := `SB(PreferenceStrength = 1, SF(Confidence = 1, Finalized = false)) Bits = [0, 1) - SB(Preference = 0, PreferenceStrength[0] = 1, PreferenceStrength[1] = 0, SF(Confidence = 1, Finalized = false, SL(Preference = 0))) Bit = 1 - SB(PreferenceStrength = 1, SF(Confidence = 1, Finalized = false)) Bits = [2, 3) - SB(Preference = 0, PreferenceStrength[0] = 1, PreferenceStrength[1] = 0, SF(Confidence = 1, Finalized = false, SL(Preference = 0))) Bit = 3 - SB(PreferenceStrength = 1, SF(Confidence = 1, Finalized = false)) Bits = [4, 256) - SB(PreferenceStrength = 0, SF(Confidence = 0, Finalized = false)) Bits = [4, 256) - SB(PreferenceStrength = 0, SF(Confidence = 0, Finalized = false)) Bits = [2, 256)` + expected := `SB(PreferenceStrength = 1, SF(Confidence = [1], Finalized = false)) Bits = [0, 1) + SB(Preference = 0, PreferenceStrength[0] = 1, PreferenceStrength[1] = 0, SF(Confidence = [1], Finalized = false, SL(Preference = 0))) Bit = 1 + SB(PreferenceStrength = 1, SF(Confidence = [1], Finalized = false)) Bits = [2, 3) + SB(Preference = 0, PreferenceStrength[0] = 1, PreferenceStrength[1] = 0, SF(Confidence = [1], Finalized = false, SL(Preference = 0))) Bit = 3 + SB(PreferenceStrength = 1, SF(Confidence = [1], Finalized = false)) Bits = [4, 256) + SB(PreferenceStrength = 0, SF(Confidence = [0], Finalized = false)) Bits = [4, 256) + SB(PreferenceStrength = 0, SF(Confidence = [0], Finalized = false)) Bits = [2, 256)` require.Equal(expected, tree.String()) require.Equal(zero, tree.Preference()) require.False(tree.Finalized()) @@ -421,13 +421,13 @@ func TestSnowballTransitiveReset(t *testing.T) { require.False(tree.RecordPoll(emptyBag)) { - expected := `SB(PreferenceStrength = 1, SF(Confidence = 0, Finalized = false)) Bits = [0, 1) - SB(Preference = 0, PreferenceStrength[0] = 1, PreferenceStrength[1] = 0, SF(Confidence = 1, Finalized = false, SL(Preference = 0))) Bit = 1 - SB(PreferenceStrength = 1, SF(Confidence = 1, Finalized = false)) Bits = [2, 3) - SB(Preference = 0, PreferenceStrength[0] = 1, PreferenceStrength[1] = 0, SF(Confidence = 1, Finalized = false, SL(Preference = 0))) Bit = 3 - SB(PreferenceStrength = 1, SF(Confidence = 1, Finalized = false)) Bits = [4, 256) - SB(PreferenceStrength = 0, SF(Confidence = 0, Finalized = false)) Bits = [4, 256) - SB(PreferenceStrength = 0, SF(Confidence = 0, Finalized = false)) Bits = [2, 256)` + expected := `SB(PreferenceStrength = 1, SF(Confidence = [0], Finalized = false)) Bits = [0, 1) + SB(Preference = 0, PreferenceStrength[0] = 1, PreferenceStrength[1] = 0, SF(Confidence = [1], Finalized = false, SL(Preference = 0))) Bit = 1 + SB(PreferenceStrength = 1, SF(Confidence = [1], Finalized = false)) Bits = [2, 3) + SB(Preference = 0, PreferenceStrength[0] = 1, PreferenceStrength[1] = 0, SF(Confidence = [1], Finalized = false, SL(Preference = 0))) Bit = 3 + SB(PreferenceStrength = 1, SF(Confidence = [1], Finalized = false)) Bits = [4, 256) + SB(PreferenceStrength = 0, SF(Confidence = [0], Finalized = false)) Bits = [4, 256) + SB(PreferenceStrength = 0, SF(Confidence = [0], Finalized = false)) Bits = [2, 256)` require.Equal(expected, tree.String()) require.Equal(zero, tree.Preference()) require.False(tree.Finalized()) @@ -436,13 +436,13 @@ func TestSnowballTransitiveReset(t *testing.T) { require.True(tree.RecordPoll(zeroBag)) { - expected := `SB(PreferenceStrength = 2, SF(Confidence = 1, Finalized = false)) Bits = [0, 1) - SB(Preference = 0, PreferenceStrength[0] = 2, PreferenceStrength[1] = 0, SF(Confidence = 1, Finalized = false, SL(Preference = 0))) Bit = 1 - SB(PreferenceStrength = 2, SF(Confidence = 1, Finalized = false)) Bits = [2, 3) - SB(Preference = 0, PreferenceStrength[0] = 2, PreferenceStrength[1] = 0, SF(Confidence = 1, Finalized = false, SL(Preference = 0))) Bit = 3 - SB(PreferenceStrength = 2, SF(Confidence = 1, Finalized = false)) Bits = [4, 256) - SB(PreferenceStrength = 0, SF(Confidence = 0, Finalized = false)) Bits = [4, 256) - SB(PreferenceStrength = 0, SF(Confidence = 0, Finalized = false)) Bits = [2, 256)` + expected := `SB(PreferenceStrength = 2, SF(Confidence = [1], Finalized = false)) Bits = [0, 1) + SB(Preference = 0, PreferenceStrength[0] = 2, PreferenceStrength[1] = 0, SF(Confidence = [1], Finalized = false, SL(Preference = 0))) Bit = 1 + SB(PreferenceStrength = 2, SF(Confidence = [1], Finalized = false)) Bits = [2, 3) + SB(Preference = 0, PreferenceStrength[0] = 2, PreferenceStrength[1] = 0, SF(Confidence = [1], Finalized = false, SL(Preference = 0))) Bit = 3 + SB(PreferenceStrength = 2, SF(Confidence = [1], Finalized = false)) Bits = [4, 256) + SB(PreferenceStrength = 0, SF(Confidence = [0], Finalized = false)) Bits = [4, 256) + SB(PreferenceStrength = 0, SF(Confidence = [0], Finalized = false)) Bits = [2, 256)` require.Equal(expected, tree.String()) require.Equal(zero, tree.Preference()) require.False(tree.Finalized()) @@ -451,7 +451,7 @@ func TestSnowballTransitiveReset(t *testing.T) { require.True(tree.RecordPoll(zeroBag)) { - expected := "SB(PreferenceStrength = 3, SF(Confidence = 2, Finalized = true)) Bits = [4, 256)" + expected := "SB(PreferenceStrength = 3, SF(Confidence = [2], Finalized = true)) Bits = [4, 256)" require.Equal(expected, tree.String()) require.Equal(zero, tree.Preference()) require.True(tree.Finalized()) @@ -578,11 +578,11 @@ func TestSnowballResetChild(t *testing.T) { require.True(tree.RecordPoll(c0000Bag)) { - expected := `SB(Preference = 0, PreferenceStrength[0] = 1, PreferenceStrength[1] = 0, SF(Confidence = 1, Finalized = false, SL(Preference = 0))) Bit = 0 - SB(Preference = 0, PreferenceStrength[0] = 1, PreferenceStrength[1] = 0, SF(Confidence = 1, Finalized = false, SL(Preference = 0))) Bit = 1 - SB(PreferenceStrength = 1, SF(Confidence = 1, Finalized = false)) Bits = [2, 256) - SB(PreferenceStrength = 0, SF(Confidence = 0, Finalized = false)) Bits = [2, 256) - SB(PreferenceStrength = 0, SF(Confidence = 0, Finalized = false)) Bits = [1, 256)` + expected := `SB(Preference = 0, PreferenceStrength[0] = 1, PreferenceStrength[1] = 0, SF(Confidence = [1], Finalized = false, SL(Preference = 0))) Bit = 0 + SB(Preference = 0, PreferenceStrength[0] = 1, PreferenceStrength[1] = 0, SF(Confidence = [1], Finalized = false, SL(Preference = 0))) Bit = 1 + SB(PreferenceStrength = 1, SF(Confidence = [1], Finalized = false)) Bits = [2, 256) + SB(PreferenceStrength = 0, SF(Confidence = [0], Finalized = false)) Bits = [2, 256) + SB(PreferenceStrength = 0, SF(Confidence = [0], Finalized = false)) Bits = [1, 256)` require.Equal(expected, tree.String()) require.Equal(c0000, tree.Preference()) require.False(tree.Finalized()) @@ -592,11 +592,11 @@ func TestSnowballResetChild(t *testing.T) { require.False(tree.RecordPoll(emptyBag)) { - expected := `SB(Preference = 0, PreferenceStrength[0] = 1, PreferenceStrength[1] = 0, SF(Confidence = 0, Finalized = false, SL(Preference = 0))) Bit = 0 - SB(Preference = 0, PreferenceStrength[0] = 1, PreferenceStrength[1] = 0, SF(Confidence = 1, Finalized = false, SL(Preference = 0))) Bit = 1 - SB(PreferenceStrength = 1, SF(Confidence = 1, Finalized = false)) Bits = [2, 256) - SB(PreferenceStrength = 0, SF(Confidence = 0, Finalized = false)) Bits = [2, 256) - SB(PreferenceStrength = 0, SF(Confidence = 0, Finalized = false)) Bits = [1, 256)` + expected := `SB(Preference = 0, PreferenceStrength[0] = 1, PreferenceStrength[1] = 0, SF(Confidence = [0], Finalized = false, SL(Preference = 0))) Bit = 0 + SB(Preference = 0, PreferenceStrength[0] = 1, PreferenceStrength[1] = 0, SF(Confidence = [1], Finalized = false, SL(Preference = 0))) Bit = 1 + SB(PreferenceStrength = 1, SF(Confidence = [1], Finalized = false)) Bits = [2, 256) + SB(PreferenceStrength = 0, SF(Confidence = [0], Finalized = false)) Bits = [2, 256) + SB(PreferenceStrength = 0, SF(Confidence = [0], Finalized = false)) Bits = [1, 256)` require.Equal(expected, tree.String()) require.Equal(c0000, tree.Preference()) require.False(tree.Finalized()) @@ -605,11 +605,11 @@ func TestSnowballResetChild(t *testing.T) { require.True(tree.RecordPoll(c0000Bag)) { - expected := `SB(Preference = 0, PreferenceStrength[0] = 2, PreferenceStrength[1] = 0, SF(Confidence = 1, Finalized = false, SL(Preference = 0))) Bit = 0 - SB(Preference = 0, PreferenceStrength[0] = 2, PreferenceStrength[1] = 0, SF(Confidence = 1, Finalized = false, SL(Preference = 0))) Bit = 1 - SB(PreferenceStrength = 2, SF(Confidence = 1, Finalized = false)) Bits = [2, 256) - SB(PreferenceStrength = 0, SF(Confidence = 0, Finalized = false)) Bits = [2, 256) - SB(PreferenceStrength = 0, SF(Confidence = 0, Finalized = false)) Bits = [1, 256)` + expected := `SB(Preference = 0, PreferenceStrength[0] = 2, PreferenceStrength[1] = 0, SF(Confidence = [1], Finalized = false, SL(Preference = 0))) Bit = 0 + SB(Preference = 0, PreferenceStrength[0] = 2, PreferenceStrength[1] = 0, SF(Confidence = [1], Finalized = false, SL(Preference = 0))) Bit = 1 + SB(PreferenceStrength = 2, SF(Confidence = [1], Finalized = false)) Bits = [2, 256) + SB(PreferenceStrength = 0, SF(Confidence = [0], Finalized = false)) Bits = [2, 256) + SB(PreferenceStrength = 0, SF(Confidence = [0], Finalized = false)) Bits = [1, 256)` require.Equal(expected, tree.String()) require.Equal(c0000, tree.Preference()) require.False(tree.Finalized()) @@ -640,11 +640,11 @@ func TestSnowballResetSibling(t *testing.T) { require.True(tree.RecordPoll(c0100Bag)) { - expected := `SB(Preference = 0, PreferenceStrength[0] = 1, PreferenceStrength[1] = 0, SF(Confidence = 1, Finalized = false, SL(Preference = 0))) Bit = 0 - SB(Preference = 1, PreferenceStrength[0] = 0, PreferenceStrength[1] = 1, SF(Confidence = 1, Finalized = false, SL(Preference = 1))) Bit = 1 - SB(PreferenceStrength = 0, SF(Confidence = 0, Finalized = false)) Bits = [2, 256) - SB(PreferenceStrength = 1, SF(Confidence = 1, Finalized = false)) Bits = [2, 256) - SB(PreferenceStrength = 0, SF(Confidence = 0, Finalized = false)) Bits = [1, 256)` + expected := `SB(Preference = 0, PreferenceStrength[0] = 1, PreferenceStrength[1] = 0, SF(Confidence = [1], Finalized = false, SL(Preference = 0))) Bit = 0 + SB(Preference = 1, PreferenceStrength[0] = 0, PreferenceStrength[1] = 1, SF(Confidence = [1], Finalized = false, SL(Preference = 1))) Bit = 1 + SB(PreferenceStrength = 0, SF(Confidence = [0], Finalized = false)) Bits = [2, 256) + SB(PreferenceStrength = 1, SF(Confidence = [1], Finalized = false)) Bits = [2, 256) + SB(PreferenceStrength = 0, SF(Confidence = [0], Finalized = false)) Bits = [1, 256)` require.Equal(expected, tree.String()) require.Equal(c0100, tree.Preference()) require.False(tree.Finalized()) @@ -654,11 +654,11 @@ func TestSnowballResetSibling(t *testing.T) { require.True(tree.RecordPoll(c1000Bag)) { - expected := `SB(Preference = 0, PreferenceStrength[0] = 1, PreferenceStrength[1] = 1, SF(Confidence = 1, Finalized = false, SL(Preference = 1))) Bit = 0 - SB(Preference = 1, PreferenceStrength[0] = 0, PreferenceStrength[1] = 1, SF(Confidence = 1, Finalized = false, SL(Preference = 1))) Bit = 1 - SB(PreferenceStrength = 0, SF(Confidence = 0, Finalized = false)) Bits = [2, 256) - SB(PreferenceStrength = 1, SF(Confidence = 1, Finalized = false)) Bits = [2, 256) - SB(PreferenceStrength = 1, SF(Confidence = 1, Finalized = false)) Bits = [1, 256)` + expected := `SB(Preference = 0, PreferenceStrength[0] = 1, PreferenceStrength[1] = 1, SF(Confidence = [1], Finalized = false, SL(Preference = 1))) Bit = 0 + SB(Preference = 1, PreferenceStrength[0] = 0, PreferenceStrength[1] = 1, SF(Confidence = [1], Finalized = false, SL(Preference = 1))) Bit = 1 + SB(PreferenceStrength = 0, SF(Confidence = [0], Finalized = false)) Bits = [2, 256) + SB(PreferenceStrength = 1, SF(Confidence = [1], Finalized = false)) Bits = [2, 256) + SB(PreferenceStrength = 1, SF(Confidence = [1], Finalized = false)) Bits = [1, 256)` require.Equal(expected, tree.String()) require.Equal(c0100, tree.Preference()) require.False(tree.Finalized()) @@ -667,11 +667,11 @@ func TestSnowballResetSibling(t *testing.T) { require.True(tree.RecordPoll(c0100Bag)) { - expected := `SB(Preference = 0, PreferenceStrength[0] = 2, PreferenceStrength[1] = 1, SF(Confidence = 1, Finalized = false, SL(Preference = 0))) Bit = 0 - SB(Preference = 1, PreferenceStrength[0] = 0, PreferenceStrength[1] = 2, SF(Confidence = 1, Finalized = false, SL(Preference = 1))) Bit = 1 - SB(PreferenceStrength = 0, SF(Confidence = 0, Finalized = false)) Bits = [2, 256) - SB(PreferenceStrength = 2, SF(Confidence = 1, Finalized = false)) Bits = [2, 256) - SB(PreferenceStrength = 1, SF(Confidence = 1, Finalized = false)) Bits = [1, 256)` + expected := `SB(Preference = 0, PreferenceStrength[0] = 2, PreferenceStrength[1] = 1, SF(Confidence = [1], Finalized = false, SL(Preference = 0))) Bit = 0 + SB(Preference = 1, PreferenceStrength[0] = 0, PreferenceStrength[1] = 2, SF(Confidence = [1], Finalized = false, SL(Preference = 1))) Bit = 1 + SB(PreferenceStrength = 0, SF(Confidence = [0], Finalized = false)) Bits = [2, 256) + SB(PreferenceStrength = 2, SF(Confidence = [1], Finalized = false)) Bits = [2, 256) + SB(PreferenceStrength = 1, SF(Confidence = [1], Finalized = false)) Bits = [1, 256)` require.Equal(expected, tree.String()) require.Equal(c0100, tree.Preference()) require.False(tree.Finalized()) @@ -736,9 +736,9 @@ func TestSnowballFineGrained(t *testing.T) { tree.Add(c1100) { - expected := `SB(Preference = 0, PreferenceStrength[0] = 0, PreferenceStrength[1] = 0, SF(Confidence = 0, Finalized = false, SL(Preference = 0))) Bit = 0 - SB(PreferenceStrength = 0, SF(Confidence = 0, Finalized = false)) Bits = [1, 256) - SB(PreferenceStrength = 0, SF(Confidence = 0, Finalized = false)) Bits = [1, 256)` + expected := `SB(Preference = 0, PreferenceStrength[0] = 0, PreferenceStrength[1] = 0, SF(Confidence = [0], Finalized = false, SL(Preference = 0))) Bit = 0 + SB(PreferenceStrength = 0, SF(Confidence = [0], Finalized = false)) Bits = [1, 256) + SB(PreferenceStrength = 0, SF(Confidence = [0], Finalized = false)) Bits = [1, 256)` require.Equal(expected, tree.String()) require.Equal(c0000, tree.Preference()) require.False(tree.Finalized()) @@ -747,11 +747,11 @@ func TestSnowballFineGrained(t *testing.T) { tree.Add(c1000) { - expected := `SB(Preference = 0, PreferenceStrength[0] = 0, PreferenceStrength[1] = 0, SF(Confidence = 0, Finalized = false, SL(Preference = 0))) Bit = 0 - SB(PreferenceStrength = 0, SF(Confidence = 0, Finalized = false)) Bits = [1, 256) - SB(Preference = 1, PreferenceStrength[0] = 0, PreferenceStrength[1] = 0, SF(Confidence = 0, Finalized = false, SL(Preference = 1))) Bit = 1 - SB(PreferenceStrength = 0, SF(Confidence = 0, Finalized = false)) Bits = [2, 256) - SB(PreferenceStrength = 0, SF(Confidence = 0, Finalized = false)) Bits = [2, 256)` + expected := `SB(Preference = 0, PreferenceStrength[0] = 0, PreferenceStrength[1] = 0, SF(Confidence = [0], Finalized = false, SL(Preference = 0))) Bit = 0 + SB(PreferenceStrength = 0, SF(Confidence = [0], Finalized = false)) Bits = [1, 256) + SB(Preference = 1, PreferenceStrength[0] = 0, PreferenceStrength[1] = 0, SF(Confidence = [0], Finalized = false, SL(Preference = 1))) Bit = 1 + SB(PreferenceStrength = 0, SF(Confidence = [0], Finalized = false)) Bits = [2, 256) + SB(PreferenceStrength = 0, SF(Confidence = [0], Finalized = false)) Bits = [2, 256)` require.Equal(expected, tree.String()) require.Equal(c0000, tree.Preference()) require.False(tree.Finalized()) @@ -760,14 +760,14 @@ func TestSnowballFineGrained(t *testing.T) { tree.Add(c0010) { - expected := `SB(Preference = 0, PreferenceStrength[0] = 0, PreferenceStrength[1] = 0, SF(Confidence = 0, Finalized = false, SL(Preference = 0))) Bit = 0 - SB(PreferenceStrength = 0, SF(Confidence = 0, Finalized = false)) Bits = [1, 2) - SB(Preference = 0, PreferenceStrength[0] = 0, PreferenceStrength[1] = 0, SF(Confidence = 0, Finalized = false, SL(Preference = 0))) Bit = 2 - SB(PreferenceStrength = 0, SF(Confidence = 0, Finalized = false)) Bits = [3, 256) - SB(PreferenceStrength = 0, SF(Confidence = 0, Finalized = false)) Bits = [3, 256) - SB(Preference = 1, PreferenceStrength[0] = 0, PreferenceStrength[1] = 0, SF(Confidence = 0, Finalized = false, SL(Preference = 1))) Bit = 1 - SB(PreferenceStrength = 0, SF(Confidence = 0, Finalized = false)) Bits = [2, 256) - SB(PreferenceStrength = 0, SF(Confidence = 0, Finalized = false)) Bits = [2, 256)` + expected := `SB(Preference = 0, PreferenceStrength[0] = 0, PreferenceStrength[1] = 0, SF(Confidence = [0], Finalized = false, SL(Preference = 0))) Bit = 0 + SB(PreferenceStrength = 0, SF(Confidence = [0], Finalized = false)) Bits = [1, 2) + SB(Preference = 0, PreferenceStrength[0] = 0, PreferenceStrength[1] = 0, SF(Confidence = [0], Finalized = false, SL(Preference = 0))) Bit = 2 + SB(PreferenceStrength = 0, SF(Confidence = [0], Finalized = false)) Bits = [3, 256) + SB(PreferenceStrength = 0, SF(Confidence = [0], Finalized = false)) Bits = [3, 256) + SB(Preference = 1, PreferenceStrength[0] = 0, PreferenceStrength[1] = 0, SF(Confidence = [0], Finalized = false, SL(Preference = 1))) Bit = 1 + SB(PreferenceStrength = 0, SF(Confidence = [0], Finalized = false)) Bits = [2, 256) + SB(PreferenceStrength = 0, SF(Confidence = [0], Finalized = false)) Bits = [2, 256)` require.Equal(expected, tree.String()) require.Equal(c0000, tree.Preference()) require.False(tree.Finalized()) @@ -777,14 +777,14 @@ func TestSnowballFineGrained(t *testing.T) { require.True(tree.RecordPoll(c0000Bag)) { - expected := `SB(Preference = 0, PreferenceStrength[0] = 1, PreferenceStrength[1] = 0, SF(Confidence = 1, Finalized = false, SL(Preference = 0))) Bit = 0 - SB(PreferenceStrength = 1, SF(Confidence = 1, Finalized = false)) Bits = [1, 2) - SB(Preference = 0, PreferenceStrength[0] = 1, PreferenceStrength[1] = 0, SF(Confidence = 1, Finalized = false, SL(Preference = 0))) Bit = 2 - SB(PreferenceStrength = 1, SF(Confidence = 1, Finalized = false)) Bits = [3, 256) - SB(PreferenceStrength = 0, SF(Confidence = 0, Finalized = false)) Bits = [3, 256) - SB(Preference = 1, PreferenceStrength[0] = 0, PreferenceStrength[1] = 0, SF(Confidence = 0, Finalized = false, SL(Preference = 1))) Bit = 1 - SB(PreferenceStrength = 0, SF(Confidence = 0, Finalized = false)) Bits = [2, 256) - SB(PreferenceStrength = 0, SF(Confidence = 0, Finalized = false)) Bits = [2, 256)` + expected := `SB(Preference = 0, PreferenceStrength[0] = 1, PreferenceStrength[1] = 0, SF(Confidence = [1], Finalized = false, SL(Preference = 0))) Bit = 0 + SB(PreferenceStrength = 1, SF(Confidence = [1], Finalized = false)) Bits = [1, 2) + SB(Preference = 0, PreferenceStrength[0] = 1, PreferenceStrength[1] = 0, SF(Confidence = [1], Finalized = false, SL(Preference = 0))) Bit = 2 + SB(PreferenceStrength = 1, SF(Confidence = [1], Finalized = false)) Bits = [3, 256) + SB(PreferenceStrength = 0, SF(Confidence = [0], Finalized = false)) Bits = [3, 256) + SB(Preference = 1, PreferenceStrength[0] = 0, PreferenceStrength[1] = 0, SF(Confidence = [0], Finalized = false, SL(Preference = 1))) Bit = 1 + SB(PreferenceStrength = 0, SF(Confidence = [0], Finalized = false)) Bits = [2, 256) + SB(PreferenceStrength = 0, SF(Confidence = [0], Finalized = false)) Bits = [2, 256)` require.Equal(expected, tree.String()) require.Equal(c0000, tree.Preference()) require.False(tree.Finalized()) @@ -794,9 +794,9 @@ func TestSnowballFineGrained(t *testing.T) { require.True(tree.RecordPoll(c0010Bag)) { - expected := `SB(Preference = 0, PreferenceStrength[0] = 1, PreferenceStrength[1] = 1, SF(Confidence = 1, Finalized = false, SL(Preference = 1))) Bit = 2 - SB(PreferenceStrength = 1, SF(Confidence = 1, Finalized = false)) Bits = [3, 256) - SB(PreferenceStrength = 1, SF(Confidence = 1, Finalized = false)) Bits = [3, 256)` + expected := `SB(Preference = 0, PreferenceStrength[0] = 1, PreferenceStrength[1] = 1, SF(Confidence = [1], Finalized = false, SL(Preference = 1))) Bit = 2 + SB(PreferenceStrength = 1, SF(Confidence = [1], Finalized = false)) Bits = [3, 256) + SB(PreferenceStrength = 1, SF(Confidence = [1], Finalized = false)) Bits = [3, 256)` require.Equal(expected, tree.String()) require.Equal(c0000, tree.Preference()) require.False(tree.Finalized()) @@ -804,7 +804,7 @@ func TestSnowballFineGrained(t *testing.T) { require.True(tree.RecordPoll(c0010Bag)) { - expected := "SB(PreferenceStrength = 2, SF(Confidence = 2, Finalized = true)) Bits = [3, 256)" + expected := "SB(PreferenceStrength = 2, SF(Confidence = [2], Finalized = true)) Bits = [3, 256)" require.Equal(expected, tree.String()) require.Equal(c0010, tree.Preference()) require.True(tree.Finalized()) @@ -881,9 +881,9 @@ func TestSnowballFilterBinaryChildren(t *testing.T) { tree.Add(c1000) { - expected := `SB(Preference = 0, PreferenceStrength[0] = 0, PreferenceStrength[1] = 0, SF(Confidence = 0, Finalized = false, SL(Preference = 0))) Bit = 0 - SB(PreferenceStrength = 0, SF(Confidence = 0, Finalized = false)) Bits = [1, 256) - SB(PreferenceStrength = 0, SF(Confidence = 0, Finalized = false)) Bits = [1, 256)` + expected := `SB(Preference = 0, PreferenceStrength[0] = 0, PreferenceStrength[1] = 0, SF(Confidence = [0], Finalized = false, SL(Preference = 0))) Bit = 0 + SB(PreferenceStrength = 0, SF(Confidence = [0], Finalized = false)) Bits = [1, 256) + SB(PreferenceStrength = 0, SF(Confidence = [0], Finalized = false)) Bits = [1, 256)` require.Equal(expected, tree.String()) require.Equal(c0000, tree.Preference()) require.False(tree.Finalized()) @@ -892,12 +892,12 @@ func TestSnowballFilterBinaryChildren(t *testing.T) { tree.Add(c0010) { - expected := `SB(Preference = 0, PreferenceStrength[0] = 0, PreferenceStrength[1] = 0, SF(Confidence = 0, Finalized = false, SL(Preference = 0))) Bit = 0 - SB(PreferenceStrength = 0, SF(Confidence = 0, Finalized = false)) Bits = [1, 2) - SB(Preference = 0, PreferenceStrength[0] = 0, PreferenceStrength[1] = 0, SF(Confidence = 0, Finalized = false, SL(Preference = 0))) Bit = 2 - SB(PreferenceStrength = 0, SF(Confidence = 0, Finalized = false)) Bits = [3, 256) - SB(PreferenceStrength = 0, SF(Confidence = 0, Finalized = false)) Bits = [3, 256) - SB(PreferenceStrength = 0, SF(Confidence = 0, Finalized = false)) Bits = [1, 256)` + expected := `SB(Preference = 0, PreferenceStrength[0] = 0, PreferenceStrength[1] = 0, SF(Confidence = [0], Finalized = false, SL(Preference = 0))) Bit = 0 + SB(PreferenceStrength = 0, SF(Confidence = [0], Finalized = false)) Bits = [1, 2) + SB(Preference = 0, PreferenceStrength[0] = 0, PreferenceStrength[1] = 0, SF(Confidence = [0], Finalized = false, SL(Preference = 0))) Bit = 2 + SB(PreferenceStrength = 0, SF(Confidence = [0], Finalized = false)) Bits = [3, 256) + SB(PreferenceStrength = 0, SF(Confidence = [0], Finalized = false)) Bits = [3, 256) + SB(PreferenceStrength = 0, SF(Confidence = [0], Finalized = false)) Bits = [1, 256)` require.Equal(expected, tree.String()) require.Equal(c0000, tree.Preference()) require.False(tree.Finalized()) @@ -907,12 +907,12 @@ func TestSnowballFilterBinaryChildren(t *testing.T) { require.True(tree.RecordPoll(c0000Bag)) { - expected := `SB(Preference = 0, PreferenceStrength[0] = 1, PreferenceStrength[1] = 0, SF(Confidence = 1, Finalized = false, SL(Preference = 0))) Bit = 0 - SB(PreferenceStrength = 1, SF(Confidence = 1, Finalized = false)) Bits = [1, 2) - SB(Preference = 0, PreferenceStrength[0] = 1, PreferenceStrength[1] = 0, SF(Confidence = 1, Finalized = false, SL(Preference = 0))) Bit = 2 - SB(PreferenceStrength = 1, SF(Confidence = 1, Finalized = false)) Bits = [3, 256) - SB(PreferenceStrength = 0, SF(Confidence = 0, Finalized = false)) Bits = [3, 256) - SB(PreferenceStrength = 0, SF(Confidence = 0, Finalized = false)) Bits = [1, 256)` + expected := `SB(Preference = 0, PreferenceStrength[0] = 1, PreferenceStrength[1] = 0, SF(Confidence = [1], Finalized = false, SL(Preference = 0))) Bit = 0 + SB(PreferenceStrength = 1, SF(Confidence = [1], Finalized = false)) Bits = [1, 2) + SB(Preference = 0, PreferenceStrength[0] = 1, PreferenceStrength[1] = 0, SF(Confidence = [1], Finalized = false, SL(Preference = 0))) Bit = 2 + SB(PreferenceStrength = 1, SF(Confidence = [1], Finalized = false)) Bits = [3, 256) + SB(PreferenceStrength = 0, SF(Confidence = [0], Finalized = false)) Bits = [3, 256) + SB(PreferenceStrength = 0, SF(Confidence = [0], Finalized = false)) Bits = [1, 256)` require.Equal(expected, tree.String()) require.Equal(c0000, tree.Preference()) require.False(tree.Finalized()) @@ -921,13 +921,13 @@ func TestSnowballFilterBinaryChildren(t *testing.T) { tree.Add(c0100) { - expected := `SB(Preference = 0, PreferenceStrength[0] = 1, PreferenceStrength[1] = 0, SF(Confidence = 1, Finalized = false, SL(Preference = 0))) Bit = 0 - SB(Preference = 0, PreferenceStrength[0] = 1, PreferenceStrength[1] = 0, SF(Confidence = 1, Finalized = false, SL(Preference = 0))) Bit = 1 - SB(Preference = 0, PreferenceStrength[0] = 1, PreferenceStrength[1] = 0, SF(Confidence = 1, Finalized = false, SL(Preference = 0))) Bit = 2 - SB(PreferenceStrength = 1, SF(Confidence = 1, Finalized = false)) Bits = [3, 256) - SB(PreferenceStrength = 0, SF(Confidence = 0, Finalized = false)) Bits = [3, 256) - SB(PreferenceStrength = 0, SF(Confidence = 0, Finalized = false)) Bits = [2, 256) - SB(PreferenceStrength = 0, SF(Confidence = 0, Finalized = false)) Bits = [1, 256)` + expected := `SB(Preference = 0, PreferenceStrength[0] = 1, PreferenceStrength[1] = 0, SF(Confidence = [1], Finalized = false, SL(Preference = 0))) Bit = 0 + SB(Preference = 0, PreferenceStrength[0] = 1, PreferenceStrength[1] = 0, SF(Confidence = [1], Finalized = false, SL(Preference = 0))) Bit = 1 + SB(Preference = 0, PreferenceStrength[0] = 1, PreferenceStrength[1] = 0, SF(Confidence = [1], Finalized = false, SL(Preference = 0))) Bit = 2 + SB(PreferenceStrength = 1, SF(Confidence = [1], Finalized = false)) Bits = [3, 256) + SB(PreferenceStrength = 0, SF(Confidence = [0], Finalized = false)) Bits = [3, 256) + SB(PreferenceStrength = 0, SF(Confidence = [0], Finalized = false)) Bits = [2, 256) + SB(PreferenceStrength = 0, SF(Confidence = [0], Finalized = false)) Bits = [1, 256)` require.Equal(expected, tree.String()) require.Equal(c0000, tree.Preference()) require.False(tree.Finalized()) @@ -937,11 +937,11 @@ func TestSnowballFilterBinaryChildren(t *testing.T) { require.True(tree.RecordPoll(c0100Bag)) { - expected := `SB(Preference = 0, PreferenceStrength[0] = 1, PreferenceStrength[1] = 1, SF(Confidence = 1, Finalized = false, SL(Preference = 1))) Bit = 1 - SB(Preference = 0, PreferenceStrength[0] = 1, PreferenceStrength[1] = 0, SF(Confidence = 1, Finalized = false, SL(Preference = 0))) Bit = 2 - SB(PreferenceStrength = 1, SF(Confidence = 1, Finalized = false)) Bits = [3, 256) - SB(PreferenceStrength = 0, SF(Confidence = 0, Finalized = false)) Bits = [3, 256) - SB(PreferenceStrength = 1, SF(Confidence = 1, Finalized = false)) Bits = [2, 256)` + expected := `SB(Preference = 0, PreferenceStrength[0] = 1, PreferenceStrength[1] = 1, SF(Confidence = [1], Finalized = false, SL(Preference = 1))) Bit = 1 + SB(Preference = 0, PreferenceStrength[0] = 1, PreferenceStrength[1] = 0, SF(Confidence = [1], Finalized = false, SL(Preference = 0))) Bit = 2 + SB(PreferenceStrength = 1, SF(Confidence = [1], Finalized = false)) Bits = [3, 256) + SB(PreferenceStrength = 0, SF(Confidence = [0], Finalized = false)) Bits = [3, 256) + SB(PreferenceStrength = 1, SF(Confidence = [1], Finalized = false)) Bits = [2, 256)` require.Equal(expected, tree.String()) require.Equal(c0000, tree.Preference()) require.False(tree.Finalized()) diff --git a/snow/consensus/snowball/unary_snowball.go b/snow/consensus/snowball/unary_snowball.go index 24ed78cee43b..c67180f4c384 100644 --- a/snow/consensus/snowball/unary_snowball.go +++ b/snow/consensus/snowball/unary_snowball.go @@ -10,9 +10,9 @@ import ( var _ Unary = (*unarySnowball)(nil) -func newUnarySnowball(alphaPreference, alphaConfidence, beta int) unarySnowball { +func newUnarySnowball(alphaPreference int, terminationConditions []terminationCondition) unarySnowball { return unarySnowball{ - unarySnowflake: newUnarySnowflake(alphaPreference, alphaConfidence, beta), + unarySnowflake: newUnarySnowflake(alphaPreference, terminationConditions), } } diff --git a/snow/consensus/snowball/unary_snowball_test.go b/snow/consensus/snowball/unary_snowball_test.go index 4bea0458d95f..007d2ab53090 100644 --- a/snow/consensus/snowball/unary_snowball_test.go +++ b/snow/consensus/snowball/unary_snowball_test.go @@ -22,8 +22,9 @@ func TestUnarySnowball(t *testing.T) { alphaPreference, alphaConfidence := 1, 2 beta := 2 + terminationConditions := newSingleTerminationCondition(alphaConfidence, beta) - sb := newUnarySnowball(alphaPreference, alphaConfidence, beta) + sb := newUnarySnowball(alphaPreference, terminationConditions) sb.RecordPoll(alphaConfidence) UnarySnowballStateTest(t, &sb, 1, []int{1}, false) @@ -48,7 +49,7 @@ func TestUnarySnowball(t *testing.T) { binarySnowball := sbClone.Extend(0) - expected := "SB(Preference = 0, PreferenceStrength[0] = 4, PreferenceStrength[1] = 0, SF(Confidence = 1, Finalized = false, SL(Preference = 0)))" + expected := "SB(Preference = 0, PreferenceStrength[0] = 4, PreferenceStrength[1] = 0, SF(Confidence = [1], Finalized = false, SL(Preference = 0)))" require.Equal(expected, binarySnowball.String()) binarySnowball.RecordUnsuccessfulPoll() @@ -70,6 +71,6 @@ func TestUnarySnowball(t *testing.T) { require.Equal(1, binarySnowball.Preference()) require.True(binarySnowball.Finalized()) - expected = "SB(PreferenceStrength = 4, SF(Confidence = 1, Finalized = false))" + expected = "SB(PreferenceStrength = 4, SF(Confidence = [1], Finalized = false))" require.Equal(expected, sb.String()) } diff --git a/snow/consensus/snowball/unary_snowflake.go b/snow/consensus/snowball/unary_snowflake.go index 3e21316dc370..a49152966d9a 100644 --- a/snow/consensus/snowball/unary_snowflake.go +++ b/snow/consensus/snowball/unary_snowflake.go @@ -10,16 +10,11 @@ import ( var _ Unary = (*unarySnowflake)(nil) -func newUnarySnowflake(alphaPreference, alphaConfidence, beta int) unarySnowflake { +func newUnarySnowflake(alphaPreference int, terminationConditions []terminationCondition) unarySnowflake { return unarySnowflake{ - alphaPreference: alphaPreference, - terminationConditions: []terminationCondition{ - { - alphaConfidence: alphaConfidence, - beta: beta, - }, - }, - confidence: make([]int, 1), + alphaPreference: alphaPreference, + terminationConditions: terminationConditions, + confidence: make([]int, len(terminationConditions)), } } @@ -93,7 +88,7 @@ func (sf *unarySnowflake) Clone() Unary { } func (sf *unarySnowflake) String() string { - return fmt.Sprintf("SF(Confidence = %d, Finalized = %v)", - sf.confidence[0], + return fmt.Sprintf("SF(Confidence = %v, Finalized = %v)", + sf.confidence, sf.finalized) } diff --git a/snow/consensus/snowball/unary_snowflake_test.go b/snow/consensus/snowball/unary_snowflake_test.go index 0c6282060b42..ee099460e52b 100644 --- a/snow/consensus/snowball/unary_snowflake_test.go +++ b/snow/consensus/snowball/unary_snowflake_test.go @@ -9,10 +9,10 @@ import ( "github.com/stretchr/testify/require" ) -func UnarySnowflakeStateTest(t *testing.T, sf *unarySnowflake, expectedConfidence []int, expectedFinalized bool) { +func UnarySnowflakeStateTest(t *testing.T, sf *unarySnowflake, expectedConfidences []int, expectedFinalized bool) { require := require.New(t) - require.Equal(expectedConfidence, sf.confidence) + require.Equal(expectedConfidences, sf.confidence) require.Equal(expectedFinalized, sf.Finalized()) } @@ -21,8 +21,9 @@ func TestUnarySnowflake(t *testing.T) { alphaPreference, alphaConfidence := 1, 2 beta := 2 + terminationConditions := newSingleTerminationCondition(alphaConfidence, beta) - sf := newUnarySnowflake(alphaPreference, alphaConfidence, beta) + sf := newUnarySnowflake(alphaPreference, terminationConditions) sf.RecordPoll(alphaConfidence) UnarySnowflakeStateTest(t, &sf, []int{1}, false) @@ -61,3 +62,35 @@ func TestUnarySnowflake(t *testing.T) { sf.RecordPoll(alphaConfidence) UnarySnowflakeStateTest(t, &sf, []int{1}, true) } + +type unarySnowflakeTest struct { + require *require.Assertions + + unarySnowflake +} + +func newUnarySnowflakeTest(t *testing.T, alphaPreference int, terminationConditions []terminationCondition) snowflakeTest[struct{}] { + require := require.New(t) + + return &unarySnowflakeTest{ + require: require, + unarySnowflake: newUnarySnowflake(alphaPreference, terminationConditions), + } +} + +func (sf *unarySnowflakeTest) RecordPoll(count int, _ struct{}) { + sf.unarySnowflake.RecordPoll(count) +} + +func (sf *unarySnowflakeTest) AssertEqual(expectedConfidences []int, expectedFinalized bool, _ struct{}) { + sf.require.Equal(expectedConfidences, sf.unarySnowflake.confidence) + sf.require.Equal(expectedFinalized, sf.Finalized()) +} + +func TestUnarySnowflakeErrorDriven(t *testing.T) { + for _, test := range getErrorDrivenSnowflakeSingleChoiceSuite[struct{}]() { + t.Run(test.name, func(t *testing.T) { + test.f(t, newUnarySnowflakeTest, struct{}{}) + }) + } +} From d3a37392cbc0c498f5c484af7db8ea8dad201c93 Mon Sep 17 00:00:00 2001 From: marun Date: Wed, 12 Jun 2024 23:23:52 +0200 Subject: [PATCH 3/3] [antithesis] Add ci jobs to trigger test runs (#3076) --- .../workflows/publish_antithesis_images.yml | 10 +++- .github/workflows/trigger-antithesis-runs.yml | 53 +++++++++++++++++++ tests/antithesis/README.md | 28 ++++++++++ 3 files changed, 89 insertions(+), 2 deletions(-) create mode 100644 .github/workflows/trigger-antithesis-runs.yml diff --git a/.github/workflows/publish_antithesis_images.yml b/.github/workflows/publish_antithesis_images.yml index 35e77218fdb6..32ecc3ae4c36 100644 --- a/.github/workflows/publish_antithesis_images.yml +++ b/.github/workflows/publish_antithesis_images.yml @@ -2,6 +2,12 @@ name: Publish Antithesis Images on: workflow_dispatch: + inputs: + image_tag: + description: 'The tag to apply to published images' + default: latest + required: true + type: string push: branches: - master @@ -29,12 +35,12 @@ jobs: run: bash -x ./scripts/build_antithesis_images.sh env: IMAGE_PREFIX: ${{ env.REGISTRY }}/${{ env.REPOSITORY }} - TAG: latest + TAG: ${{ github.events.inputs.image_tag || latest }} TEST_SETUP: avalanchego - name: Build and push images for xsvm test setup run: bash -x ./scripts/build_antithesis_images.sh env: IMAGE_PREFIX: ${{ env.REGISTRY }}/${{ env.REPOSITORY }} - TAG: latest + TAG: ${{ github.events.inputs.image_tag || latest }} TEST_SETUP: xsvm diff --git a/.github/workflows/trigger-antithesis-runs.yml b/.github/workflows/trigger-antithesis-runs.yml new file mode 100644 index 000000000000..0521b0770d79 --- /dev/null +++ b/.github/workflows/trigger-antithesis-runs.yml @@ -0,0 +1,53 @@ +name: Trigger Antithesis Test Runs + +on: + # TODO(marun) Add a schedule to execute regularly + workflow_dispatch: + inputs: + duration: + description: 'The duration to run the test for' + default: '0.5' + required: true + type: string + recipients: + description: 'Email recipients to send the test report to' + default: ${{ secrets.ANTITHESIS_RECIPIENTS }} + required: true + type: string + image_tag: + description: 'The image tag to target' + default: latest + required: true + type: string + +jobs: + Run Antithesis Avalanchego Test Setup: + runs-on: ubuntu-latest + steps: + - uses: antithesishq/antithesis-trigger-action@v0.5 + with: + notebook_name: avalanche + tenant: avalanche + username: ${{ secrets.ANTITHESIS_USERNAME }} + password: ${{ secrets.ANTITHESIS_PASSWORD }} + github_token: ${{ secrets.ANTITHESIS_GH_PAT }} + config_image: antithesis-avalanchego-config@${{ github.events.inputs.image_tag }} + images: antithesis-avalanchego-workload@${{ github.events.inputs.image_tag }};antithesis-avalanchego-node@${{ github.events.inputs.image_tag }} + email_recipients: ${{ github.events.inputs.recipients }} + additional_parameters: |- + custom.duration=${{ github.events.inputs.duration }} + Run Antithesis XSVM Test Setup: + runs-on: ubuntu-latest + steps: + - uses: antithesishq/antithesis-trigger-action@v0.5 + with: + notebook_name: avalanche + tenant: avalanche + username: ${{ secrets.ANTITHESIS_USERNAME }} + password: ${{ secrets.ANTITHESIS_PASSWORD }} + github_token: ${{ secrets.ANTITHESIS_GH_PAT }} + config_image: antithesis-xsvm-config@${{ github.events.inputs.image_tag }} + images: antithesis-xsvm-workload@${{ github.events.inputs.image_tag }};antithesis-xsvm-node@${{ github.events.inputs.image_tag }} + email_recipients: ${{ github.events.inputs.recipients }} + additional_parameters: |- + custom.duration=${{ github.events.inputs.duration }} diff --git a/tests/antithesis/README.md b/tests/antithesis/README.md index 3acb7746104a..1fd22370e655 100644 --- a/tests/antithesis/README.md +++ b/tests/antithesis/README.md @@ -115,3 +115,31 @@ $ docker-compose up # Cleanup the compose project $ docker-compose down --volumes ``` + +## Manually triggering an Antithesis test run + +When making changes to a test setup, it may be useful to manually +trigger an Antithesis test run outside of the normal schedule. This +can be performed against master or an arbitrary branch: + + - Navigate to the ['Actions' tab of the avalanchego + repo](https://github.com/ava-labs/avalanchego/actions). + - Select the [Publish Antithesis + Images](https://github.com/ava-labs/avalanchego/actions/workflows/publish_antithesis_images.yml) + workflow on the left. + - Find the 'Run workflow' drop-down on the right and trigger the + workflow against the desired branch. The default value for + `image_tag` (`latest`) is used by scheduled test runs, so consider + supplying a different value to avoid interferring with the results + of the scheduled runs. + - Wait for the publication job to complete successfully so that the + images are available to be tested against. + - Select the [Trigger Antithesis Test Runs](https://github.com/ava-labs/avalanchego/actions/workflows/trigger-antithesis-runs.yml) + workflow on the left. + - Find the 'Run workflow' drop-down on the right and trigger the + workflow against the desired branch. The branch only determines the + CI configuration (the images have already been built), so master is + probably fine. Make sure to supply the same `image_tag` that was + provided to the publishing workflow and consider setting + `recipients` to your own email rather than sending the test report + to everyone on the regular distribution list.