|
@@ -0,0 +1,90 @@
|
|
|
|
+package storage
|
|
|
|
+
|
|
|
|
+import (
|
|
|
|
+ "log"
|
|
|
|
+ "testing"
|
|
|
|
+)
|
|
|
|
+
|
|
|
|
+type void struct{}
|
|
|
|
+type voidSet map[string]void
|
|
|
|
+
|
|
|
|
+var purgeList voidSet
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+setUp() initializes a test database.
|
|
|
|
+
|
|
|
|
+ - tablesToTruncate is a slice of names of tables to truncate during initialization.
|
|
|
|
+ If any of these tables are not present in the database, the function will fatal out.
|
|
|
|
+
|
|
|
|
+Use defer tearDown(t) to clean the database at the end of a test.
|
|
|
|
+
|
|
|
|
+Implementation note:
|
|
|
|
+
|
|
|
|
+In the current implementation, truncation is performed using SQL DELETE, not
|
|
|
|
+TRUNCATE, because MySQL 5.x cannot TRUNCATE the master table in a master/child
|
|
|
|
+referential integrity constraint, even when the child table is empty. This could
|
|
|
|
+smarter.
|
|
|
|
+
|
|
|
|
+// FIXME stop using constant credentials
|
|
|
|
+*/
|
|
|
|
+
|
|
|
|
+func setUp(t *testing.T, entitiesToPurge []StorageController) {
|
|
|
|
+ var err error
|
|
|
|
+ var DSN = "goroot:gopass@tcp(localhost:3306)/go_kurz_test"
|
|
|
|
+ var name string = ""
|
|
|
|
+ var voidNil void = void{}
|
|
|
|
+ var tableNames voidSet = make(voidSet)
|
|
|
|
+
|
|
|
|
+ Service.SetDSN(DSN)
|
|
|
|
+ err = Service.Open()
|
|
|
|
+ if err != nil {
|
|
|
|
+ t.Fatalf("Failed opening the test database: %+v", err)
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ sql := "SHOW TABLES"
|
|
|
|
+ rows, err := Service.DB.Query(sql)
|
|
|
|
+ if err != nil {
|
|
|
|
+ log.Fatalf("Failed listing tables in the database: %+v\n", err)
|
|
|
|
+ }
|
|
|
|
+ defer rows.Close()
|
|
|
|
+
|
|
|
|
+ purgeList = make(voidSet)
|
|
|
|
+ for rows.Next() {
|
|
|
|
+ if err = rows.Scan(&name); err != nil {
|
|
|
|
+ log.Fatalf("Failed scanning table name: %+v\n", err)
|
|
|
|
+ }
|
|
|
|
+ tableNames[name] = voidNil
|
|
|
|
+ }
|
|
|
|
+ log.Print("Tables:", tableNames)
|
|
|
|
+ for _, entityName := range entitiesToPurge {
|
|
|
|
+ tableName := entityName.Table()
|
|
|
|
+ log.Printf("Checking %s\n", tableName)
|
|
|
|
+ if _, ok := tableNames[tableName]; !ok {
|
|
|
|
+ log.Fatalf("Table %s can not be found in the database. Aborting\n", tableName)
|
|
|
|
+ }
|
|
|
|
+ purgeList[tableName] = voidNil
|
|
|
|
+ Service.Truncate(name)
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+func tearDown(t *testing.T) {
|
|
|
|
+ if purgeList == nil {
|
|
|
|
+ log.Fatalf("Truncate list may not be nil : it has been initialized in initTermStorage. Aborting")
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ for name, _ := range purgeList {
|
|
|
|
+ Service.Truncate(name)
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ Service.Close()
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+func TestSave(t *testing.T) {
|
|
|
|
+ setUp(t, []StorageController{EventInfoService})
|
|
|
|
+ defer tearDown(t)
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+func TestLoad(t *testing.T) {
|
|
|
|
+ setUp(t, []StorageController{EventInfoService})
|
|
|
|
+ defer tearDown(t)
|
|
|
|
+}
|