From d059981bc47751f7d6fedccadf84d1459273aeef Mon Sep 17 00:00:00 2001 From: Takeshi Yoneda Date: Sun, 9 Jun 2024 08:49:14 -0700 Subject: [PATCH] Fixes flaky TestEngine_sortedCompiledModules (#2241) fixes #2234 Signed-off-by: Takeshi Yoneda --- internal/engine/wazevo/engine_test.go | 109 +++++++++++++------------- 1 file changed, 56 insertions(+), 53 deletions(-) diff --git a/internal/engine/wazevo/engine_test.go b/internal/engine/wazevo/engine_test.go index dbfa310429..f2eb93cb9d 100644 --- a/internal/engine/wazevo/engine_test.go +++ b/internal/engine/wazevo/engine_test.go @@ -4,6 +4,7 @@ import ( "context" "fmt" "reflect" + "sort" "testing" "unsafe" @@ -104,19 +105,6 @@ func TestEngine_CompileModule(t *testing.T) { } func TestEngine_sortedCompiledModules(t *testing.T) { - getCM := func(addr uintptr) *compiledModule { - var buf []byte - { - // TODO: use unsafe.Slice after floor version is set to Go 1.20. - hdr := (*reflect.SliceHeader)(unsafe.Pointer(&buf)) - hdr.Data = addr - hdr.Len = 4 - hdr.Cap = 4 - } - cm := &compiledModule{executables: &executables{executable: buf}} - return cm - } - requireEqualExisting := func(t *testing.T, e *engine, expected []uintptr) { actual := make([]uintptr, 0) for _, cm := range e.sortedCompiledModules { @@ -125,60 +113,75 @@ func TestEngine_sortedCompiledModules(t *testing.T) { require.Equal(t, expected, actual) } - m1 := getCM(1) - m100 := getCM(100) - m5 := getCM(5) - m10 := getCM(10) + var cms []struct { + cm *compiledModule + addr uintptr + } + for i := 0; i < 4; i++ { + cm := &compiledModule{executables: &executables{executable: make([]byte, 100)}} + cms = append(cms, struct { + cm *compiledModule + addr uintptr + }{cm, uintptr(unsafe.Pointer(&cm.executables.executable[0]))}) + } + + sort.Slice(cms, func(i, j int) bool { + return cms[i].addr < cms[j].addr + }) + cm1, addr1 := cms[0].cm, cms[0].addr + cm2, addr2 := cms[1].cm, cms[1].addr + cm3, addr3 := cms[2].cm, cms[2].addr + cm4, addr4 := cms[3].cm, cms[3].addr t.Run("add", func(t *testing.T) { e := &engine{} - e.addCompiledModuleToSortedList(m1) - e.addCompiledModuleToSortedList(m100) - e.addCompiledModuleToSortedList(m5) - e.addCompiledModuleToSortedList(m10) - requireEqualExisting(t, e, []uintptr{1, 5, 10, 100}) + e.addCompiledModuleToSortedList(cm1) + e.addCompiledModuleToSortedList(cm4) + e.addCompiledModuleToSortedList(cm2) + e.addCompiledModuleToSortedList(cm3) + requireEqualExisting(t, e, []uintptr{addr1, addr2, addr3, addr4}) }) t.Run("delete", func(t *testing.T) { e := &engine{} - e.addCompiledModuleToSortedList(m1) - e.addCompiledModuleToSortedList(m100) - e.addCompiledModuleToSortedList(m5) - e.addCompiledModuleToSortedList(m10) - e.deleteCompiledModuleFromSortedList(m100) + e.addCompiledModuleToSortedList(cm1) + e.addCompiledModuleToSortedList(cm4) + e.addCompiledModuleToSortedList(cm2) + e.addCompiledModuleToSortedList(cm3) + e.deleteCompiledModuleFromSortedList(cm4) require.Equal(t, 3, len(e.sortedCompiledModules)) - requireEqualExisting(t, e, []uintptr{1, 5, 10}) - e.deleteCompiledModuleFromSortedList(m1) - requireEqualExisting(t, e, []uintptr{5, 10}) - e.deleteCompiledModuleFromSortedList(m10) - requireEqualExisting(t, e, []uintptr{5}) - e.deleteCompiledModuleFromSortedList(m5) + requireEqualExisting(t, e, []uintptr{addr1, addr2, addr3}) + e.deleteCompiledModuleFromSortedList(cm2) + requireEqualExisting(t, e, []uintptr{addr1, addr3}) + e.deleteCompiledModuleFromSortedList(cm1) + requireEqualExisting(t, e, []uintptr{addr3}) + e.deleteCompiledModuleFromSortedList(cm3) requireEqualExisting(t, e, []uintptr{}) }) t.Run("OfAddr", func(t *testing.T) { e := &engine{} - e.addCompiledModuleToSortedList(m1) - e.addCompiledModuleToSortedList(m100) - e.addCompiledModuleToSortedList(m5) - e.addCompiledModuleToSortedList(m10) + e.addCompiledModuleToSortedList(cm1) + e.addCompiledModuleToSortedList(cm4) + e.addCompiledModuleToSortedList(cm2) + e.addCompiledModuleToSortedList(cm3) require.Equal(t, nil, e.compiledModuleOfAddr(0)) - require.Equal(t, unsafe.Pointer(m1), unsafe.Pointer(e.compiledModuleOfAddr(1))) - require.Equal(t, unsafe.Pointer(m1), unsafe.Pointer(e.compiledModuleOfAddr(4))) - require.Equal(t, unsafe.Pointer(m5), unsafe.Pointer(e.compiledModuleOfAddr(5))) - require.Equal(t, unsafe.Pointer(m5), unsafe.Pointer(e.compiledModuleOfAddr(8))) - require.Equal(t, unsafe.Pointer(m10), unsafe.Pointer(e.compiledModuleOfAddr(10))) - require.Equal(t, unsafe.Pointer(m10), unsafe.Pointer(e.compiledModuleOfAddr(11))) - require.Equal(t, unsafe.Pointer(m10), unsafe.Pointer(e.compiledModuleOfAddr(12))) - require.Equal(t, unsafe.Pointer(m100), unsafe.Pointer(e.compiledModuleOfAddr(100))) - require.Equal(t, unsafe.Pointer(m100), unsafe.Pointer(e.compiledModuleOfAddr(103))) - e.deleteCompiledModuleFromSortedList(m1) - require.Equal(t, nil, e.compiledModuleOfAddr(1)) - require.Equal(t, nil, e.compiledModuleOfAddr(2)) - require.Equal(t, nil, e.compiledModuleOfAddr(4)) - e.deleteCompiledModuleFromSortedList(m100) - require.Equal(t, nil, e.compiledModuleOfAddr(100)) - require.Equal(t, nil, e.compiledModuleOfAddr(103)) + require.Equal(t, unsafe.Pointer(cm1), unsafe.Pointer(e.compiledModuleOfAddr(addr1))) + require.Equal(t, unsafe.Pointer(cm1), unsafe.Pointer(e.compiledModuleOfAddr(addr1+10))) + require.Equal(t, unsafe.Pointer(cm2), unsafe.Pointer(e.compiledModuleOfAddr(addr2))) + require.Equal(t, unsafe.Pointer(cm2), unsafe.Pointer(e.compiledModuleOfAddr(addr2+50))) + require.Equal(t, unsafe.Pointer(cm3), unsafe.Pointer(e.compiledModuleOfAddr(addr3))) + require.Equal(t, unsafe.Pointer(cm3), unsafe.Pointer(e.compiledModuleOfAddr(addr3+1))) + require.Equal(t, unsafe.Pointer(cm3), unsafe.Pointer(e.compiledModuleOfAddr(addr3+2))) + require.Equal(t, unsafe.Pointer(cm4), unsafe.Pointer(e.compiledModuleOfAddr(addr4+1))) + require.Equal(t, unsafe.Pointer(cm4), unsafe.Pointer(e.compiledModuleOfAddr(addr4+10))) + e.deleteCompiledModuleFromSortedList(cm1) + require.Equal(t, nil, e.compiledModuleOfAddr(addr1)) + require.Equal(t, nil, e.compiledModuleOfAddr(addr1+1)) + require.Equal(t, nil, e.compiledModuleOfAddr(addr1+99)) + e.deleteCompiledModuleFromSortedList(cm4) + require.Equal(t, nil, e.compiledModuleOfAddr(addr4)) + require.Equal(t, nil, e.compiledModuleOfAddr(addr4+10)) }) }