summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--device/device_test.go35
1 files changed, 35 insertions, 0 deletions
diff --git a/device/device_test.go b/device/device_test.go
index 6b443ce..b783771 100644
--- a/device/device_test.go
+++ b/device/device_test.go
@@ -7,9 +7,11 @@ package device
import (
"bytes"
+ "encoding/hex"
"errors"
"fmt"
"io/ioutil"
+ "math/rand"
"net"
"runtime"
"runtime/pprof"
@@ -196,6 +198,39 @@ func TestTwoDevicePing(t *testing.T) {
})
}
+func TestUpDown(t *testing.T) {
+ goroutineLeakCheck(t)
+ const itrials = 200
+ const otrials = 10
+
+ for n := 0; n < otrials; n++ {
+ pair := genTestPair(t)
+ for i := range pair {
+ for k := range pair[i].dev.peers.keyMap {
+ pair[i].dev.IpcSet(fmt.Sprintf("public_key=%s\npersistent_keepalive_interval=1\n", hex.EncodeToString(k[:])))
+ }
+ }
+ var wg sync.WaitGroup
+ wg.Add(len(pair))
+ for i := range pair {
+ go func(d *Device) {
+ defer wg.Done()
+ for i := 0; i < itrials; i++ {
+ d.Up()
+ time.Sleep(time.Duration(rand.Intn(int(time.Nanosecond * (0x10000 - 1)))))
+ d.Down()
+ time.Sleep(time.Duration(rand.Intn(int(time.Nanosecond * (0x10000 - 1)))))
+ }
+ }(pair[i].dev)
+ }
+ wg.Wait()
+ for i := range pair {
+ pair[i].dev.Up()
+ pair[i].dev.Close()
+ }
+ }
+}
+
// TestConcurrencySafety does other things concurrently with tunnel use.
// It is intended to be used with the race detector to catch data races.
func TestConcurrencySafety(t *testing.T) {