diff --git a/test/e2e/storage/testsuites/BUILD b/test/e2e/storage/testsuites/BUILD index c544a3f6ab5..d4699ccc952 100644 --- a/test/e2e/storage/testsuites/BUILD +++ b/test/e2e/storage/testsuites/BUILD @@ -1,4 +1,4 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") +load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") go_library( name = "go_default_library", @@ -73,3 +73,10 @@ filegroup( tags = ["automanaged"], visibility = ["//visibility:public"], ) + +go_test( + name = "go_default_test", + srcs = ["base_test.go"], + embed = [":go_default_library"], + deps = ["//test/e2e/framework/volume:go_default_library"], +) diff --git a/test/e2e/storage/testsuites/base_test.go b/test/e2e/storage/testsuites/base_test.go new file mode 100644 index 00000000000..59b0ad2e528 --- /dev/null +++ b/test/e2e/storage/testsuites/base_test.go @@ -0,0 +1,475 @@ +/* +Copyright 2018 The Kubernetes 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 testsuites + +import ( + "testing" + + "k8s.io/kubernetes/test/e2e/framework/volume" +) + +// getSizeRangesIntersection takes two instances of storage size ranges and determines the +// intersection of the intervals (if it exists) and return the minimum of the intersection +// to be used as the claim size for the test. +// if value not set, that means there's no minimum or maximum size limitation and we set default size for it. +// Considerate all corner case as followed: +// first: A,B is regular value and ? means unspecified +// second: C,D is regular value and ? means unspecified +// ---------------------------------------------------------------- +// | \second| min=C,max=?| min=C,max=D| min=?,max=D| min=?,max=?| +// |first\ | | | | | +// |---------------------------------------------------------------- +// |min=A,max=?| #1 | #2 | #3 | #4 | +// ----------------------------------------------------------------- +// |min=A,max=B| #5 | #6 | #7 | #8 | +// ----------------------------------------------------------------- +// |min=?,max=B| #9 | #10 | #11 | #12 | +// ----------------------------------------------------------------- +// |min=?,max=?| #13 | #14 | #15 | #16 | +// |---------------------------------------------------------------| +func Test_getSizeRangesIntersection(t *testing.T) { + type args struct { + first volume.SizeRange + second volume.SizeRange + } + tests := []struct { + name string + args args + want string + wantErr bool + }{ + { + name: "case #1: first{min=A,max=?} second{min=C,max=?} where C > A ", + args: args{ + first: volume.SizeRange{ + Min: "5Gi", + }, + second: volume.SizeRange{ + Min: "10Gi", + }, + }, + want: "10Gi", + wantErr: false, + }, + { + name: "case #1: first{min=A,max=?} second{min=C,max=?} where C < A ", + args: args{ + first: volume.SizeRange{ + Min: "5Gi", + }, + second: volume.SizeRange{ + Min: "1Gi", + }, + }, + want: "5Gi", + wantErr: false, + }, + { + name: "case #2: first{min=A,max=?} second{min=C,max=D} where A > D ", + args: args{ + first: volume.SizeRange{ + Min: "5Gi", + }, + second: volume.SizeRange{ + Min: "1Gi", + Max: "4Gi", + }, + }, + want: "", + wantErr: true, + }, + { + name: "case #2: first{min=A,max=?} second{min=C,max=D} where D > A > C ", + args: args{ + first: volume.SizeRange{ + Min: "5Gi", + Max: "", + }, + second: volume.SizeRange{ + Min: "3Gi", + Max: "10Gi", + }, + }, + want: "5Gi", + wantErr: false, + }, + { + name: "case #2: first{min=A,max=?} second{min=C,max=D} where A < C ", + args: args{ + first: volume.SizeRange{ + Min: "5Gi", + Max: "", + }, + second: volume.SizeRange{ + Min: "6Gi", + Max: "10Gi", + }, + }, + want: "6Gi", + wantErr: false, + }, + { + name: "case #3: first{min=A,max=?} second{min=?,max=D} where A > D", + args: args{ + first: volume.SizeRange{ + Min: "5Gi", + Max: "", + }, + second: volume.SizeRange{ + Max: "1Gi", + }, + }, + want: "", + wantErr: true, + }, + { + name: "case #3: first{min=A,max=?} second{min=?,max=D} where A < D", + args: args{ + first: volume.SizeRange{ + Min: "5Gi", + Max: "", + }, + second: volume.SizeRange{ + Max: "10Gi", + }, + }, + want: "5Gi", + wantErr: false, + }, + { + name: "case #4: first{min=A,max=?} second{min=?,max=?} ", + args: args{ + first: volume.SizeRange{ + Min: "5Gi", + Max: "", + }, + second: volume.SizeRange{}, + }, + want: "5Gi", + wantErr: false, + }, + + { + name: "case #5: first{min=A,max=B} second{min=C,max=?} where C < A ", + args: args{ + first: volume.SizeRange{ + Min: "5Gi", + Max: "10Gi", + }, + second: volume.SizeRange{ + Min: "1Gi", + }, + }, + want: "5Gi", + wantErr: false, + }, + { + name: "case #5: first{min=A,max=B} second{min=C,max=?} where B > C > A ", + args: args{ + first: volume.SizeRange{ + Min: "5Gi", + Max: "10Gi", + }, + second: volume.SizeRange{ + Min: "6Gi", + }, + }, + want: "6Gi", + wantErr: false, + }, + { + name: "case #5: first{min=A,max=B} second{min=C,max=?} where C > B ", + args: args{ + first: volume.SizeRange{ + Min: "5Gi", + Max: "10Gi", + }, + second: volume.SizeRange{ + Min: "15Gi", + }, + }, + want: "", + wantErr: true, + }, + { + name: "case #6: first{min=A,max=B} second{min=C,max=D} where A < B < C < D", + args: args{ + first: volume.SizeRange{ + Min: "5Gi", + Max: "6Gi", + }, + second: volume.SizeRange{ + Min: "7Gi", + Max: "8Gi", + }, + }, + want: "", + wantErr: true, + }, + { + name: "case #6: first{min=A,max=B} second{min=C,max=D} where A < C < B < D ", + args: args{ + first: volume.SizeRange{ + Min: "5Gi", + Max: "10Gi", + }, + second: volume.SizeRange{ + Min: "8Gi", + Max: "15Gi", + }, + }, + want: "8Gi", + wantErr: false, + }, + { + name: "case #7: first{min=A,max=B} second{min=?,max=D} where D < A", + args: args{ + first: volume.SizeRange{ + Min: "5Gi", + Max: "10Gi", + }, + second: volume.SizeRange{ + Max: "3Gi", + }, + }, + want: "", + wantErr: true, + }, + { + name: "case #7: first{min=A,max=B} second{min=?,max=D} where B > D > A", + args: args{ + first: volume.SizeRange{ + Min: "5Gi", + Max: "10Gi", + }, + second: volume.SizeRange{ + Max: "8Gi", + }, + }, + want: "5Gi", + wantErr: false, + }, + { + name: "case #7: first{min=A,max=B} second{min=?,max=D} where D > B", + args: args{ + first: volume.SizeRange{ + Min: "5Gi", + Max: "10Gi", + }, + second: volume.SizeRange{ + Max: "15Gi", + }, + }, + want: "5Gi", + wantErr: false, + }, + { + name: "case #8: first{min=A,max=B} second{min=?,max=?}", + args: args{ + first: volume.SizeRange{ + Min: "5Gi", + Max: "10Gi", + }, + second: volume.SizeRange{}, + }, + want: "5Gi", + wantErr: false, + }, + { + name: "case #9: first{min=?,max=B} second{min=C,max=?} where C > B", + args: args{ + first: volume.SizeRange{ + Max: "5Gi", + }, + second: volume.SizeRange{ + Min: "10Gi", + }, + }, + want: "", + wantErr: true, + }, + { + name: "case #9: first{min=?,max=B} second{min=C,max=?} where C < B", + args: args{ + first: volume.SizeRange{ + Max: "10Gi", + }, + second: volume.SizeRange{ + Min: "5Gi", + }, + }, + want: "5Gi", + wantErr: false, + }, + { + name: "case #10: first{min=?,max=B} second{min=C,max=D} where B > D", + args: args{ + first: volume.SizeRange{ + Max: "10Gi", + }, + second: volume.SizeRange{ + Min: "1Gi", + Max: "5Gi", + }, + }, + want: "1Gi", + wantErr: false, + }, + { + name: "case #10: first{min=?,max=B} second{min=C,max=D} where C < B < D", + args: args{ + first: volume.SizeRange{ + Max: "10Gi", + }, + second: volume.SizeRange{ + Min: "5Gi", + Max: "15Gi", + }, + }, + want: "5Gi", + wantErr: false, + }, + { + name: "case #10: first{min=?,max=B} second{min=C,max=D} where B < C", + args: args{ + first: volume.SizeRange{ + Max: "10Gi", + }, + second: volume.SizeRange{ + Min: "15Gi", + Max: "20Gi", + }, + }, + want: "", + wantErr: true, + }, + { + name: "case #11: first{min=?,max=B} second{min=?,max=D} where D < B", + args: args{ + first: volume.SizeRange{ + Max: "10Gi", + }, + second: volume.SizeRange{ + Max: "5Gi", + }, + }, + want: minValidSize, + wantErr: false, + }, + { + name: "case #11: first{min=?,max=B} second{min=?,max=D} where D > B", + args: args{ + first: volume.SizeRange{ + Max: "10Gi", + }, + second: volume.SizeRange{ + Max: "15Gi", + }, + }, + want: minValidSize, + wantErr: false, + }, + { + name: "case #12: first{min=?,max=B} second{min=?,max=?} ", + args: args{ + first: volume.SizeRange{ + Max: "10Gi", + }, + second: volume.SizeRange{}, + }, + want: minValidSize, + wantErr: false, + }, + { + name: "case #13: first{min=?,max=?} second{min=C,max=?} ", + args: args{ + first: volume.SizeRange{}, + second: volume.SizeRange{ + Min: "5Gi", + }, + }, + want: "5Gi", + wantErr: false, + }, + { + name: "case #14: first{min=?,max=?} second{min=C,max=D} where C < D", + args: args{ + first: volume.SizeRange{}, + second: volume.SizeRange{ + Min: "5Gi", + Max: "10Gi", + }, + }, + want: "5Gi", + wantErr: false, + }, + { + name: "case #14: first{min=?,max=?} second{min=C,max=D} where C > D", + args: args{ + first: volume.SizeRange{}, + second: volume.SizeRange{ + Min: "10Gi", + Max: "5Gi", + }, + }, + want: "", + wantErr: true, + }, + { + name: "case #14: first{min=?,max=?} second{min=C,max=D} where C = D", + args: args{ + first: volume.SizeRange{}, + second: volume.SizeRange{ + Min: "1Mi", + Max: "1Mi", + }, + }, + want: "1Mi", + wantErr: false, + }, + { + name: "case #15: first{min=?,max=?} second{min=?,max=D}", + args: args{ + first: volume.SizeRange{}, + second: volume.SizeRange{ + Max: "10Gi", + }, + }, + want: minValidSize, + wantErr: false, + }, + { + name: "case #16: first{min=?,max=?} second{min=?,max=?}", + args: args{ + first: volume.SizeRange{}, + second: volume.SizeRange{}, + }, + want: minValidSize, + wantErr: false, + }, + } + for _, tt := range tests { + got, err := getSizeRangesIntersection(tt.args.first, tt.args.second) + if (err != nil) != tt.wantErr { + t.Errorf("%q. getSizeRangesIntersection() error = %v, wantErr %v", tt.name, err, tt.wantErr) + continue + } + if got != tt.want { + t.Errorf("%q. getSizeRangesIntersection() = %v, want %v", tt.name, got, tt.want) + } + } +}