go.etcd.io/etcd@v3.3.27+incompatible/etcdserver/cluster_util_test.go (about)

     1  // Copyright 2015 The etcd Authors
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License");
     4  // you may not use this file except in compliance with the License.
     5  // You may obtain a copy of the License at
     6  //
     7  //     http://www.apache.org/licenses/LICENSE-2.0
     8  //
     9  // Unless required by applicable law or agreed to in writing, software
    10  // distributed under the License is distributed on an "AS IS" BASIS,
    11  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    12  // See the License for the specific language governing permissions and
    13  // limitations under the License.
    14  
    15  package etcdserver
    16  
    17  import (
    18  	"reflect"
    19  	"testing"
    20  
    21  	"github.com/coreos/etcd/pkg/types"
    22  	"github.com/coreos/etcd/version"
    23  	"github.com/coreos/go-semver/semver"
    24  )
    25  
    26  func TestDecideClusterVersion(t *testing.T) {
    27  	tests := []struct {
    28  		vers  map[string]*version.Versions
    29  		wdver *semver.Version
    30  	}{
    31  		{
    32  			map[string]*version.Versions{"a": {Server: "2.0.0"}},
    33  			semver.Must(semver.NewVersion("2.0.0")),
    34  		},
    35  		// unknown
    36  		{
    37  			map[string]*version.Versions{"a": nil},
    38  			nil,
    39  		},
    40  		{
    41  			map[string]*version.Versions{"a": {Server: "2.0.0"}, "b": {Server: "2.1.0"}, "c": {Server: "2.1.0"}},
    42  			semver.Must(semver.NewVersion("2.0.0")),
    43  		},
    44  		{
    45  			map[string]*version.Versions{"a": {Server: "2.1.0"}, "b": {Server: "2.1.0"}, "c": {Server: "2.1.0"}},
    46  			semver.Must(semver.NewVersion("2.1.0")),
    47  		},
    48  		{
    49  			map[string]*version.Versions{"a": nil, "b": {Server: "2.1.0"}, "c": {Server: "2.1.0"}},
    50  			nil,
    51  		},
    52  	}
    53  
    54  	for i, tt := range tests {
    55  		dver := decideClusterVersion(tt.vers)
    56  		if !reflect.DeepEqual(dver, tt.wdver) {
    57  			t.Errorf("#%d: ver = %+v, want %+v", i, dver, tt.wdver)
    58  		}
    59  	}
    60  }
    61  
    62  func TestIsCompatibleWithVers(t *testing.T) {
    63  	tests := []struct {
    64  		vers       map[string]*version.Versions
    65  		local      types.ID
    66  		minV, maxV *semver.Version
    67  		wok        bool
    68  	}{
    69  		// too low
    70  		{
    71  			map[string]*version.Versions{
    72  				"a": {Server: "2.0.0", Cluster: "not_decided"},
    73  				"b": {Server: "2.1.0", Cluster: "2.1.0"},
    74  				"c": {Server: "2.1.0", Cluster: "2.1.0"},
    75  			},
    76  			0xa,
    77  			semver.Must(semver.NewVersion("2.0.0")), semver.Must(semver.NewVersion("2.0.0")),
    78  			false,
    79  		},
    80  		{
    81  			map[string]*version.Versions{
    82  				"a": {Server: "2.1.0", Cluster: "not_decided"},
    83  				"b": {Server: "2.1.0", Cluster: "2.1.0"},
    84  				"c": {Server: "2.1.0", Cluster: "2.1.0"},
    85  			},
    86  			0xa,
    87  			semver.Must(semver.NewVersion("2.0.0")), semver.Must(semver.NewVersion("2.1.0")),
    88  			true,
    89  		},
    90  		// too high
    91  		{
    92  			map[string]*version.Versions{
    93  				"a": {Server: "2.2.0", Cluster: "not_decided"},
    94  				"b": {Server: "2.0.0", Cluster: "2.0.0"},
    95  				"c": {Server: "2.0.0", Cluster: "2.0.0"},
    96  			},
    97  			0xa,
    98  			semver.Must(semver.NewVersion("2.1.0")), semver.Must(semver.NewVersion("2.2.0")),
    99  			false,
   100  		},
   101  		// cannot get b's version, expect ok
   102  		{
   103  			map[string]*version.Versions{
   104  				"a": {Server: "2.1.0", Cluster: "not_decided"},
   105  				"b": nil,
   106  				"c": {Server: "2.1.0", Cluster: "2.1.0"},
   107  			},
   108  			0xa,
   109  			semver.Must(semver.NewVersion("2.0.0")), semver.Must(semver.NewVersion("2.1.0")),
   110  			true,
   111  		},
   112  		// cannot get b and c's version, expect not ok
   113  		{
   114  			map[string]*version.Versions{
   115  				"a": {Server: "2.1.0", Cluster: "not_decided"},
   116  				"b": nil,
   117  				"c": nil,
   118  			},
   119  			0xa,
   120  			semver.Must(semver.NewVersion("2.0.0")), semver.Must(semver.NewVersion("2.1.0")),
   121  			false,
   122  		},
   123  	}
   124  
   125  	for i, tt := range tests {
   126  		ok := isCompatibleWithVers(tt.vers, tt.local, tt.minV, tt.maxV)
   127  		if ok != tt.wok {
   128  			t.Errorf("#%d: ok = %+v, want %+v", i, ok, tt.wok)
   129  		}
   130  	}
   131  }