Julien Schmidt 12 роки тому
батько
коміт
1978a3c367
1 змінених файлів з 43 додано та 24 видалено
  1. 43 24
      driver_test.go

+ 43 - 24
driver_test.go

@@ -7,7 +7,6 @@ import (
 	"os"
 	"sync"
 	"testing"
-	"time"
 )
 
 var (
@@ -694,9 +693,16 @@ func TestStmtMultiRows(t *testing.T) {
 
 }
 
-var canStop bool
+func TestConcurrent(t *testing.T) {
+	if os.Getenv("MYSQL_TEST_CONCURRENT") != "1" {
+		t.Log("CONCURRENT env var not set. Skipping TestConcurrent")
+		return
+	}
+	if !getEnv() {
+		t.Logf("MySQL-Server not running on %s. Skipping TestConcurrent", netAddr)
+		return
+	}
 
-func doStuff(t *testing.T) {
 	db, err := sql.Open("mysql", dsn)
 	if err != nil {
 		t.Fatalf("Error connecting: %v", err)
@@ -704,32 +710,45 @@ func doStuff(t *testing.T) {
 
 	defer db.Close()
 
-	for !canStop {
-		_, err := db.Exec("SELECT 1")
-		if err != nil {
-			canStop = true
-			t.Fatalf(err.Error())
-		}
+	var max int
+	err = db.QueryRow("SELECT @@max_connections").Scan(&max)
+	if err != nil {
+		t.Fatalf("%v", err)
 	}
-}
 
-func TestConcurrent(t *testing.T) {
-	if os.Getenv("MYSQL_TEST_CONCURRENT") != "1" {
-		t.Log("CONCURRENT env var not set. Skipping TestConcurrent")
-		return
-	}
-	if !getEnv() {
-		t.Logf("MySQL-Server not running on %s. Skipping TestConcurrent", netAddr)
-		return
-	}
+	t.Logf("Testing %d concurrent connections \r\n", max)
 
-	fmt.Println("Run")
+	canStop := false
 
-	canStop = false
-	for i := 0; i < 500; i++ {
-		go doStuff(t)
+	c := make(chan struct{}, max)
+	for i := 0; i < max; i++ {
+		go func() {
+			tx, err := db.Begin()
+			if err != nil {
+				canStop = true
+				t.Fatalf("Error on Con %d: %s", i, err.Error())
+			}
+
+			c <- struct{}{}
+
+			for !canStop {
+				_, err := tx.Exec("SELECT 1")
+				if err != nil {
+					canStop = true
+					t.Fatalf("Error on Con %d: %s", i, err.Error())
+				}
+			}
+
+			err = tx.Commit()
+			if err != nil {
+				canStop = true
+				t.Fatalf("Error on Con %d: %s", i, err.Error())
+			}
+		}()
 	}
 
-	time.Sleep(3 * time.Second)
+	for i := 0; i < max; i++ {
+		<-c
+	}
 	canStop = true
 }