Skip to content

Commit 1e80650

Browse files
authored
add test for api/blocklistener.go and api/listener.go (iotexproject#2307)
improve testcoverage in api package (iotexproject#1581) * Add test for api/listener.go * Add test for api/blocklistener.go * Modify irregular names * simplify code and add an error catch
1 parent 70ecb5f commit 1e80650

File tree

8 files changed

+366
-7
lines changed

8 files changed

+366
-7
lines changed

api/apitestserver.go

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
// Copyright (c) 2019 IoTeX Foundation
2+
// This is an alpha (internal) release and is not suitable for production. This source code is provided 'as is' and no
3+
// warranties are given as to title or non-infringement, merchantability or fitness for purpose and, to the extent
4+
// permitted by law, all liability for your use of the code is disclaimed. This source code is governed by Apache
5+
// License 2.0 that can be found in the LICENSE file.
6+
7+
package api
8+
9+
import (
10+
grpc "google.golang.org/grpc"
11+
"github.com/iotexproject/iotex-proto/golang/iotexapi"
12+
)
13+
14+
// StreamBlocksServer defines the interface of a rpc stream server
15+
type StreamBlocksServer interface {
16+
Send(*iotexapi.StreamBlocksResponse) error
17+
grpc.ServerStream
18+
}

api/blocklistener_test.go

+62
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
// Copyright (c) 2019 IoTeX Foundation
2+
// This is an alpha (internal) release and is not suitable for production. This source code is provided 'as is' and no
3+
// warranties are given as to title or non-infringement, merchantability or fitness for purpose and, to the extent
4+
// permitted by law, all liability for your use of the code is disclaimed. This source code is governed by Apache
5+
// License 2.0 that can be found in the LICENSE file.
6+
7+
package api
8+
9+
import (
10+
"errors"
11+
"testing"
12+
"time"
13+
14+
"github.com/golang/mock/gomock"
15+
"github.com/stretchr/testify/require"
16+
17+
"github.com/iotexproject/iotex-core/action"
18+
"github.com/iotexproject/iotex-core/blockchain/block"
19+
"github.com/iotexproject/iotex-core/test/identityset"
20+
"github.com/iotexproject/iotex-core/test/mock/mock_apiserver"
21+
)
22+
23+
var (
24+
errorSend error = errors.New("send error")
25+
)
26+
27+
func TestBlockListener(t *testing.T) {
28+
ctrl := gomock.NewController(t)
29+
defer ctrl.Finish()
30+
31+
errChan := make(chan error, 10)
32+
33+
server := mock_apiserver.NewMockStreamBlocksServer(ctrl)
34+
responder := NewBlockListener(server, errChan)
35+
36+
receipts := []*action.Receipt{
37+
{
38+
BlockHeight: 1,
39+
},
40+
{
41+
BlockHeight: 2,
42+
},
43+
}
44+
builder := block.NewTestingBuilder().
45+
SetHeight(1).
46+
SetVersion(111).
47+
SetTimeStamp(time.Now()).
48+
SetReceipts(receipts)
49+
testBlock, err := builder.SignAndBuild(identityset.PrivateKey(0))
50+
require.NoError(t, err)
51+
52+
server.EXPECT().Send(gomock.Any()).Return(nil).Times(1)
53+
require.NoError(t, responder.Respond(&testBlock))
54+
55+
server.EXPECT().Send(gomock.Any()).Return(errorSend).Times(1)
56+
require.Equal(t, errorSend, responder.Respond(&testBlock))
57+
58+
responder.Exit()
59+
60+
require.Equal(t, errorSend, <-errChan)
61+
require.NoError(t, <-errChan)
62+
}

api/listener.go

+5-7
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,11 @@ import (
99
"github.com/iotexproject/iotex-core/blockchain/block"
1010
)
1111

12-
type (
13-
// Responder responds to new block
14-
Responder interface {
15-
Respond(*block.Block) error
16-
Exit()
17-
}
12+
var (
13+
errorResponderAdded = errors.New("Responder already added")
14+
)
1815

16+
type (
1917
// Listener pass new block to all responders
2018
Listener interface {
2119
Start() error
@@ -75,7 +73,7 @@ func (cl *chainListener) ReceiveBlock(blk *block.Block) error {
7573
func (cl *chainListener) AddResponder(r Responder) error {
7674
_, loaded := cl.streamMap.LoadOrStore(r, struct{}{})
7775
if loaded {
78-
return errors.New("Responder already added")
76+
return errorResponderAdded
7977
}
8078
return nil
8179
}

api/listener_test.go

+60
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
// Copyright (c) 2019 IoTeX Foundation
2+
// This is an alpha (internal) release and is not suitable for production. This source code is provided 'as is' and no
3+
// warranties are given as to title or non-infringement, merchantability or fitness for purpose and, to the extent
4+
// permitted by law, all liability for your use of the code is disclaimed. This source code is governed by Apache
5+
// License 2.0 that can be found in the LICENSE file.
6+
7+
package api
8+
9+
import (
10+
"testing"
11+
12+
"github.com/golang/mock/gomock"
13+
"github.com/pkg/errors"
14+
"github.com/stretchr/testify/require"
15+
16+
"github.com/iotexproject/iotex-core/blockchain/block"
17+
"github.com/iotexproject/iotex-core/test/mock/mock_apiresponder"
18+
)
19+
20+
// test for chainListener
21+
func TestChainListener(t *testing.T) {
22+
ctrl := gomock.NewController(t)
23+
defer ctrl.Finish()
24+
25+
responder := mock_apiresponder.NewMockResponder(ctrl)
26+
listener := NewChainListener()
27+
28+
err := listener.Start()
29+
require.NoError(t, err)
30+
31+
err = listener.Stop()
32+
require.NoError(t, err)
33+
34+
err = listener.AddResponder(responder)
35+
require.NoError(t, err)
36+
37+
err = listener.AddResponder(responder)
38+
require.Error(t, err)
39+
require.Equal(t, errorResponderAdded, err)
40+
41+
block := &block.Block{
42+
Header: block.Header{},
43+
Body: block.Body{},
44+
Footer: block.Footer{},
45+
}
46+
responder.EXPECT().Respond(gomock.Any()).Return(nil).Times(1)
47+
err = listener.ReceiveBlock(block)
48+
require.NoError(t, err)
49+
50+
expectedError := errors.New("Error when streaming the block")
51+
responder.EXPECT().Respond(gomock.Any()).Return(expectedError).Times(1)
52+
err = listener.ReceiveBlock(block)
53+
require.NoError(t, err)
54+
55+
responder.EXPECT().Exit().Return().Times(1)
56+
err = listener.AddResponder(responder)
57+
require.NoError(t, err)
58+
err = listener.Stop()
59+
require.NoError(t, err)
60+
}

api/responder.go

+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
// Copyright (c) 2019 IoTeX Foundation
2+
// This is an alpha (internal) release and is not suitable for production. This source code is provided 'as is' and no
3+
// warranties are given as to title or non-infringement, merchantability or fitness for purpose and, to the extent
4+
// permitted by law, all liability for your use of the code is disclaimed. This source code is governed by Apache
5+
// License 2.0 that can be found in the LICENSE file.
6+
7+
package api
8+
9+
import (
10+
"github.com/iotexproject/iotex-core/blockchain/block"
11+
)
12+
13+
// Responder responds to new block
14+
type Responder interface {
15+
Respond(*block.Block) error
16+
Exit()
17+
}

misc/scripts/mockgen.sh

+12
Original file line numberDiff line numberDiff line change
@@ -122,3 +122,15 @@ mockgen -destination=./test/mock/mock_ioctlclient/mock_ioctlclient.go \
122122
-source=./ioctl/client.go \
123123
-package=mock_ioctlclient \
124124
Client
125+
126+
mkdir -p ./test/mock/mock_apiresponder
127+
mockgen -destination=./test/mock/mock_apiresponder/mock_apiresponder.go \
128+
-source=./api/responder.go \
129+
-package=mock_apiresponder \
130+
Responder
131+
132+
mkdir -p ./test/mock/mock_apiserver
133+
mockgen -destination=./test/mock/mock_apiserver/mock_apiserver.go \
134+
-source=./api/apitestserver.go \
135+
-package=mock_apiserver \
136+
StreamBlocksServer

test/mock/mock_apiresponder/mock_apiresponder.go

+60
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test/mock/mock_apiserver/mock_apiserver.go

+132
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)