Skip to content

Commit cb6adb8

Browse files
committed
Merge remote-tracking branch 'ethereum/master' into merge-16ce7bf50fa71c907d1dc6504ed32a9161e71351
Merge Geth master updates starting from 766272f ending by 16ce7bf. The list of PRs that are important for us: - ethereum/go-ethereum#28147 removal of rollback mechanism in downloader. We may still need this mechanism since we're pre-merge and allow forks; - ethereum/go-ethereum@3dc45a3 related to release pipeline, example of pre-release version update; - ethereum/go-ethereum@dc34fe8 related to release pipeline, example of post-release version update; - ethereum/go-ethereum#28098 BLOBBASEFEE opcode implemented as a part of Cancun (we have to support it eventually); - ethereum/go-ethereum#28195 introduce new Cancun-related block fields to eth tools; - ethereum/go-ethereum#28243 introduce blob transactions support for internal eth services; - ethereum/go-ethereum#28084 allows to invoke contract at specific block hash, may be useful for Governance contract integration; - ethereum/go-ethereum#28538 Dockerfile.alltools update example, just to remember that it should be in sync with Dockerfile; - ethereum/go-ethereum#28605 Improved Cancun- and Shanghai- related consensus verification. Although we must enable Shanghai and Cancun in dBFT, this PR is a hint of what should be changed wrt Clique/Ethash implementation for this; - ethereum/go-ethereum#28549 GitHub actions are added for tests; - ethereum/go-ethereum#27766 Beacon Committee chain implementation (light chain that is able to verify signed blocks once synced); Signed-off-by: Anna Shaleva <shaleva.ann@nspcc.ru>
2 parents c83107d + 16ce7bf commit cb6adb8

File tree

676 files changed

+43449
-49179
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

676 files changed

+43449
-49179
lines changed

.github/workflows/go.yml

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
name: i386 linux tests
2+
3+
on:
4+
push:
5+
branches: [ master ]
6+
pull_request:
7+
branches: [ master ]
8+
workflow_dispatch:
9+
10+
jobs:
11+
build:
12+
runs-on: self-hosted
13+
steps:
14+
- uses: actions/checkout@v2
15+
- name: Set up Go
16+
uses: actions/setup-go@v2
17+
with:
18+
go-version: 1.21.4
19+
- name: Run tests
20+
run: go test -short ./...
21+
env:
22+
GOOS: linux
23+
GOARCH: 386

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@ profile.cov
4949
**/yarn-error.log
5050
logs/
5151

52+
tests/spec-tests/
53+
5254
# privnet
5355
/privnet/**/*.log
5456
/privnet/**/geth/

.golangci.yml

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ run:
1212
linters:
1313
disable-all: true
1414
enable:
15-
- goconst
1615
- goimports
1716
- gosimple
1817
- govet
@@ -39,9 +38,6 @@ linters:
3938
linters-settings:
4039
gofmt:
4140
simplify: true
42-
goconst:
43-
min-len: 3 # minimum length of string constant
44-
min-occurrences: 6 # minimum number of occurrences
4541

4642
issues:
4743
exclude-rules:

.travis.yml

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,18 +9,6 @@ jobs:
99
- azure-osx
1010

1111
include:
12-
# This builder only tests code linters on latest version of Go
13-
- stage: lint
14-
os: linux
15-
dist: bionic
16-
go: 1.21.x
17-
env:
18-
- lint
19-
git:
20-
submodules: false # avoid cloning ethereum/tests
21-
script:
22-
- go run build/ci.go lint
23-
2412
# These builders create the Docker sub-images for multi-arch push and each
2513
# will attempt to push the multi-arch image if they are the last builder
2614
- stage: build
@@ -96,6 +84,7 @@ jobs:
9684
- stage: build
9785
if: type = push
9886
os: osx
87+
osx_image: xcode14.2
9988
go: 1.21.x
10089
env:
10190
- azure-osx
@@ -104,6 +93,8 @@ jobs:
10493
script:
10594
- go run build/ci.go install -dlgo
10695
- go run build/ci.go archive -type tar -signer OSX_SIGNING_KEY -signify SIGNIFY_KEY -upload gethstore/builds
96+
- go run build/ci.go install -dlgo -arch arm64
97+
- go run build/ci.go archive -arch arm64 -type tar -signer OSX_SIGNING_KEY -signify SIGNIFY_KEY -upload gethstore/builds
10798

10899
# These builders run the tests
109100
- stage: build

