From 7c74e5f46ea7794e94218cf137cb87d97e795e8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Duchesneau?= Date: Thu, 19 Sep 2024 09:58:55 -0400 Subject: [PATCH] add another test, bump changelog --- docs/release-notes/change-log.md | 4 +-- test/integration_test.go | 25 +++++++++++------ test/runnable_test.go | 26 +++++++++++++++++- .../complex-substreams-v0.1.0.spkg | Bin 246159 -> 247980 bytes test/testdata/complex_substreams/src/lib.rs | 23 ++++++++++++++-- 5 files changed, 64 insertions(+), 14 deletions(-) diff --git a/docs/release-notes/change-log.md b/docs/release-notes/change-log.md index ecdd3eb3..cf11f6f8 100644 --- a/docs/release-notes/change-log.md +++ b/docs/release-notes/change-log.md @@ -9,9 +9,9 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## Unreleased +## v1.10.5 -* Fixed an(other) issue where multiple stores running on the same stage with different initialBlocks will fail to proress +* Fixed an(other) issue where multiple stores running on the same stage with different initialBlocks will fail to proress (and hang) ## v1.10.4 diff --git a/test/integration_test.go b/test/integration_test.go index 5ff8175f..dd734fc5 100644 --- a/test/integration_test.go +++ b/test/integration_test.go @@ -356,7 +356,7 @@ func TestOneStoreOneMap(t *testing.T) { } require.NoError(t, err) - mapOutput := run.MapOutput("assert_test_store_add_i64") + mapOutput := run.MapOutputString("assert_test_store_add_i64") assert.Contains(t, mapOutput, `assert_test_store_add_i64: 0801`) assert.Equal(t, test.expectedResponseCount, strings.Count(mapOutput, "\n")) @@ -414,16 +414,23 @@ func TestMultipleStoresDifferentStartBlocks(t *testing.T) { func TestMultipleStoresUnalignedStartBlocksDevMode(t *testing.T) { manifest.TestUseSimpleHash = true // dev mode - run2 := newTestRun(t, 23, 999, 30, 0, "multi_store_different_23", "./testdata/complex_substreams/complex-substreams-v0.1.0.spkg") - require.NoError(t, run2.Run(t, "dev_mode")) - fmt.Println(run2.MapOutput("multi_store_different_23")) + run := newTestRun(t, 23, 999, 30, 0, "multi_store_different_23", "./testdata/complex_substreams/complex-substreams-v0.1.0.spkg") + require.NoError(t, run.Run(t, "dev_mode")) + outs := run.MapOutput("multi_store_different_23") + // ensure that the 20->22 block range is processed by the "set_sum_store_init_0" store + assert.Contains(t, string(outs[23]), "store2:sum:276") // 1+2+3+4+5+6+7+8+9+10+11+12+13+14+15+16+17+18+19+20+21+22+23 = 276 + assert.Contains(t, string(outs[24]), "store2:sum:300") // 276+24 ... } func TestMultipleStoresUnalignedStartBlocksProdMode(t *testing.T) { manifest.TestUseSimpleHash = true - run2 := newTestRun(t, 23, 999, 30, 0, "multi_store_different_23", "./testdata/complex_substreams/complex-substreams-v0.1.0.spkg") - run2.ProductionMode = true - require.NoError(t, run2.Run(t, "prod_mode")) - fmt.Println(run2.MapOutput("multi_store_different_23")) + run := newTestRun(t, 23, 999, 30, 0, "multi_store_different_23", "./testdata/complex_substreams/complex-substreams-v0.1.0.spkg") + run.ProductionMode = true + require.NoError(t, run.Run(t, "prod_mode")) + + outs := run.MapOutput("multi_store_different_23") + // ensure that the 20->22 block range is processed by the "set_sum_store_init_0" store + assert.Contains(t, string(outs[23]), "store2:sum:276") // 1+2+3+4+5+6+7+8+9+10+11+12+13+14+15+16+17+18+19+20+21+22+23 = 276 + assert.Contains(t, string(outs[24]), "store2:sum:300") // 276+24 ... } func TestStoreDeletePrefix(t *testing.T) { @@ -477,7 +484,7 @@ func Test_WASMBindgenShims(t *testing.T) { require.NoError(t, run.Run(t, "test_wasmbindgenshims")) - mapOutput := run.MapOutput("map_block") + mapOutput := run.MapOutputString("map_block") fmt.Println(mapOutput) } diff --git a/test/runnable_test.go b/test/runnable_test.go index 7badc45d..67b169b2 100644 --- a/test/runnable_test.go +++ b/test/runnable_test.go @@ -179,7 +179,31 @@ func (f *testRun) Logs() (out []string) { return } -func (f *testRun) MapOutput(modName string) string { +func (f *testRun) MapOutput(modName string) map[uint64][]byte { + + moduleOutputs := make(map[uint64][]byte) + for _, response := range f.Responses { + switch r := response.Message.(type) { + case *pbsubstreamsrpc.Response_BlockScopedData: + for _, output := range r.BlockScopedData.AllModuleOutputs() { + if output.Name() != modName { + continue + } + if !output.IsMap() { + continue + } + mapout := output.MapOutput.GetMapOutput() + if mapout == nil { + continue + } + moduleOutputs[r.BlockScopedData.Clock.Number] = mapout.Value + } + } + } + return moduleOutputs +} + +func (f *testRun) MapOutputString(modName string) string { var moduleOutputs []string for _, response := range f.Responses { switch r := response.Message.(type) { diff --git a/test/testdata/complex_substreams/complex-substreams-v0.1.0.spkg b/test/testdata/complex_substreams/complex-substreams-v0.1.0.spkg index e3bc2e1fc0f9c6f8b1d45dc771e598d9ced2cbf2..c974ea7e52bb54c24a86551266a0af02eb1398f2 100644 GIT binary patch delta 32349 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 q, second_store #[substreams::handlers::map] fn multi_store_different_23(first_store: store::Deltas, second_store: store::Deltas) -> Result { + let mut store1_value: i64 = 0; + first_store + .deltas + .iter() + .for_each(|delta| match delta.key.as_str() { + "block_counter" => store1_value = delta.new_value, + x => panic!("unhandled key {}", x), + }); + + let mut store2_value: String = "".to_string(); + second_store + .deltas + .iter() + .for_each(|delta| match delta.key.as_str() { + "sum" => store2_value = delta.new_value.clone(), + x => panic!("unhandled key {}", x), + }); + + Ok(test::Block { - id: "hehehehe".to_string(), - number: 5, + id: "store2:".to_string()+&store2_value.to_string(), + number: store1_value as u64, }) }