Skip to content

Commit

Permalink
Split intengration/clientv3 tests into multiple packages
Browse files Browse the repository at this point in the history
They used to take >10min with coverage, so were causing interrupted
Travis runs.

Know thay fit in 100-150s (together), thanks also to parallel
execution.
  • Loading branch information
ptabor committed Jan 23, 2021
1 parent 88ee005 commit 351bdb3
Show file tree
Hide file tree
Showing 20 changed files with 197 additions and 119 deletions.
10 changes: 5 additions & 5 deletions codecov.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,13 @@ fixes:
- "go.etcd.io/etcd/api/v3/::api/"
- "go.etcd.io/etcd/client/v3/::client/v3/"
- "go.etcd.io/etcd/client/v2/::client/v2/"
- "go.etcd.io/etcd/etcdctl/v3::etcdctl/"
- "go.etcd.io/etcd/pkg/v3::pkg/"
- "go.etcd.io/etcd/raft/v3::raft/"
- "go.etcd.io/etcd/server/v3::server/"
- "go.etcd.io/etcd/etcdctl/v3/::etcdctl/"
- "go.etcd.io/etcd/pkg/v3/::pkg/"
- "go.etcd.io/etcd/raft/v3/::raft/"
- "go.etcd.io/etcd/server/v3/::server/"

ignore:
- "**/*.pb.go"
- "**/*.pb.gw.go"
- "tests/**/*"
- "go.etcd.io/etcd/tests/**/*"
- "go.etcd.io/etcd/tests/**/*"
12 changes: 12 additions & 0 deletions pkg/testutil/testutil.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ package testutil

import (
"net/url"
"os"
"runtime"
"testing"
"time"
Expand Down Expand Up @@ -91,3 +92,14 @@ func SkipTestIfShortMode(t testing.TB, reason string) {
}
}
}

// ExitInShortMode closes the current process (with 0) if the short test mode detected.
//
// To be used in Test-main, where test context (testing.TB) is not available.
//
// Requires custom env-variable (GOLANG_TEST_SHORT) apart of `go test --short flag`.
func ExitInShortMode(reason string) {
if os.Getenv("GOLANG_TEST_SHORT") == "true" {
os.Exit(0)
}
}
6 changes: 3 additions & 3 deletions test.sh
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ function run_unit_tests {
local pkgs="${1:-./...}"
shift 1
# shellcheck disable=SC2086
go_test "${pkgs}" "parallel" : -short -timeout="${TIMEOUT:-3m}" "${COMMON_TEST_FLAGS[@]}" "${RUN_ARG[@]}" "$@"
GOLANG_TEST_SHORT=true go_test "${pkgs}" "parallel" : -short -timeout="${TIMEOUT:-3m}" "${COMMON_TEST_FLAGS[@]}" "${RUN_ARG[@]}" "$@"
}

