xorm_test.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. package xorm
  2. import (
  3. "flag"
  4. "fmt"
  5. "os"
  6. "strings"
  7. "testing"
  8. _ "github.com/denisenkom/go-mssqldb"
  9. _ "github.com/go-sql-driver/mysql"
  10. _ "github.com/lib/pq"
  11. _ "github.com/mattn/go-sqlite3"
  12. "github.com/xormplus/core"
  13. _ "github.com/ziutek/mymysql/godrv"
  14. )
  15. var (
  16. testEngine EngineInterface
  17. dbType string
  18. connString string
  19. db = flag.String("db", "sqlite3", "the tested database")
  20. showSQL = flag.Bool("show_sql", true, "show generated SQLs")
  21. ptrConnStr = flag.String("conn_str", "./test.db?cache=shared&mode=rwc", "test database connection string")
  22. mapType = flag.String("map_type", "snake", "indicate the name mapping")
  23. cache = flag.Bool("cache", false, "if enable cache")
  24. cluster = flag.Bool("cluster", false, "if this is a cluster")
  25. splitter = flag.String("splitter", ";", "the splitter on connstr for cluster")
  26. schema = flag.String("schema", "", "specify the schema")
  27. )
  28. func createEngine(dbType, connStr string) error {
  29. if testEngine == nil {
  30. var err error
  31. if !*cluster {
  32. testEngine, err = NewEngine(dbType, connStr)
  33. } else {
  34. testEngine, err = NewEngineGroup(dbType, strings.Split(connStr, *splitter))
  35. }
  36. if err != nil {
  37. return err
  38. }
  39. if *schema != "" {
  40. testEngine.SetSchema(*schema)
  41. }
  42. testEngine.ShowSQL(*showSQL)
  43. testEngine.SetLogLevel(core.LOG_DEBUG)
  44. if *cache {
  45. cacher := NewLRUCacher(NewMemoryStore(), 100000)
  46. testEngine.SetDefaultCacher(cacher)
  47. }
  48. if len(*mapType) > 0 {
  49. switch *mapType {
  50. case "snake":
  51. testEngine.SetMapper(core.SnakeMapper{})
  52. case "same":
  53. testEngine.SetMapper(core.SameMapper{})
  54. case "gonic":
  55. testEngine.SetMapper(core.LintGonicMapper)
  56. }
  57. }
  58. }
  59. tables, err := testEngine.DBMetas()
  60. if err != nil {
  61. return err
  62. }
  63. var tableNames = make([]interface{}, 0, len(tables))
  64. for _, table := range tables {
  65. tableNames = append(tableNames, table.Name)
  66. }
  67. if err = testEngine.DropTables(tableNames...); err != nil {
  68. return err
  69. }
  70. return nil
  71. }
  72. func prepareEngine() error {
  73. return createEngine(dbType, connString)
  74. }
  75. func TestMain(m *testing.M) {
  76. flag.Parse()
  77. dbType = *db
  78. if *db == "sqlite3" {
  79. if ptrConnStr == nil {
  80. connString = "./test.db?cache=shared&mode=rwc"
  81. } else {
  82. connString = *ptrConnStr
  83. }
  84. } else {
  85. if ptrConnStr == nil {
  86. fmt.Println("you should indicate conn string")
  87. return
  88. }
  89. connString = *ptrConnStr
  90. }
  91. dbs := strings.Split(*db, "::")
  92. conns := strings.Split(connString, "::")
  93. var res int
  94. for i := 0; i < len(dbs); i++ {
  95. dbType = dbs[i]
  96. connString = conns[i]
  97. testEngine = nil
  98. fmt.Println("testing", dbType, connString)
  99. if err := prepareEngine(); err != nil {
  100. fmt.Println(err)
  101. return
  102. }
  103. code := m.Run()
  104. if code > 0 {
  105. res = code
  106. }
  107. }
  108. os.Exit(res)
  109. }
  110. func TestPing(t *testing.T) {
  111. if err := testEngine.Ping(); err != nil {
  112. t.Fatal(err)
  113. }
  114. }