95 lines
1.8 KiB
Go
95 lines
1.8 KiB
Go
|
package canal
|
||
|
|
||
|
import (
|
||
|
"flag"
|
||
|
"fmt"
|
||
|
"os"
|
||
|
"testing"
|
||
|
|
||
|
"github.com/ngaut/log"
|
||
|
. "github.com/pingcap/check"
|
||
|
"github.com/siddontang/go-mysql/mysql"
|
||
|
)
|
||
|
|
||
|
var testHost = flag.String("host", "127.0.0.1", "MySQL host")
|
||
|
|
||
|
func Test(t *testing.T) {
|
||
|
TestingT(t)
|
||
|
}
|
||
|
|
||
|
type canalTestSuite struct {
|
||
|
c *Canal
|
||
|
}
|
||
|
|
||
|
var _ = Suite(&canalTestSuite{})
|
||
|
|
||
|
func (s *canalTestSuite) SetUpSuite(c *C) {
|
||
|
cfg := NewDefaultConfig()
|
||
|
cfg.Addr = fmt.Sprintf("%s:3306", *testHost)
|
||
|
cfg.User = "root"
|
||
|
cfg.Dump.ExecutionPath = "mysqldump"
|
||
|
cfg.Dump.TableDB = "test"
|
||
|
cfg.Dump.Tables = []string{"canal_test"}
|
||
|
|
||
|
os.RemoveAll(cfg.DataDir)
|
||
|
|
||
|
var err error
|
||
|
s.c, err = NewCanal(cfg)
|
||
|
c.Assert(err, IsNil)
|
||
|
|
||
|
sql := `
|
||
|
CREATE TABLE IF NOT EXISTS test.canal_test (
|
||
|
id int AUTO_INCREMENT,
|
||
|
name varchar(100),
|
||
|
PRIMARY KEY(id)
|
||
|
)ENGINE=innodb;
|
||
|
`
|
||
|
|
||
|
s.execute(c, sql)
|
||
|
|
||
|
s.execute(c, "DELETE FROM test.canal_test")
|
||
|
s.execute(c, "INSERT INTO test.canal_test (name) VALUES (?), (?), (?)", "a", "b", "c")
|
||
|
|
||
|
s.execute(c, "SET GLOBAL binlog_format = 'ROW'")
|
||
|
|
||
|
s.c.RegRowsEventHandler(&testRowsEventHandler{})
|
||
|
err = s.c.Start()
|
||
|
c.Assert(err, IsNil)
|
||
|
}
|
||
|
|
||
|
func (s *canalTestSuite) TearDownSuite(c *C) {
|
||
|
if s.c != nil {
|
||
|
s.c.Close()
|
||
|
s.c = nil
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (s *canalTestSuite) execute(c *C, query string, args ...interface{}) *mysql.Result {
|
||
|
r, err := s.c.Execute(query, args...)
|
||
|
c.Assert(err, IsNil)
|
||
|
return r
|
||
|
}
|
||
|
|
||
|
type testRowsEventHandler struct {
|
||
|
}
|
||
|
|
||
|
func (h *testRowsEventHandler) Do(e *RowsEvent) error {
|
||
|
log.Infof("%s %v\n", e.Action, e.Rows)
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func (h *testRowsEventHandler) String() string {
|
||
|
return "testRowsEventHandler"
|
||
|
}
|
||
|
|
||
|
func (s *canalTestSuite) TestCanal(c *C) {
|
||
|
<-s.c.WaitDumpDone()
|
||
|
|
||
|
for i := 1; i < 10; i++ {
|
||
|
s.execute(c, "INSERT INTO test.canal_test (name) VALUES (?)", fmt.Sprintf("%d", i))
|
||
|
}
|
||
|
|
||
|
err := s.c.CatchMasterPos(100)
|
||
|
c.Assert(err, IsNil)
|
||
|
}
|