|
7 | 7 | "os"
|
8 | 8 | "sync"
|
9 | 9 | "testing"
|
10 |
| - "time" |
11 | 10 | )
|
12 | 11 |
|
13 | 12 | var (
|
@@ -694,42 +693,62 @@ func TestStmtMultiRows(t *testing.T) {
|
694 | 693 |
|
695 | 694 | }
|
696 | 695 |
|
697 |
| -var canStop bool |
| 696 | +func TestConcurrent(t *testing.T) { |
| 697 | + if os.Getenv("MYSQL_TEST_CONCURRENT") != "1" { |
| 698 | + t.Log("CONCURRENT env var not set. Skipping TestConcurrent") |
| 699 | + return |
| 700 | + } |
| 701 | + if !getEnv() { |
| 702 | + t.Logf("MySQL-Server not running on %s. Skipping TestConcurrent", netAddr) |
| 703 | + return |
| 704 | + } |
698 | 705 |
|
699 |
| -func doStuff(t *testing.T) { |
700 | 706 | db, err := sql.Open("mysql", dsn)
|
701 | 707 | if err != nil {
|
702 | 708 | t.Fatalf("Error connecting: %v", err)
|
703 | 709 | }
|
704 | 710 |
|
705 | 711 | defer db.Close()
|
706 | 712 |
|
707 |
| - for !canStop { |
708 |
| - _, err := db.Exec("SELECT 1") |
709 |
| - if err != nil { |
710 |
| - canStop = true |
711 |
| - t.Fatalf(err.Error()) |
712 |
| - } |
| 713 | + var max int |
| 714 | + err = db.QueryRow("SELECT @@max_connections").Scan(&max) |
| 715 | + if err != nil { |
| 716 | + t.Fatalf("%v", err) |
713 | 717 | }
|
714 |
| -} |
715 | 718 |
|
716 |
| -func TestConcurrent(t *testing.T) { |
717 |
| - if os.Getenv("MYSQL_TEST_CONCURRENT") != "1" { |
718 |
| - t.Log("CONCURRENT env var not set. Skipping TestConcurrent") |
719 |
| - return |
720 |
| - } |
721 |
| - if !getEnv() { |
722 |
| - t.Logf("MySQL-Server not running on %s. Skipping TestConcurrent", netAddr) |
723 |
| - return |
724 |
| - } |
| 719 | + t.Logf("Testing %d concurrent connections \r\n", max) |
725 | 720 |
|
726 |
| - fmt.Println("Run") |
| 721 | + canStop := false |
727 | 722 |
|
728 |
| - canStop = false |
729 |
| - for i := 0; i < 500; i++ { |
730 |
| - go doStuff(t) |
| 723 | + c := make(chan struct{}, max) |
| 724 | + for i := 0; i < max; i++ { |
| 725 | + go func() { |
| 726 | + tx, err := db.Begin() |
| 727 | + if err != nil { |
| 728 | + canStop = true |
| 729 | + t.Fatalf("Error on Con %d: %s", i, err.Error()) |
| 730 | + } |
| 731 | + |
| 732 | + c <- struct{}{} |
| 733 | + |
| 734 | + for !canStop { |
| 735 | + _, err := tx.Exec("SELECT 1") |
| 736 | + if err != nil { |
| 737 | + canStop = true |
| 738 | + t.Fatalf("Error on Con %d: %s", i, err.Error()) |
| 739 | + } |
| 740 | + } |
| 741 | + |
| 742 | + err = tx.Commit() |
| 743 | + if err != nil { |
| 744 | + canStop = true |
| 745 | + t.Fatalf("Error on Con %d: %s", i, err.Error()) |
| 746 | + } |
| 747 | + }() |
731 | 748 | }
|
732 | 749 |
|
733 |
| - time.Sleep(3 * time.Second) |
| 750 | + for i := 0; i < max; i++ { |
| 751 | + <-c |
| 752 | + } |
734 | 753 | canStop = true
|
735 | 754 | }
|
0 commit comments