mirror of
https://github.com/elyby/chrly.git
synced 2024-12-23 05:30:06 +05:30
Ugly and dirty solution to sync batch_uuids_provider_test
This commit is contained in:
parent
17f82ec6d3
commit
a8e4f7ae56
@ -4,9 +4,7 @@ import (
|
|||||||
"crypto/rand"
|
"crypto/rand"
|
||||||
"encoding/base64"
|
"encoding/base64"
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
|
||||||
|
|
||||||
testify "github.com/stretchr/testify/assert"
|
testify "github.com/stretchr/testify/assert"
|
||||||
"github.com/stretchr/testify/mock"
|
"github.com/stretchr/testify/mock"
|
||||||
@ -117,15 +115,17 @@ func (suite *batchUuidsProviderTestSuite) SetupTest() {
|
|||||||
suite.iterateChan <- false
|
suite.iterateChan <- false
|
||||||
}
|
}
|
||||||
|
|
||||||
var lock sync.Mutex
|
|
||||||
suite.GetUuidAsync = func(username string) chan *batchUuidsProviderGetUuidResult {
|
suite.GetUuidAsync = func(username string) chan *batchUuidsProviderGetUuidResult {
|
||||||
lock.Lock()
|
s := make(chan bool)
|
||||||
defer lock.Unlock()
|
// This dirty hack ensures, that the username will be queued before we return control to the caller.
|
||||||
|
// It's needed to keep expected calls order and prevent cases when iteration happens before all usernames
|
||||||
|
// will be queued.
|
||||||
|
suite.Logger.On("IncCounter", "mojang_textures.usernames.queued", int64(1)).Once().Run(func(args mock.Arguments) {
|
||||||
|
s <- true
|
||||||
|
})
|
||||||
|
|
||||||
c := make(chan *batchUuidsProviderGetUuidResult)
|
c := make(chan *batchUuidsProviderGetUuidResult)
|
||||||
s := make(chan int)
|
|
||||||
go func() {
|
go func() {
|
||||||
s <- 0
|
|
||||||
profile, err := suite.Provider.GetUuid(username)
|
profile, err := suite.Provider.GetUuid(username)
|
||||||
c <- &batchUuidsProviderGetUuidResult{
|
c <- &batchUuidsProviderGetUuidResult{
|
||||||
Result: profile,
|
Result: profile,
|
||||||
@ -144,7 +144,6 @@ func (suite *batchUuidsProviderTestSuite) SetupTest() {
|
|||||||
|
|
||||||
func (suite *batchUuidsProviderTestSuite) TearDownTest() {
|
func (suite *batchUuidsProviderTestSuite) TearDownTest() {
|
||||||
suite.done()
|
suite.done()
|
||||||
time.Sleep(10 * time.Millisecond) // Add delay to let finish all goroutines before assert mocks calls
|
|
||||||
suite.MojangApi.AssertExpectations(suite.T())
|
suite.MojangApi.AssertExpectations(suite.T())
|
||||||
suite.Logger.AssertExpectations(suite.T())
|
suite.Logger.AssertExpectations(suite.T())
|
||||||
}
|
}
|
||||||
@ -156,7 +155,6 @@ func TestBatchUuidsProvider(t *testing.T) {
|
|||||||
func (suite *batchUuidsProviderTestSuite) TestGetUuidForOneUsername() {
|
func (suite *batchUuidsProviderTestSuite) TestGetUuidForOneUsername() {
|
||||||
expectedResult := &mojang.ProfileInfo{Id: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", Name: "username"}
|
expectedResult := &mojang.ProfileInfo{Id: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", Name: "username"}
|
||||||
|
|
||||||
suite.Logger.On("IncCounter", "mojang_textures.usernames.queued", int64(1)).Once()
|
|
||||||
suite.Logger.On("UpdateGauge", "mojang_textures.usernames.iteration_size", int64(1)).Once()
|
suite.Logger.On("UpdateGauge", "mojang_textures.usernames.iteration_size", int64(1)).Once()
|
||||||
suite.Logger.On("UpdateGauge", "mojang_textures.usernames.queue_size", int64(0)).Once()
|
suite.Logger.On("UpdateGauge", "mojang_textures.usernames.queue_size", int64(0)).Once()
|
||||||
suite.Logger.On("RecordTimer", "mojang_textures.usernames.round_time", mock.Anything).Once()
|
suite.Logger.On("RecordTimer", "mojang_textures.usernames.round_time", mock.Anything).Once()
|
||||||
@ -176,7 +174,6 @@ func (suite *batchUuidsProviderTestSuite) TestGetUuidForTwoUsernames() {
|
|||||||
expectedResult1 := &mojang.ProfileInfo{Id: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", Name: "username1"}
|
expectedResult1 := &mojang.ProfileInfo{Id: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", Name: "username1"}
|
||||||
expectedResult2 := &mojang.ProfileInfo{Id: "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", Name: "username2"}
|
expectedResult2 := &mojang.ProfileInfo{Id: "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", Name: "username2"}
|
||||||
|
|
||||||
suite.Logger.On("IncCounter", "mojang_textures.usernames.queued", int64(1)).Twice()
|
|
||||||
suite.Logger.On("UpdateGauge", "mojang_textures.usernames.iteration_size", int64(2)).Once()
|
suite.Logger.On("UpdateGauge", "mojang_textures.usernames.iteration_size", int64(2)).Once()
|
||||||
suite.Logger.On("UpdateGauge", "mojang_textures.usernames.queue_size", int64(0)).Once()
|
suite.Logger.On("UpdateGauge", "mojang_textures.usernames.queue_size", int64(0)).Once()
|
||||||
suite.Logger.On("RecordTimer", "mojang_textures.usernames.round_time", mock.Anything).Once()
|
suite.Logger.On("RecordTimer", "mojang_textures.usernames.round_time", mock.Anything).Once()
|
||||||
@ -206,15 +203,18 @@ func (suite *batchUuidsProviderTestSuite) TestGetUuidForMoreThan10Usernames() {
|
|||||||
usernames[i] = randStr(8)
|
usernames[i] = randStr(8)
|
||||||
}
|
}
|
||||||
|
|
||||||
suite.Logger.On("IncCounter", "mojang_textures.usernames.queued", int64(1)).Times(12)
|
|
||||||
suite.Logger.On("UpdateGauge", "mojang_textures.usernames.iteration_size", int64(10)).Once()
|
suite.Logger.On("UpdateGauge", "mojang_textures.usernames.iteration_size", int64(10)).Once()
|
||||||
suite.Logger.On("UpdateGauge", "mojang_textures.usernames.iteration_size", int64(2)).Once()
|
suite.Logger.On("UpdateGauge", "mojang_textures.usernames.iteration_size", int64(2)).Once()
|
||||||
suite.Logger.On("UpdateGauge", "mojang_textures.usernames.queue_size", int64(2)).Once()
|
suite.Logger.On("UpdateGauge", "mojang_textures.usernames.queue_size", int64(2)).Once()
|
||||||
suite.Logger.On("UpdateGauge", "mojang_textures.usernames.queue_size", int64(0)).Once()
|
suite.Logger.On("UpdateGauge", "mojang_textures.usernames.queue_size", int64(0)).Once()
|
||||||
suite.Logger.On("RecordTimer", "mojang_textures.usernames.round_time", mock.Anything).Twice()
|
suite.Logger.On("RecordTimer", "mojang_textures.usernames.round_time", mock.Anything).Twice()
|
||||||
|
|
||||||
suite.MojangApi.On("UsernamesToUuids", usernames[0:10]).Once().Return([]*mojang.ProfileInfo{}, nil)
|
suite.MojangApi.On("UsernamesToUuids", mock.MatchedBy(func(usernames []string) bool {
|
||||||
suite.MojangApi.On("UsernamesToUuids", usernames[10:12]).Once().Return([]*mojang.ProfileInfo{}, nil)
|
return len(usernames) == 10
|
||||||
|
})).Once().Return([]*mojang.ProfileInfo{}, nil)
|
||||||
|
suite.MojangApi.On("UsernamesToUuids", mock.MatchedBy(func(usernames []string) bool {
|
||||||
|
return len(usernames) == 2
|
||||||
|
})).Once().Return([]*mojang.ProfileInfo{}, nil)
|
||||||
|
|
||||||
channels := make([]chan *batchUuidsProviderGetUuidResult, len(usernames))
|
channels := make([]chan *batchUuidsProviderGetUuidResult, len(usernames))
|
||||||
for i, username := range usernames {
|
for i, username := range usernames {
|
||||||
@ -230,7 +230,6 @@ func (suite *batchUuidsProviderTestSuite) TestGetUuidForMoreThan10Usernames() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (suite *batchUuidsProviderTestSuite) TestDoNothingWhenNoTasks() {
|
func (suite *batchUuidsProviderTestSuite) TestDoNothingWhenNoTasks() {
|
||||||
suite.Logger.On("IncCounter", "mojang_textures.usernames.queued", int64(1)).Once()
|
|
||||||
suite.Logger.On("UpdateGauge", "mojang_textures.usernames.iteration_size", int64(1)).Once()
|
suite.Logger.On("UpdateGauge", "mojang_textures.usernames.iteration_size", int64(1)).Once()
|
||||||
suite.Logger.On("UpdateGauge", "mojang_textures.usernames.iteration_size", int64(0)).Twice()
|
suite.Logger.On("UpdateGauge", "mojang_textures.usernames.iteration_size", int64(0)).Twice()
|
||||||
suite.Logger.On("UpdateGauge", "mojang_textures.usernames.queue_size", int64(0)).Times(3)
|
suite.Logger.On("UpdateGauge", "mojang_textures.usernames.queue_size", int64(0)).Times(3)
|
||||||
@ -238,7 +237,7 @@ func (suite *batchUuidsProviderTestSuite) TestDoNothingWhenNoTasks() {
|
|||||||
|
|
||||||
suite.MojangApi.On("UsernamesToUuids", []string{"username"}).Once().Return([]*mojang.ProfileInfo{}, nil)
|
suite.MojangApi.On("UsernamesToUuids", []string{"username"}).Once().Return([]*mojang.ProfileInfo{}, nil)
|
||||||
|
|
||||||
// Perform first iteration and await it finish
|
// Perform first iteration and await it finishes
|
||||||
resultChan := suite.GetUuidAsync("username")
|
resultChan := suite.GetUuidAsync("username")
|
||||||
|
|
||||||
suite.Iterate()
|
suite.Iterate()
|
||||||
@ -247,7 +246,7 @@ func (suite *batchUuidsProviderTestSuite) TestDoNothingWhenNoTasks() {
|
|||||||
suite.Assert().Nil(result.Result)
|
suite.Assert().Nil(result.Result)
|
||||||
suite.Assert().Nil(result.Error)
|
suite.Assert().Nil(result.Error)
|
||||||
|
|
||||||
// Let it to perform a few more iterations to ensure, that there is no calls to external APIs
|
// Let it to perform a few more iterations to ensure, that there are no calls to external APIs
|
||||||
suite.Iterate()
|
suite.Iterate()
|
||||||
suite.Iterate()
|
suite.Iterate()
|
||||||
}
|
}
|
||||||
@ -255,7 +254,6 @@ func (suite *batchUuidsProviderTestSuite) TestDoNothingWhenNoTasks() {
|
|||||||
func (suite *batchUuidsProviderTestSuite) TestGetUuidForTwoUsernamesWithAnError() {
|
func (suite *batchUuidsProviderTestSuite) TestGetUuidForTwoUsernamesWithAnError() {
|
||||||
expectedError := &mojang.TooManyRequestsError{}
|
expectedError := &mojang.TooManyRequestsError{}
|
||||||
|
|
||||||
suite.Logger.On("IncCounter", "mojang_textures.usernames.queued", int64(1)).Twice()
|
|
||||||
suite.Logger.On("UpdateGauge", "mojang_textures.usernames.iteration_size", int64(2)).Once()
|
suite.Logger.On("UpdateGauge", "mojang_textures.usernames.iteration_size", int64(2)).Once()
|
||||||
suite.Logger.On("UpdateGauge", "mojang_textures.usernames.queue_size", int64(0)).Once()
|
suite.Logger.On("UpdateGauge", "mojang_textures.usernames.queue_size", int64(0)).Once()
|
||||||
suite.Logger.On("RecordTimer", "mojang_textures.usernames.round_time", mock.Anything).Once()
|
suite.Logger.On("RecordTimer", "mojang_textures.usernames.round_time", mock.Anything).Once()
|
||||||
|
Loading…
Reference in New Issue
Block a user