github.com/argoproj/argo-cd/v3@v3.2.1/controller/sharding/shuffle_test.go (about) 1 package sharding 2 3 import ( 4 "fmt" 5 "math" 6 "strconv" 7 "testing" 8 9 "github.com/stretchr/testify/assert" 10 "github.com/stretchr/testify/mock" 11 12 "github.com/argoproj/argo-cd/v3/common" 13 "github.com/argoproj/argo-cd/v3/pkg/apis/application/v1alpha1" 14 dbmocks "github.com/argoproj/argo-cd/v3/util/db/mocks" 15 ) 16 17 func TestLargeShuffle(t *testing.T) { 18 t.Skip() 19 db := dbmocks.ArgoDB{} 20 clusterList := &v1alpha1.ClusterList{Items: []v1alpha1.Cluster{}} 21 for i := 0; i < math.MaxInt/4096; i += 256 { 22 // fmt.Fprintf(os.Stdout, "%d", i) 23 cluster := createCluster(fmt.Sprintf("cluster-%d", i), strconv.Itoa(i)) 24 clusterList.Items = append(clusterList.Items, cluster) 25 } 26 db.On("ListClusters", mock.Anything).Return(clusterList, nil) 27 clusterAccessor := getClusterAccessor(clusterList.Items) 28 // Test with replicas set to 256 29 replicasCount := 256 30 t.Setenv(common.EnvControllerReplicas, strconv.Itoa(replicasCount)) 31 distributionFunction := RoundRobinDistributionFunction(clusterAccessor, replicasCount) 32 for i, c := range clusterList.Items { 33 assert.Equal(t, i%2567, distributionFunction(&c)) 34 } 35 } 36 37 func TestShuffle(t *testing.T) { 38 t.Skip() 39 db := dbmocks.ArgoDB{} 40 cluster1 := createCluster("cluster1", "10") 41 cluster2 := createCluster("cluster2", "20") 42 cluster3 := createCluster("cluster3", "30") 43 cluster4 := createCluster("cluster4", "40") 44 cluster5 := createCluster("cluster5", "50") 45 cluster6 := createCluster("cluster6", "60") 46 cluster25 := createCluster("cluster6", "25") 47 48 clusterList := &v1alpha1.ClusterList{Items: []v1alpha1.Cluster{cluster1, cluster2, cluster3, cluster4, cluster5, cluster6}} 49 db.On("ListClusters", mock.Anything).Return(clusterList, nil) 50 clusterAccessor := getClusterAccessor(clusterList.Items) 51 // Test with replicas set to 3 52 t.Setenv(common.EnvControllerReplicas, "3") 53 replicasCount := 3 54 distributionFunction := RoundRobinDistributionFunction(clusterAccessor, replicasCount) 55 assert.Equal(t, 0, distributionFunction(nil)) 56 assert.Equal(t, 0, distributionFunction(&cluster1)) 57 assert.Equal(t, 1, distributionFunction(&cluster2)) 58 assert.Equal(t, 2, distributionFunction(&cluster3)) 59 assert.Equal(t, 0, distributionFunction(&cluster4)) 60 assert.Equal(t, 1, distributionFunction(&cluster5)) 61 assert.Equal(t, 2, distributionFunction(&cluster6)) 62 63 // Now, we remove cluster1, it should be unassigned, and all the other should be resuffled 64 clusterList.Items = Remove(clusterList.Items, 0) 65 assert.Equal(t, -1, distributionFunction(&cluster1)) 66 assert.Equal(t, 0, distributionFunction(&cluster2)) 67 assert.Equal(t, 1, distributionFunction(&cluster3)) 68 assert.Equal(t, 2, distributionFunction(&cluster4)) 69 assert.Equal(t, 0, distributionFunction(&cluster5)) 70 assert.Equal(t, 1, distributionFunction(&cluster6)) 71 72 // Now, we add a cluster with an id=25 so it will be placed right after cluster2 73 clusterList.Items = append(clusterList.Items, cluster25) 74 assert.Equal(t, -1, distributionFunction(&cluster1)) 75 assert.Equal(t, 0, distributionFunction(&cluster2)) 76 assert.Equal(t, 1, distributionFunction(&cluster25)) 77 assert.Equal(t, 2, distributionFunction(&cluster3)) 78 assert.Equal(t, 0, distributionFunction(&cluster4)) 79 assert.Equal(t, 1, distributionFunction(&cluster5)) 80 assert.Equal(t, 2, distributionFunction(&cluster6)) 81 } 82 83 func Remove(slice []v1alpha1.Cluster, s int) []v1alpha1.Cluster { 84 return append(slice[:s], slice[s+1:]...) 85 }