Giant blob of minor changes
[dotfiles/.git] / .config / coc / extensions / coc-go-data / tools / pkg / mod / golang.org / x / tools@v0.0.0-20201028153306-37f0764111ff / internal / jsonrpc2 / serve_test.go
diff --git a/.config/coc/extensions/coc-go-data/tools/pkg/mod/golang.org/x/tools@v0.0.0-20201028153306-37f0764111ff/internal/jsonrpc2/serve_test.go b/.config/coc/extensions/coc-go-data/tools/pkg/mod/golang.org/x/tools@v0.0.0-20201028153306-37f0764111ff/internal/jsonrpc2/serve_test.go
new file mode 100644 (file)
index 0000000..c9c1fbd
--- /dev/null
@@ -0,0 +1,62 @@
+// Copyright 2020 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package jsonrpc2
+
+import (
+       "context"
+       "net"
+       "sync"
+       "testing"
+       "time"
+
+       "golang.org/x/tools/internal/stack/stacktest"
+)
+
+func TestIdleTimeout(t *testing.T) {
+       stacktest.NoLeak(t)
+       ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
+       defer cancel()
+
+       ln, err := net.Listen("tcp", "localhost:0")
+       if err != nil {
+               t.Fatal(err)
+       }
+       defer ln.Close()
+
+       connect := func() net.Conn {
+               conn, err := net.DialTimeout("tcp", ln.Addr().String(), 5*time.Second)
+               if err != nil {
+                       panic(err)
+               }
+               return conn
+       }
+
+       server := HandlerServer(MethodNotFound)
+       // connTimer := &fakeTimer{c: make(chan time.Time, 1)}
+       var (
+               runErr error
+               wg     sync.WaitGroup
+       )
+       wg.Add(1)
+       go func() {
+               defer wg.Done()
+               runErr = Serve(ctx, ln, server, 100*time.Millisecond)
+       }()
+
+       // Exercise some connection/disconnection patterns, and then assert that when
+       // our timer fires, the server exits.
+       conn1 := connect()
+       conn2 := connect()
+       conn1.Close()
+       conn2.Close()
+       conn3 := connect()
+       conn3.Close()
+
+       wg.Wait()
+
+       if runErr != ErrIdleTimeout {
+               t.Errorf("run() returned error %v, want %v", runErr, ErrIdleTimeout)
+       }
+}