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  }