From 8f6607b69d841343132c218408d32f2a48c08302 Mon Sep 17 00:00:00 2001 From: Ti Chi Robot Date: Wed, 13 Oct 2021 15:07:28 +0800 Subject: [PATCH] *: migrate test-infra to testify (#344) (#364) --- Makefile | 5 +- go.mod | 17 +- go.sum | 240 ++++++++--- tools/Makefile | 5 +- tools/go.mod | 1 - tools/go.sum | 20 +- tools/go_mod_guard.go | 4 +- v4/export/block_allow_list_test.go | 37 +- v4/export/config_test.go | 24 +- v4/export/consistency_test.go | 114 ++--- v4/export/dump_test.go | 55 ++- v4/export/ir_impl_test.go | 75 ++-- v4/export/main_test.go | 61 +++ v4/export/metadata_test.go | 317 ++++++++------ v4/export/prepare_test.go | 179 ++++---- v4/export/sql_test.go | 406 +++++++++++------- v4/export/sql_type_test.go | 33 +- ...ter_util_test.go => writer_serial_test.go} | 216 +++++----- v4/export/writer_test.go | 206 +++++---- 19 files changed, 1214 insertions(+), 801 deletions(-) create mode 100644 v4/export/main_test.go rename v4/export/{writer_util_test.go => writer_serial_test.go} (65%) diff --git a/Makefile b/Makefile index 3a6b3c98..c109919b 100644 --- a/Makefile +++ b/Makefile @@ -50,12 +50,10 @@ check: static: export GO111MODULE=on static: tools @ # Not running vet and fmt through metalinter becauase it ends up looking at vendor - tools/bin/gofumports -w -d -format-only -local $(DUMPLING_PKG) $$($(PACKAGE_DIRECTORIES)) 2>&1 | $(CHECKER) tools/bin/govet --shadow $$($(PACKAGE_DIRECTORIES)) 2>&1 | $(CHECKER) @# why some lints are disabled? @# gochecknoglobals - disabled because we do use quite a lot of globals - @# goimports - executed above already, gofumports @# gofmt - ditto @# gci - ditto @# wsl - too pedantic about the formatting @@ -76,7 +74,6 @@ static: tools @# sqlclosecheck - the rows in dumpling is created in one function but closed in other functions CGO_ENABLED=0 tools/bin/golangci-lint run --enable-all --deadline 180s \ --disable gochecknoglobals \ - --disable goimports \ --disable gofmt \ --disable gci \ --disable wsl \ @@ -97,6 +94,8 @@ static: tools --disable errorlint \ --disable sqlclosecheck \ --disable scopelint \ + --disable gofumpt \ + --disable interfacer \ $$($(PACKAGE_DIRECTORIES)) # pingcap/errors APIs are mixed with multiple patterns 'pkg/errors', # 'juju/errors' and 'pingcap/parser'. To avoid confusion and mistake, diff --git a/go.mod b/go.mod index 9509a040..a13456a9 100644 --- a/go.mod +++ b/go.mod @@ -3,24 +3,31 @@ module github.com/pingcap/dumpling go 1.16 require ( + cloud.google.com/go/storage v1.16.1 // indirect github.com/DATA-DOG/go-sqlmock v1.5.0 github.com/coreos/go-semver v0.3.0 github.com/docker/go-units v0.4.0 github.com/go-sql-driver/mysql v1.6.0 - github.com/pingcap/check v0.0.0-20200212061837-5e12011dc712 + github.com/pingcap/badger v1.5.1-0.20210831093107-2f6cb8008145 // indirect github.com/pingcap/errors v0.11.5-0.20210425183316-da1aaba5fb63 github.com/pingcap/failpoint v0.0.0-20210316064728-7acb0f0a3dfd - github.com/pingcap/log v0.0.0-20210818144256-6455d4a4c6f9 - github.com/pingcap/parser v0.0.0-20210823033705-7a7940986a30 - github.com/pingcap/tidb v1.1.0-beta.0.20210827045605-d4cadb53ef12 + github.com/pingcap/log v0.0.0-20210906054005-afc726e70354 + github.com/pingcap/parser v0.0.0-20210831085004-b5390aa83f65 + github.com/pingcap/tidb v1.1.0-beta.0.20211013051927-1ff46a93327d github.com/pingcap/tidb-tools v5.2.0-alpha.0.20210727084616-915b22e4d42c+incompatible + github.com/pingcap/tipb v0.0.0-20210802080519-94b831c6db55 // indirect github.com/prometheus/client_golang v1.5.1 github.com/prometheus/client_model v0.2.0 github.com/soheilhy/cmux v0.1.4 github.com/spf13/pflag v1.0.5 - github.com/tikv/pd v1.1.0-beta.0.20210818082359-acba1da0018d + github.com/stretchr/testify v1.7.0 + github.com/tikv/client-go/v2 v2.0.0-alpha.0.20210913094925-a8fa8acd44e7 // indirect + github.com/tikv/pd v1.1.0-beta.0.20210818112400-0c5667766690 github.com/xitongsys/parquet-go v1.6.0 // indirect go.etcd.io/etcd v0.5.0-alpha.5.0.20200824191128-ae9734ed278b + go.uber.org/goleak v1.1.10 go.uber.org/zap v1.19.0 golang.org/x/sync v0.0.0-20210220032951-036812b2e83c ) + +replace google.golang.org/grpc => google.golang.org/grpc v1.29.1 diff --git a/go.sum b/go.sum index db2f3a0b..7bb8d08e 100644 --- a/go.sum +++ b/go.sum @@ -1,4 +1,3 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= @@ -8,23 +7,41 @@ cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0 h1:3ithwDMr7/3vpAMXiH+ZQnYbuIsh+OPhUPMFC9enmn0= cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= +cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= +cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= +cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= +cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= +cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= +cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= +cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= +cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= +cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= +cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= +cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= +cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= +cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= +cloud.google.com/go v0.93.3 h1:wPBktZFzYBcCZVARvwVKqH1uEj+aLXofJEtrb4oOsio= +cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0 h1:xE3CPsOgttP4ACBePh79zTKALtXwn/Edhcr16R5hMWU= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= +cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= +cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= +cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0 h1:/May9ojXjRkPBNVrq+oWLqmWCkr4OU5uRY29bu0mRyQ= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0 h1:Lpy6hKgdcl7a3WGSfJIFmxmcdjSpP6OmBEfcOv1Y680= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= +cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0 h1:UDpwYIwla4jHGzZJaEJYx1tOejbgSoNqsAfHAUYe2r8= cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= +cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= +cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +cloud.google.com/go/storage v1.16.1 h1:sMEIc4wxvoY3NXG7Rn9iP7jb/2buJgWR1vNXCR/UPfs= +cloud.google.com/go/storage v1.16.1/go.mod h1:LaNorbty3ehnU3rEjXSNV/NRgQA0O8Y+uh6bPe5UOk4= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= @@ -99,7 +116,6 @@ github.com/cheynewallace/tabby v1.1.1/go.mod h1:Pba/6cUL8uYqvOc9RkyvFbHGrQ9wShyr github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/cockroachdb/datadriven v1.0.0 h1:uhZrAfEayBecH2w2tZmhe20HJ7hDvrrA4x2Bg9YdZKM= @@ -170,8 +186,6 @@ github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:Htrtb github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5/go.mod h1:a2zkGnVExMxdzMo3M0Hi/3sEU+cWnZpSni0O6/Yb/P0= @@ -269,6 +283,8 @@ github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFU github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v0.0.0-20180814211427-aa810b61a9c7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -278,13 +294,17 @@ github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5y github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= @@ -300,7 +320,11 @@ github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5a github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ= @@ -309,14 +333,26 @@ github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.2.1 h1:d8MncMlErDFTwQGBK1xhv026j9kqhvw1Qv9IbWT1VLQ= +github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200407044318-7d83b28da2e9/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9 h1:2tft2559dNwKl2znYB58oVTql0grRB+Ml3LWIBbc4WM= +github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 h1:K6RDEckDVWvDI9JAJYCmNdQXq6neHJOYx3V6jnqNEec= +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/shlex v0.0.0-20181106134648-c34317bd91bf/go.mod h1:RpwtwJQFrIEPstU94h88MWPXP2ektJZ8cZ0YntAmXiE= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -392,7 +428,6 @@ github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/u github.com/json-iterator/go v1.1.9 h1:9yzud/Ht36ygwatGx56VwCZtlI/2AD15T1X2sjSuGns= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1 h1:6QPYqodiu3GuPL+7mfx+NwDdp2eTkp9IfEUpgAwUN0o= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/juju/errors v0.0.0-20181118221551-089d3ea4e4d5/go.mod h1:W54LbzXuIE0boCoNJfwqpmkKJ1O4TCTZMetAt6jGk7Q= @@ -516,8 +551,9 @@ github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5/go.mod h1:jvVRKCr github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2/go.mod h1:iIss55rKnNBTvrwdmkUpLnDpZoAHvWaiq5+iMmen4AE= github.com/phf/go-queue v0.0.0-20170504031614-9abe38d0371d h1:U+PMnTlV2tu7RuMK5etusZG3Cf+rpow5hqQByeCzJ2g= github.com/phf/go-queue v0.0.0-20170504031614-9abe38d0371d/go.mod h1:lXfE4PvvTW5xOjO6Mba8zDPyw8M93B6AQ7frTGnMlA8= -github.com/pingcap/badger v1.5.1-0.20200908111422-2e78ee155d19 h1:IXpGy7y9HyoShAFmzW2OPF0xCA5EOoSTyZHwsgYk9Ro= github.com/pingcap/badger v1.5.1-0.20200908111422-2e78ee155d19/go.mod h1:LyrqUOHZrUDf9oGi1yoz1+qw9ckSIhQb5eMa1acOLNQ= +github.com/pingcap/badger v1.5.1-0.20210831093107-2f6cb8008145 h1:t7sdxmfyZ3p9K7gD8t5B50TerzTvHuAPYt+VubTVKDY= +github.com/pingcap/badger v1.5.1-0.20210831093107-2f6cb8008145/go.mod h1:LyrqUOHZrUDf9oGi1yoz1+qw9ckSIhQb5eMa1acOLNQ= github.com/pingcap/check v0.0.0-20190102082844-67f458068fc8/go.mod h1:B1+S9LNcuMyLH/4HMTViQOJevkGiik3wW2AN9zb2fNQ= github.com/pingcap/check v0.0.0-20191107115940-caf2b9e6ccf4/go.mod h1:PYMCGwN0JHjoqGr3HrZoD+b8Tgx8bKnArhSq8YVzUMc= github.com/pingcap/check v0.0.0-20191216031241-8a5a85928f12/go.mod h1:PYMCGwN0JHjoqGr3HrZoD+b8Tgx8bKnArhSq8YVzUMc= @@ -552,24 +588,26 @@ github.com/pingcap/log v0.0.0-20200511115504-543df19646ad/go.mod h1:4rbK1p9ILyIf github.com/pingcap/log v0.0.0-20201112100606-8f1e84a3abc8/go.mod h1:4rbK1p9ILyIfb6hU7OG2CiWSqMXnp3JMbiaVJ6mvoY8= github.com/pingcap/log v0.0.0-20210317133921-96f4fcab92a4/go.mod h1:4rbK1p9ILyIfb6hU7OG2CiWSqMXnp3JMbiaVJ6mvoY8= github.com/pingcap/log v0.0.0-20210625125904-98ed8e2eb1c7/go.mod h1:8AanEdAHATuRurdGxZXBz0At+9avep+ub7U1AGYLIMM= -github.com/pingcap/log v0.0.0-20210818144256-6455d4a4c6f9 h1:6t7vOzOGF3/iz+wpcwu8N/+aoWTOMq2xc+Y0pYMJOhU= github.com/pingcap/log v0.0.0-20210818144256-6455d4a4c6f9/go.mod h1:DWQW5jICDR7UJh4HtxXSM20Churx4CQL0fwL/SoOSA4= +github.com/pingcap/log v0.0.0-20210906054005-afc726e70354 h1:SvWCbCPh1YeHd9yQLksvJYAgft6wLTY1aNG81tpyscQ= +github.com/pingcap/log v0.0.0-20210906054005-afc726e70354/go.mod h1:DWQW5jICDR7UJh4HtxXSM20Churx4CQL0fwL/SoOSA4= github.com/pingcap/parser v0.0.0-20210525032559-c37778aff307/go.mod h1:xZC8I7bug4GJ5KtHhgAikjTfU4kBv1Sbo3Pf1MZ6lVw= -github.com/pingcap/parser v0.0.0-20210823033705-7a7940986a30 h1:UPeHfUVa9AanMJJ1Sp6+WRWYazL4qHCDcYwP33L5ZUw= -github.com/pingcap/parser v0.0.0-20210823033705-7a7940986a30/go.mod h1:Ek0mLKEqUGnQqBw1JnYrJQxsguU433DU68yUbsoeJ7s= +github.com/pingcap/parser v0.0.0-20210831085004-b5390aa83f65 h1:pWIhXRyuRoheeAx62zIfz5xYzX4IHjDnYHX2dDuiEqY= +github.com/pingcap/parser v0.0.0-20210831085004-b5390aa83f65/go.mod h1:Ek0mLKEqUGnQqBw1JnYrJQxsguU433DU68yUbsoeJ7s= github.com/pingcap/sysutil v0.0.0-20200206130906-2bfa6dc40bcd/go.mod h1:EB/852NMQ+aRKioCpToQ94Wl7fktV+FNnxf3CX/TTXI= github.com/pingcap/sysutil v0.0.0-20210315073920-cc0985d983a3/go.mod h1:tckvA041UWP+NqYzrJ3fMgC/Hw9wnmQ/tUkp/JaHly8= github.com/pingcap/sysutil v0.0.0-20210730114356-fcd8a63f68c5 h1:7rvAtZe/ZUzOKzgriNPQoBNvleJXBk4z7L3Z47+tS98= github.com/pingcap/sysutil v0.0.0-20210730114356-fcd8a63f68c5/go.mod h1:XsOaV712rUk63aOEKYP9PhXTIE3FMNHmC2r1wX5wElY= -github.com/pingcap/tidb v1.1.0-beta.0.20210827045605-d4cadb53ef12 h1:betFjntgxW9sOfy4y0SJ3xrS1Mw0l1D1UE5zOUJ/nD8= -github.com/pingcap/tidb v1.1.0-beta.0.20210827045605-d4cadb53ef12/go.mod h1:l9fxVqsmjYB+Y8u/VjmiAtDkcX7vl+v5eMdUmcQKgdA= +github.com/pingcap/tidb v1.1.0-beta.0.20211013051927-1ff46a93327d h1:e8Z3K0NuFOpaQOutcA4OTndy6NSPLnctEh5z/7Mjh1Q= +github.com/pingcap/tidb v1.1.0-beta.0.20211013051927-1ff46a93327d/go.mod h1:wXXwCoDXHR0MrARaTFQrmBMhLaaskV+K8e8b3Od9d9E= github.com/pingcap/tidb-dashboard v0.0.0-20210312062513-eef5d6404638/go.mod h1:OzFN8H0EDMMqeulPhPMw2i2JaiZWOKFQ7zdRPhENNgo= github.com/pingcap/tidb-dashboard v0.0.0-20210716172320-2226872e3296/go.mod h1:OCXbZTBTIMRcIt0jFsuCakZP+goYRv6IjawKbwLS2TQ= github.com/pingcap/tidb-tools v5.0.3+incompatible/go.mod h1:XGdcy9+yqlDSEMTpOXnwf3hiTeqrV6MN/u1se9N8yIM= github.com/pingcap/tidb-tools v5.2.0-alpha.0.20210727084616-915b22e4d42c+incompatible h1:3UusiiE+cbOYzjMT3oxk2gN3lUT0ccjMiul51EEvZZc= github.com/pingcap/tidb-tools v5.2.0-alpha.0.20210727084616-915b22e4d42c+incompatible/go.mod h1:XGdcy9+yqlDSEMTpOXnwf3hiTeqrV6MN/u1se9N8yIM= -github.com/pingcap/tipb v0.0.0-20210708040514-0f154bb0dc0f h1:q6WgGOeY+hbkvtKLyi6nAew7Ptl5vXyeI61VJuJdXnQ= github.com/pingcap/tipb v0.0.0-20210708040514-0f154bb0dc0f/go.mod h1:A7mrd7WHBl1o63LE2bIBGEJMTNWXqhgmYiOvMLxozfs= +github.com/pingcap/tipb v0.0.0-20210802080519-94b831c6db55 h1:oxOovwOzm7VD37XpDo9NUtfGddZMwLpjtaQOxAq6HKg= +github.com/pingcap/tipb v0.0.0-20210802080519-94b831c6db55/go.mod h1:A7mrd7WHBl1o63LE2bIBGEJMTNWXqhgmYiOvMLxozfs= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= @@ -685,11 +723,12 @@ github.com/tiancaiamao/appdash v0.0.0-20181126055449-889f96f722a2/go.mod h1:2PfK github.com/tidwall/gjson v1.3.5/go.mod h1:P256ACg0Mn+j1RXIDXoss50DeIABTYK1PULOJHhxOls= github.com/tidwall/match v1.0.1/go.mod h1:LujAq0jyVjBy028G1WhWfIzbpQfMO8bBZ6Tyb0+pL9E= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= -github.com/tikv/client-go/v2 v2.0.0-alpha.0.20210824090536-16d902a3c7e5 h1:7CJYiW8gKiI3IQOQSAZyqZq0GxB+bmrnZgk9QNZ1cPo= -github.com/tikv/client-go/v2 v2.0.0-alpha.0.20210824090536-16d902a3c7e5/go.mod h1:KwtZXt0JD+bP9bWW2ka0ir3Wp3oTEfZUTh22bs2sI4o= +github.com/tikv/client-go/v2 v2.0.0-alpha.0.20210820060448-daddf73a0706/go.mod h1:KwtZXt0JD+bP9bWW2ka0ir3Wp3oTEfZUTh22bs2sI4o= +github.com/tikv/client-go/v2 v2.0.0-alpha.0.20210913094925-a8fa8acd44e7 h1:ZK5tbTW6v4dr3OhLqqldgzIlGmZso6KrGjFh7T590VA= +github.com/tikv/client-go/v2 v2.0.0-alpha.0.20210913094925-a8fa8acd44e7/go.mod h1:KwtZXt0JD+bP9bWW2ka0ir3Wp3oTEfZUTh22bs2sI4o= github.com/tikv/pd v1.1.0-beta.0.20210323121136-78679e5e209d/go.mod h1:Jw9KG11C/23Rr7DW4XWQ7H5xOgGZo6DFL1OKAF4+Igw= -github.com/tikv/pd v1.1.0-beta.0.20210818082359-acba1da0018d h1:AFm1Dzw+QRUevWRfrFp45CPPkuK/zdSWcfxI10z+WVE= -github.com/tikv/pd v1.1.0-beta.0.20210818082359-acba1da0018d/go.mod h1:rammPjeZgpvfrQRPkijcx8tlxF1XM5+m6kRXrkDzCAA= +github.com/tikv/pd v1.1.0-beta.0.20210818112400-0c5667766690 h1:qGn7fDqj7IZ5dozy7QVkoj+0bama92ruVGHqoCBg7W4= +github.com/tikv/pd v1.1.0-beta.0.20210818112400-0c5667766690/go.mod h1:rammPjeZgpvfrQRPkijcx8tlxF1XM5+m6kRXrkDzCAA= github.com/tklauser/go-sysconf v0.3.4 h1:HT8SVixZd3IzLdfs/xlpq0jeSfTX57g1v6wB1EuzV7M= github.com/tklauser/go-sysconf v0.3.4/go.mod h1:Cl2c8ZRWfHD5IrfHo9VN+FX9kCFjIOyVklgXycLB6ek= github.com/tklauser/numcpus v0.2.1 h1:ct88eFm+Q7m2ZfXJdan1xYoXKlmwsfP+k88q05KvlZc= @@ -745,7 +784,9 @@ github.com/yookoala/realpath v1.0.0/go.mod h1:gJJMA9wuX7AcqLy1+ffPatSCySA1FQ2S8Y github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= github.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZkTdatxwunjIkc= +github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= @@ -760,8 +801,10 @@ go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5 h1:dntmOdLpSpHlVqbW5Eay97DelsZHe+55D+xC6i0dDS0= +go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= +go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M= +go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= @@ -826,7 +869,6 @@ golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86h golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= @@ -847,10 +889,10 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo= +golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -867,6 +909,7 @@ golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR golang.org/x/net v0.0.0-20190611141213-3f473d35a33a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -877,10 +920,22 @@ golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420 h1:a8jGStKg0XqKDlKqjLrXn0ioF5MH36pT7Z0BRTqLhbk= golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= @@ -888,19 +943,30 @@ golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAG golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d h1:TzXSXBo42m9gQenoE3b9BGiEpg5IG2JkU5FkPIawgtw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a h1:4Kd8OPUx1xgUwrHDaviWZO8MsgoZTZYC3g+8m16RBww= +golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180816055513-1c9583448a9c/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -939,23 +1005,42 @@ golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210217105451-b926d437f341/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c h1:F1jZWGFhYfh0Ci55sIpILtKKK8p3i2/krTr0H1rg74I= +golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069 h1:siQdpVirKtzPhKl3lZWozZraCFObP8S1v6PRp0bLrtU= +golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= @@ -969,7 +1054,6 @@ golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGm golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181221001348-537d06c36207/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= @@ -1011,14 +1095,31 @@ golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapK golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200225230052-807dcd883420/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200527183253-8e7acdbce89d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201125231158-b5590deeca9b/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210112230658-8b4aab62c064/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5 h1:ouewzE6p+/VEB31YYnTbEJdi8pFqKp4P4n85vwo3DHA= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= @@ -1040,15 +1141,31 @@ google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsb google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0 h1:J1Pl9P2lnmYFSJvgs70DKELqHNh8CNWXPbud4njEE2s= google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= +google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= +google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= +google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= +google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= +google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= +google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= +google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= +google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= +google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= +google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= +google.golang.org/api v0.54.0 h1:ECJUVngj71QI6XEm7b1sAf8BljU5inEhMbKPR8Lxhhk= +google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5 h1:tycE03LOZYQNhDpS27tcQdAzLCVMaj7QT2SXxebnpCM= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= +google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/genproto v0.0.0-20180518175338-11a468237815/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20181004005441-af9cb2a35e7f/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= @@ -1069,32 +1186,57 @@ google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvx google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171 h1:xes2Q2k+d/+YNXVw0FpZkIDJiaux4OVrRKXRAzH6A0U= +google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/grpc v0.0.0-20180607172857-7a6a684ca69e/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= -google.golang.org/grpc v1.12.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= +google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= +google.golang.org/genproto v0.0.0-20210825212027-de86158e7fda h1:iT5uhT54PtbqUsWddv/nnEWdE5e/MTr+Nv3vjxlBP1A= +google.golang.org/genproto v0.0.0-20210825212027-de86158e7fda/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= google.golang.org/grpc v1.29.1 h1:EC2SB8S04d2r73uptxphDSUG+kTKVgjRPF+N3xpxRB4= google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0 h1:bxAC2xTBsZGibn2RTntX0oH50xLsqy1OxA9tTL3p/lk= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ= +google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= gopkg.in/alecthomas/gometalinter.v2 v2.0.12/go.mod h1:NDRytsqEZyolNuAgTzJkZMkSQM7FIKyzVzGhjB/qfYo= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/alecthomas/kingpin.v3-unstable v3.0.0-20180810215634-df19058c872c/go.mod h1:3HH7i1SgMqlzxCcBmUHW657sD4Kvv9sC3HpL3YukzwA= @@ -1144,7 +1286,7 @@ honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.2.0 h1:ws8AfbgTX3oIczLPNPCu5166oBg9ST2vNs0rcht+mDE= +honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.2.0/go.mod h1:lPVVZ2BS5TfnjLyizF7o7hv7j9/L+8cZY2hLyjP9cGY= k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= modernc.org/mathutil v1.2.2 h1:+yFk8hBprV+4c0U9GjFtL+dV3N8hOJ8JCituQcMShFY= diff --git a/tools/Makefile b/tools/Makefile index 5a8f3879..468f9840 100644 --- a/tools/Makefile +++ b/tools/Makefile @@ -1,7 +1,4 @@ -all: bin/gofumports bin/govet bin/revive bin/golangci-lint bin/failpoint-ctl - -bin/gofumports: - go build -o $@ mvdan.cc/gofumpt/gofumports +all: bin/govet bin/revive bin/golangci-lint bin/failpoint-ctl bin/govet: go build -o $@ github.com/dnephin/govet diff --git a/tools/go.mod b/tools/go.mod index 9036d827..dae27d23 100644 --- a/tools/go.mod +++ b/tools/go.mod @@ -7,5 +7,4 @@ require ( github.com/golangci/golangci-lint v1.33.0 github.com/mgechev/revive v1.0.2 github.com/pingcap/failpoint v0.0.0-20200702092429-9f69995143ce - mvdan.cc/gofumpt v0.0.0-20201123090407-3077abae40c0 ) diff --git a/tools/go.sum b/tools/go.sum index b9c528aa..cf55c6ed 100644 --- a/tools/go.sum +++ b/tools/go.sum @@ -151,9 +151,8 @@ github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.2 h1:X2ev0eStA3AbceY54o37/0PQ/UWqKEiiO2dKL5OPaFM= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3 h1:x95R7cp+rSeeqAMI2knLtQ0DKlaBhv2NrtrOvafPHRo= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= @@ -335,8 +334,6 @@ github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6So github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.5.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rogpeppe/go-internal v1.6.2 h1:aIihoIOHCiLZHxyoNQ+ABL4NKhFTgKLBdMLyEAh98m0= -github.com/rogpeppe/go-internal v1.6.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryancurrah/gomodguard v1.1.0 h1:DWbye9KyMgytn8uYpuHkwf0RHqAYO6Ay/D0TbCpPtVU= github.com/ryancurrah/gomodguard v1.1.0/go.mod h1:4O8tr7hBODaGE6VIhfJDHcwzh5GUccKSJBU0UMXJFVM= @@ -476,9 +473,8 @@ golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200602114024-627f9648deb9/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202 h1:VvcQYSHwXgi7W+TpUR6A9g6Up98WAHf3f/ulnJ62IyA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201021035429-f5854403a974 h1:IX6qOQeG5uLjB/hjjwjedwfjND0hgjPMMyO1RoIXQNI= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -489,7 +485,6 @@ golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -515,14 +510,12 @@ golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201009025420-dfb3f7c4e634 h1:bNEHhJCnrwMKNMmOx3yAynp5vs5/gRy+XWFtZFu7NBM= golang.org/x/sys v0.0.0-20201009025420-dfb3f7c4e634/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -570,9 +563,8 @@ golang.org/x/tools v0.0.0-20201001104356-43ebab892c4c/go.mod h1:z6u4i615ZeAfBE4X golang.org/x/tools v0.0.0-20201002184944-ecd9fd270d5d/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= golang.org/x/tools v0.0.0-20201007032633-0806396f153e/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= golang.org/x/tools v0.0.0-20201011145850-ed2f50202694/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= +golang.org/x/tools v0.0.0-20201013201025-64a9e34f3752 h1:2ntEwh02rqo2jSsrYmp4yKHHjh0CbXP3ZtSUetSB+q8= golang.org/x/tools v0.0.0-20201013201025-64a9e34f3752/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= -golang.org/x/tools v0.0.0-20201121010211-780cb80bd7fb h1:z5+u0pkAUPUWd3taoTialQ2JAMo4Wo1Z3L25U4ZV9r0= -golang.org/x/tools v0.0.0-20201121010211-780cb80bd7fb/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -611,7 +603,6 @@ gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/errgo.v2 v2.1.0 h1:0vLT13EuvQ0hNvakwLuFZ/jYrLp5F3kcWHXdRggjCE8= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/ini.v1 v1.51.0 h1:AQvPpx3LzTDM0AjnIRlVFwFFGC+npRopjZxLJj6gdno= @@ -635,9 +626,8 @@ honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt honnef.co/go/tools v0.0.1-2020.1.6 h1:W18jzjh8mfPez+AwGLxmOImucz/IFjpNlrKVnaj2YVc= honnef.co/go/tools v0.0.1-2020.1.6/go.mod h1:pyyisuGw24ruLjrr1ddx39WE0y9OooInRzEYLhQB2YY= k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= +mvdan.cc/gofumpt v0.0.0-20200802201014-ab5a8192947d h1:t8TAw9WgTLghti7RYkpPmqk4JtQ3+wcP5GgZqgWeWLQ= mvdan.cc/gofumpt v0.0.0-20200802201014-ab5a8192947d/go.mod h1:bzrjFmaD6+xqohD3KYP0H2FEuxknnBmyyOxdhLdaIws= -mvdan.cc/gofumpt v0.0.0-20201123090407-3077abae40c0 h1:kQ90sSvDP83HYKOsmrpDtcKkbWPjWYL2LmSCz1oE6vE= -mvdan.cc/gofumpt v0.0.0-20201123090407-3077abae40c0/go.mod h1:E4LOcu9JQEtnYXtB1Y51drqh2Qr2Ngk9J3YrRCwcbd0= mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed h1:WX1yoOaKQfddO/mLzdV4wptyWgoH/6hwLs7QHTixo0I= mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed/go.mod h1:Xkxe497xwlCKkIaQYRfC7CSLworTXY9RMqwhhCm+8Nc= mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b h1:DxJ5nJdkhDlLok9K6qO+5290kphDJbHOQO1DFFFTeBo= diff --git a/tools/go_mod_guard.go b/tools/go_mod_guard.go index 969d4f2b..15cf078d 100644 --- a/tools/go_mod_guard.go +++ b/tools/go_mod_guard.go @@ -14,7 +14,5 @@ import ( // failpoint enables manual 'failure' of some execution points. _ "github.com/pingcap/failpoint" - - // A stricter gofmt - _ "mvdan.cc/gofumpt/gofumports" + _ "github.com/pingcap/failpoint/code" ) diff --git a/v4/export/block_allow_list_test.go b/v4/export/block_allow_list_test.go index 845bcfba..cdc784ac 100644 --- a/v4/export/block_allow_list_test.go +++ b/v4/export/block_allow_list_test.go @@ -4,19 +4,17 @@ package export import ( "strings" + "testing" tcontext "github.com/pingcap/dumpling/v4/context" - - . "github.com/pingcap/check" "github.com/pingcap/tidb-tools/pkg/filter" tf "github.com/pingcap/tidb-tools/pkg/table-filter" + "github.com/stretchr/testify/require" ) -var _ = Suite(&testBWListSuite{}) - -type testBWListSuite struct{} +func TestFilterTables(t *testing.T) { + t.Parallel() -func (s *testBWListSuite) TestFilterTables(c *C) { tctx := tcontext.Background().WithLogger(appLogger) dbTables := DatabaseTables{} expectedDBTables := DatabaseTables{} @@ -28,7 +26,8 @@ func (s *testBWListSuite) TestFilterTables(c *C) { dbTables.AppendTables("yyy", []string{"xxx"}, []uint64{0}) tableFilter, err := tf.Parse([]string{"*.*"}) - c.Assert(err, IsNil) + require.NoError(t, err) + conf := &Config{ ServerInfo: ServerInfo{ ServerType: ServerTypeTiDB, @@ -36,18 +35,20 @@ func (s *testBWListSuite) TestFilterTables(c *C) { Tables: dbTables, TableFilter: tableFilter, } - databases := []string{filter.InformationSchemaName, filter.PerformanceSchemaName, "xxx", "yyy"} - c.Assert(filterDatabases(tctx, conf, databases), DeepEquals, databases) + require.Equal(t, databases, filterDatabases(tctx, conf, databases)) conf.TableFilter = tf.NewSchemasFilter("xxx") - c.Assert(filterDatabases(tctx, conf, databases), DeepEquals, []string{"xxx"}) + require.Equal(t, []string{"xxx"}, filterDatabases(tctx, conf, databases)) + filterTables(tcontext.Background(), conf) - c.Assert(conf.Tables, HasLen, 1) - c.Assert(conf.Tables, DeepEquals, expectedDBTables) + require.Len(t, conf.Tables, 1) + require.Equal(t, expectedDBTables, conf.Tables) } -func (s *testBWListSuite) TestFilterDatabaseWithNoTable(c *C) { +func TestFilterDatabaseWithNoTable(t *testing.T) { + t.Parallel() + dbTables := DatabaseTables{} expectedDBTables := DatabaseTables{} @@ -61,21 +62,21 @@ func (s *testBWListSuite) TestFilterDatabaseWithNoTable(c *C) { DumpEmptyDatabase: true, } filterTables(tcontext.Background(), conf) - c.Assert(conf.Tables, HasLen, 0) + require.Len(t, conf.Tables, 0) dbTables["xxx"] = []*TableInfo{} expectedDBTables["xxx"] = []*TableInfo{} conf.Tables = dbTables conf.TableFilter = tf.NewSchemasFilter("xxx") filterTables(tcontext.Background(), conf) - c.Assert(conf.Tables, HasLen, 1) - c.Assert(conf.Tables, DeepEquals, expectedDBTables) + require.Len(t, conf.Tables, 1) + require.Equal(t, expectedDBTables, conf.Tables) dbTables["xxx"] = []*TableInfo{} expectedDBTables = DatabaseTables{} conf.Tables = dbTables conf.DumpEmptyDatabase = false filterTables(tcontext.Background(), conf) - c.Assert(conf.Tables, HasLen, 0) - c.Assert(conf.Tables, DeepEquals, expectedDBTables) + require.Len(t, conf.Tables, 0) + require.Equal(t, expectedDBTables, conf.Tables) } diff --git a/v4/export/config_test.go b/v4/export/config_test.go index d76245fa..c8a15315 100644 --- a/v4/export/config_test.go +++ b/v4/export/config_test.go @@ -3,23 +3,22 @@ package export import ( - tcontext "github.com/pingcap/dumpling/v4/context" + "testing" - . "github.com/pingcap/check" + tcontext "github.com/pingcap/dumpling/v4/context" + "github.com/stretchr/testify/require" ) -var _ = Suite(&testConfigSuite{}) - -type testConfigSuite struct{} - -func (s *testConfigSuite) TestCreateExternalStorage(c *C) { - mockConfig := defaultConfigForTest(c) +func TestCreateExternalStorage(t *testing.T) { + t.Parallel() + mockConfig := defaultConfigForTest(t) loc, err := mockConfig.createExternalStorage(tcontext.Background()) - c.Assert(err, IsNil) - c.Assert(loc.URI(), Matches, "file:.*") + require.NoError(t, err) + require.Regexp(t, "file:.*", loc.URI()) } -func (s *testConfigSuite) TestMatchMysqlBugversion(c *C) { +func TestMatchMysqlBugVersion(t *testing.T) { + t.Parallel() cases := []struct { serverInfo ServerInfo expected bool @@ -31,7 +30,6 @@ func (s *testConfigSuite) TestMatchMysqlBugversion(c *C) { {ParseServerInfo(tcontext.Background(), "8.0.23"), false}, } for _, x := range cases { - cmt := Commentf("server info %s", x.serverInfo) - c.Assert(x.expected, Equals, matchMysqlBugversion(x.serverInfo), cmt) + require.Equalf(t, x.expected, matchMysqlBugversion(x.serverInfo), "server info: %s", x.serverInfo) } } diff --git a/v4/export/consistency_test.go b/v4/export/consistency_test.go index 931dc49e..5e54fcfb 100644 --- a/v4/export/consistency_test.go +++ b/v4/export/consistency_test.go @@ -5,63 +5,55 @@ package export import ( "context" "errors" - "strings" + "testing" tcontext "github.com/pingcap/dumpling/v4/context" + "github.com/stretchr/testify/require" "github.com/DATA-DOG/go-sqlmock" "github.com/go-sql-driver/mysql" - . "github.com/pingcap/check" ) -var _ = Suite(&testConsistencySuite{}) +func TestConsistencyController(t *testing.T) { + t.Parallel() -type testConsistencySuite struct{} - -func (s *testConsistencySuite) assertNil(err error, c *C) { - if err != nil { - c.Fatal(err.Error()) - } -} - -func (s *testConsistencySuite) assertLifetimeErrNil(tctx *tcontext.Context, ctrl ConsistencyController, c *C) { - s.assertNil(ctrl.Setup(tctx), c) - s.assertNil(ctrl.TearDown(tctx), c) -} - -func (s *testConsistencySuite) TestConsistencyController(c *C) { db, mock, err := sqlmock.New() - c.Assert(err, IsNil) - defer db.Close() + require.NoError(t, err) + defer func() { + _ = db.Close() + }() + ctx, cancel := context.WithCancel(context.Background()) defer cancel() + tctx := tcontext.Background().WithContext(ctx) - conf := defaultConfigForTest(c) + conf := defaultConfigForTest(t) resultOk := sqlmock.NewResult(0, 1) conf.Consistency = consistencyTypeNone ctrl, _ := NewConsistencyController(ctx, conf, db) _, ok := ctrl.(*ConsistencyNone) - c.Assert(ok, IsTrue) - s.assertLifetimeErrNil(tctx, ctrl, c) + require.True(t, ok) + require.NoError(t, ctrl.Setup(tctx)) + require.NoError(t, ctrl.TearDown(tctx)) conf.Consistency = consistencyTypeFlush mock.ExpectExec("FLUSH TABLES WITH READ LOCK").WillReturnResult(resultOk) mock.ExpectExec("UNLOCK TABLES").WillReturnResult(resultOk) ctrl, _ = NewConsistencyController(ctx, conf, db) _, ok = ctrl.(*ConsistencyFlushTableWithReadLock) - c.Assert(ok, IsTrue) - s.assertLifetimeErrNil(tctx, ctrl, c) - if err = mock.ExpectationsWereMet(); err != nil { - c.Fatal(err.Error()) - } + require.True(t, ok) + require.NoError(t, ctrl.Setup(tctx)) + require.NoError(t, ctrl.TearDown(tctx)) + require.NoError(t, mock.ExpectationsWereMet()) conf.Consistency = consistencyTypeSnapshot conf.ServerInfo.ServerType = ServerTypeTiDB ctrl, _ = NewConsistencyController(ctx, conf, db) _, ok = ctrl.(*ConsistencyNone) - c.Assert(ok, IsTrue) - s.assertLifetimeErrNil(tctx, ctrl, c) + require.True(t, ok) + require.NoError(t, ctrl.Setup(tctx)) + require.NoError(t, ctrl.TearDown(tctx)) conf.Consistency = consistencyTypeLock conf.Tables = NewDatabaseTables(). @@ -71,19 +63,25 @@ func (s *testConsistencySuite) TestConsistencyController(c *C) { mock.ExpectExec("UNLOCK TABLES").WillReturnResult(resultOk) ctrl, _ = NewConsistencyController(ctx, conf, db) _, ok = ctrl.(*ConsistencyLockDumpingTables) - c.Assert(ok, IsTrue) - s.assertLifetimeErrNil(tctx, ctrl, c) - c.Assert(mock.ExpectationsWereMet(), IsNil) + require.True(t, ok) + require.NoError(t, ctrl.Setup(tctx)) + require.NoError(t, ctrl.TearDown(tctx)) + require.NoError(t, mock.ExpectationsWereMet()) } -func (s *testConsistencySuite) TestConsistencyLockControllerRetry(c *C) { +func TestConsistencyLockControllerRetry(t *testing.T) { + t.Parallel() + db, mock, err := sqlmock.New() - c.Assert(err, IsNil) - defer db.Close() + require.NoError(t, err) + defer func() { + _ = db.Close() + }() + ctx, cancel := context.WithCancel(context.Background()) defer cancel() tctx := tcontext.Background().WithContext(ctx) - conf := defaultConfigForTest(c) + conf := defaultConfigForTest(t) resultOk := sqlmock.NewResult(0, 1) conf.Consistency = consistencyTypeLock @@ -96,18 +94,22 @@ func (s *testConsistencySuite) TestConsistencyLockControllerRetry(c *C) { mock.ExpectExec("UNLOCK TABLES").WillReturnResult(resultOk) ctrl, _ := NewConsistencyController(ctx, conf, db) _, ok := ctrl.(*ConsistencyLockDumpingTables) - c.Assert(ok, IsTrue) - s.assertLifetimeErrNil(tctx, ctrl, c) + require.True(t, ok) + require.NoError(t, ctrl.Setup(tctx)) + require.NoError(t, ctrl.TearDown(tctx)) + // should remove table db1.t3 in tables to dump expectedDumpTables := NewDatabaseTables(). AppendTables("db1", []string{"t1", "t2"}, []uint64{1, 2}). AppendViews("db2", "t4") - c.Assert(conf.Tables, DeepEquals, expectedDumpTables) - c.Assert(mock.ExpectationsWereMet(), IsNil) + require.Equal(t, expectedDumpTables, conf.Tables) + require.NoError(t, mock.ExpectationsWereMet()) } -func (s *testConsistencySuite) TestResolveAutoConsistency(c *C) { - conf := defaultConfigForTest(c) +func TestResolveAutoConsistency(t *testing.T) { + t.Parallel() + + conf := defaultConfigForTest(t) cases := []struct { serverTp ServerType resolvedConsistency string @@ -122,38 +124,42 @@ func (s *testConsistencySuite) TestResolveAutoConsistency(c *C) { conf.Consistency = consistencyTypeAuto conf.ServerInfo.ServerType = x.serverTp d := &Dumper{conf: conf} - c.Assert(resolveAutoConsistency(d), IsNil) - cmt := Commentf("server type %s", x.serverTp.String()) - c.Assert(conf.Consistency, Equals, x.resolvedConsistency, cmt) + require.NoError(t, resolveAutoConsistency(d)) + require.Equalf(t, x.resolvedConsistency, conf.Consistency, "server type: %s", x.serverTp.String()) } } -func (s *testConsistencySuite) TestConsistencyControllerError(c *C) { +func TestConsistencyControllerError(t *testing.T) { + t.Parallel() + db, mock, err := sqlmock.New() - c.Assert(err, IsNil) - defer db.Close() + require.NoError(t, err) + defer func() { + require.NoError(t, db.Close()) + }() + ctx, cancel := context.WithCancel(context.Background()) defer cancel() tctx := tcontext.Background().WithContext(ctx) - conf := defaultConfigForTest(c) + conf := defaultConfigForTest(t) conf.Consistency = "invalid_str" _, err = NewConsistencyController(ctx, conf, db) - c.Assert(err, NotNil) - c.Assert(strings.Contains(err.Error(), "invalid consistency option"), IsTrue) + require.Error(t, err) + require.Contains(t, err.Error(), "invalid consistency option") // snapshot consistency is only available in TiDB conf.Consistency = consistencyTypeSnapshot conf.ServerInfo.ServerType = ServerTypeUnknown _, err = NewConsistencyController(ctx, conf, db) - c.Assert(err, NotNil) + require.Error(t, err) // flush consistency is unavailable in TiDB conf.Consistency = consistencyTypeFlush conf.ServerInfo.ServerType = ServerTypeTiDB ctrl, _ := NewConsistencyController(ctx, conf, db) err = ctrl.Setup(tctx) - c.Assert(err, NotNil) + require.Error(t, err) // lock table fail conf.Consistency = consistencyTypeLock @@ -161,5 +167,5 @@ func (s *testConsistencySuite) TestConsistencyControllerError(c *C) { mock.ExpectExec("LOCK TABLE").WillReturnError(errors.New("")) ctrl, _ = NewConsistencyController(ctx, conf, db) err = ctrl.Setup(tctx) - c.Assert(err, NotNil) + require.Error(t, err) } diff --git a/v4/export/dump_test.go b/v4/export/dump_test.go index da55debc..2eff6387 100644 --- a/v4/export/dump_test.go +++ b/v4/export/dump_test.go @@ -5,20 +5,25 @@ package export import ( "context" "fmt" + "testing" "time" tcontext "github.com/pingcap/dumpling/v4/context" + "github.com/stretchr/testify/require" "github.com/DATA-DOG/go-sqlmock" - . "github.com/pingcap/check" "github.com/pingcap/errors" "golang.org/x/sync/errgroup" ) -func (s *testSQLSuite) TestDumpBlock(c *C) { +func TestDumpBlock(t *testing.T) { + t.Parallel() + db, mock, err := sqlmock.New() - c.Assert(err, IsNil) - defer db.Close() + require.NoError(t, err) + defer func() { + require.NoError(t, db.Close()) + }() mock.ExpectQuery(fmt.Sprintf("SHOW CREATE DATABASE `%s`", escapeString(database))). WillReturnRows(sqlmock.NewRows([]string{"Database", "Create Database"}). @@ -27,7 +32,7 @@ func (s *testSQLSuite) TestDumpBlock(c *C) { tctx, cancel := tcontext.Background().WithLogger(appLogger).WithCancel() defer cancel() conn, err := db.Conn(tctx) - c.Assert(err, IsNil) + require.NoError(t, err) d := &Dumper{ tctx: tctx, @@ -49,19 +54,24 @@ func (s *testSQLSuite) TestDumpBlock(c *C) { taskChan := make(chan Task, 1) taskChan <- &TaskDatabaseMeta{} d.conf.Tables = DatabaseTables{}.AppendTable(database, nil) - c.Assert(errors.ErrorEqual(d.dumpDatabases(writerCtx, conn, taskChan), context.Canceled), IsTrue) - c.Assert(errors.ErrorEqual(wg.Wait(), writerErr), IsTrue) + require.ErrorIs(t, d.dumpDatabases(writerCtx, conn, taskChan), context.Canceled) + require.ErrorIs(t, wg.Wait(), writerErr) } -func (s *testSQLSuite) TestDumpTableMeta(c *C) { +func TestDumpTableMeta(t *testing.T) { + t.Parallel() + db, mock, err := sqlmock.New() - c.Assert(err, IsNil) - defer db.Close() + require.NoError(t, err) + defer func() { + require.NoError(t, db.Close()) + }() tctx, cancel := tcontext.Background().WithLogger(appLogger).WithCancel() defer cancel() conn, err := db.Conn(tctx) - c.Assert(err, IsNil) + require.NoError(t, err) + conf := DefaultConfig() conf.NoSchemas = true @@ -79,18 +89,20 @@ func (s *testSQLSuite) TestDumpTableMeta(c *C) { mock.ExpectQuery(fmt.Sprintf("SELECT \\* FROM `%s`.`%s`", database, table)). WillReturnRows(sqlmock.NewRows([]string{"id"}).AddRow(1)) meta, err := dumpTableMeta(conf, conn, database, &TableInfo{Type: TableTypeBase, Name: table}) - c.Assert(err, IsNil) - c.Assert(meta.DatabaseName(), Equals, database) - c.Assert(meta.TableName(), Equals, table) - c.Assert(meta.SelectedField(), Equals, "*") - c.Assert(meta.SelectedLen(), Equals, 1) - c.Assert(meta.ShowCreateTable(), Equals, "") - c.Assert(meta.HasImplicitRowID(), Equals, hasImplicitRowID) + require.NoError(t, err) + require.Equal(t, database, meta.DatabaseName()) + require.Equal(t, table, meta.TableName()) + require.Equal(t, "*", meta.SelectedField()) + require.Equal(t, 1, meta.SelectedLen()) + require.Equal(t, "", meta.ShowCreateTable()) + require.Equal(t, hasImplicitRowID, meta.HasImplicitRowID()) } } -func (s *testSQLSuite) TestGetListTableTypeByConf(c *C) { - conf := defaultConfigForTest(c) +func TestGetListTableTypeByConf(t *testing.T) { + t.Parallel() + + conf := defaultConfigForTest(t) tctx := tcontext.Background().WithLogger(appLogger) cases := []struct { serverInfo ServerInfo @@ -112,7 +124,6 @@ func (s *testSQLSuite) TestGetListTableTypeByConf(c *C) { for _, x := range cases { conf.Consistency = x.consistency conf.ServerInfo = x.serverInfo - cmt := Commentf("server info %s consistency %s", x.serverInfo, x.consistency) - c.Assert(getListTableTypeByConf(conf), Equals, x.expected, cmt) + require.Equalf(t, x.expected, getListTableTypeByConf(conf), "server info: %s, consistency: %s", x.serverInfo, x.consistency) } } diff --git a/v4/export/ir_impl_test.go b/v4/export/ir_impl_test.go index 82410789..97a5a47d 100644 --- a/v4/export/ir_impl_test.go +++ b/v4/export/ir_impl_test.go @@ -4,15 +4,12 @@ package export import ( "strings" + "testing" "github.com/DATA-DOG/go-sqlmock" - . "github.com/pingcap/check" + "github.com/stretchr/testify/require" ) -var _ = Suite(&testIRImplSuite{}) - -type testIRImplSuite struct{} - type simpleRowReceiver struct { data []string } @@ -27,10 +24,14 @@ func (s *simpleRowReceiver) BindAddress(args []interface{}) { } } -func (s *testIRImplSuite) TestRowIter(c *C) { +func TestRowIter(t *testing.T) { + t.Parallel() + db, mock, err := sqlmock.New() - c.Assert(err, IsNil) - defer db.Close() + require.NoError(t, err) + defer func() { + _ = db.Close() + }() expectedRows := mock.NewRows([]string{"id"}). AddRow("1"). @@ -38,32 +39,40 @@ func (s *testIRImplSuite) TestRowIter(c *C) { AddRow("3") mock.ExpectQuery("SELECT id from t").WillReturnRows(expectedRows) rows, err := db.Query("SELECT id from t") - c.Assert(err, IsNil) + require.NoError(t, err) iter := newRowIter(rows, 1) for i := 0; i < 100; i++ { - c.Assert(iter.HasNext(), IsTrue) + require.True(t, iter.HasNext()) } + res := newSimpleRowReceiver(1) - c.Assert(iter.Decode(res), IsNil) - c.Assert(res.data, DeepEquals, []string{"1"}) + require.NoError(t, iter.Decode(res)) + require.Equal(t, []string{"1"}, res.data) + iter.Next() - c.Assert(iter.HasNext(), IsTrue) - c.Assert(iter.HasNext(), IsTrue) - c.Assert(iter.Decode(res), IsNil) - c.Assert(res.data, DeepEquals, []string{"2"}) + require.True(t, iter.HasNext()) + require.True(t, iter.HasNext()) + require.NoError(t, iter.Decode(res)) + require.Equal(t, []string{"2"}, res.data) + iter.Next() - c.Assert(iter.HasNext(), IsTrue) - c.Assert(iter.Decode(res), IsNil) + require.True(t, iter.HasNext()) + require.NoError(t, iter.Decode(res)) + iter.Next() - c.Assert(res.data, DeepEquals, []string{"3"}) - c.Assert(iter.HasNext(), IsFalse) + require.Equal(t, []string{"3"}, res.data) + require.False(t, iter.HasNext()) } -func (s *testIRImplSuite) TestChunkRowIter(c *C) { +func TestChunkRowIter(t *testing.T) { + t.Parallel() + db, mock, err := sqlmock.New() - c.Assert(err, IsNil) - defer db.Close() + require.NoError(t, err) + defer func() { + _ = db.Close() + }() twentyBytes := strings.Repeat("x", 20) thirtyBytes := strings.Repeat("x", 30) @@ -73,8 +82,10 @@ func (s *testIRImplSuite) TestChunkRowIter(c *C) { } mock.ExpectQuery("SELECT a, b FROM t").WillReturnRows(expectedRows) rows, err := db.Query("SELECT a, b FROM t") - c.Assert(err, IsNil) - defer rows.Close() + require.NoError(t, err) + defer func() { + require.NoError(t, rows.Close()) + }() var ( testFileSize uint64 = 200 @@ -97,7 +108,7 @@ func (s *testIRImplSuite) TestChunkRowIter(c *C) { for sqlRowIter.HasNext() { wp.currentStatementSize = 0 for sqlRowIter.HasNext() { - c.Assert(sqlRowIter.Decode(res), IsNil) + require.NoError(t, sqlRowIter.Decode(res)) sz := uint64(len(res.data[0]) + len(res.data[1])) wp.AddFileSize(sz) sqlRowIter.Next() @@ -111,11 +122,11 @@ func (s *testIRImplSuite) TestChunkRowIter(c *C) { } } - c.Assert(resSize, DeepEquals, expectedSize) - c.Assert(sqlRowIter.HasNext(), IsTrue) - c.Assert(wp.ShouldSwitchFile(), IsTrue) - c.Assert(wp.ShouldSwitchStatement(), IsTrue) - rows.Close() - c.Assert(sqlRowIter.Decode(res), NotNil) + require.Equal(t, expectedSize, resSize) + require.True(t, sqlRowIter.HasNext()) + require.True(t, wp.ShouldSwitchFile()) + require.True(t, wp.ShouldSwitchStatement()) + require.NoError(t, rows.Close()) + require.Error(t, sqlRowIter.Decode(res)) sqlRowIter.Next() } diff --git a/v4/export/main_test.go b/v4/export/main_test.go new file mode 100644 index 00000000..b312b938 --- /dev/null +++ b/v4/export/main_test.go @@ -0,0 +1,61 @@ +// Copyright 2021 PingCAP, Inc. +// +// 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 export + +import ( + "fmt" + "os" + "testing" + + "github.com/pingcap/dumpling/v4/log" + "github.com/prometheus/client_golang/prometheus" + "github.com/stretchr/testify/require" + "go.uber.org/goleak" +) + +var appLogger log.Logger + +func TestMain(m *testing.M) { + initColTypeRowReceiverMap() + + logger, _, err := log.InitAppLogger(&log.Config{ + Level: "debug", + File: "", + Format: "text", + }) + + if err != nil { + _, _ = fmt.Fprintf(os.Stderr, "fail to init logger: %v\n", err) + os.Exit(1) + } + + appLogger = logger + registry := prometheus.NewRegistry() + registry.MustRegister(prometheus.NewProcessCollector(prometheus.ProcessCollectorOpts{})) + registry.MustRegister(prometheus.NewGoCollector()) + RegisterMetrics(registry) + + opts := []goleak.Option{ + goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), + } + + goleak.VerifyTestMain(m, opts...) +} + +func defaultConfigForTest(t *testing.T) *Config { + config := DefaultConfig() + require.NoError(t, adjustFileFormat(config)) + return config +} diff --git a/v4/export/metadata_test.go b/v4/export/metadata_test.go index c135e455..fce7259c 100644 --- a/v4/export/metadata_test.go +++ b/v4/export/metadata_test.go @@ -6,30 +6,33 @@ import ( "context" "errors" "fmt" + "os" + "testing" tcontext "github.com/pingcap/dumpling/v4/context" + "github.com/stretchr/testify/require" "github.com/DATA-DOG/go-sqlmock" - . "github.com/pingcap/check" "github.com/pingcap/tidb/br/pkg/storage" ) -var _ = Suite(&testMetaDataSuite{}) - const ( logFile = "ON.000001" pos = "7502" gtidSet = "6ce40be3-e359-11e9-87e0-36933cb0ca5a:1-29" ) -type testMetaDataSuite struct{} +func TestMysqlMetaData(t *testing.T) { + t.Parallel() -func (s *testMetaDataSuite) TestMysqlMetaData(c *C) { db, mock, err := sqlmock.New() - c.Assert(err, IsNil) - defer db.Close() + require.NoError(t, err) + defer func() { + require.NoError(t, db.Close()) + }() + conn, err := db.Conn(context.Background()) - c.Assert(err, IsNil) + require.NoError(t, err) rows := sqlmock.NewRows([]string{"File", "Position", "Binlog_Do_DB", "Binlog_Ignore_DB", "Executed_Gtid_Set"}). AddRow(logFile, pos, "", "", gtidSet) @@ -38,29 +41,28 @@ func (s *testMetaDataSuite) TestMysqlMetaData(c *C) { mock.ExpectQuery("SHOW SLAVE STATUS").WillReturnRows( sqlmock.NewRows([]string{"exec_master_log_pos", "relay_master_log_file", "master_host", "Executed_Gtid_Set", "Seconds_Behind_Master"})) - m := newGlobalMetadata(tcontext.Background(), s.createStorage(c), "") - c.Assert(m.recordGlobalMetaData(conn, ServerTypeMySQL, false), IsNil) + m := newGlobalMetadata(tcontext.Background(), createStorage(t), "") + require.NoError(t, m.recordGlobalMetaData(conn, ServerTypeMySQL, false)) - c.Assert(m.buffer.String(), Equals, "SHOW MASTER STATUS:\n"+ - "\tLog: ON.000001\n"+ - "\tPos: 7502\n"+ - "\tGTID:6ce40be3-e359-11e9-87e0-36933cb0ca5a:1-29\n\n") - c.Assert(mock.ExpectationsWereMet(), IsNil) + expected := "SHOW MASTER STATUS:\n" + + "\tLog: ON.000001\n" + + "\tPos: 7502\n" + + "\tGTID:6ce40be3-e359-11e9-87e0-36933cb0ca5a:1-29\n\n" + require.Equal(t, expected, m.buffer.String()) + require.NoError(t, mock.ExpectationsWereMet()) } -func (s *testMetaDataSuite) createStorage(c *C) storage.ExternalStorage { - backend, err := storage.ParseBackend("file:///"+c.MkDir(), nil) - c.Assert(err, IsNil) - testLoc, _ := storage.Create(context.Background(), backend, true) - return testLoc -} +func TestMetaDataAfterConn(t *testing.T) { + t.Parallel() -func (s *testMetaDataSuite) TestMetaDataAfterConn(c *C) { db, mock, err := sqlmock.New() - c.Assert(err, IsNil) - defer db.Close() + require.NoError(t, err) + defer func() { + require.NoError(t, db.Close()) + }() + conn, err := db.Conn(context.Background()) - c.Assert(err, IsNil) + require.NoError(t, err) rows := sqlmock.NewRows([]string{"File", "Position", "Binlog_Do_DB", "Binlog_Ignore_DB", "Executed_Gtid_Set"}). AddRow(logFile, pos, "", "", gtidSet) @@ -73,28 +75,35 @@ func (s *testMetaDataSuite) TestMetaDataAfterConn(c *C) { sqlmock.NewRows([]string{"exec_master_log_pos", "relay_master_log_file", "master_host", "Executed_Gtid_Set", "Seconds_Behind_Master"})) mock.ExpectQuery("SHOW MASTER STATUS").WillReturnRows(rows2) - m := newGlobalMetadata(tcontext.Background(), s.createStorage(c), "") - c.Assert(m.recordGlobalMetaData(conn, ServerTypeMySQL, false), IsNil) - c.Assert(m.recordGlobalMetaData(conn, ServerTypeMySQL, true), IsNil) + m := newGlobalMetadata(tcontext.Background(), createStorage(t), "") + require.NoError(t, m.recordGlobalMetaData(conn, ServerTypeMySQL, false)) + require.NoError(t, m.recordGlobalMetaData(conn, ServerTypeMySQL, true)) + m.buffer.Write(m.afterConnBuffer.Bytes()) - c.Assert(m.buffer.String(), Equals, "SHOW MASTER STATUS:\n"+ - "\tLog: ON.000001\n"+ - "\tPos: 7502\n"+ - "\tGTID:6ce40be3-e359-11e9-87e0-36933cb0ca5a:1-29\n\n"+ - "SHOW MASTER STATUS: /* AFTER CONNECTION POOL ESTABLISHED */\n"+ - "\tLog: ON.000001\n"+ - "\tPos: 7510\n"+ - "\tGTID:6ce40be3-e359-11e9-87e0-36933cb0ca5a:1-29\n\n") - c.Assert(mock.ExpectationsWereMet(), IsNil) + expected := "SHOW MASTER STATUS:\n" + + "\tLog: ON.000001\n" + + "\tPos: 7502\n" + + "\tGTID:6ce40be3-e359-11e9-87e0-36933cb0ca5a:1-29\n\n" + + "SHOW MASTER STATUS: /* AFTER CONNECTION POOL ESTABLISHED */\n" + + "\tLog: ON.000001\n" + + "\tPos: 7510\n" + + "\tGTID:6ce40be3-e359-11e9-87e0-36933cb0ca5a:1-29\n\n" + require.Equal(t, expected, m.buffer.String()) + require.NoError(t, mock.ExpectationsWereMet()) } -func (s *testMetaDataSuite) TestMysqlWithFollowersMetaData(c *C) { +func TestMysqlWithFollowersMetaData(t *testing.T) { + t.Parallel() + db, mock, err := sqlmock.New() - c.Assert(err, IsNil) - defer db.Close() + require.NoError(t, err) + defer func() { + require.NoError(t, db.Close()) + }() + conn, err := db.Conn(context.Background()) - c.Assert(err, IsNil) + require.NoError(t, err) rows := sqlmock.NewRows([]string{"File", "Position", "Binlog_Do_DB", "Binlog_Ignore_DB", "Executed_Gtid_Set"}). AddRow(logFile, pos, "", "", gtidSet) @@ -104,27 +113,33 @@ func (s *testMetaDataSuite) TestMysqlWithFollowersMetaData(c *C) { mock.ExpectQuery("SELECT @@default_master_connection").WillReturnError(fmt.Errorf("mock error")) mock.ExpectQuery("SHOW SLAVE STATUS").WillReturnRows(followerRows) - m := newGlobalMetadata(tcontext.Background(), s.createStorage(c), "") - c.Assert(m.recordGlobalMetaData(conn, ServerTypeMySQL, false), IsNil) - - c.Assert(m.buffer.String(), Equals, "SHOW MASTER STATUS:\n"+ - "\tLog: ON.000001\n"+ - "\tPos: 7502\n"+ - "\tGTID:6ce40be3-e359-11e9-87e0-36933cb0ca5a:1-29\n\n"+ - "SHOW SLAVE STATUS:\n"+ - "\tHost: 192.168.1.100\n"+ - "\tLog: mysql-bin.001821\n"+ - "\tPos: 256529431\n"+ - "\tGTID:6ce40be3-e359-11e9-87e0-36933cb0ca5a:1-29\n\n") - c.Assert(mock.ExpectationsWereMet(), IsNil) + m := newGlobalMetadata(tcontext.Background(), createStorage(t), "") + require.NoError(t, m.recordGlobalMetaData(conn, ServerTypeMySQL, false)) + + expected := "SHOW MASTER STATUS:\n" + + "\tLog: ON.000001\n" + + "\tPos: 7502\n" + + "\tGTID:6ce40be3-e359-11e9-87e0-36933cb0ca5a:1-29\n\n" + + "SHOW SLAVE STATUS:\n" + + "\tHost: 192.168.1.100\n" + + "\tLog: mysql-bin.001821\n" + + "\tPos: 256529431\n" + + "\tGTID:6ce40be3-e359-11e9-87e0-36933cb0ca5a:1-29\n\n" + require.Equal(t, expected, m.buffer.String()) + require.NoError(t, mock.ExpectationsWereMet()) } -func (s *testMetaDataSuite) TestMysqlWithNullFollowersMetaData(c *C) { +func TestMysqlWithNullFollowersMetaData(t *testing.T) { + t.Parallel() + db, mock, err := sqlmock.New() - c.Assert(err, IsNil) - defer db.Close() + require.NoError(t, err) + defer func() { + require.NoError(t, db.Close()) + }() + conn, err := db.Conn(context.Background()) - c.Assert(err, IsNil) + require.NoError(t, err) rows := sqlmock.NewRows([]string{"File", "Position", "Binlog_Do_DB", "Binlog_Ignore_DB", "Executed_Gtid_Set"}). AddRow(logFile, pos, "", "", gtidSet) @@ -132,22 +147,28 @@ func (s *testMetaDataSuite) TestMysqlWithNullFollowersMetaData(c *C) { mock.ExpectQuery("SELECT @@default_master_connection").WillReturnError(fmt.Errorf("mock error")) mock.ExpectQuery("SHOW SLAVE STATUS").WillReturnRows(sqlmock.NewRows([]string{"SQL_Remaining_Delay"}).AddRow(nil)) - m := newGlobalMetadata(tcontext.Background(), s.createStorage(c), "") - c.Assert(m.recordGlobalMetaData(conn, ServerTypeMySQL, false), IsNil) + m := newGlobalMetadata(tcontext.Background(), createStorage(t), "") + require.NoError(t, m.recordGlobalMetaData(conn, ServerTypeMySQL, false)) - c.Assert(m.buffer.String(), Equals, "SHOW MASTER STATUS:\n"+ - "\tLog: ON.000001\n"+ - "\tPos: 7502\n"+ - "\tGTID:6ce40be3-e359-11e9-87e0-36933cb0ca5a:1-29\n\n") - c.Assert(mock.ExpectationsWereMet(), IsNil) + expected := "SHOW MASTER STATUS:\n" + + "\tLog: ON.000001\n" + + "\tPos: 7502\n" + + "\tGTID:6ce40be3-e359-11e9-87e0-36933cb0ca5a:1-29\n\n" + require.Equal(t, expected, m.buffer.String()) + require.NoError(t, mock.ExpectationsWereMet()) } -func (s *testMetaDataSuite) TestMariaDBMetaData(c *C) { +func TestMariaDBMetaData(t *testing.T) { + t.Parallel() + db, mock, err := sqlmock.New() - c.Assert(err, IsNil) - defer db.Close() + require.NoError(t, err) + defer func() { + require.NoError(t, db.Close()) + }() + conn, err := db.Conn(context.Background()) - c.Assert(err, IsNil) + require.NoError(t, err) logFile := "mariadb-bin.000016" pos := "475" @@ -159,18 +180,22 @@ func (s *testMetaDataSuite) TestMariaDBMetaData(c *C) { AddRow(gtidSet) mock.ExpectQuery("SELECT @@global.gtid_binlog_pos").WillReturnRows(rows) mock.ExpectQuery("SHOW SLAVE STATUS").WillReturnRows(rows) - m := newGlobalMetadata(tcontext.Background(), s.createStorage(c), "") - c.Assert(m.recordGlobalMetaData(conn, ServerTypeMariaDB, false), IsNil) - - c.Assert(mock.ExpectationsWereMet(), IsNil) + m := newGlobalMetadata(tcontext.Background(), createStorage(t), "") + require.NoError(t, m.recordGlobalMetaData(conn, ServerTypeMariaDB, false)) + require.NoError(t, mock.ExpectationsWereMet()) } -func (s *testMetaDataSuite) TestMariaDBWithFollowersMetaData(c *C) { +func TestMariaDBWithFollowersMetaData(t *testing.T) { + t.Parallel() + db, mock, err := sqlmock.New() - c.Assert(err, IsNil) - defer db.Close() + require.NoError(t, err) + defer func() { + require.NoError(t, db.Close()) + }() + conn, err := db.Conn(context.Background()) - c.Assert(err, IsNil) + require.NoError(t, err) rows := sqlmock.NewRows([]string{"File", "Position", "Binlog_Do_DB", "Binlog_Ignore_DB", "Executed_Gtid_Set"}). AddRow(logFile, pos, "", "", gtidSet) @@ -183,34 +208,40 @@ func (s *testMetaDataSuite) TestMariaDBWithFollowersMetaData(c *C) { AddRow("connection_1")) mock.ExpectQuery("SHOW ALL SLAVES STATUS").WillReturnRows(followerRows) - m := newGlobalMetadata(tcontext.Background(), s.createStorage(c), "") - c.Assert(m.recordGlobalMetaData(conn, ServerTypeMySQL, false), IsNil) - - c.Assert(m.buffer.String(), Equals, "SHOW MASTER STATUS:\n"+ - "\tLog: ON.000001\n"+ - "\tPos: 7502\n"+ - "\tGTID:6ce40be3-e359-11e9-87e0-36933cb0ca5a:1-29\n\n"+ - "SHOW SLAVE STATUS:\n"+ - "\tConnection name: connection_1\n"+ - "\tHost: 192.168.1.100\n"+ - "\tLog: mysql-bin.001821\n"+ - "\tPos: 256529431\n"+ - "\tGTID:6ce40be3-e359-11e9-87e0-36933cb0ca5a:1-29\n\n"+ - "SHOW SLAVE STATUS:\n"+ - "\tConnection name: connection_2\n"+ - "\tHost: 192.168.1.102\n"+ - "\tLog: mysql-bin.001820\n"+ - "\tPos: 256529451\n"+ - "\tGTID:6ce40be3-e359-11e9-87e0-36933cb0ca5a:1-29\n\n") - c.Assert(mock.ExpectationsWereMet(), IsNil) + m := newGlobalMetadata(tcontext.Background(), createStorage(t), "") + require.NoError(t, m.recordGlobalMetaData(conn, ServerTypeMySQL, false)) + + expected := "SHOW MASTER STATUS:\n" + + "\tLog: ON.000001\n" + + "\tPos: 7502\n" + + "\tGTID:6ce40be3-e359-11e9-87e0-36933cb0ca5a:1-29\n\n" + + "SHOW SLAVE STATUS:\n" + + "\tConnection name: connection_1\n" + + "\tHost: 192.168.1.100\n" + + "\tLog: mysql-bin.001821\n" + + "\tPos: 256529431\n" + + "\tGTID:6ce40be3-e359-11e9-87e0-36933cb0ca5a:1-29\n\n" + + "SHOW SLAVE STATUS:\n" + + "\tConnection name: connection_2\n" + + "\tHost: 192.168.1.102\n" + + "\tLog: mysql-bin.001820\n" + + "\tPos: 256529451\n" + + "\tGTID:6ce40be3-e359-11e9-87e0-36933cb0ca5a:1-29\n\n" + require.Equal(t, expected, m.buffer.String()) + require.NoError(t, mock.ExpectationsWereMet()) } -func (s *testMetaDataSuite) TestEarlierMysqlMetaData(c *C) { +func TestEarlierMysqlMetaData(t *testing.T) { + t.Parallel() + db, mock, err := sqlmock.New() - c.Assert(err, IsNil) - defer db.Close() + require.NoError(t, err) + defer func() { + require.NoError(t, db.Close()) + }() + conn, err := db.Conn(context.Background()) - c.Assert(err, IsNil) + require.NoError(t, err) logFile := "mysql-bin.000001" pos := "4879" @@ -221,22 +252,28 @@ func (s *testMetaDataSuite) TestEarlierMysqlMetaData(c *C) { mock.ExpectQuery("SHOW SLAVE STATUS").WillReturnRows( sqlmock.NewRows([]string{"exec_master_log_pos", "relay_master_log_file", "master_host", "Executed_Gtid_Set", "Seconds_Behind_Master"})) - m := newGlobalMetadata(tcontext.Background(), s.createStorage(c), "") - c.Assert(m.recordGlobalMetaData(conn, ServerTypeMySQL, false), IsNil) + m := newGlobalMetadata(tcontext.Background(), createStorage(t), "") + require.NoError(t, m.recordGlobalMetaData(conn, ServerTypeMySQL, false)) - c.Assert(m.buffer.String(), Equals, "SHOW MASTER STATUS:\n"+ - "\tLog: mysql-bin.000001\n"+ - "\tPos: 4879\n"+ - "\tGTID:\n\n") - c.Assert(mock.ExpectationsWereMet(), IsNil) + expected := "SHOW MASTER STATUS:\n" + + "\tLog: mysql-bin.000001\n" + + "\tPos: 4879\n" + + "\tGTID:\n\n" + require.Equal(t, expected, m.buffer.String()) + require.NoError(t, mock.ExpectationsWereMet()) } -func (s *testMetaDataSuite) TestTiDBSnapshotMetaData(c *C) { +func TestTiDBSnapshotMetaData(t *testing.T) { + t.Parallel() + db, mock, err := sqlmock.New() - c.Assert(err, IsNil) - defer db.Close() + require.NoError(t, err) + defer func() { + require.NoError(t, db.Close()) + }() + conn, err := db.Conn(context.Background()) - c.Assert(err, IsNil) + require.NoError(t, err) logFile := "tidb-binlog" pos := "420633329401856001" @@ -244,37 +281,53 @@ func (s *testMetaDataSuite) TestTiDBSnapshotMetaData(c *C) { AddRow(logFile, pos, "", "") mock.ExpectQuery("SHOW MASTER STATUS").WillReturnRows(rows) - m := newGlobalMetadata(tcontext.Background(), s.createStorage(c), "") - c.Assert(m.recordGlobalMetaData(conn, ServerTypeTiDB, false), IsNil) - c.Assert(m.buffer.String(), Equals, "SHOW MASTER STATUS:\n"+ - "\tLog: tidb-binlog\n"+ - "\tPos: 420633329401856001\n"+ - "\tGTID:\n\n") + m := newGlobalMetadata(tcontext.Background(), createStorage(t), "") + require.NoError(t, m.recordGlobalMetaData(conn, ServerTypeTiDB, false)) + + expected := "SHOW MASTER STATUS:\n" + + "\tLog: tidb-binlog\n" + + "\tPos: 420633329401856001\n" + + "\tGTID:\n\n" + require.Equal(t, expected, m.buffer.String()) snapshot := "420633273211289601" rows = sqlmock.NewRows([]string{"File", "Position", "Binlog_Do_DB", "Binlog_Ignore_DB"}). AddRow(logFile, pos, "", "") mock.ExpectQuery("SHOW MASTER STATUS").WillReturnRows(rows) - m = newGlobalMetadata(tcontext.Background(), s.createStorage(c), snapshot) - c.Assert(m.recordGlobalMetaData(conn, ServerTypeTiDB, false), IsNil) - c.Assert(m.buffer.String(), Equals, "SHOW MASTER STATUS:\n"+ - "\tLog: tidb-binlog\n"+ - "\tPos: 420633273211289601\n"+ - "\tGTID:\n\n") - c.Assert(mock.ExpectationsWereMet(), IsNil) + m = newGlobalMetadata(tcontext.Background(), createStorage(t), snapshot) + require.NoError(t, m.recordGlobalMetaData(conn, ServerTypeTiDB, false)) + + expected = "SHOW MASTER STATUS:\n" + + "\tLog: tidb-binlog\n" + + "\tPos: 420633273211289601\n" + + "\tGTID:\n\n" + require.Equal(t, expected, m.buffer.String()) + require.NoError(t, mock.ExpectationsWereMet()) } -func (s *testMetaDataSuite) TestNoPrivilege(c *C) { +func TestNoPrivilege(t *testing.T) { + t.Parallel() + db, mock, err := sqlmock.New() - c.Assert(err, IsNil) - defer db.Close() + require.NoError(t, err) + defer func() { + require.NoError(t, db.Close()) + }() + conn, err := db.Conn(context.Background()) - c.Assert(err, IsNil) + require.NoError(t, err) mock.ExpectQuery("SHOW MASTER STATUS").WillReturnError(errors.New("lack SUPER or REPLICATION CLIENT privilege")) - m := newGlobalMetadata(tcontext.Background(), s.createStorage(c), "") + m := newGlobalMetadata(tcontext.Background(), createStorage(t), "") // some consistencyType will ignore this error, this test make sure no extra message is written - c.Assert(m.recordGlobalMetaData(conn, ServerTypeTiDB, false), NotNil) - c.Assert(m.buffer.String(), Equals, "") + require.Error(t, m.recordGlobalMetaData(conn, ServerTypeTiDB, false)) + require.Equal(t, "", m.buffer.String()) +} + +func createStorage(t *testing.T) storage.ExternalStorage { + backend, err := storage.ParseBackend("file:///"+os.TempDir(), nil) + require.NoError(t, err) + testLoc, _ := storage.Create(context.Background(), backend, true) + return testLoc } diff --git a/v4/export/prepare_test.go b/v4/export/prepare_test.go index aeb218ba..bfe3fa9b 100644 --- a/v4/export/prepare_test.go +++ b/v4/export/prepare_test.go @@ -6,24 +6,26 @@ import ( "context" "fmt" "strings" + "testing" tcontext "github.com/pingcap/dumpling/v4/context" + "github.com/stretchr/testify/require" "github.com/DATA-DOG/go-sqlmock" - . "github.com/pingcap/check" ) -var _ = Suite(&testPrepareSuite{}) +func TestPrepareDumpingDatabases(t *testing.T) { + t.Parallel() -type testPrepareSuite struct{} - -func (s *testPrepareSuite) TestPrepareDumpingDatabases(c *C) { db, mock, err := sqlmock.New() - c.Assert(err, IsNil) - defer db.Close() + require.NoError(t, err) + defer func() { + require.NoError(t, db.Close()) + }() + tctx := tcontext.Background().WithLogger(appLogger) conn, err := db.Conn(tctx) - c.Assert(err, IsNil) + require.NoError(t, err) rows := sqlmock.NewRows([]string{"Database"}). AddRow("db1"). @@ -31,11 +33,11 @@ func (s *testPrepareSuite) TestPrepareDumpingDatabases(c *C) { AddRow("db3"). AddRow("db5") mock.ExpectQuery("SHOW DATABASES").WillReturnRows(rows) - conf := defaultConfigForTest(c) + conf := defaultConfigForTest(t) conf.Databases = []string{"db1", "db2", "db3"} result, err := prepareDumpingDatabases(tctx, conf, conn) - c.Assert(err, IsNil) - c.Assert(result, DeepEquals, []string{"db1", "db2", "db3"}) + require.NoError(t, err) + require.Equal(t, []string{"db1", "db2", "db3"}, result) conf.Databases = nil rows = sqlmock.NewRows([]string{"Database"}). @@ -43,12 +45,12 @@ func (s *testPrepareSuite) TestPrepareDumpingDatabases(c *C) { AddRow("db2") mock.ExpectQuery("SHOW DATABASES").WillReturnRows(rows) result, err = prepareDumpingDatabases(tctx, conf, conn) - c.Assert(err, IsNil) - c.Assert(result, DeepEquals, []string{"db1", "db2"}) + require.NoError(t, err) + require.Equal(t, []string{"db1", "db2"}, result) mock.ExpectQuery("SHOW DATABASES").WillReturnError(fmt.Errorf("err")) _, err = prepareDumpingDatabases(tctx, conf, conn) - c.Assert(err, NotNil) + require.Error(t, err) rows = sqlmock.NewRows([]string{"Database"}). AddRow("db1"). @@ -58,16 +60,21 @@ func (s *testPrepareSuite) TestPrepareDumpingDatabases(c *C) { mock.ExpectQuery("SHOW DATABASES").WillReturnRows(rows) conf.Databases = []string{"db1", "db2", "db4", "db6"} _, err = prepareDumpingDatabases(tctx, conf, conn) - c.Assert(err, ErrorMatches, `Unknown databases \[db4,db6\]`) - c.Assert(mock.ExpectationsWereMet(), IsNil) + require.EqualError(t, err, `Unknown databases [db4,db6]`) + require.NoError(t, mock.ExpectationsWereMet()) } -func (s *testPrepareSuite) TestListAllTables(c *C) { +func TestListAllTables(t *testing.T) { + t.Parallel() + db, mock, err := sqlmock.New() - c.Assert(err, IsNil) - defer db.Close() + require.NoError(t, err) + defer func() { + require.NoError(t, db.Close()) + }() + conn, err := db.Conn(context.Background()) - c.Assert(err, IsNil) + require.NoError(t, err) tctx := tcontext.Background().WithLogger(appLogger) // Test list all tables and skipping views. @@ -92,14 +99,13 @@ func (s *testPrepareSuite) TestListAllTables(c *C) { mock.ExpectQuery(query).WillReturnRows(rows) tables, err := ListAllDatabasesTables(tctx, conn, dbNames, listTableByInfoSchema, TableTypeBase) - c.Assert(err, IsNil) + require.NoError(t, err) - for d, t := range tables { + for d, table := range tables { expectedTbs, ok := data[d] - c.Assert(ok, IsTrue) - for i := 0; i < len(t); i++ { - cmt := Commentf("%v mismatch: %v", t[i], expectedTbs[i]) - c.Assert(t[i].Equals(expectedTbs[i]), IsTrue, cmt) + require.True(t, ok) + for i := 0; i < len(table); i++ { + require.Truef(t, table[i].Equals(expectedTbs[i]), "%v mismatches expected: %v", table[i], expectedTbs[i]) } } @@ -111,23 +117,29 @@ func (s *testPrepareSuite) TestListAllTables(c *C) { mock.ExpectQuery(query).WillReturnRows(sqlmock.NewRows([]string{"TABLE_SCHEMA", "TABLE_NAME", "TABLE_TYPE", "AVG_ROW_LENGTH"}). AddRow("db", "t1", TableTypeBaseStr, 1).AddRow("db", "t2", TableTypeViewStr, nil)) tables, err = ListAllDatabasesTables(tctx, conn, []string{"db"}, listTableByInfoSchema, TableTypeBase, TableTypeView) - c.Assert(err, IsNil) - c.Assert(len(tables), Equals, 1) - c.Assert(len(tables["db"]), Equals, 2) + require.NoError(t, err) + require.Len(t, tables, 1) + require.Len(t, tables["db"], 2) + for i := 0; i < len(tables["db"]); i++ { - cmt := Commentf("%v mismatch: %v", tables["db"][i], data["db"][i]) - c.Assert(tables["db"][i].Equals(data["db"][i]), IsTrue, cmt) + require.Truef(t, tables["db"][i].Equals(data["db"][i]), "%v mismatches expected: %v", tables["db"][i], data["db"][i]) } - c.Assert(mock.ExpectationsWereMet(), IsNil) + require.NoError(t, mock.ExpectationsWereMet()) } -func (s *testPrepareSuite) TestListAllTablesByTableStatus(c *C) { +func TestListAllTablesByTableStatus(t *testing.T) { + t.Parallel() + db, mock, err := sqlmock.New() - c.Assert(err, IsNil) - defer db.Close() + require.NoError(t, err) + defer func() { + require.NoError(t, db.Close()) + }() + conn, err := db.Conn(context.Background()) - c.Assert(err, IsNil) + require.NoError(t, err) + tctx := tcontext.Background().WithLogger(appLogger) // Test list all tables and skipping views. @@ -154,14 +166,14 @@ func (s *testPrepareSuite) TestListAllTablesByTableStatus(c *C) { } tables, err := ListAllDatabasesTables(tctx, conn, dbNames, listTableByShowTableStatus, TableTypeBase) - c.Assert(err, IsNil) + require.NoError(t, err) - for d, t := range tables { + for d, table := range tables { expectedTbs, ok := data[d] - c.Assert(ok, IsTrue) - for i := 0; i < len(t); i++ { - cmt := Commentf("%v mismatch: %v", t[i], expectedTbs[i]) - c.Assert(t[i].Equals(expectedTbs[i]), IsTrue, cmt) + require.True(t, ok) + + for i := 0; i < len(table); i++ { + require.Truef(t, table[i].Equals(expectedTbs[i]), "%v mismatches expected: %v", table[i], expectedTbs[i]) } } @@ -173,23 +185,29 @@ func (s *testPrepareSuite) TestListAllTablesByTableStatus(c *C) { AddRow("t1", "InnoDB", 10, "Dynamic", 0, 1, 16384, 0, 0, 0, nil, "2021-07-08 03:04:07", nil, nil, "latin1_swedish_ci", nil, "", ""). AddRow("t2", nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, TableTypeView.String())) tables, err = ListAllDatabasesTables(tctx, conn, []string{"db"}, listTableByShowTableStatus, TableTypeBase, TableTypeView) - c.Assert(err, IsNil) - c.Assert(len(tables), Equals, 1) - c.Assert(len(tables["db"]), Equals, 2) + require.NoError(t, err) + require.Len(t, tables, 1) + require.Len(t, tables["db"], 2) + for i := 0; i < len(tables["db"]); i++ { - cmt := Commentf("%v mismatch: %v", tables["db"][i], data["db"][i]) - c.Assert(tables["db"][i].Equals(data["db"][i]), IsTrue, cmt) + require.Truef(t, tables["db"][i].Equals(data["db"][i]), "%v mismatches expected: %v", tables["db"][i], data["db"][i]) } - c.Assert(mock.ExpectationsWereMet(), IsNil) + require.NoError(t, mock.ExpectationsWereMet()) } -func (s *testPrepareSuite) TestListAllTablesByShowFullTables(c *C) { +func TestListAllTablesByShowFullTables(t *testing.T) { + t.Parallel() + db, mock, err := sqlmock.New() - c.Assert(err, IsNil) - defer db.Close() + require.NoError(t, err) + defer func() { + require.NoError(t, db.Close()) + }() + conn, err := db.Conn(context.Background()) - c.Assert(err, IsNil) + require.NoError(t, err) + tctx := tcontext.Background().WithLogger(appLogger) // Test list all tables and skipping views. @@ -215,14 +233,14 @@ func (s *testPrepareSuite) TestListAllTablesByShowFullTables(c *C) { } tables, err := ListAllDatabasesTables(tctx, conn, dbNames, listTableByShowFullTables, TableTypeBase) - c.Assert(err, IsNil) + require.NoError(t, err) - for d, t := range tables { + for d, table := range tables { expectedTbs, ok := data[d] - c.Assert(ok, IsTrue) - for i := 0; i < len(t); i++ { - cmt := Commentf("%v mismatch: %v", t[i], expectedTbs[i]) - c.Assert(t[i].Equals(expectedTbs[i]), IsTrue, cmt) + require.True(t, ok) + + for i := 0; i < len(table); i++ { + require.Truef(t, table[i].Equals(expectedTbs[i]), "%v mismatches expected: %v", table[i], expectedTbs[i]) } } @@ -244,39 +262,48 @@ func (s *testPrepareSuite) TestListAllTablesByShowFullTables(c *C) { mock.ExpectQuery(fmt.Sprintf(query, dbName)).WillReturnRows(rows) } tables, err = ListAllDatabasesTables(tctx, conn, []string{"db"}, listTableByShowFullTables, TableTypeBase, TableTypeView) - c.Assert(err, IsNil) - c.Assert(len(tables), Equals, 1) - c.Assert(len(tables["db"]), Equals, 2) + require.NoError(t, err) + require.Len(t, tables, 1) + require.Len(t, tables["db"], 2) + for i := 0; i < len(tables["db"]); i++ { - cmt := Commentf("%v mismatch: %v", tables["db"][i], data["db"][i]) - c.Assert(tables["db"][i].Equals(data["db"][i]), IsTrue, cmt) + require.Truef(t, tables["db"][i].Equals(data["db"][i]), "%v mismatches expected: %v", tables["db"][i], data["db"][i]) } - c.Assert(mock.ExpectationsWereMet(), IsNil) + require.NoError(t, mock.ExpectationsWereMet()) } -func (s *testPrepareSuite) TestConfigValidation(c *C) { - conf := defaultConfigForTest(c) +func TestConfigValidation(t *testing.T) { + t.Parallel() + + conf := defaultConfigForTest(t) conf.Where = "id < 5" conf.SQL = "select * from t where id > 3" - c.Assert(validateSpecifiedSQL(conf), ErrorMatches, "can't specify both --sql and --where at the same time. Please try to combine them into --sql") + require.EqualError(t, validateSpecifiedSQL(conf), "can't specify both --sql and --where at the same time. Please try to combine them into --sql") + conf.Where = "" - c.Assert(validateSpecifiedSQL(conf), IsNil) + require.NoError(t, validateSpecifiedSQL(conf)) conf.FileType = FileFormatSQLTextString - c.Assert(adjustFileFormat(conf), ErrorMatches, ".*please unset --filetype or set it to 'csv'.*") + err := adjustFileFormat(conf) + require.Error(t, err) + require.Regexp(t, ".*please unset --filetype or set it to 'csv'.*", err.Error()) + conf.FileType = FileFormatCSVString - c.Assert(adjustFileFormat(conf), IsNil) + require.NoError(t, adjustFileFormat(conf)) + conf.FileType = "" - c.Assert(adjustFileFormat(conf), IsNil) - c.Assert(conf.FileType, Equals, FileFormatCSVString) + require.NoError(t, adjustFileFormat(conf)) + require.Equal(t, FileFormatCSVString, conf.FileType) + conf.SQL = "" conf.FileType = FileFormatSQLTextString - c.Assert(adjustFileFormat(conf), IsNil) + require.NoError(t, adjustFileFormat(conf)) + conf.FileType = "" - c.Assert(adjustFileFormat(conf), IsNil) - c.Assert(conf.FileType, Equals, FileFormatSQLTextString) + require.NoError(t, adjustFileFormat(conf)) + require.Equal(t, FileFormatSQLTextString, conf.FileType) conf.FileType = "rand_str" - c.Assert(adjustFileFormat(conf), ErrorMatches, "unknown config.FileType 'rand_str'") + require.EqualError(t, adjustFileFormat(conf), "unknown config.FileType 'rand_str'") } diff --git a/v4/export/sql_test.go b/v4/export/sql_test.go index 9de2de58..dac6ff6b 100644 --- a/v4/export/sql_test.go +++ b/v4/export/sql_test.go @@ -14,31 +14,45 @@ import ( "runtime" "strconv" "strings" + "testing" tcontext "github.com/pingcap/dumpling/v4/context" + "github.com/stretchr/testify/require" "github.com/DATA-DOG/go-sqlmock" "github.com/coreos/go-semver/semver" - . "github.com/pingcap/check" "github.com/pingcap/errors" ) -var ( - _ = Suite(&testSQLSuite{}) - showIndexHeaders = []string{"Table", "Non_unique", "Key_name", "Seq_in_index", "Column_name", "Collation", "Cardinality", "Sub_part", "Packed", "Null", "Index_type", "Comment", "Index_comment"} -) +var showIndexHeaders = []string{ + "Table", + "Non_unique", + "Key_name", + "Seq_in_index", + "Column_name", + "Collation", + "Cardinality", + "Sub_part", + "Packed", + "Null", + "Index_type", + "Comment", + "Index_comment", +} const ( database = "foo" table = "bar" ) -type testSQLSuite struct{} +func TestDetectServerInfo(t *testing.T) { + t.Parallel() -func (s *testSQLSuite) TestDetectServerInfo(c *C) { db, mock, err := sqlmock.New() - c.Assert(err, IsNil) - defer db.Close() + require.NoError(t, err) + defer func() { + _ = db.Close() + }() mkVer := makeVersion data := [][]interface{}{ @@ -55,66 +69,75 @@ func (s *testSQLSuite) TestDetectServerInfo(c *C) { for _, datum := range data { tag, r, serverTp, expectVer := dec(datum) - cmt := Commentf("test case number: %d", tag) - + comment := fmt.Sprintf("test case number: %d", tag) rows := sqlmock.NewRows([]string{"version"}).AddRow(r) mock.ExpectQuery("SELECT version()").WillReturnRows(rows) verStr, err := SelectVersion(db) - c.Assert(err, IsNil, cmt) + require.NoError(t, err, comment) + info := ParseServerInfo(tcontext.Background(), verStr) - c.Assert(info.ServerType, Equals, serverTp, cmt) - c.Assert(info.ServerVersion == nil, Equals, expectVer == nil, cmt) + require.Equal(t, serverTp, info.ServerType, comment) + require.Equal(t, expectVer == nil, info.ServerVersion == nil, comment) + if info.ServerVersion == nil { - c.Assert(expectVer, IsNil, cmt) + require.Nil(t, expectVer, comment) } else { - c.Assert(info.ServerVersion.Equal(*expectVer), IsTrue) + require.True(t, info.ServerVersion.Equal(*expectVer), comment) } - c.Assert(mock.ExpectationsWereMet(), IsNil, cmt) + + require.NoError(t, mock.ExpectationsWereMet(), comment) } } -func (s *testSQLSuite) TestBuildSelectAllQuery(c *C) { +func TestBuildSelectAllQuery(t *testing.T) { + t.Parallel() + db, mock, err := sqlmock.New() - c.Assert(err, IsNil) - defer db.Close() + require.NoError(t, err) + defer func() { + require.NoError(t, db.Close()) + }() + conn, err := db.Conn(context.Background()) - c.Assert(err, IsNil) + require.NoError(t, err) - mockConf := defaultConfigForTest(c) + mockConf := defaultConfigForTest(t) mockConf.SortByPk = true // Test TiDB server. mockConf.ServerInfo.ServerType = ServerTypeTiDB orderByClause, err := buildOrderByClause(mockConf, conn, database, table, true) - c.Assert(err, IsNil) + require.NoError(t, err) mock.ExpectQuery("SHOW COLUMNS FROM"). WillReturnRows(sqlmock.NewRows([]string{"Field", "Type", "Null", "Key", "Default", "Extra"}). AddRow("id", "int(11)", "NO", "PRI", nil, "")) selectedField, _, err := buildSelectField(conn, database, table, false) - c.Assert(err, IsNil) + require.NoError(t, err) + q := buildSelectQuery(database, table, selectedField, "", "", orderByClause) - c.Assert(q, Equals, fmt.Sprintf("SELECT * FROM `%s`.`%s` ORDER BY `_tidb_rowid`", database, table)) + require.Equal(t, fmt.Sprintf("SELECT * FROM `%s`.`%s` ORDER BY `_tidb_rowid`", database, table), q) mock.ExpectQuery(fmt.Sprintf("SHOW INDEX FROM `%s`.`%s`", database, table)). WillReturnRows(sqlmock.NewRows(showIndexHeaders). AddRow(table, 0, "PRIMARY", 1, "id", "A", 0, nil, nil, "", "BTREE", "", "")) orderByClause, err = buildOrderByClause(mockConf, conn, database, table, false) - c.Assert(err, IsNil) + require.NoError(t, err) mock.ExpectQuery("SHOW COLUMNS FROM"). WillReturnRows(sqlmock.NewRows([]string{"Field", "Type", "Null", "Key", "Default", "Extra"}). AddRow("id", "int(11)", "NO", "PRI", nil, "")) selectedField, _, err = buildSelectField(conn, database, table, false) - c.Assert(err, IsNil) + require.NoError(t, err) + q = buildSelectQuery(database, table, selectedField, "", "", orderByClause) - c.Assert(q, Equals, fmt.Sprintf("SELECT * FROM `%s`.`%s` ORDER BY `id`", database, table)) - c.Assert(mock.ExpectationsWereMet(), IsNil) + require.Equal(t, fmt.Sprintf("SELECT * FROM `%s`.`%s` ORDER BY `id`", database, table), q) + require.NoError(t, mock.ExpectationsWereMet()) // Test other servers. otherServers := []ServerType{ServerTypeUnknown, ServerTypeMySQL, ServerTypeMariaDB} @@ -122,97 +145,109 @@ func (s *testSQLSuite) TestBuildSelectAllQuery(c *C) { // Test table with primary key. for _, serverTp := range otherServers { mockConf.ServerInfo.ServerType = serverTp - cmt := Commentf("server type: %s", serverTp) + comment := fmt.Sprintf("server type: %s", serverTp) + mock.ExpectQuery(fmt.Sprintf("SHOW INDEX FROM `%s`.`%s`", database, table)). WillReturnRows(sqlmock.NewRows(showIndexHeaders). AddRow(table, 0, "PRIMARY", 1, "id", "A", 0, nil, nil, "", "BTREE", "", "")) orderByClause, err := buildOrderByClause(mockConf, conn, database, table, false) - c.Assert(err, IsNil, cmt) + require.NoError(t, err, comment) mock.ExpectQuery("SHOW COLUMNS FROM"). WillReturnRows(sqlmock.NewRows([]string{"Field", "Type", "Null", "Key", "Default", "Extra"}). AddRow("id", "int(11)", "NO", "PRI", nil, "")) selectedField, _, err = buildSelectField(conn, database, table, false) - c.Assert(err, IsNil) + require.NoError(t, err, comment) + q = buildSelectQuery(database, table, selectedField, "", "", orderByClause) - c.Assert(q, Equals, fmt.Sprintf("SELECT * FROM `%s`.`%s` ORDER BY `id`", database, table), cmt) + require.Equal(t, fmt.Sprintf("SELECT * FROM `%s`.`%s` ORDER BY `id`", database, table), q, comment) + err = mock.ExpectationsWereMet() - c.Assert(err, IsNil, cmt) - c.Assert(mock.ExpectationsWereMet(), IsNil, cmt) + require.NoError(t, err, comment) + require.NoError(t, mock.ExpectationsWereMet(), comment) } // Test table without primary key. for _, serverTp := range otherServers { mockConf.ServerInfo.ServerType = serverTp - cmt := Commentf("server type: %s", serverTp) + comment := fmt.Sprintf("server type: %s", serverTp) + mock.ExpectQuery(fmt.Sprintf("SHOW INDEX FROM `%s`.`%s`", database, table)). WillReturnRows(sqlmock.NewRows(showIndexHeaders)) orderByClause, err := buildOrderByClause(mockConf, conn, database, table, false) - c.Assert(err, IsNil, cmt) + require.NoError(t, err, comment) mock.ExpectQuery("SHOW COLUMNS FROM"). WillReturnRows(sqlmock.NewRows([]string{"Field", "Type", "Null", "Key", "Default", "Extra"}). AddRow("id", "int(11)", "NO", "PRI", nil, "")) selectedField, _, err = buildSelectField(conn, "test", "t", false) - c.Assert(err, IsNil) + require.NoError(t, err, comment) + q := buildSelectQuery(database, table, selectedField, "", "", orderByClause) - c.Assert(q, Equals, fmt.Sprintf("SELECT * FROM `%s`.`%s`", database, table), cmt) + require.Equal(t, fmt.Sprintf("SELECT * FROM `%s`.`%s`", database, table), q, comment) + err = mock.ExpectationsWereMet() - c.Assert(err, IsNil, cmt) - c.Assert(mock.ExpectationsWereMet(), IsNil) + require.NoError(t, err, comment) + require.NoError(t, mock.ExpectationsWereMet(), comment) } // Test when config.SortByPk is disabled. mockConf.SortByPk = false for tp := ServerTypeUnknown; tp < ServerTypeAll; tp++ { mockConf.ServerInfo.ServerType = ServerType(tp) - cmt := Commentf("current server type: ", tp) + comment := fmt.Sprintf("current server type: %v", tp) mock.ExpectQuery("SHOW COLUMNS FROM"). WillReturnRows(sqlmock.NewRows([]string{"Field", "Type", "Null", "Key", "Default", "Extra"}). AddRow("id", "int(11)", "NO", "PRI", nil, "")) selectedField, _, err := buildSelectField(conn, "test", "t", false) - c.Assert(err, IsNil) + require.NoError(t, err, comment) + q := buildSelectQuery(database, table, selectedField, "", "", "") - c.Assert(q, Equals, fmt.Sprintf("SELECT * FROM `%s`.`%s`", database, table), cmt) - c.Assert(mock.ExpectationsWereMet(), IsNil, cmt) + require.Equal(t, fmt.Sprintf("SELECT * FROM `%s`.`%s`", database, table), q, comment) + require.NoError(t, mock.ExpectationsWereMet(), comment) } } -func (s *testSQLSuite) TestBuildOrderByClause(c *C) { +func TestBuildOrderByClause(t *testing.T) { + t.Parallel() + db, mock, err := sqlmock.New() - c.Assert(err, IsNil) - defer db.Close() + require.NoError(t, err) + defer func() { + require.NoError(t, db.Close()) + }() + conn, err := db.Conn(context.Background()) - c.Assert(err, IsNil) + require.NoError(t, err) - mockConf := defaultConfigForTest(c) + mockConf := defaultConfigForTest(t) mockConf.SortByPk = true // Test TiDB server. mockConf.ServerInfo.ServerType = ServerTypeTiDB orderByClause, err := buildOrderByClause(mockConf, conn, database, table, true) - c.Assert(err, IsNil) - c.Assert(orderByClause, Equals, orderByTiDBRowID) + require.NoError(t, err) + require.Equal(t, orderByTiDBRowID, orderByClause) mock.ExpectQuery(fmt.Sprintf("SHOW INDEX FROM `%s`.`%s`", database, table)). WillReturnRows(sqlmock.NewRows(showIndexHeaders).AddRow(table, 0, "PRIMARY", 1, "id", "A", 0, nil, nil, "", "BTREE", "", "")) orderByClause, err = buildOrderByClause(mockConf, conn, database, table, false) - c.Assert(err, IsNil) - c.Assert(orderByClause, Equals, "ORDER BY `id`") + require.NoError(t, err) + require.Equal(t, "ORDER BY `id`", orderByClause) // Test table with primary key. mock.ExpectQuery(fmt.Sprintf("SHOW INDEX FROM `%s`.`%s`", database, table)). WillReturnRows(sqlmock.NewRows(showIndexHeaders).AddRow(table, 0, "PRIMARY", 1, "id", "A", 0, nil, nil, "", "BTREE", "", "")) orderByClause, err = buildOrderByClause(mockConf, conn, database, table, false) - c.Assert(err, IsNil) - c.Assert(orderByClause, Equals, "ORDER BY `id`") + require.NoError(t, err) + require.Equal(t, "ORDER BY `id`", orderByClause) // Test table with joint primary key. mock.ExpectQuery(fmt.Sprintf("SHOW INDEX FROM `%s`.`%s`", database, table)). @@ -220,34 +255,39 @@ func (s *testSQLSuite) TestBuildOrderByClause(c *C) { AddRow(table, 0, "PRIMARY", 1, "id", "A", 0, nil, nil, "", "BTREE", "", ""). AddRow(table, 0, "PRIMARY", 2, "name", "A", 0, nil, nil, "", "BTREE", "", "")) orderByClause, err = buildOrderByClause(mockConf, conn, database, table, false) - c.Assert(err, IsNil) - c.Assert(orderByClause, Equals, "ORDER BY `id`,`name`") + require.NoError(t, err) + require.Equal(t, "ORDER BY `id`,`name`", orderByClause) // Test table without primary key. mock.ExpectQuery(fmt.Sprintf("SHOW INDEX FROM `%s`.`%s`", database, table)). WillReturnRows(sqlmock.NewRows(showIndexHeaders)) orderByClause, err = buildOrderByClause(mockConf, conn, database, table, false) - c.Assert(err, IsNil) - c.Assert(orderByClause, Equals, "") + require.NoError(t, err) + require.Equal(t, "", orderByClause) // Test when config.SortByPk is disabled. mockConf.SortByPk = false for _, hasImplicitRowID := range []bool{false, true} { - cmt := Commentf("current hasImplicitRowID: ", hasImplicitRowID) + comment := fmt.Sprintf("current hasImplicitRowID: %v", hasImplicitRowID) orderByClause, err := buildOrderByClause(mockConf, conn, database, table, hasImplicitRowID) - c.Assert(err, IsNil, cmt) - c.Assert(orderByClause, Equals, "", cmt) + require.NoError(t, err, comment) + require.Equal(t, "", orderByClause, comment) } } -func (s *testSQLSuite) TestBuildSelectField(c *C) { +func TestBuildSelectField(t *testing.T) { + t.Parallel() + db, mock, err := sqlmock.New() - c.Assert(err, IsNil) - defer db.Close() + require.NoError(t, err) + defer func() { + require.NoError(t, db.Close()) + }() + conn, err := db.Conn(context.Background()) - c.Assert(err, IsNil) + require.NoError(t, err) // generate columns not found mock.ExpectQuery("SHOW COLUMNS FROM"). @@ -255,9 +295,9 @@ func (s *testSQLSuite) TestBuildSelectField(c *C) { AddRow("id", "int(11)", "NO", "PRI", nil, "")) selectedField, _, err := buildSelectField(conn, "test", "t", false) - c.Assert(selectedField, Equals, "*") - c.Assert(err, IsNil) - c.Assert(mock.ExpectationsWereMet(), IsNil) + require.Equal(t, "*", selectedField) + require.NoError(t, err) + require.NoError(t, mock.ExpectationsWereMet()) // user assigns completeInsert mock.ExpectQuery("SHOW COLUMNS FROM"). @@ -267,9 +307,9 @@ func (s *testSQLSuite) TestBuildSelectField(c *C) { AddRow("quo`te", "varchar(12)", "NO", "UNI", nil, "")) selectedField, _, err = buildSelectField(conn, "test", "t", true) - c.Assert(selectedField, Equals, "`id`,`name`,`quo``te`") - c.Assert(err, IsNil) - c.Assert(mock.ExpectationsWereMet(), IsNil) + require.Equal(t, "`id`,`name`,`quo``te`", selectedField) + require.NoError(t, err) + require.NoError(t, mock.ExpectationsWereMet()) // found generate columns, rest columns is `id`,`name` mock.ExpectQuery("SHOW COLUMNS FROM"). @@ -280,15 +320,19 @@ func (s *testSQLSuite) TestBuildSelectField(c *C) { AddRow("generated", "varchar(12)", "NO", "", nil, "VIRTUAL GENERATED")) selectedField, _, err = buildSelectField(conn, "test", "t", false) - c.Assert(selectedField, Equals, "`id`,`name`,`quo``te`") - c.Assert(err, IsNil) - c.Assert(mock.ExpectationsWereMet(), IsNil) + require.Equal(t, "`id`,`name`,`quo``te`", selectedField) + require.NoError(t, err) + require.NoError(t, mock.ExpectationsWereMet()) } -func (s *testSQLSuite) TestParseSnapshotToTSO(c *C) { +func TestParseSnapshotToTSO(t *testing.T) { + t.Parallel() + db, mock, err := sqlmock.New() - c.Assert(err, IsNil) - defer db.Close() + require.NoError(t, err) + defer func() { + _ = db.Close() + }() snapshot := "2020/07/18 20:31:50" var unixTimeStamp uint64 = 1595075510 @@ -297,26 +341,31 @@ func (s *testSQLSuite) TestParseSnapshotToTSO(c *C) { WithArgs(sqlmock.AnyArg()). WillReturnRows(sqlmock.NewRows([]string{`unix_timestamp("2020/07/18 20:31:50")`}).AddRow(1595075510)) tso, err := parseSnapshotToTSO(db, snapshot) - c.Assert(err, IsNil) - c.Assert(tso, Equals, (unixTimeStamp<<18)*1000) - c.Assert(mock.ExpectationsWereMet(), IsNil) + require.NoError(t, err) + require.Equal(t, (unixTimeStamp<<18)*1000, tso) + require.NoError(t, mock.ExpectationsWereMet()) // generate columns not valid snapshot mock.ExpectQuery(`SELECT unix_timestamp(?)`). WithArgs(sqlmock.AnyArg()). WillReturnRows(sqlmock.NewRows([]string{`unix_timestamp("XXYYZZ")`}).AddRow(nil)) tso, err = parseSnapshotToTSO(db, "XXYYZZ") - c.Assert(err, ErrorMatches, "snapshot XXYYZZ format not supported. please use tso or '2006-01-02 15:04:05' format time") - c.Assert(tso, Equals, uint64(0)) - c.Assert(mock.ExpectationsWereMet(), IsNil) + require.EqualError(t, err, "snapshot XXYYZZ format not supported. please use tso or '2006-01-02 15:04:05' format time") + require.Equal(t, uint64(0), tso) + require.NoError(t, mock.ExpectationsWereMet()) } -func (s *testSQLSuite) TestShowCreateView(c *C) { +func TestShowCreateView(t *testing.T) { + t.Parallel() + db, mock, err := sqlmock.New() - c.Assert(err, IsNil) - defer db.Close() + require.NoError(t, err) + defer func() { + require.NoError(t, db.Close()) + }() + conn, err := db.Conn(context.Background()) - c.Assert(err, IsNil) + require.NoError(t, err) mock.ExpectQuery("SHOW FIELDS FROM `test`.`v`"). WillReturnRows(sqlmock.NewRows([]string{"Field", "Type", "Null", "Key", "Default", "Extra"}). @@ -327,13 +376,15 @@ func (s *testSQLSuite) TestShowCreateView(c *C) { AddRow("v", "CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v` (`a`) AS SELECT `t`.`a` AS `a` FROM `test`.`t`", "utf8", "utf8_general_ci")) createTableSQL, createViewSQL, err := ShowCreateView(conn, "test", "v") - c.Assert(err, IsNil) - c.Assert(createTableSQL, Equals, "CREATE TABLE `v`(\n`a` int\n)ENGINE=MyISAM;\n") - c.Assert(createViewSQL, Equals, "DROP TABLE IF EXISTS `v`;\nDROP VIEW IF EXISTS `v`;\nSET @PREV_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT;\nSET @PREV_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS;\nSET @PREV_COLLATION_CONNECTION=@@COLLATION_CONNECTION;\nSET character_set_client = utf8;\nSET character_set_results = utf8;\nSET collation_connection = utf8_general_ci;\nCREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v` (`a`) AS SELECT `t`.`a` AS `a` FROM `test`.`t`;\nSET character_set_client = @PREV_CHARACTER_SET_CLIENT;\nSET character_set_results = @PREV_CHARACTER_SET_RESULTS;\nSET collation_connection = @PREV_COLLATION_CONNECTION;\n") - c.Assert(mock.ExpectationsWereMet(), IsNil) + require.NoError(t, err) + require.Equal(t, "CREATE TABLE `v`(\n`a` int\n)ENGINE=MyISAM;\n", createTableSQL) + require.Equal(t, "DROP TABLE IF EXISTS `v`;\nDROP VIEW IF EXISTS `v`;\nSET @PREV_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT;\nSET @PREV_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS;\nSET @PREV_COLLATION_CONNECTION=@@COLLATION_CONNECTION;\nSET character_set_client = utf8;\nSET character_set_results = utf8;\nSET collation_connection = utf8_general_ci;\nCREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v` (`a`) AS SELECT `t`.`a` AS `a` FROM `test`.`t`;\nSET character_set_client = @PREV_CHARACTER_SET_CLIENT;\nSET character_set_results = @PREV_CHARACTER_SET_RESULTS;\nSET collation_connection = @PREV_COLLATION_CONNECTION;\n", createViewSQL) + require.NoError(t, mock.ExpectationsWereMet()) } -func (s *testSQLSuite) TestGetSuitableRows(c *C) { +func TestGetSuitableRows(t *testing.T) { + t.Parallel() + testCases := []struct { avgRowLength uint64 expectedRows uint64 @@ -357,47 +408,59 @@ func (s *testSQLSuite) TestGetSuitableRows(c *C) { } for _, testCase := range testCases { rows := GetSuitableRows(testCase.avgRowLength) - c.Assert(rows, Equals, testCase.expectedRows) + require.Equal(t, testCase.expectedRows, rows) } } -func (s *testSQLSuite) TestSelectTiDBRowID(c *C) { +func TestSelectTiDBRowID(t *testing.T) { + t.Parallel() + db, mock, err := sqlmock.New() - c.Assert(err, IsNil) - defer db.Close() + require.NoError(t, err) + defer func() { + require.NoError(t, db.Close()) + }() + conn, err := db.Conn(context.Background()) - c.Assert(err, IsNil) + require.NoError(t, err) + database, table := "test", "t" // _tidb_rowid is unavailable, or PKIsHandle. mock.ExpectExec("SELECT _tidb_rowid from `test`.`t`"). WillReturnError(errors.New(`1054, "Unknown column '_tidb_rowid' in 'field list'"`)) hasImplicitRowID, err := SelectTiDBRowID(conn, database, table) - c.Assert(err, IsNil) - c.Assert(hasImplicitRowID, IsFalse) + require.NoError(t, err) + require.False(t, hasImplicitRowID) // _tidb_rowid is available. mock.ExpectExec("SELECT _tidb_rowid from `test`.`t`"). WillReturnResult(sqlmock.NewResult(0, 0)) hasImplicitRowID, err = SelectTiDBRowID(conn, database, table) - c.Assert(err, IsNil) - c.Assert(hasImplicitRowID, IsTrue) + require.NoError(t, err) + require.True(t, hasImplicitRowID) // _tidb_rowid returns error expectedErr := errors.New("mock error") mock.ExpectExec("SELECT _tidb_rowid from `test`.`t`"). WillReturnError(expectedErr) hasImplicitRowID, err = SelectTiDBRowID(conn, database, table) - c.Assert(errors.Cause(err), Equals, expectedErr) - c.Assert(hasImplicitRowID, IsFalse) + require.ErrorIs(t, errors.Cause(err), expectedErr) + require.False(t, hasImplicitRowID) } -func (s *testSQLSuite) TestBuildTableSampleQueries(c *C) { +func TestBuildTableSampleQueries(t *testing.T) { + t.Parallel() + db, mock, err := sqlmock.New() - c.Assert(err, IsNil) - defer db.Close() + require.NoError(t, err) + defer func() { + require.NoError(t, db.Close()) + }() + conn, err := db.Conn(context.Background()) - c.Assert(err, IsNil) + require.NoError(t, err) + tctx, cancel := tcontext.Background().WithLogger(appLogger).WithCancel() d := &Dumper{ @@ -615,7 +678,7 @@ func (s *testSQLSuite) TestBuildTableSampleQueries(c *C) { } for caseID, testCase := range testCases { - c.Log(fmt.Sprintf("case #%d", caseID)) + t.Logf("case #%d", caseID) handleColNames := testCase.handleColNames handleColTypes := testCase.handleColTypes handleVals := testCase.handleVals @@ -623,7 +686,7 @@ func (s *testSQLSuite) TestBuildTableSampleQueries(c *C) { // Test build whereClauses whereClauses := buildWhereClauses(handleColNames, handleValStrings) - c.Assert(whereClauses, DeepEquals, testCase.expectedWhereClauses) + require.Equal(t, testCase.expectedWhereClauses, whereClauses) // Test build tasks through table sample if len(handleColNames) > 0 { @@ -675,18 +738,19 @@ func (s *testSQLSuite) TestBuildTableSampleQueries(c *C) { } } - c.Assert(d.concurrentDumpTable(tctx, conn, meta, taskChan), IsNil) - c.Assert(mock.ExpectationsWereMet(), IsNil) + require.NoError(t, d.concurrentDumpTable(tctx, conn, meta, taskChan)) + require.NoError(t, mock.ExpectationsWereMet()) orderByClause := buildOrderByClauseString(handleColNames) checkQuery := func(i int, query string) { task := <-taskChan taskTableData, ok := task.(*TaskTableData) - c.Assert(ok, IsTrue) - c.Assert(taskTableData.ChunkIndex, Equals, i) + require.True(t, ok) + require.Equal(t, i, taskTableData.ChunkIndex) + data, ok := taskTableData.Data.(*tableData) - c.Assert(ok, IsTrue) - c.Assert(data.query, Equals, query) + require.True(t, ok) + require.Equal(t, query, data.query) } // special case, no value found @@ -704,7 +768,9 @@ func (s *testSQLSuite) TestBuildTableSampleQueries(c *C) { } } -func (s *testSQLSuite) TestBuildPartitionClauses(c *C) { +func TestBuildPartitionClauses(t *testing.T) { + t.Parallel() + const ( dbName = "test" tbName = "t" @@ -758,16 +824,22 @@ func (s *testSQLSuite) TestBuildPartitionClauses(c *C) { } for _, testCase := range testCases { query := buildSelectQuery(dbName, tbName, fields, testCase.partition, testCase.where, testCase.orderByClause) - c.Assert(query, Equals, testCase.expectedQuery) + require.Equal(t, testCase.expectedQuery, query) } } -func (s *testSQLSuite) TestBuildRegionQueriesWithoutPartition(c *C) { +func TestBuildRegionQueriesWithoutPartition(t *testing.T) { + t.Parallel() + db, mock, err := sqlmock.New() - c.Assert(err, IsNil) - defer db.Close() + require.NoError(t, err) + defer func() { + require.NoError(t, db.Close()) + }() + conn, err := db.Conn(context.Background()) - c.Assert(err, IsNil) + require.NoError(t, err) + tctx, cancel := tcontext.Background().WithLogger(appLogger).WithCancel() d := &Dumper{ @@ -852,8 +924,8 @@ func (s *testSQLSuite) TestBuildRegionQueriesWithoutPartition(c *C) { }, } - for caseID, testCase := range testCases { - c.Log(fmt.Sprintf("case #%d", caseID)) + for i, testCase := range testCases { + t.Logf("case #%d", i) handleColNames := testCase.handleColNames handleColTypes := testCase.handleColTypes regionResults := testCase.regionResults @@ -901,28 +973,34 @@ func (s *testSQLSuite) TestBuildRegionQueriesWithoutPartition(c *C) { mock.ExpectQuery(fmt.Sprintf("SHOW INDEX FROM `%s`.`%s`", database, table)).WillReturnRows(rows) mock.ExpectQuery("SHOW INDEX FROM").WillReturnRows(sqlmock.NewRows(showIndexHeaders)) } - c.Assert(d.concurrentDumpTable(tctx, conn, meta, taskChan), IsNil) - c.Assert(mock.ExpectationsWereMet(), IsNil) + require.NoError(t, d.concurrentDumpTable(tctx, conn, meta, taskChan)) + require.NoError(t, mock.ExpectationsWereMet()) for i, w := range testCase.expectedWhereClauses { query := buildSelectQuery(database, table, "*", "", buildWhereCondition(d.conf, w), orderByClause) task := <-taskChan taskTableData, ok := task.(*TaskTableData) - c.Assert(ok, IsTrue) - c.Assert(taskTableData.ChunkIndex, Equals, i) + require.True(t, ok) + require.Equal(t, i, taskTableData.ChunkIndex) data, ok := taskTableData.Data.(*tableData) - c.Assert(ok, IsTrue) - c.Assert(data.query, Equals, query) + require.True(t, ok) + require.Equal(t, query, data.query) } } } -func (s *testSQLSuite) TestBuildRegionQueriesWithPartitions(c *C) { +func TestBuildRegionQueriesWithPartitions(t *testing.T) { + t.Parallel() + db, mock, err := sqlmock.New() - c.Assert(err, IsNil) - defer db.Close() + require.NoError(t, err) + defer func() { + require.NoError(t, db.Close()) + }() + conn, err := db.Conn(context.Background()) - c.Assert(err, IsNil) + require.NoError(t, err) + tctx, cancel := tcontext.Background().WithLogger(appLogger).WithCancel() d := &Dumper{ @@ -1050,7 +1128,7 @@ func (s *testSQLSuite) TestBuildRegionQueriesWithPartitions(c *C) { } for i, testCase := range testCases { - c.Log(fmt.Sprintf("case #%d", i)) + t.Logf("case #%d", i) handleColNames := testCase.handleColNames handleColTypes := testCase.handleColTypes regionResults := testCase.regionResults @@ -1095,8 +1173,8 @@ func (s *testSQLSuite) TestBuildRegionQueriesWithPartitions(c *C) { } orderByClause := buildOrderByClauseString(handleColNames) - c.Assert(d.concurrentDumpTable(tctx, conn, meta, taskChan), IsNil) - c.Assert(mock.ExpectationsWereMet(), IsNil) + require.NoError(t, d.concurrentDumpTable(tctx, conn, meta, taskChan)) + require.NoError(t, mock.ExpectationsWereMet()) chunkIdx := 0 for i, partition := range partitions { @@ -1104,11 +1182,11 @@ func (s *testSQLSuite) TestBuildRegionQueriesWithPartitions(c *C) { query := buildSelectQuery(database, table, "*", partition, buildWhereCondition(d.conf, w), orderByClause) task := <-taskChan taskTableData, ok := task.(*TaskTableData) - c.Assert(ok, IsTrue) - c.Assert(taskTableData.ChunkIndex, Equals, chunkIdx) + require.True(t, ok) + require.Equal(t, chunkIdx, taskTableData.ChunkIndex) data, ok := taskTableData.Data.(*tableData) - c.Assert(ok, IsTrue) - c.Assert(data.query, Equals, query) + require.True(t, ok) + require.Equal(t, query, data.query) chunkIdx++ } } @@ -1123,12 +1201,12 @@ func buildMockNewRows(mock sqlmock.Sqlmock, columns []string, driverValues [][]d return rows } -func readRegionCsvDriverValues(c *C) [][]driver.Value { +func readRegionCsvDriverValues(t *testing.T) [][]driver.Value { // nolint: dogsled _, filename, _, _ := runtime.Caller(0) csvFilename := path.Join(path.Dir(filename), "region_results.csv") file, err := os.Open(csvFilename) - c.Assert(err, IsNil) + require.NoError(t, err) csvReader := csv.NewReader(file) values := make([][]driver.Value, 0, 990) for { @@ -1136,24 +1214,30 @@ func readRegionCsvDriverValues(c *C) [][]driver.Value { if err == io.EOF { break } - c.Assert(err, IsNil) + require.NoError(t, err) if len(results) != 3 { continue } regionID, err := strconv.Atoi(results[0]) - c.Assert(err, IsNil) + require.NoError(t, err) startKey, endKey := results[1], results[2] values = append(values, []driver.Value{regionID, startKey, endKey}) } return values } -func (s *testSQLSuite) TestBuildVersion3RegionQueries(c *C) { +func TestBuildVersion3RegionQueries(t *testing.T) { + t.Parallel() + db, mock, err := sqlmock.New() - c.Assert(err, IsNil) - defer db.Close() + require.NoError(t, err) + defer func() { + require.NoError(t, db.Close()) + }() + conn, err := db.Conn(context.Background()) - c.Assert(err, IsNil) + require.NoError(t, err) + tctx, cancel := tcontext.Background().WithLogger(appLogger).WithCancel() oldOpenFunc := openDBFunc defer func() { @@ -1258,7 +1342,7 @@ func (s *testSQLSuite) TestBuildVersion3RegionQueries(c *C) { {2142, "2021-06-28 10:59:03", 1959424}, {2142, "2021-06-28 10:59:04", 2000000}, }) - selectRegionStatusHistograms := buildMockNewRows(mock, []string{"REGION_ID", "START_KEY", "END_KEY"}, readRegionCsvDriverValues(c)) + selectRegionStatusHistograms := buildMockNewRows(mock, []string{"REGION_ID", "START_KEY", "END_KEY"}, readRegionCsvDriverValues(t)) selectInformationSchemaTables := buildMockNewRows(mock, []string{"TABLE_SCHEMA", "TABLE_NAME", "TIDB_TABLE_ID"}, [][]driver.Value{ {"mysql", "expr_pushdown_blacklist", 39}, @@ -1295,8 +1379,8 @@ func (s *testSQLSuite) TestBuildVersion3RegionQueries(c *C) { mock.ExpectQuery("SELECT REGION_ID,START_KEY,END_KEY FROM INFORMATION_SCHEMA.TIKV_REGION_STATUS ORDER BY START_KEY;"). WillReturnRows(selectRegionStatusHistograms) - c.Assert(d.renewSelectTableRegionFuncForLowerTiDB(tctx), IsNil) - c.Assert(mock.ExpectationsWereMet(), IsNil) + require.NoError(t, d.renewSelectTableRegionFuncForLowerTiDB(tctx)) + require.NoError(t, mock.ExpectationsWereMet()) testCases := []struct { tableName string @@ -1371,7 +1455,7 @@ func (s *testSQLSuite) TestBuildVersion3RegionQueries(c *C) { } for i, testCase := range testCases { - c.Log(fmt.Sprintf("case #%d", i)) + t.Logf("case #%d", i) table := testCase.tableName handleColNames := testCase.handleColNames handleColTypes := testCase.handleColTypes @@ -1399,19 +1483,21 @@ func (s *testSQLSuite) TestBuildVersion3RegionQueries(c *C) { } orderByClause := buildOrderByClauseString(handleColNames) - c.Assert(d.concurrentDumpTable(tctx, conn, meta, taskChan), IsNil) - c.Assert(mock.ExpectationsWereMet(), IsNil) + require.NoError(t, d.concurrentDumpTable(tctx, conn, meta, taskChan)) + require.NoError(t, mock.ExpectationsWereMet()) chunkIdx := 0 for _, w := range testCase.expectedWhereClauses { query := buildSelectQuery(database, table, "*", "", buildWhereCondition(d.conf, w), orderByClause) task := <-taskChan taskTableData, ok := task.(*TaskTableData) - c.Assert(ok, IsTrue) - c.Assert(taskTableData.ChunkIndex, Equals, chunkIdx) + require.True(t, ok) + require.Equal(t, chunkIdx, taskTableData.ChunkIndex) + data, ok := taskTableData.Data.(*tableData) - c.Assert(ok, IsTrue) - c.Assert(data.query, Equals, query) + require.True(t, ok) + require.Equal(t, query, data.query) + chunkIdx++ } } diff --git a/v4/export/sql_type_test.go b/v4/export/sql_type_test.go index 7f7c1cd5..97ae6d05 100644 --- a/v4/export/sql_type_test.go +++ b/v4/export/sql_type_test.go @@ -4,15 +4,14 @@ package export import ( "bytes" + "testing" - . "github.com/pingcap/check" + "github.com/stretchr/testify/require" ) -var _ = Suite(&testSQLByteSuite{}) +func TestEscape(t *testing.T) { + t.Parallel() -type testSQLByteSuite struct{} - -func (s *testSQLByteSuite) TestEscape(c *C) { var bf bytes.Buffer str := []byte(`MWQeWw""'\rNmtGxzGp`) expectStrBackslash := `MWQeWw\"\"\'\\rNmtGxzGp` @@ -20,37 +19,39 @@ func (s *testSQLByteSuite) TestEscape(c *C) { expectStrBackslashDoubleQuote := `MWQeWw\"\"'\\rNmtGxzGp` expectStrWithoutBackslashDoubleQuote := `MWQeWw""""'\rNmtGxzGp` escapeSQL(str, &bf, true) - c.Assert(bf.String(), Equals, expectStrBackslash) + require.Equal(t, expectStrBackslash, bf.String()) + bf.Reset() escapeSQL(str, &bf, false) - c.Assert(bf.String(), Equals, expectStrWithoutBackslash) + require.Equal(t, expectStrWithoutBackslash, bf.String()) + bf.Reset() opt := &csvOption{ delimiter: []byte(`"`), separator: []byte(`,`), } escapeCSV(str, &bf, true, opt) - c.Assert(bf.String(), Equals, expectStrBackslashDoubleQuote) + require.Equal(t, expectStrBackslashDoubleQuote, bf.String()) + bf.Reset() escapeCSV(str, &bf, false, opt) - c.Assert(bf.String(), Equals, expectStrWithoutBackslashDoubleQuote) - bf.Reset() + require.Equal(t, expectStrWithoutBackslashDoubleQuote, bf.String()) + bf.Reset() str = []byte(`a|*|b"cd`) expectedStrWithDelimiter := `a|*|b""cd` expectedStrBackslashWithoutDelimiter := `a\|*\|b"cd` expectedStrWithoutDelimiter := `a|*|b"cd` - escapeCSV(str, &bf, false, opt) - c.Assert(bf.String(), Equals, expectedStrWithDelimiter) - bf.Reset() + require.Equal(t, expectedStrWithDelimiter, bf.String()) + bf.Reset() opt.delimiter = []byte("") opt.separator = []byte(`|*|`) escapeCSV(str, &bf, true, opt) - c.Assert(bf.String(), Equals, expectedStrBackslashWithoutDelimiter) + require.Equal(t, expectedStrBackslashWithoutDelimiter, bf.String()) + bf.Reset() escapeCSV(str, &bf, false, opt) - c.Assert(bf.String(), Equals, expectedStrWithoutDelimiter) - bf.Reset() + require.Equal(t, expectedStrWithoutDelimiter, bf.String()) } diff --git a/v4/export/writer_util_test.go b/v4/export/writer_serial_test.go similarity index 65% rename from v4/export/writer_util_test.go rename to v4/export/writer_serial_test.go index b5d164a4..8cfdf3e7 100644 --- a/v4/export/writer_util_test.go +++ b/v4/export/writer_serial_test.go @@ -9,56 +9,13 @@ import ( "testing" tcontext "github.com/pingcap/dumpling/v4/context" - "github.com/pingcap/dumpling/v4/log" - . "github.com/pingcap/check" "github.com/pingcap/errors" "github.com/pingcap/tidb/br/pkg/storage" - "github.com/prometheus/client_golang/prometheus" + "github.com/stretchr/testify/require" ) -var appLogger log.Logger - -func TestT(t *testing.T) { - initColTypeRowReceiverMap() - logger, _, err := log.InitAppLogger(&log.Config{ - Level: "debug", - File: "", - Format: "text", - }) - if err != nil { - t.Log("fail to init logger, err: " + err.Error()) - t.Fail() - } - appLogger = logger - registry := prometheus.NewRegistry() - registry.MustRegister(prometheus.NewProcessCollector(prometheus.ProcessCollectorOpts{})) - registry.MustRegister(prometheus.NewGoCollector()) - RegisterMetrics(registry) - TestingT(t) -} - -var _ = SerialSuites(&testWriteSuite{}) - -type testWriteSuite struct { - mockCfg *Config -} - -func (s *testWriteSuite) SetUpSuite(_ *C) { - s.mockCfg = &Config{ - FileSize: UnspecifiedSize, - } - InitMetricsVector(s.mockCfg.Labels) -} - -func (s *testWriteSuite) TearDownTest(c *C) { - RemoveLabelValuesWithTaskInMetrics(s.mockCfg.Labels) - - c.Assert(ReadGauge(finishedRowsGauge, s.mockCfg.Labels), Equals, float64(0)) - c.Assert(ReadGauge(finishedSizeGauge, s.mockCfg.Labels), Equals, float64(0)) -} - -func (s *testWriteSuite) TestWriteMeta(c *C) { +func TestWriteMeta(t *testing.T) { createTableStmt := "CREATE TABLE `t1` (\n" + " `a` int(11) DEFAULT NULL\n" + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;\n" @@ -67,15 +24,19 @@ func (s *testWriteSuite) TestWriteMeta(c *C) { writer := storage.NewBufferWriter() err := WriteMeta(tcontext.Background(), meta, writer) - c.Assert(err, IsNil) + require.NoError(t, err) + expected := "/*!40103 SET TIME_ZONE='+00:00' */;\n" + "CREATE TABLE `t1` (\n" + " `a` int(11) DEFAULT NULL\n" + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;\n" - c.Assert(writer.String(), Equals, expected) + require.Equal(t, expected, writer.String()) } -func (s *testWriteSuite) TestWriteInsert(c *C) { +func TestWriteInsert(t *testing.T) { + cfg, clean := createMockConfig(t) + defer clean() + data := [][]driver.Value{ {"1", "male", "bob@mail.com", "020-1234", nil}, {"2", "female", "sarah@mail.com", "020-1253", "healthy"}, @@ -90,10 +51,11 @@ func (s *testWriteSuite) TestWriteInsert(c *C) { tableIR := newMockTableIR("test", "employee", data, specCmts, colTypes) bf := storage.NewBufferWriter() - conf := configForWriteSQL(s.mockCfg, UnspecifiedSize, UnspecifiedSize) + conf := configForWriteSQL(cfg, UnspecifiedSize, UnspecifiedSize) n, err := WriteInsert(tcontext.Background(), conf, tableIR, tableIR, bf) - c.Assert(n, Equals, uint64(4)) - c.Assert(err, IsNil) + require.NoError(t, err) + require.Equal(t, uint64(4), n) + expected := "/*!40101 SET NAMES binary*/;\n" + "/*!40014 SET FOREIGN_KEY_CHECKS=0*/;\n" + "INSERT INTO `employee` VALUES\n" + @@ -101,12 +63,15 @@ func (s *testWriteSuite) TestWriteInsert(c *C) { "(2,'female','sarah@mail.com','020-1253','healthy'),\n" + "(3,'male','john@mail.com','020-1256','healthy'),\n" + "(4,'female','sarah@mail.com','020-1235','healthy');\n" - c.Assert(bf.String(), Equals, expected) - c.Assert(ReadGauge(finishedRowsGauge, conf.Labels), Equals, float64(len(data))) - c.Assert(ReadGauge(finishedSizeGauge, conf.Labels), Equals, float64(len(expected))) + require.Equal(t, expected, bf.String()) + require.Equal(t, ReadGauge(finishedRowsGauge, conf.Labels), float64(len(data))) + require.Equal(t, ReadGauge(finishedSizeGauge, conf.Labels), float64(len(expected))) } -func (s *testWriteSuite) TestWriteInsertReturnsError(c *C) { +func TestWriteInsertReturnsError(t *testing.T) { + cfg, clean := createMockConfig(t) + defer clean() + data := [][]driver.Value{ {"1", "male", "bob@mail.com", "020-1234", nil}, {"2", "female", "sarah@mail.com", "020-1253", "healthy"}, @@ -124,23 +89,27 @@ func (s *testWriteSuite) TestWriteInsertReturnsError(c *C) { tableIR.rowErr = rowErr bf := storage.NewBufferWriter() - conf := configForWriteSQL(s.mockCfg, UnspecifiedSize, UnspecifiedSize) + conf := configForWriteSQL(cfg, UnspecifiedSize, UnspecifiedSize) n, err := WriteInsert(tcontext.Background(), conf, tableIR, tableIR, bf) - c.Assert(n, Equals, uint64(3)) - c.Assert(err, Equals, rowErr) + require.ErrorIs(t, err, rowErr) + require.Equal(t, uint64(3), n) + expected := "/*!40101 SET NAMES binary*/;\n" + "/*!40014 SET FOREIGN_KEY_CHECKS=0*/;\n" + "INSERT INTO `employee` VALUES\n" + "(1,'male','bob@mail.com','020-1234',NULL),\n" + "(2,'female','sarah@mail.com','020-1253','healthy'),\n" + "(3,'male','john@mail.com','020-1256','healthy');\n" - c.Assert(bf.String(), Equals, expected) + require.Equal(t, expected, bf.String()) // error occurred, should revert pointer to zero - c.Assert(ReadGauge(finishedRowsGauge, conf.Labels), Equals, float64(0)) - c.Assert(ReadGauge(finishedSizeGauge, conf.Labels), Equals, float64(0)) + require.Equal(t, ReadGauge(finishedRowsGauge, conf.Labels), float64(0)) + require.Equal(t, ReadGauge(finishedSizeGauge, conf.Labels), float64(0)) } -func (s *testWriteSuite) TestWriteInsertInCsv(c *C) { +func TestWriteInsertInCsv(t *testing.T) { + cfg, clean := createMockConfig(t) + defer clean() + data := [][]driver.Value{ {"1", "male", "bob@mail.com", "020-1234", nil}, {"2", "female", "sarah@mail.com", "020-1253", "healthy"}, @@ -153,51 +122,57 @@ func (s *testWriteSuite) TestWriteInsertInCsv(c *C) { // test nullValue opt := &csvOption{separator: []byte(","), delimiter: doubleQuotationMark, nullValue: "\\N"} - conf := configForWriteCSV(s.mockCfg, true, opt) + conf := configForWriteCSV(cfg, true, opt) n, err := WriteInsertInCsv(tcontext.Background(), conf, tableIR, tableIR, bf) - c.Assert(n, Equals, uint64(4)) - c.Assert(err, IsNil) + require.Equal(t, uint64(4), n) + require.NoError(t, err) + expected := "1,\"male\",\"bob@mail.com\",\"020-1234\",\\N\n" + "2,\"female\",\"sarah@mail.com\",\"020-1253\",\"healthy\"\n" + "3,\"male\",\"john@mail.com\",\"020-1256\",\"healthy\"\n" + "4,\"female\",\"sarah@mail.com\",\"020-1235\",\"healthy\"\n" - c.Assert(bf.String(), Equals, expected) - c.Assert(ReadGauge(finishedRowsGauge, conf.Labels), Equals, float64(len(data))) - c.Assert(ReadGauge(finishedSizeGauge, conf.Labels), Equals, float64(len(expected))) + require.Equal(t, expected, bf.String()) + require.Equal(t, float64(len(data)), ReadGauge(finishedRowsGauge, conf.Labels)) + require.Equal(t, float64(len(expected)), ReadGauge(finishedSizeGauge, conf.Labels)) + RemoveLabelValuesWithTaskInMetrics(conf.Labels) // test delimiter bf.Reset() opt.delimiter = quotationMark tableIR = newMockTableIR("test", "employee", data, nil, colTypes) - conf = configForWriteCSV(s.mockCfg, true, opt) + conf = configForWriteCSV(cfg, true, opt) n, err = WriteInsertInCsv(tcontext.Background(), conf, tableIR, tableIR, bf) - c.Assert(n, Equals, uint64(4)) - c.Assert(err, IsNil) + require.Equal(t, uint64(4), n) + require.NoError(t, err) + expected = "1,'male','bob@mail.com','020-1234',\\N\n" + "2,'female','sarah@mail.com','020-1253','healthy'\n" + "3,'male','john@mail.com','020-1256','healthy'\n" + "4,'female','sarah@mail.com','020-1235','healthy'\n" - c.Assert(bf.String(), Equals, expected) - c.Assert(ReadGauge(finishedRowsGauge, conf.Labels), Equals, float64(len(data))) - c.Assert(ReadGauge(finishedSizeGauge, conf.Labels), Equals, float64(len(expected))) + require.Equal(t, expected, bf.String()) + require.Equal(t, float64(len(data)), ReadGauge(finishedRowsGauge, conf.Labels)) + require.Equal(t, float64(len(expected)), ReadGauge(finishedSizeGauge, conf.Labels)) + RemoveLabelValuesWithTaskInMetrics(conf.Labels) // test separator bf.Reset() opt.separator = []byte(";") tableIR = newMockTableIR("test", "employee", data, nil, colTypes) - conf = configForWriteCSV(s.mockCfg, true, opt) + conf = configForWriteCSV(cfg, true, opt) n, err = WriteInsertInCsv(tcontext.Background(), conf, tableIR, tableIR, bf) - c.Assert(n, Equals, uint64(4)) - c.Assert(err, IsNil) + require.Equal(t, uint64(4), n) + require.NoError(t, err) + expected = "1;'male';'bob@mail.com';'020-1234';\\N\n" + "2;'female';'sarah@mail.com';'020-1253';'healthy'\n" + "3;'male';'john@mail.com';'020-1256';'healthy'\n" + "4;'female';'sarah@mail.com';'020-1235';'healthy'\n" - c.Assert(bf.String(), Equals, expected) - c.Assert(ReadGauge(finishedRowsGauge, conf.Labels), Equals, float64(len(data))) - c.Assert(ReadGauge(finishedSizeGauge, conf.Labels), Equals, float64(len(expected))) + require.Equal(t, expected, bf.String()) + require.Equal(t, float64(len(data)), ReadGauge(finishedRowsGauge, conf.Labels)) + require.Equal(t, float64(len(expected)), ReadGauge(finishedSizeGauge, conf.Labels)) + RemoveLabelValuesWithTaskInMetrics(conf.Labels) // test delimiter that included in values @@ -206,22 +181,27 @@ func (s *testWriteSuite) TestWriteInsertInCsv(c *C) { opt.delimiter = []byte("ma") tableIR = newMockTableIR("test", "employee", data, nil, colTypes) tableIR.colNames = []string{"id", "gender", "email", "phone_number", "status"} - conf = configForWriteCSV(s.mockCfg, false, opt) + conf = configForWriteCSV(cfg, false, opt) n, err = WriteInsertInCsv(tcontext.Background(), conf, tableIR, tableIR, bf) - c.Assert(n, Equals, uint64(4)) - c.Assert(err, IsNil) + require.Equal(t, uint64(4), n) + require.NoError(t, err) + expected = "maidma&;,?magenderma&;,?maemamailma&;,?maphone_numberma&;,?mastatusma\n" + "1&;,?mamamalema&;,?mabob@mamail.comma&;,?ma020-1234ma&;,?\\N\n" + "2&;,?mafemamalema&;,?masarah@mamail.comma&;,?ma020-1253ma&;,?mahealthyma\n" + "3&;,?mamamalema&;,?majohn@mamail.comma&;,?ma020-1256ma&;,?mahealthyma\n" + "4&;,?mafemamalema&;,?masarah@mamail.comma&;,?ma020-1235ma&;,?mahealthyma\n" - c.Assert(bf.String(), Equals, expected) - c.Assert(ReadGauge(finishedRowsGauge, conf.Labels), Equals, float64(len(data))) - c.Assert(ReadGauge(finishedSizeGauge, conf.Labels), Equals, float64(len(expected))) + require.Equal(t, expected, bf.String()) + require.Equal(t, float64(len(data)), ReadGauge(finishedRowsGauge, conf.Labels)) + require.Equal(t, float64(len(expected)), ReadGauge(finishedSizeGauge, conf.Labels)) + RemoveLabelValuesWithTaskInMetrics(conf.Labels) } -func (s *testWriteSuite) TestWriteInsertInCsvReturnsError(c *C) { +func TestWriteInsertInCsvReturnsError(t *testing.T) { + cfg, clean := createMockConfig(t) + defer clean() + data := [][]driver.Value{ {"1", "male", "bob@mail.com", "020-1234", nil}, {"2", "female", "sarah@mail.com", "020-1253", "healthy"}, @@ -238,20 +218,25 @@ func (s *testWriteSuite) TestWriteInsertInCsvReturnsError(c *C) { // test nullValue opt := &csvOption{separator: []byte(","), delimiter: doubleQuotationMark, nullValue: "\\N"} - conf := configForWriteCSV(s.mockCfg, true, opt) + conf := configForWriteCSV(cfg, true, opt) n, err := WriteInsertInCsv(tcontext.Background(), conf, tableIR, tableIR, bf) - c.Assert(n, Equals, uint64(3)) - c.Assert(err, Equals, rowErr) + require.Equal(t, uint64(3), n) + require.ErrorIs(t, err, rowErr) + expected := "1,\"male\",\"bob@mail.com\",\"020-1234\",\\N\n" + "2,\"female\",\"sarah@mail.com\",\"020-1253\",\"healthy\"\n" + "3,\"male\",\"john@mail.com\",\"020-1256\",\"healthy\"\n" - c.Assert(bf.String(), Equals, expected) - c.Assert(ReadGauge(finishedRowsGauge, conf.Labels), Equals, float64(0)) - c.Assert(ReadGauge(finishedSizeGauge, conf.Labels), Equals, float64(0)) + require.Equal(t, expected, bf.String()) + require.Equal(t, float64(0), ReadGauge(finishedRowsGauge, conf.Labels)) + require.Equal(t, float64(0), ReadGauge(finishedSizeGauge, conf.Labels)) + RemoveLabelValuesWithTaskInMetrics(conf.Labels) } -func (s *testWriteSuite) TestSQLDataTypes(c *C) { +func TestSQLDataTypes(t *testing.T) { + cfg, clean := createMockConfig(t) + defer clean() + data := [][]driver.Value{ {"CHAR", "char1", `'char1'`}, {"INT", 12345, `12345`}, @@ -266,20 +251,22 @@ func (s *testWriteSuite) TestSQLDataTypes(c *C) { tableIR := newMockTableIR("test", "t", tableData, nil, colType) bf := storage.NewBufferWriter() - conf := configForWriteSQL(s.mockCfg, UnspecifiedSize, UnspecifiedSize) + conf := configForWriteSQL(cfg, UnspecifiedSize, UnspecifiedSize) n, err := WriteInsert(tcontext.Background(), conf, tableIR, tableIR, bf) - c.Assert(n, Equals, uint64(1)) - c.Assert(err, IsNil) + require.NoError(t, err) + require.Equal(t, uint64(1), n) + lines := strings.Split(bf.String(), "\n") - c.Assert(len(lines), Equals, 3) - c.Assert(lines[1], Equals, fmt.Sprintf("(%s);", result)) - c.Assert(ReadGauge(finishedRowsGauge, conf.Labels), Equals, float64(1)) - c.Assert(ReadGauge(finishedSizeGauge, conf.Labels), Equals, float64(len(bf.String()))) + require.Len(t, lines, 3) + require.Equal(t, fmt.Sprintf("(%s);", result), lines[1]) + require.Equal(t, float64(1), ReadGauge(finishedRowsGauge, conf.Labels)) + require.Equal(t, float64(len(bf.String())), ReadGauge(finishedSizeGauge, conf.Labels)) + RemoveLabelValuesWithTaskInMetrics(conf.Labels) } } -func (s *testWriteSuite) TestWrite(c *C) { +func TestWrite(t *testing.T) { mocksw := &mockPoisonWriter{} src := []string{"test", "loooooooooooooooooooong", "poison"} exp := []string{"test", "loooooooooooooooooooong", "poison_error"} @@ -287,14 +274,13 @@ func (s *testWriteSuite) TestWrite(c *C) { for i, s := range src { err := write(tcontext.Background(), mocksw, s) if err != nil { - c.Assert(err.Error(), Equals, exp[i]) + require.EqualError(t, err, exp[i]) } else { - c.Assert(s, Equals, mocksw.buf) - c.Assert(mocksw.buf, Equals, exp[i]) + require.Equal(t, s, mocksw.buf) + require.Equal(t, exp[i], mocksw.buf) } } - err := write(tcontext.Background(), mocksw, "test") - c.Assert(err, IsNil) + require.NoError(t, write(tcontext.Background(), mocksw, "test")) } // cloneConfigForTest clones a dumpling config. @@ -320,3 +306,19 @@ func configForWriteCSV(config *Config, noHeader bool, opt *csvOption) *Config { cfg.FileSize = UnspecifiedSize return cfg } + +func createMockConfig(t *testing.T) (cfg *Config, clean func()) { + cfg = &Config{ + FileSize: UnspecifiedSize, + } + + InitMetricsVector(cfg.Labels) + + clean = func() { + RemoveLabelValuesWithTaskInMetrics(cfg.Labels) + require.Equal(t, float64(0), ReadGauge(finishedRowsGauge, cfg.Labels)) + require.Equal(t, float64(0), ReadGauge(finishedSizeGauge, cfg.Labels)) + } + + return +} diff --git a/v4/export/writer_test.go b/v4/export/writer_test.go index 08b62725..27a5ad7f 100644 --- a/v4/export/writer_test.go +++ b/v4/export/writer_test.go @@ -8,102 +8,97 @@ import ( "io/ioutil" "os" "path" - - tcontext "github.com/pingcap/dumpling/v4/context" + "sync" + "testing" "github.com/DATA-DOG/go-sqlmock" - . "github.com/pingcap/check" + tcontext "github.com/pingcap/dumpling/v4/context" + "github.com/stretchr/testify/require" ) -var _ = Suite(&testWriterSuite{}) - -type testWriterSuite struct{} +func TestWriteDatabaseMeta(t *testing.T) { + t.Parallel() -func defaultConfigForTest(c *C) *Config { - config := DefaultConfig() - c.Assert(adjustFileFormat(config), IsNil) - return config -} - -func (s *testWriterSuite) newWriter(conf *Config, c *C) *Writer { - extStore, err := conf.createExternalStorage(context.Background()) - c.Assert(err, IsNil) - db, _, err := sqlmock.New() - c.Assert(err, IsNil) - conn, err := db.Conn(context.Background()) - c.Assert(err, IsNil) - return NewWriter(tcontext.Background(), 0, conf, conn, extStore) -} - -func (s *testWriterSuite) TestWriteDatabaseMeta(c *C) { - dir := c.MkDir() - - config := defaultConfigForTest(c) + dir := t.TempDir() + config := defaultConfigForTest(t) config.OutputDirPath = dir - writer := s.newWriter(config, c) + writer, clean := createTestWriter(config, t) + defer clean() + err := writer.WriteDatabaseMeta("test", "CREATE DATABASE `test`") - c.Assert(err, IsNil) + require.NoError(t, err) + p := path.Join(dir, "test-schema-create.sql") _, err = os.Stat(p) - c.Assert(err, IsNil) + require.NoError(t, err) + bytes, err := ioutil.ReadFile(p) - c.Assert(err, IsNil) - c.Assert(string(bytes), Equals, "/*!40101 SET NAMES binary*/;\nCREATE DATABASE `test`;\n") + require.NoError(t, err) + require.Equal(t, "/*!40101 SET NAMES binary*/;\nCREATE DATABASE `test`;\n", string(bytes)) } -func (s *testWriterSuite) TestWriteTableMeta(c *C) { - dir := c.MkDir() +func TestWriteTableMeta(t *testing.T) { + t.Parallel() - config := defaultConfigForTest(c) + dir := t.TempDir() + + config := defaultConfigForTest(t) config.OutputDirPath = dir - writer := s.newWriter(config, c) + writer, clean := createTestWriter(config, t) + defer clean() + err := writer.WriteTableMeta("test", "t", "CREATE TABLE t (a INT)") - c.Assert(err, IsNil) + require.NoError(t, err) p := path.Join(dir, "test.t-schema.sql") _, err = os.Stat(p) - c.Assert(err, IsNil) + require.NoError(t, err) bytes, err := ioutil.ReadFile(p) - c.Assert(err, IsNil) - c.Assert(string(bytes), Equals, "/*!40101 SET NAMES binary*/;\nCREATE TABLE t (a INT);\n") + require.NoError(t, err) + require.Equal(t, "/*!40101 SET NAMES binary*/;\nCREATE TABLE t (a INT);\n", string(bytes)) } -func (s *testWriterSuite) TestWriteViewMeta(c *C) { - dir := c.MkDir() +func TestWriteViewMeta(t *testing.T) { + t.Parallel() - config := defaultConfigForTest(c) + dir := t.TempDir() + config := defaultConfigForTest(t) config.OutputDirPath = dir - writer := s.newWriter(config, c) + writer, clean := createTestWriter(config, t) + defer clean() + specCmt := "/*!40101 SET NAMES binary*/;\n" createTableSQL := "CREATE TABLE `v`(\n`a` int\n)ENGINE=MyISAM;\n" createViewSQL := "DROP TABLE IF EXISTS `v`;\nDROP VIEW IF EXISTS `v`;\nSET @PREV_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT;\nSET @PREV_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS;\nSET @PREV_COLLATION_CONNECTION=@@COLLATION_CONNECTION;\nSET character_set_client = utf8;\nSET character_set_results = utf8;\nSET collation_connection = utf8_general_ci;\nCREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v` (`a`) AS SELECT `t`.`a` AS `a` FROM `test`.`t`;\nSET character_set_client = @PREV_CHARACTER_SET_CLIENT;\nSET character_set_results = @PREV_CHARACTER_SET_RESULTS;\nSET collation_connection = @PREV_COLLATION_CONNECTION;\n" err := writer.WriteViewMeta("test", "v", createTableSQL, createViewSQL) - c.Assert(err, IsNil) + require.NoError(t, err) p := path.Join(dir, "test.v-schema.sql") _, err = os.Stat(p) - c.Assert(err, IsNil) + require.NoError(t, err) bytes, err := ioutil.ReadFile(p) - c.Assert(err, IsNil) - c.Assert(string(bytes), Equals, specCmt+createTableSQL) + require.NoError(t, err) + require.Equal(t, specCmt+createTableSQL, string(bytes)) p = path.Join(dir, "test.v-schema-view.sql") _, err = os.Stat(p) - c.Assert(err, IsNil) + require.NoError(t, err) bytes, err = ioutil.ReadFile(p) - c.Assert(err, IsNil) - c.Assert(string(bytes), Equals, specCmt+createViewSQL) + require.NoError(t, err) + require.Equal(t, specCmt+createViewSQL, string(bytes)) } -func (s *testWriterSuite) TestWriteTableData(c *C) { - dir := c.MkDir() +func TestWriteTableData(t *testing.T) { + t.Parallel() - config := defaultConfigForTest(c) + dir := t.TempDir() + config := defaultConfigForTest(t) config.OutputDirPath = dir - writer := s.newWriter(config, c) + writer, clean := createTestWriter(config, t) + defer clean() data := [][]driver.Value{ {"1", "male", "bob@mail.com", "020-1234", nil}, @@ -118,13 +113,13 @@ func (s *testWriterSuite) TestWriteTableData(c *C) { } tableIR := newMockTableIR("test", "employee", data, specCmts, colTypes) err := writer.WriteTableData(tableIR, tableIR, 0) - c.Assert(err, IsNil) + require.NoError(t, err) p := path.Join(dir, "test.employee.000000000.sql") _, err = os.Stat(p) - c.Assert(err, IsNil) + require.NoError(t, err) bytes, err := ioutil.ReadFile(p) - c.Assert(err, IsNil) + require.NoError(t, err) expected := "/*!40101 SET NAMES binary*/;\n" + "/*!40014 SET FOREIGN_KEY_CHECKS=0*/;\n" + @@ -133,13 +128,14 @@ func (s *testWriterSuite) TestWriteTableData(c *C) { "(2,'female','sarah@mail.com','020-1253','healthy'),\n" + "(3,'male','john@mail.com','020-1256','healthy'),\n" + "(4,'female','sarah@mail.com','020-1235','healthy');\n" - c.Assert(string(bytes), Equals, expected) + require.Equal(t, expected, string(bytes)) } -func (s *testWriterSuite) TestWriteTableDataWithFileSize(c *C) { - dir := c.MkDir() +func TestWriteTableDataWithFileSize(t *testing.T) { + t.Parallel() - config := defaultConfigForTest(c) + dir := t.TempDir() + config := defaultConfigForTest(t) config.OutputDirPath = dir config.FileSize = 50 specCmts := []string{ @@ -150,7 +146,8 @@ func (s *testWriterSuite) TestWriteTableDataWithFileSize(c *C) { config.FileSize += uint64(len(specCmts[1]) + 1) config.FileSize += uint64(len("INSERT INTO `employees` VALUES\n")) - writer := s.newWriter(config, c) + writer, clean := createTestWriter(config, t) + defer clean() data := [][]driver.Value{ {"1", "male", "bob@mail.com", "020-1234", nil}, @@ -161,7 +158,7 @@ func (s *testWriterSuite) TestWriteTableDataWithFileSize(c *C) { colTypes := []string{"INT", "SET", "VARCHAR", "VARCHAR", "TEXT"} tableIR := newMockTableIR("test", "employee", data, specCmts, colTypes) err := writer.WriteTableData(tableIR, tableIR, 0) - c.Assert(err, IsNil) + require.NoError(t, err) cases := map[string]string{ "test.employee.000000000.sql": "/*!40101 SET NAMES binary*/;\n" + @@ -179,17 +176,18 @@ func (s *testWriterSuite) TestWriteTableDataWithFileSize(c *C) { for p, expected := range cases { p = path.Join(dir, p) _, err := os.Stat(p) - c.Assert(err, IsNil) + require.NoError(t, err) bytes, err := ioutil.ReadFile(p) - c.Assert(err, IsNil) - c.Assert(string(bytes), Equals, expected) + require.NoError(t, err) + require.Equal(t, expected, string(bytes)) } } -func (s *testWriterSuite) TestWriteTableDataWithFileSizeAndRows(c *C) { - dir := c.MkDir() +func TestWriteTableDataWithFileSizeAndRows(t *testing.T) { + t.Parallel() - config := defaultConfigForTest(c) + dir := t.TempDir() + config := defaultConfigForTest(t) config.OutputDirPath = dir config.FileSize = 50 config.Rows = 4 @@ -201,7 +199,8 @@ func (s *testWriterSuite) TestWriteTableDataWithFileSizeAndRows(c *C) { config.FileSize += uint64(len(specCmts[1]) + 1) config.FileSize += uint64(len("INSERT INTO `employees` VALUES\n")) - writer := s.newWriter(config, c) + writer, clean := createTestWriter(config, t) + defer clean() data := [][]driver.Value{ {"1", "male", "bob@mail.com", "020-1234", nil}, @@ -212,7 +211,7 @@ func (s *testWriterSuite) TestWriteTableDataWithFileSizeAndRows(c *C) { colTypes := []string{"INT", "SET", "VARCHAR", "VARCHAR", "TEXT"} tableIR := newMockTableIR("test", "employee", data, specCmts, colTypes) err := writer.WriteTableData(tableIR, tableIR, 0) - c.Assert(err, IsNil) + require.NoError(t, err) cases := map[string]string{ "test.employee.0000000000000.sql": "/*!40101 SET NAMES binary*/;\n" + @@ -230,25 +229,27 @@ func (s *testWriterSuite) TestWriteTableDataWithFileSizeAndRows(c *C) { for p, expected := range cases { p = path.Join(dir, p) _, err = os.Stat(p) - c.Assert(err, IsNil) + require.NoError(t, err) bytes, err := ioutil.ReadFile(p) - c.Assert(err, IsNil) - c.Assert(string(bytes), Equals, expected) + require.NoError(t, err) + require.Equal(t, expected, string(bytes)) } } -func (s *testWriterSuite) TestWriteTableDataWithStatementSize(c *C) { - dir := c.MkDir() +func TestWriteTableDataWithStatementSize(t *testing.T) { + t.Parallel() - config := defaultConfigForTest(c) + dir := t.TempDir() + config := defaultConfigForTest(t) config.OutputDirPath = dir config.StatementSize = 50 config.StatementSize += uint64(len("INSERT INTO `employee` VALUES\n")) var err error config.OutputFileTemplate, err = ParseOutputFileTemplate("specified-name") - c.Assert(err, IsNil) + require.NoError(t, err) - writer := s.newWriter(config, c) + writer, clean := createTestWriter(config, t) + defer clean() data := [][]driver.Value{ {"1", "male", "bob@mail.com", "020-1234", nil}, @@ -263,7 +264,7 @@ func (s *testWriterSuite) TestWriteTableDataWithStatementSize(c *C) { } tableIR := newMockTableIR("te%/st", "employee", data, specCmts, colTypes) err = writer.WriteTableData(tableIR, tableIR, 0) - c.Assert(err, IsNil) + require.NoError(t, err) // only with statement size cases := map[string]string{ @@ -280,10 +281,10 @@ func (s *testWriterSuite) TestWriteTableDataWithStatementSize(c *C) { for p, expected := range cases { p = path.Join(config.OutputDirPath, p) _, err = os.Stat(p) - c.Assert(err, IsNil) + require.NoError(t, err) bytes, err1 := ioutil.ReadFile(p) - c.Assert(err1, IsNil) - c.Assert(string(bytes), Equals, expected) + require.NoError(t, err1) + require.Equal(t, expected, string(bytes)) } // with file size and statement size @@ -294,11 +295,13 @@ func (s *testWriterSuite) TestWriteTableDataWithStatementSize(c *C) { config.StatementSize += uint64(len("INSERT INTO `employee` VALUES\n")) // test specifying filename format config.OutputFileTemplate, err = ParseOutputFileTemplate("{{.Index}}-{{.Table}}-{{fn .DB}}") - c.Assert(err, IsNil) + require.NoError(t, err) err = os.RemoveAll(config.OutputDirPath) - c.Assert(err, IsNil) + require.NoError(t, err) config.OutputDirPath, err = ioutil.TempDir("", "dumpling") - writer = s.newWriter(config, c) + + writer, clean = createTestWriter(config, t) + defer clean() cases = map[string]string{ "000000000-employee-te%25%2Fst.sql": "/*!40101 SET NAMES binary*/;\n" + @@ -315,14 +318,35 @@ func (s *testWriterSuite) TestWriteTableDataWithStatementSize(c *C) { } tableIR = newMockTableIR("te%/st", "employee", data, specCmts, colTypes) - c.Assert(writer.WriteTableData(tableIR, tableIR, 0), IsNil) - c.Assert(err, IsNil) + require.NoError(t, writer.WriteTableData(tableIR, tableIR, 0)) + require.NoError(t, err) for p, expected := range cases { p = path.Join(config.OutputDirPath, p) _, err = os.Stat(p) - c.Assert(err, IsNil) + require.NoError(t, err) bytes, err := ioutil.ReadFile(p) - c.Assert(err, IsNil) - c.Assert(string(bytes), Equals, expected) + require.NoError(t, err) + require.Equal(t, expected, string(bytes)) + } +} + +var mu sync.Mutex + +func createTestWriter(conf *Config, t *testing.T) (w *Writer, clean func()) { + mu.Lock() + extStore, err := conf.createExternalStorage(context.Background()) + mu.Unlock() + + require.NoError(t, err) + db, _, err := sqlmock.New() + require.NoError(t, err) + conn, err := db.Conn(context.Background()) + require.NoError(t, err) + + w = NewWriter(tcontext.Background(), 0, conf, conn, extStore) + clean = func() { + require.NoError(t, db.Close()) } + + return }