github.com/grafana/pyroscope@v1.18.0/pkg/phlaredb/symdb/stacktrace_range_test.go (about) 1 package symdb 2 3 import ( 4 "testing" 5 6 "github.com/stretchr/testify/assert" 7 ) 8 9 func Test_SplitStacktraces(t *testing.T) { 10 type testCase struct { 11 description string 12 maxNodes uint32 13 stacktraces []uint32 14 expected []*StacktraceIDRange 15 } 16 17 testCases := []testCase{ 18 { 19 description: "no limit", 20 stacktraces: []uint32{234, 1234, 2345}, 21 expected: []*StacktraceIDRange{ 22 {IDs: []uint32{234, 1234, 2345}}, 23 }, 24 }, 25 { 26 description: "one chunk", 27 maxNodes: 4, 28 stacktraces: []uint32{1, 2, 3}, 29 expected: []*StacktraceIDRange{ 30 {m: 4, chunk: 0, IDs: []uint32{1, 2, 3}}, 31 }, 32 }, 33 { 34 description: "one chunk shifted", 35 maxNodes: 4, 36 stacktraces: []uint32{401, 402}, 37 expected: []*StacktraceIDRange{ 38 {m: 4, chunk: 100, IDs: []uint32{1, 2}}, 39 }, 40 }, 41 { 42 description: "multiple shards", 43 maxNodes: 4, 44 stacktraces: []uint32{1, 2, 5, 7, 11, 13, 14, 15, 17, 41, 42, 43, 83, 85, 86}, 45 // : []uint32{1, 2, 1, 3, 3, 1, 2, 3, 1, 1, 2, 3, 3, 1, 2}, 46 // : []uint32{0, 0, 1, 1, 2, 3, 3, 3, 4, 10, 10, 10, 20, 21, 21}, 47 expected: []*StacktraceIDRange{ 48 {m: 4, chunk: 0, IDs: []uint32{1, 2}}, 49 {m: 4, chunk: 1, IDs: []uint32{1, 3}}, 50 {m: 4, chunk: 2, IDs: []uint32{3}}, 51 {m: 4, chunk: 3, IDs: []uint32{1, 2, 3}}, 52 {m: 4, chunk: 4, IDs: []uint32{1}}, 53 {m: 4, chunk: 10, IDs: []uint32{1, 2, 3}}, 54 {m: 4, chunk: 20, IDs: []uint32{3}}, 55 {m: 4, chunk: 21, IDs: []uint32{1, 2}}, 56 }, 57 }, 58 { 59 description: "multiple shards exact", 60 maxNodes: 4, 61 stacktraces: []uint32{1, 2, 5, 7, 11, 13, 14, 15, 17, 41, 42, 43, 83, 85, 86, 87}, 62 expected: []*StacktraceIDRange{ 63 {m: 4, chunk: 0, IDs: []uint32{1, 2}}, 64 {m: 4, chunk: 1, IDs: []uint32{1, 3}}, 65 {m: 4, chunk: 2, IDs: []uint32{3}}, 66 {m: 4, chunk: 3, IDs: []uint32{1, 2, 3}}, 67 {m: 4, chunk: 4, IDs: []uint32{1}}, 68 {m: 4, chunk: 10, IDs: []uint32{1, 2, 3}}, 69 {m: 4, chunk: 20, IDs: []uint32{3}}, 70 {m: 4, chunk: 21, IDs: []uint32{1, 2, 3}}, 71 }, 72 }, 73 } 74 75 for _, tc := range testCases { 76 t.Run(tc.description, func(t *testing.T) { 77 assert.Equal(t, tc.expected, SplitStacktraces(tc.stacktraces, tc.maxNodes)) 78 }) 79 } 80 }