Dockerfile.alltools

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ ARG VERSION=""
44
ARG BUILDNUM=""
55

66
# Build Geth in a stock Go builder container
7-
FROM golang:1.20-alpine as builder
7+
FROM golang:1.21-alpine as builder
88

99
RUN apk add --no-cache gcc musl-dev linux-headers git
1010

Makefile

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,27 +110,33 @@ define init_node
110110
@$(GETHBIN)/geth init --datadir $(1)/$(2) $(1)/$(GENESIS_WORK_JSON) > $(1)/$(2)/geth_init.log 2>&1
111111
endef
112112

113+
#? geth: Build geth
113114
geth:
114115
$(GORUN) build/ci.go install ./cmd/geth
115116
@echo "Done building."
116117
@echo "Run \"$(GETHBIN)/geth\" to launch geth."
117118

119+
#? all: Build all packages and executables
118120
all:
119121
$(GORUN) build/ci.go install
120122

123+
#? test: Run the tests
121124
test: all
122125
$(GORUN) build/ci.go test
123126

127+
#? lint: Run certain pre-selected linters
124128
lint: ## Run linters.
125129
$(GORUN) build/ci.go lint
126130

131+
#? clean: Clean go cache, built executables, and the auto generated folder
127132
clean:
128133
go clean -cache
129134
rm -fr build/_workspace/pkg/ $(GETHBIN)/*
130135

131136
# The devtools target installs tools required for 'go generate'.
132137
# You need to put $GOBIN (or $GOPATH/bin) in your PATH to use 'go generate'.
133138

139+
#? devtools: Install recommended developer tools
134140
devtools:
135141
env GOBIN= go install golang.org/x/tools/cmd/stringer@latest
136142
env GOBIN= go install github.com/fjl/gencodec@latest
@@ -298,4 +304,10 @@ privnet_start_seven: $(SEVEN_DIR)/$(NODE1)/geth $(SEVEN_DIR)/$(NODE2)/geth $(SEV
298304
$(call run_miner_node,$(SEVEN_DIR),$(NODE6),$(NODE6_PORT),$(NODE6_RPC_PORT),$(NODE6))
299305
$(call run_miner_node,$(SEVEN_DIR),$(NODE7),$(NODE7_PORT),$(NODE7_RPC_PORT),$(NODE7))
300306
$(call run_node,$(SEVEN_DIR),$(NODE8),$(NODE8_PORT),$(NODE8_RPC_PORT))
301-
@echo "OK! Check logs in $(SEVEN_DIR)/<node_dir>/geth_node.log"
307+
@echo "OK! Check logs in $(SEVEN_DIR)/<node_dir>/geth_node.log"
308+
309+
#? help: Get more info on make commands.
310+
help: Makefile
311+
@echo " Choose a command run in go-ethereum:"
312+
@sed -n 's/^#?//p' $< | column -t -s ':' | sort | sed -e 's/^/ /'
313+
.PHONY: help

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
## Go Ethereum
22

3-
Official Golang execution layer implementation of the Ethereum protocol.
3+
Golang execution layer implementation of the Ethereum protocol.
44

55
[![API Reference](
6-
https://camo.githubusercontent.com/915b7be44ada53c290eb157634330494ebe3e30a/68747470733a2f2f676f646f632e6f72672f6769746875622e636f6d2f676f6c616e672f6764646f3f7374617475732e737667
6+
https://pkg.go.dev/badge/github.com/ethereum/go-ethereum
77
)](https://pkg.go.dev/github.com/ethereum/go-ethereum?tab=doc)
88
[![Go Report Card](https://goreportcard.com/badge/github.com/ethereum/go-ethereum)](https://goreportcard.com/report/github.com/ethereum/go-ethereum)
9-
[![Travis](https://travis-ci.com/ethereum/go-ethereum.svg?branch=master)](https://travis-ci.com/ethereum/go-ethereum)
9+
[![Travis](https://app.travis-ci.com/ethereum/go-ethereum.svg?branch=master)](https://app.travis-ci.com/github/ethereum/go-ethereum)
1010
[![Discord](https://img.shields.io/badge/discord-join%20chat-blue.svg)](https://discord.gg/nthXNEv)
1111

1212
Automated builds are available for stable releases and the unstable master branch. Binary

accounts/abi/abi.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ import (
2929
)
3030

3131
// The ABI holds information about a contract's context and available
32-
// invokable methods. It will allow you to type check function calls and
32+
// invocable methods. It will allow you to type check function calls and
3333
// packs data accordingly.
3434
type ABI struct {
3535
Constructor Method
@@ -251,7 +251,7 @@ var revertSelector = crypto.Keccak256([]byte("Error(string)"))[:4]
251251
var panicSelector = crypto.Keccak256([]byte("Panic(uint256)"))[:4]
252252

253253
// panicReasons map is for readable panic codes
254-
// see this linkage for the deails
254+
// see this linkage for the details
255255
// https://docs.soliditylang.org/en/v0.8.21/control-structures.html#panic-via-assert-and-error-via-require
256256
// the reason string list is copied from ether.js
257257
// https://github.com/ethers-io/ethers.js/blob/fa3a883ff7c88611ce766f58bdd4b8ac90814470/src.ts/abi/interface.ts#L207-L218

accounts/abi/abi_test.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,7 @@ var methods = map[string]Method{
120120
}
121121

122122
func TestReader(t *testing.T) {
123+
t.Parallel()
123124
abi := ABI{
124125
Methods: methods,
125126
}
@@ -151,6 +152,7 @@ func TestReader(t *testing.T) {
151152
}
152153

153154
func TestInvalidABI(t *testing.T) {
155+
t.Parallel()
154156
json := `[{ "type" : "function", "name" : "", "constant" : fals }]`
155157
_, err := JSON(strings.NewReader(json))
156158
if err == nil {
@@ -170,6 +172,7 @@ func TestInvalidABI(t *testing.T) {
170172
// constructor(uint256 a, uint256 b) public{}
171173
// }
172174
func TestConstructor(t *testing.T) {
175+
t.Parallel()
173176
json := `[{ "inputs": [{"internalType": "uint256","name": "a","type": "uint256" },{ "internalType": "uint256","name": "b","type": "uint256"}],"stateMutability": "nonpayable","type": "constructor"}]`
174177
method := NewMethod("", "", Constructor, "nonpayable", false, false, []Argument{{"a", Uint256, false}, {"b", Uint256, false}}, nil)
175178
// Test from JSON
@@ -199,6 +202,7 @@ func TestConstructor(t *testing.T) {
199202
}
200203

201204
func TestTestNumbers(t *testing.T) {
205+
t.Parallel()
202206
abi, err := JSON(strings.NewReader(jsondata))
203207
if err != nil {
204208
t.Fatal(err)
@@ -236,6 +240,7 @@ func TestTestNumbers(t *testing.T) {
236240
}
237241

238242
func TestMethodSignature(t *testing.T) {
243+
t.Parallel()
239244
m := NewMethod("foo", "foo", Function, "", false, false, []Argument{{"bar", String, false}, {"baz", String, false}}, nil)
240245
exp := "foo(string,string)"
241246
if m.Sig != exp {
@@ -274,6 +279,7 @@ func TestMethodSignature(t *testing.T) {
274279
}
275280

276281
func TestOverloadedMethodSignature(t *testing.T) {
282+
t.Parallel()
277283
json := `[{"constant":true,"inputs":[{"name":"i","type":"uint256"},{"name":"j","type":"uint256"}],"name":"foo","outputs":[],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"i","type":"uint256"}],"name":"foo","outputs":[],"payable":false,"stateMutability":"pure","type":"function"},{"anonymous":false,"inputs":[{"indexed":false,"name":"i","type":"uint256"}],"name":"bar","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"i","type":"uint256"},{"indexed":false,"name":"j","type":"uint256"}],"name":"bar","type":"event"}]`
278284
abi, err := JSON(strings.NewReader(json))
279285
if err != nil {
@@ -297,6 +303,7 @@ func TestOverloadedMethodSignature(t *testing.T) {
297303
}
298304

299305
func TestCustomErrors(t *testing.T) {
306+
t.Parallel()
300307
json := `[{ "inputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ],"name": "MyError", "type": "error"} ]`
301308
abi, err := JSON(strings.NewReader(json))
302309
if err != nil {
@@ -311,6 +318,7 @@ func TestCustomErrors(t *testing.T) {
311318
}
312319

313320
func TestMultiPack(t *testing.T) {
321+
t.Parallel()
314322
abi, err := JSON(strings.NewReader(jsondata))
315323
if err != nil {
316324
t.Fatal(err)
@@ -348,6 +356,7 @@ func ExampleJSON() {
348356
}
349357

350358
func TestInputVariableInputLength(t *testing.T) {
359+
t.Parallel()
351360
const definition = `[
352361
{ "type" : "function", "name" : "strOne", "constant" : true, "inputs" : [ { "name" : "str", "type" : "string" } ] },
353362
{ "type" : "function", "name" : "bytesOne", "constant" : true, "inputs" : [ { "name" : "str", "type" : "bytes" } ] },
@@ -476,6 +485,7 @@ func TestInputVariableInputLength(t *testing.T) {
476485
}
477486

478487
func TestInputFixedArrayAndVariableInputLength(t *testing.T) {
488+
t.Parallel()
479489
abi, err := JSON(strings.NewReader(jsondata))
480490
if err != nil {
481491
t.Error(err)
@@ -650,6 +660,7 @@ func TestInputFixedArrayAndVariableInputLength(t *testing.T) {
650660
}
651661

652662
func TestDefaultFunctionParsing(t *testing.T) {
663+
t.Parallel()
653664
const definition = `[{ "name" : "balance", "type" : "function" }]`
654665

655666
abi, err := JSON(strings.NewReader(definition))
@@ -663,6 +674,7 @@ func TestDefaultFunctionParsing(t *testing.T) {
663674
}
664675

665676
func TestBareEvents(t *testing.T) {
677+
t.Parallel()
666678
const definition = `[
667679
{ "type" : "event", "name" : "balance" },
668680
{ "type" : "event", "name" : "anon", "anonymous" : true},
@@ -739,6 +751,7 @@ func TestBareEvents(t *testing.T) {
739751
//
740752
// receipt{status=1 cgas=23949 bloom=00000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000040200000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 logs=[log: b6818c8064f645cd82d99b59a1a267d6d61117ef [75fd880d39c1daf53b6547ab6cb59451fc6452d27caa90e5b6649dd8293b9eed] 000000000000000000000000376c47978271565f56deb45495afa69e59c16ab200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000158 9ae378b6d4409eada347a5dc0c180f186cb62dc68fcc0f043425eb917335aa28 0 95d429d309bb9d753954195fe2d69bd140b4ae731b9b5b605c34323de162cf00 0]}
741753
func TestUnpackEvent(t *testing.T) {
754+
t.Parallel()
742755
const abiJSON = `[{"constant":false,"inputs":[{"name":"memo","type":"bytes"}],"name":"receive","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"anonymous":false,"inputs":[{"indexed":false,"name":"sender","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"memo","type":"bytes"}],"name":"received","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"sender","type":"address"}],"name":"receivedAddr","type":"event"}]`
743756
abi, err := JSON(strings.NewReader(abiJSON))
744757
if err != nil {
@@ -777,6 +790,7 @@ func TestUnpackEvent(t *testing.T) {
777790
}
778791

779792
func TestUnpackEventIntoMap(t *testing.T) {
793+
t.Parallel()
780794
const abiJSON = `[{"constant":false,"inputs":[{"name":"memo","type":"bytes"}],"name":"receive","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"anonymous":false,"inputs":[{"indexed":false,"name":"sender","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"memo","type":"bytes"}],"name":"received","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"sender","type":"address"}],"name":"receivedAddr","type":"event"}]`
781795
abi, err := JSON(strings.NewReader(abiJSON))
782796
if err != nil {
@@ -827,6 +841,7 @@ func TestUnpackEventIntoMap(t *testing.T) {
827841
}
828842

829843
func TestUnpackMethodIntoMap(t *testing.T) {
844+
t.Parallel()
830845
const abiJSON = `[{"constant":false,"inputs":[{"name":"memo","type":"bytes"}],"name":"receive","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[],"name":"send","outputs":[{"name":"amount","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"addr","type":"address"}],"name":"get","outputs":[{"name":"hash","type":"bytes"}],"payable":true,"stateMutability":"payable","type":"function"}]`
831846
abi, err := JSON(strings.NewReader(abiJSON))
832847
if err != nil {
@@ -877,6 +892,7 @@ func TestUnpackMethodIntoMap(t *testing.T) {
877892
}
878893

879894
func TestUnpackIntoMapNamingConflict(t *testing.T) {
895+
t.Parallel()
880896
// Two methods have the same name
881897
var abiJSON = `[{"constant":false,"inputs":[{"name":"memo","type":"bytes"}],"name":"get","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[],"name":"send","outputs":[{"name":"amount","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"addr","type":"address"}],"name":"get","outputs":[{"name":"hash","type":"bytes"}],"payable":true,"stateMutability":"payable","type":"function"}]`
882898
abi, err := JSON(strings.NewReader(abiJSON))
@@ -960,6 +976,7 @@ func TestUnpackIntoMapNamingConflict(t *testing.T) {
960976
}
961977

962978
func TestABI_MethodById(t *testing.T) {
979+
t.Parallel()
963980
abi, err := JSON(strings.NewReader(jsondata))
964981
if err != nil {
965982
t.Fatal(err)
@@ -992,6 +1009,7 @@ func TestABI_MethodById(t *testing.T) {
9921009
}
9931010

9941011
func TestABI_EventById(t *testing.T) {
1012+
t.Parallel()
9951013
tests := []struct {
9961014
name string
9971015
json string
@@ -1058,6 +1076,7 @@ func TestABI_EventById(t *testing.T) {
10581076
}
10591077

10601078
func TestABI_ErrorByID(t *testing.T) {
1079+
t.Parallel()
10611080
abi, err := JSON(strings.NewReader(`[
10621081
{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"}],"name":"MyError1","type":"error"},
10631082
{"inputs":[{"components":[{"internalType":"uint256","name":"a","type":"uint256"},{"internalType":"string","name":"b","type":"string"},{"internalType":"address","name":"c","type":"address"}],"internalType":"struct MyError.MyStruct","name":"x","type":"tuple"},{"internalType":"address","name":"y","type":"address"},{"components":[{"internalType":"uint256","name":"a","type":"uint256"},{"internalType":"string","name":"b","type":"string"},{"internalType":"address","name":"c","type":"address"}],"internalType":"struct MyError.MyStruct","name":"z","type":"tuple"}],"name":"MyError2","type":"error"},
@@ -1088,6 +1107,7 @@ func TestABI_ErrorByID(t *testing.T) {
10881107
// TestDoubleDuplicateMethodNames checks that if transfer0 already exists, there won't be a name
10891108
// conflict and that the second transfer method will be renamed transfer1.
10901109
func TestDoubleDuplicateMethodNames(t *testing.T) {
1110+
t.Parallel()
10911111
abiJSON := `[{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"value","type":"uint256"}],"name":"transfer","outputs":[{"name":"ok","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"value","type":"uint256"},{"name":"data","type":"bytes"}],"name":"transfer0","outputs":[{"name":"ok","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"value","type":"uint256"},{"name":"data","type":"bytes"},{"name":"customFallback","type":"string"}],"name":"transfer","outputs":[{"name":"ok","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"}]`
10921112
contractAbi, err := JSON(strings.NewReader(abiJSON))
10931113
if err != nil {
@@ -1117,6 +1137,7 @@ func TestDoubleDuplicateMethodNames(t *testing.T) {
11171137
// event send();
11181138
// }
11191139
func TestDoubleDuplicateEventNames(t *testing.T) {
1140+
t.Parallel()
11201141
abiJSON := `[{"anonymous": false,"inputs": [{"indexed": false,"internalType": "uint256","name": "a","type": "uint256"}],"name": "send","type": "event"},{"anonymous": false,"inputs": [],"name": "send0","type": "event"},{ "anonymous": false, "inputs": [],"name": "send","type": "event"}]`
11211142
contractAbi, err := JSON(strings.NewReader(abiJSON))
11221143
if err != nil {
@@ -1144,6 +1165,7 @@ func TestDoubleDuplicateEventNames(t *testing.T) {
11441165
// event send(uint256, uint256);
11451166
// }
11461167
func TestUnnamedEventParam(t *testing.T) {
1168+
t.Parallel()
11471169
abiJSON := `[{ "anonymous": false, "inputs": [{ "indexed": false,"internalType": "uint256", "name": "","type": "uint256"},{"indexed": false,"internalType": "uint256","name": "","type": "uint256"}],"name": "send","type": "event"}]`
11481170
contractAbi, err := JSON(strings.NewReader(abiJSON))
11491171
if err != nil {
@@ -1177,7 +1199,9 @@ func TestUnpackRevert(t *testing.T) {
11771199
{"4e487b7100000000000000000000000000000000000000000000000000000000000000ff", "unknown panic code: 0xff", nil},
11781200
}
11791201
for index, c := range cases {
1202+
index, c := index, c
11801203
t.Run(fmt.Sprintf("case %d", index), func(t *testing.T) {
1204+
t.Parallel()
11811205
got, err := UnpackRevert(common.Hex2Bytes(c.input))
11821206
if c.expectErr != nil {
11831207
if err == nil {

0 commit comments

Comments
 (0)