Skip to content

Commit

Permalink
- Add initialize channel and get feature ✨
Browse files Browse the repository at this point in the history
- Remove integration tags build 🔥
- Change circleci test configuration 💚
  • Loading branch information
fairyhunter13 committed Apr 22, 2020
1 parent 27049c9 commit 7058d51
Show file tree
Hide file tree
Showing 8 changed files with 350 additions and 194 deletions.
2 changes: 1 addition & 1 deletion .circleci/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ jobs:
go get github.com/stretchr/testify/assert
- run:
name: "Integration testing and generate coverage"
command: go test -v -cover -race -coverprofile=coverage.out -tags=integration ./...
command: go test -v -cover -race -coverprofile=coverage.out ./...
- run:
name: "Uploading to coveralls.io"
command: goveralls -coverprofile=coverage.out -service=circle-ci -repotoken=$COVERALLS_TOKEN
Expand Down
8 changes: 3 additions & 5 deletions channel_test.go
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
// +build integration

package amqpwrapper

import (
Expand Down Expand Up @@ -93,7 +91,7 @@ func TestNewChannelManager(t *testing.T) {
return
},
connMgr: func() (connMgr IConnectionManager) {
mockConn := &MockConnectionManager{}
mockConn := &MockIConnectionManager{}
mockConn.On("CreateChannel", Producer).Return(nil, errors.New("Connection or random error"))
connMgr = mockConn
return
Expand Down Expand Up @@ -301,7 +299,7 @@ func TestChannelManager_IsClosed(t *testing.T) {
want: true,
fields: fields{
connMgr: func() (connMgr IConnectionManager) {
mgr := new(MockConnectionManager)
mgr := new(MockIConnectionManager)
mgr.On("IsClosed").Return(true)
connMgr = mgr
return
Expand All @@ -313,7 +311,7 @@ func TestChannelManager_IsClosed(t *testing.T) {
want: false,
fields: fields{
connMgr: func() (connMgr IConnectionManager) {
mgr := new(MockConnectionManager)
mgr := new(MockIConnectionManager)
mgr.On("IsClosed").Return(false)
connMgr = mgr
return
Expand Down
2 changes: 0 additions & 2 deletions main_test.go
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
// +build integration

package amqpwrapper

import (
Expand Down
32 changes: 31 additions & 1 deletion manager.go
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package amqpwrapper

//go:generate mockery -all -inpkg -recursive -testonly

import (
"sync"
"sync/atomic"
Expand All @@ -14,6 +16,7 @@ type (
GetChannel(key string, typeChan uint64) (channel *amqp.Channel, err error)
CreateChannel(typeChan uint64) (channel *amqp.Channel, err error)
InitChannel(fn InitializeChannel, args InitArgs) (err error)
InitChannelAndGet(fn InitializeChannel, args InitArgs) (channel *amqp.Channel, err error)
Close() (err error)
IsClosed() (result bool)
}
Expand Down Expand Up @@ -123,8 +126,35 @@ func (p *ConnectionManager) InitChannel(fn InitializeChannel, args InitArgs) (er
return
}
p.mutex.Lock()
defer p.mutex.Unlock()
err = p.initChannel(fn, args)
p.mutex.Unlock()
return
}

//InitChannelAndGet initialize channel with fn and add it to the map to recover or reinit, then return the created channel.
func (p *ConnectionManager) InitChannelAndGet(fn InitializeChannel, args InitArgs) (ch *amqp.Channel, err error) {
var tempChan *amqp.Channel
if fn == nil {
err = ErrNilArg
return
}
if p.isNotValidChannelArgs(args) {
err = ErrInvalidArgs
return
}
if args.Channel == nil {
tempChan, err = p.CreateChannel(args.TypeChan)
if err != nil {
return
}
}
p.mutex.Lock()
err = p.initChannel(fn, args)
p.mutex.Unlock()
if err != nil {
return
}
ch = tempChan
return
}

Expand Down
129 changes: 127 additions & 2 deletions manager_test.go
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
// +build integration

package amqpwrapper

import (
Expand Down Expand Up @@ -682,3 +680,130 @@ func TestConnectError(t *testing.T) {
assert.NotNil(t, err, "connectConsumer error should not be nil")
})
}

func TestConnectionManager_InitChannelAndGet(t *testing.T) {
type args struct {
fn InitializeChannel
args func() InitArgs
}
tests := []struct {
name string
p func() IConnectionManager
args args
wantErr bool
}{
{
name: "Function channel is nil",
p: func() IConnectionManager {
mgr, err := NewManager(uriDial, amqp.Config{})
assert.Nilf(t, err, "Error in initiating new manager: %s", err)
return mgr
},
args: args{
args: func() InitArgs {
return InitArgs{
Key: "Producer",
TypeChan: Producer,
}
},
},
wantErr: true,
},
{
name: "Channel type is invalid",
p: func() IConnectionManager {
mgr, err := NewManager(uriDial, amqp.Config{})
assert.Nilf(t, err, "Error in initiating new manager: %s", err)
return mgr
},
args: args{
fn: func(amqpChan *amqp.Channel) (err error) {
return
},
args: func() InitArgs {
return InitArgs{
Key: "Producer",
TypeChan: 500,
}
},
},
wantErr: true,
},
{
name: "Connection is already closed",
p: func() IConnectionManager {
mgr, err := NewManager(uriDial, amqp.Config{})
assert.Nilf(t, err, "Error in initiating new manager: %s", err)
defer mgr.Close()
return mgr
},
args: args{
fn: func(amqpChan *amqp.Channel) (err error) {
return
},
args: func() InitArgs {
return InitArgs{
Key: "Producer",
TypeChan: Producer,
}
},
},
wantErr: true,
},
{
name: "Init channel returns error",
p: func() IConnectionManager {
mgr, err := NewManager(uriDial, amqp.Config{})
assert.Nilf(t, err, "Error in initiating new manager: %s", err)
return mgr
},
args: args{
fn: func(amqpChan *amqp.Channel) (err error) {
err = errors.New("RANDOM")
return
},
args: func() InitArgs {
return InitArgs{
Key: "Producer",
TypeChan: Producer,
}
},
},
wantErr: true,
},
{
name: "Initialize channel with nil channel",
p: func() IConnectionManager {
mgr, err := NewManager(uriDial, amqp.Config{})
assert.Nilf(t, err, "Error in initiating new manager: %s", err)
return mgr
},
args: args{
fn: func(amqpChan *amqp.Channel) (err error) {
return
},
args: func() InitArgs {
return InitArgs{
Key: "Producer",
TypeChan: Producer,
}
},
},
wantErr: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
gotChannel, err := tt.p().InitChannelAndGet(tt.args.fn, tt.args.args())
if (err != nil) != tt.wantErr {
t.Errorf("ConnectionManager.InitChannelAndGet() error = %v, wantErr %v", err, tt.wantErr)
return
}
if tt.wantErr {
assert.Nil(t, gotChannel, "The channel must be nil value")
} else {
assert.NotNil(t, gotChannel, "The channel must not be nil")
}
})
}
}
64 changes: 64 additions & 0 deletions mock_IChannelManager_test.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading

0 comments on commit 7058d51

Please sign in to comment.