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 }