github.com/lingyao2333/mo-zero@v1.4.1/core/stores/sqlx/mysql_test.go (about)

     1  package sqlx
     2  
     3  import (
     4  	"errors"
     5  	"reflect"
     6  	"testing"
     7  
     8  	"github.com/go-sql-driver/mysql"
     9  	"github.com/lingyao2333/mo-zero/core/breaker"
    10  	"github.com/lingyao2333/mo-zero/core/logx"
    11  	"github.com/lingyao2333/mo-zero/core/stat"
    12  	"github.com/stretchr/testify/assert"
    13  )
    14  
    15  func init() {
    16  	stat.SetReporter(nil)
    17  }
    18  
    19  func TestBreakerOnDuplicateEntry(t *testing.T) {
    20  	logx.Disable()
    21  
    22  	err := tryOnDuplicateEntryError(t, mysqlAcceptable)
    23  	assert.Equal(t, duplicateEntryCode, err.(*mysql.MySQLError).Number)
    24  }
    25  
    26  func TestBreakerOnNotHandlingDuplicateEntry(t *testing.T) {
    27  	logx.Disable()
    28  
    29  	var found bool
    30  	for i := 0; i < 100; i++ {
    31  		if tryOnDuplicateEntryError(t, nil) == breaker.ErrServiceUnavailable {
    32  			found = true
    33  		}
    34  	}
    35  	assert.True(t, found)
    36  }
    37  
    38  func TestMysqlAcceptable(t *testing.T) {
    39  	conn := NewMysql("nomysql").(*commonSqlConn)
    40  	withMysqlAcceptable()(conn)
    41  	assert.EqualValues(t, reflect.ValueOf(mysqlAcceptable).Pointer(), reflect.ValueOf(conn.accept).Pointer())
    42  	assert.True(t, mysqlAcceptable(nil))
    43  	assert.False(t, mysqlAcceptable(errors.New("any")))
    44  	assert.False(t, mysqlAcceptable(new(mysql.MySQLError)))
    45  }
    46  
    47  func tryOnDuplicateEntryError(t *testing.T, accept func(error) bool) error {
    48  	logx.Disable()
    49  
    50  	conn := commonSqlConn{
    51  		brk:    breaker.NewBreaker(),
    52  		accept: accept,
    53  	}
    54  	for i := 0; i < 1000; i++ {
    55  		assert.NotNil(t, conn.brk.DoWithAcceptable(func() error {
    56  			return &mysql.MySQLError{
    57  				Number: duplicateEntryCode,
    58  			}
    59  		}, conn.acceptable))
    60  	}
    61  	return conn.brk.DoWithAcceptable(func() error {
    62  		return &mysql.MySQLError{
    63  			Number: duplicateEntryCode,
    64  		}
    65  	}, conn.acceptable)
    66  }