github.com/johnnyeven/libtools@v0.0.0-20191126065708-61829c1adf46/kafka/consumergroup/consumer_group_test.go (about)

     1  package consumergroup
     2  
     3  import (
     4  	"fmt"
     5  	"testing"
     6  
     7  	"github.com/wvanbergen/kazoo-go"
     8  )
     9  
    10  func createTestConsumerGroupInstanceList(size int) kazoo.ConsumergroupInstanceList {
    11  	k := make(kazoo.ConsumergroupInstanceList, size)
    12  	for i := range k {
    13  		k[i] = &kazoo.ConsumergroupInstance{ID: fmt.Sprintf("consumer%d", i)}
    14  	}
    15  	return k
    16  }
    17  
    18  func createTestPartitions(count int) []partitionLeader {
    19  	p := make([]partitionLeader, count)
    20  	for i := range p {
    21  		p[i] = partitionLeader{id: int32(i), leader: 1, partition: &kazoo.Partition{ID: int32(i)}}
    22  	}
    23  	return p
    24  }
    25  
    26  func Skip_Test_PartitionDivision(t *testing.T) {
    27  	consumerPartitionTestCases := [][2]int{
    28  		// {number of Consumers, number of Partitions}
    29  		[2]int{2, 5},
    30  		[2]int{5, 2},
    31  		[2]int{9, 32},
    32  		[2]int{10, 50},
    33  	}
    34  	for _, v := range consumerPartitionTestCases {
    35  		consumers := createTestConsumerGroupInstanceList(v[0])
    36  		partitions := createTestPartitions(v[1])
    37  		division := dividePartitionsBetweenConsumers(consumers, partitions)
    38  
    39  		// make sure every partition is used once
    40  		grouping := make(map[int32]struct{})
    41  		maxConsumed := 0
    42  		minConsumed := len(partitions) + 1
    43  		for _, v := range division {
    44  			if len(v) > maxConsumed {
    45  				maxConsumed = len(v)
    46  			}
    47  			if len(v) < minConsumed {
    48  				minConsumed = len(v)
    49  			}
    50  			for _, partition := range v {
    51  				if _, ok := grouping[partition.ID]; ok {
    52  					t.Errorf("PartitionDivision: Partition %v was assigned more than once!", partition.ID)
    53  				} else {
    54  					grouping[partition.ID] = struct{}{}
    55  				}
    56  			}
    57  		}
    58  		if len(grouping) != len(partitions) {
    59  			t.Errorf("PartitionDivision: Expected to divide %d partitions among consumers, but only %d partitions were consumed.", len(partitions), len(grouping))
    60  		}
    61  		if (maxConsumed - minConsumed) > 1 {
    62  			t.Errorf("PartitionDivision: Partitions weren't divided evenly, consumers shouldn't have a difference of more than 1 in the number of partitions consumed (was %d).", maxConsumed-minConsumed)
    63  		}
    64  		if minConsumed > 1 && len(consumers) != len(division) {
    65  			t.Errorf("PartitionDivision: Partitions weren't divided evenly, some consumers didn't get any paritions even though there were %d partitions and %d consumers.", len(partitions), len(consumers))
    66  		}
    67  	}
    68  }