summaryrefslogtreecommitdiffhomepage
path: root/device
diff options
context:
space:
mode:
authorJason A. Donenfeld <Jason@zx2c4.com>2021-02-03 17:43:41 +0100
committerJason A. Donenfeld <Jason@zx2c4.com>2021-02-03 17:43:41 +0100
commit7258a8973dfb2e3069fe1a8364966cfaadbdb4e1 (patch)
treef199511ff2b90f3d52e780aba5e9191bba34a5ad /device
parentd9d547a3f3f83f6ea23e140e3665ac41b6aca10a (diff)
device: add up/down stress test
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
Diffstat (limited to 'device')
-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) {