]> Cypherpunks repositories - gostls13.git/commitdiff
net: add TestSendfileParts
authorAlex Brainman <alex.brainman@gmail.com>
Mon, 11 Jun 2018 01:03:25 +0000 (11:03 +1000)
committerAlex Brainman <alex.brainman@gmail.com>
Mon, 11 Jun 2018 06:35:20 +0000 (06:35 +0000)
Add test for freebsd issue #25809.

This test also fails on my Windows 10 Version 1803.
My hope is that adding new test will break one of our builders.

Updates #25722
Updates #25809

Change-Id: Ia103bc708b8fa3b9af57613acc44893f90b3fa18
Reviewed-on: https://go-review.googlesource.com/117775
Run-TryBot: Alex Brainman <alex.brainman@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
src/net/sendfile_test.go

index 75d4b4e9bf2469fef51c36831ff1c0165c34d64d..3418d7f243af6af9d586b7755be628c58a2cf370 100644 (file)
@@ -7,11 +7,13 @@
 package net
 
 import (
+       "bytes"
        "crypto/sha256"
        "encoding/hex"
        "fmt"
        "io"
        "os"
+       "runtime"
        "testing"
 )
 
@@ -90,3 +92,65 @@ func TestSendfile(t *testing.T) {
                t.Error(err)
        }
 }
+
+func TestSendfileParts(t *testing.T) {
+       if runtime.GOOS == "freebsd" {
+               t.Skipf("skipping on %s (see golang.org/issue/25809 for details)", runtime.GOOS)
+       }
+
+       ln, err := newLocalListener("tcp")
+       if err != nil {
+               t.Fatal(err)
+       }
+       defer ln.Close()
+
+       errc := make(chan error, 1)
+       go func(ln Listener) {
+               // Wait for a connection.
+               conn, err := ln.Accept()
+               if err != nil {
+                       errc <- err
+                       close(errc)
+                       return
+               }
+
+               go func() {
+                       defer close(errc)
+                       defer conn.Close()
+
+                       f, err := os.Open(twain)
+                       if err != nil {
+                               errc <- err
+                               return
+                       }
+                       defer f.Close()
+
+                       for i := 0; i < 3; i++ {
+                               // Return file data using io.CopyN, which should use
+                               // sendFile if available.
+                               _, err = io.CopyN(conn, f, 3)
+                               if err != nil {
+                                       errc <- err
+                                       return
+                               }
+                       }
+               }()
+       }(ln)
+
+       c, err := Dial("tcp", ln.Addr().String())
+       if err != nil {
+               t.Fatal(err)
+       }
+       defer c.Close()
+
+       buf := new(bytes.Buffer)
+       buf.ReadFrom(c)
+
+       if want, have := "Produced ", buf.String(); have != want {
+               t.Errorf("unexpected server reply %q, want %q", have, want)
+       }
+
+       for err := range errc {
+               t.Error(err)
+       }
+}