etcd/tests/robustness/options/cluster_options_test.go
Marek Siarkowicz b71686d1e6 Refactor mocking rand
Signed-off-by: Marek Siarkowicz <siarkowicz@google.com>
2023-11-15 10:26:39 +01:00

111 lines
5.0 KiB
Go

// Copyright 2023 The etcd Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package options
import (
"math/rand"
"testing"
"go.etcd.io/etcd/server/v3/embed"
"go.etcd.io/etcd/tests/v3/framework/e2e"
)
func mockRand(source rand.Source) func() {
tmp := internalRand
internalRand = rand.New(source)
return func() {
internalRand = tmp
}
}
func TestWithClusterOptionGroups(t *testing.T) {
restore := mockRand(rand.NewSource(1))
defer restore()
tickOptions1 := ClusterOptions{WithTickMs(101), WithElectionMs(1001)}
tickOptions2 := ClusterOptions{WithTickMs(202), WithElectionMs(2002)}
tickOptions3 := ClusterOptions{WithTickMs(303), WithElectionMs(3003)}
opts := ClusterOptions{
WithSnapshotCount(100, 150, 200),
WithClusterOptionGroups(tickOptions1, tickOptions2, tickOptions3),
WithSnapshotCatchUpEntries(100),
}
expectedServerConfigs := []embed.Config{
embed.Config{SnapshotCount: 200, SnapshotCatchUpEntries: 100, TickMs: 101, ElectionMs: 1001},
embed.Config{SnapshotCount: 100, SnapshotCatchUpEntries: 100, TickMs: 202, ElectionMs: 2002},
embed.Config{SnapshotCount: 200, SnapshotCatchUpEntries: 100, TickMs: 202, ElectionMs: 2002},
embed.Config{SnapshotCount: 200, SnapshotCatchUpEntries: 100, TickMs: 101, ElectionMs: 1001},
embed.Config{SnapshotCount: 200, SnapshotCatchUpEntries: 100, TickMs: 101, ElectionMs: 1001},
embed.Config{SnapshotCount: 150, SnapshotCatchUpEntries: 100, TickMs: 202, ElectionMs: 2002},
}
for i, tt := range expectedServerConfigs {
cluster := *e2e.NewConfig(opts...)
if cluster.ServerConfig.SnapshotCount != tt.SnapshotCount {
t.Errorf("Test case %d: SnapshotCount = %v, want %v\n", i, cluster.ServerConfig.SnapshotCount, tt.SnapshotCount)
}
if cluster.ServerConfig.SnapshotCatchUpEntries != tt.SnapshotCatchUpEntries {
t.Errorf("Test case %d: SnapshotCatchUpEntries = %v, want %v\n", i, cluster.ServerConfig.SnapshotCatchUpEntries, tt.SnapshotCatchUpEntries)
}
if cluster.ServerConfig.TickMs != tt.TickMs {
t.Errorf("Test case %d: TickMs = %v, want %v\n", i, cluster.ServerConfig.TickMs, tt.TickMs)
}
if cluster.ServerConfig.ElectionMs != tt.ElectionMs {
t.Errorf("Test case %d: ElectionMs = %v, want %v\n", i, cluster.ServerConfig.ElectionMs, tt.ElectionMs)
}
}
}
func TestWithOptionsSubset(t *testing.T) {
restore := mockRand(rand.NewSource(1))
defer restore()
tickOptions := ClusterOptions{WithTickMs(50), WithElectionMs(500)}
opts := ClusterOptions{
WithSnapshotCatchUpEntries(100),
WithSubsetOptions(WithSnapshotCount(100, 150, 200), WithClusterOptionGroups(tickOptions)),
}
expectedServerConfigs := []embed.Config{
embed.Config{SnapshotCount: 10000, SnapshotCatchUpEntries: 100, TickMs: 100, ElectionMs: 1000},
embed.Config{SnapshotCount: 10000, SnapshotCatchUpEntries: 100, TickMs: 100, ElectionMs: 1000},
embed.Config{SnapshotCount: 10000, SnapshotCatchUpEntries: 100, TickMs: 100, ElectionMs: 1000},
// both SnapshotCount and TickMs&ElectionMs are not default values.
embed.Config{SnapshotCount: 200, SnapshotCatchUpEntries: 100, TickMs: 50, ElectionMs: 500},
embed.Config{SnapshotCount: 10000, SnapshotCatchUpEntries: 100, TickMs: 100, ElectionMs: 1000},
// only TickMs&ElectionMs are not default values.
embed.Config{SnapshotCount: 10000, SnapshotCatchUpEntries: 100, TickMs: 50, ElectionMs: 500},
// both SnapshotCount and TickMs&ElectionMs are not default values.
embed.Config{SnapshotCount: 200, SnapshotCatchUpEntries: 100, TickMs: 50, ElectionMs: 500},
// both SnapshotCount and TickMs&ElectionMs are not default values.
embed.Config{SnapshotCount: 10000, SnapshotCatchUpEntries: 100, TickMs: 50, ElectionMs: 500},
// only SnapshotCount is not default value.
embed.Config{SnapshotCount: 100, SnapshotCatchUpEntries: 100, TickMs: 100, ElectionMs: 1000},
}
for i, tt := range expectedServerConfigs {
cluster := *e2e.NewConfig(opts...)
if cluster.ServerConfig.SnapshotCount != tt.SnapshotCount {
t.Errorf("Test case %d: SnapshotCount = %v, want %v\n", i, cluster.ServerConfig.SnapshotCount, tt.SnapshotCount)
}
if cluster.ServerConfig.SnapshotCatchUpEntries != tt.SnapshotCatchUpEntries {
t.Errorf("Test case %d: SnapshotCatchUpEntries = %v, want %v\n", i, cluster.ServerConfig.SnapshotCatchUpEntries, tt.SnapshotCatchUpEntries)
}
if cluster.ServerConfig.TickMs != tt.TickMs {
t.Errorf("Test case %d: TickMs = %v, want %v\n", i, cluster.ServerConfig.TickMs, tt.TickMs)
}
if cluster.ServerConfig.ElectionMs != tt.ElectionMs {
t.Errorf("Test case %d: ElectionMs = %v, want %v\n", i, cluster.ServerConfig.ElectionMs, tt.ElectionMs)
}
}
}