function unit_pass {
Expand All @@ -109,7 +109,7 @@ function integration_extra {

function integration_pass {
local pkgs=${USERPKG:-"./integration/..."}
run_for_module "tests" go_test "${pkgs}" "keep_going" : -timeout="${TIMEOUT:-30m}" "${COMMON_TEST_FLAGS[@]}" "${RUN_ARG[@]}" "$@" || return $?
run_for_module "tests" go_test "${pkgs}" "parallel" : -timeout="${TIMEOUT:-30m}" "${COMMON_TEST_FLAGS[@]}" "${RUN_ARG[@]}" "$@" || return $?
integration_extra "$@"
}

Expand Down Expand Up @@ -307,7 +307,7 @@ function cov_pass {

log_callout "[$(date)] Collecting coverage from unit tests ..."
for m in $(module_dirs); do
run_for_module "${m}" go_test "./..." "parallel" "pkg_to_coverprofileflag unit_${m}" -short -timeout=30m \
GOLANG_TEST_SHORT=true run_for_module "${m}" go_test "./..." "parallel" "pkg_to_coverprofileflag unit_${m}" -short -timeout=30m \
"${gocov_build_flags[@]}" "$@" || failed="$failed unit"
done

Expand Down
4 changes: 2 additions & 2 deletions tests/functional/tester/cluster_run.go
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ func (clus *Cluster) Run() {
clus.rd = round

if err := clus.doRound(); err != nil {
clus.lg.Warn(
clus.lg.Error(
"round FAIL",
zap.Int("round", clus.rd),
zap.Int("case", clus.cs),
Expand Down Expand Up @@ -316,7 +316,7 @@ func (clus *Cluster) compact(rev int64, timeout time.Duration) (err error) {
}

func (clus *Cluster) failed() {
clus.lg.Info(
clus.lg.Error(
"functional-tester FAIL",
zap.Int("round", clus.rd),
zap.Int("case", clus.cs),
Expand Down
2 changes: 2 additions & 0 deletions tests/integration/clientv3/concurrency/main_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,8 @@ func forUnitTestsRunInMockedContext(mocking func(), example func()) {

// TestMain sets up an etcd cluster if running the examples.
func TestMain(m *testing.M) {
testutil.ExitInShortMode("Skipping: the tests require real cluster")

v := m.Run()
lazyCluster.Terminate()
if v == 0 {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@

// +build !cluster_proxy

package clientv3test
package connectivity_test

import (
"context"
Expand All @@ -25,6 +25,7 @@ import (
"go.etcd.io/etcd/client/v3"
"go.etcd.io/etcd/pkg/v3/testutil"
"go.etcd.io/etcd/tests/v3/integration"
"go.etcd.io/etcd/tests/v3/integration/clientv3"
"google.golang.org/grpc"
)

Expand Down Expand Up @@ -111,7 +112,7 @@ func TestBalancerUnderBlackholeKeepAliveWatch(t *testing.T) {
func TestBalancerUnderBlackholeNoKeepAlivePut(t *testing.T) {
testBalancerUnderBlackholeNoKeepAlive(t, func(cli *clientv3.Client, ctx context.Context) error {
_, err := cli.Put(ctx, "foo", "bar")
if isClientTimeout(err) || isServerCtxTimeout(err) || err == rpctypes.ErrTimeout {
if clientv3test.IsClientTimeout(err) || clientv3test.IsServerCtxTimeout(err) || err == rpctypes.ErrTimeout {
return errExpected
}
return err
Expand All @@ -121,7 +122,7 @@ func TestBalancerUnderBlackholeNoKeepAlivePut(t *testing.T) {
func TestBalancerUnderBlackholeNoKeepAliveDelete(t *testing.T) {
testBalancerUnderBlackholeNoKeepAlive(t, func(cli *clientv3.Client, ctx context.Context) error {
_, err := cli.Delete(ctx, "foo")
if isClientTimeout(err) || isServerCtxTimeout(err) || err == rpctypes.ErrTimeout {
if clientv3test.IsClientTimeout(err) || clientv3test.IsServerCtxTimeout(err) || err == rpctypes.ErrTimeout {
return errExpected
}
return err
Expand All @@ -134,7 +135,7 @@ func TestBalancerUnderBlackholeNoKeepAliveTxn(t *testing.T) {
If(clientv3.Compare(clientv3.Version("foo"), "=", 0)).
Then(clientv3.OpPut("foo", "bar")).
Else(clientv3.OpPut("foo", "baz")).Commit()
if isClientTimeout(err) || isServerCtxTimeout(err) || err == rpctypes.ErrTimeout {
if clientv3test.IsClientTimeout(err) || clientv3test.IsServerCtxTimeout(err) || err == rpctypes.ErrTimeout {
return errExpected
}
return err
Expand All @@ -144,7 +145,7 @@ func TestBalancerUnderBlackholeNoKeepAliveTxn(t *testing.T) {
func TestBalancerUnderBlackholeNoKeepAliveLinearizableGet(t *testing.T) {
testBalancerUnderBlackholeNoKeepAlive(t, func(cli *clientv3.Client, ctx context.Context) error {
_, err := cli.Get(ctx, "a")
if isClientTimeout(err) || isServerCtxTimeout(err) || err == rpctypes.ErrTimeout {
if clientv3test.IsClientTimeout(err) || clientv3test.IsServerCtxTimeout(err) || err == rpctypes.ErrTimeout {
return errExpected
}
return err
Expand All @@ -154,7 +155,7 @@ func TestBalancerUnderBlackholeNoKeepAliveLinearizableGet(t *testing.T) {
func TestBalancerUnderBlackholeNoKeepAliveSerializableGet(t *testing.T) {
testBalancerUnderBlackholeNoKeepAlive(t, func(cli *clientv3.Client, ctx context.Context) error {
_, err := cli.Get(ctx, "a", clientv3.WithSerializable())
if isClientTimeout(err) || isServerCtxTimeout(err) {
if clientv3test.IsClientTimeout(err) || clientv3test.IsServerCtxTimeout(err) {
return errExpected
}
return err
Expand Down Expand Up @@ -186,7 +187,7 @@ func testBalancerUnderBlackholeNoKeepAlive(t *testing.T, op func(*clientv3.Clien
defer cli.Close()

// wait for eps[0] to be pinned
mustWaitPinReady(t, cli)
clientv3test.MustWaitPinReady(t, cli)

// add all eps to list, so that when the original pined one fails
// the client can switch to other available eps
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.

package clientv3test
package connectivity_test

import (
"context"
Expand All @@ -26,21 +26,22 @@ import (
"go.etcd.io/etcd/pkg/v3/testutil"
"go.etcd.io/etcd/pkg/v3/transport"
"go.etcd.io/etcd/tests/v3/integration"
clientv3test "go.etcd.io/etcd/tests/v3/integration/clientv3"
"google.golang.org/grpc"
)

var (
testTLSInfo = transport.TLSInfo{
KeyFile: "../../fixtures/server.key.insecure",
CertFile: "../../fixtures/server.crt",
TrustedCAFile: "../../fixtures/ca.crt",
KeyFile: "../../../fixtures/server.key.insecure",
CertFile: "../../../fixtures/server.crt",
TrustedCAFile: "../../../fixtures/ca.crt",
ClientCertAuth: true,
}

testTLSInfoExpired = transport.TLSInfo{
KeyFile: "../fixtures-expired/server.key.insecure",
CertFile: "../fixtures-expired/server.crt",
TrustedCAFile: "../fixtures-expired/ca.crt",
KeyFile: "../../fixtures-expired/server.key.insecure",
CertFile: "../../fixtures-expired/server.crt",
TrustedCAFile: "../../fixtures-expired/ca.crt",
ClientCertAuth: true,
}
)
Expand All @@ -62,7 +63,7 @@ func TestDialTLSExpired(t *testing.T) {
DialOptions: []grpc.DialOption{grpc.WithBlock()},
TLS: tls,
})
if !isClientTimeout(err) {
if !clientv3test.IsClientTimeout(err) {
t.Fatalf("expected dial timeout error, got %v", err)
}
}
Expand All @@ -84,7 +85,7 @@ func TestDialTLSNoConfig(t *testing.T) {
c.Close()
}
}()
if !isClientTimeout(err) {
if !clientv3test.IsClientTimeout(err) {
t.Fatalf("expected dial timeout error, got %v", err)
}
}
Expand Down
15 changes: 15 additions & 0 deletions tests/integration/clientv3/connectivity/doc.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
// Copyright 2021 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 connectivity
15 changes: 15 additions & 0 deletions tests/integration/clientv3/connectivity/main_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
// Copyright 2013 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package connectivity

import (
"testing"

"go.etcd.io/etcd/pkg/v3/testutil"
)

func TestMain(m *testing.M) {
testutil.MustTestMainWithLeakDetection(m)
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@

// +build !cluster_proxy

package clientv3test
package connectivity_test

import (
"context"
Expand All @@ -27,6 +27,7 @@ import (
"go.etcd.io/etcd/client/v3"
"go.etcd.io/etcd/pkg/v3/testutil"
"go.etcd.io/etcd/tests/v3/integration"
"go.etcd.io/etcd/tests/v3/integration/clientv3"
"google.golang.org/grpc"
)

Expand All @@ -38,7 +39,7 @@ var errExpected = errors.New("expected error")
func TestBalancerUnderNetworkPartitionPut(t *testing.T) {
testBalancerUnderNetworkPartition(t, func(cli *clientv3.Client, ctx context.Context) error {
_, err := cli.Put(ctx, "a", "b")
if isClientTimeout(err) || isServerCtxTimeout(err) || err == rpctypes.ErrTimeout {
if clientv3test.IsClientTimeout(err) || clientv3test.IsServerCtxTimeout(err) || err == rpctypes.ErrTimeout {
return errExpected
}
return err
Expand All @@ -48,7 +49,7 @@ func TestBalancerUnderNetworkPartitionPut(t *testing.T) {
func TestBalancerUnderNetworkPartitionDelete(t *testing.T) {
testBalancerUnderNetworkPartition(t, func(cli *clientv3.Client, ctx context.Context) error {
_, err := cli.Delete(ctx, "a")
if isClientTimeout(err) || isServerCtxTimeout(err) || err == rpctypes.ErrTimeout {
if clientv3test.IsClientTimeout(err) || clientv3test.IsServerCtxTimeout(err) || err == rpctypes.ErrTimeout {
return errExpected
}
return err
Expand All @@ -61,7 +62,7 @@ func TestBalancerUnderNetworkPartitionTxn(t *testing.T) {
If(clientv3.Compare(clientv3.Version("foo"), "=", 0)).
Then(clientv3.OpPut("foo", "bar")).
Else(clientv3.OpPut("foo", "baz")).Commit()
if isClientTimeout(err) || isServerCtxTimeout(err) || err == rpctypes.ErrTimeout {
if clientv3test.IsClientTimeout(err) || clientv3test.IsServerCtxTimeout(err) || err == rpctypes.ErrTimeout {
return errExpected
}
return err
Expand All @@ -74,7 +75,7 @@ func TestBalancerUnderNetworkPartitionTxn(t *testing.T) {
func TestBalancerUnderNetworkPartitionLinearizableGetWithLongTimeout(t *testing.T) {
testBalancerUnderNetworkPartition(t, func(cli *clientv3.Client, ctx context.Context) error {
_, err := cli.Get(ctx, "a")
if isClientTimeout(err) || isServerCtxTimeout(err) || err == rpctypes.ErrTimeout {
if clientv3test.IsClientTimeout(err) || clientv3test.IsServerCtxTimeout(err) || err == rpctypes.ErrTimeout {
return errExpected
}
return err
Expand All @@ -87,7 +88,7 @@ func TestBalancerUnderNetworkPartitionLinearizableGetWithLongTimeout(t *testing.
func TestBalancerUnderNetworkPartitionLinearizableGetWithShortTimeout(t *testing.T) {
testBalancerUnderNetworkPartition(t, func(cli *clientv3.Client, ctx context.Context) error {
_, err := cli.Get(ctx, "a")
if isClientTimeout(err) || isServerCtxTimeout(err) {
if clientv3test.IsClientTimeout(err) || clientv3test.IsServerCtxTimeout(err) {
return errExpected
}
return err
Expand Down Expand Up @@ -125,7 +126,7 @@ func testBalancerUnderNetworkPartition(t *testing.T, op func(*clientv3.Client, c
defer cli.Close()

// wait for eps[0] to be pinned
mustWaitPinReady(t, cli)
clientv3test.MustWaitPinReady(t, cli)

// add other endpoints for later endpoint switch
cli.SetEndpoints(eps...)
Expand Down Expand Up @@ -235,7 +236,7 @@ func testBalancerUnderNetworkPartitionWatch(t *testing.T, isolateLeader bool) {
defer watchCli.Close()

// wait for eps[target] to be pinned
mustWaitPinReady(t, watchCli)
clientv3test.MustWaitPinReady(t, watchCli)

// add all eps to list, so that when the original pined one fails
// the client can switch to other available eps
Expand Down Expand Up @@ -290,7 +291,7 @@ func TestDropReadUnderNetworkPartition(t *testing.T) {
defer cli.Close()

// wait for eps[0] to be pinned
mustWaitPinReady(t, cli)
clientv3test.MustWaitPinReady(t, cli)

// add other endpoints for later endpoint switch
cli.SetEndpoints(eps...)
Expand Down
Loading

0 comments on commit 351bdb3

Please sign in to comment.