c2047754c3
Compiler changes: * Change map assignment to use mapassign and assign value directly. * Change string iteration to use decoderune, faster for ASCII strings. * Change makeslice to take int, and use makeslice64 for larger values. * Add new noverflow field to hmap struct used for maps. Unresolved problems, to be fixed later: * Commented out test in go/types/sizes_test.go that doesn't compile. * Commented out reflect.TestStructOf test for padding after zero-sized field. Reviewed-on: https://go-review.googlesource.com/35231 gotools/: Updates for Go 1.8rc1. * Makefile.am (go_cmd_go_files): Add bug.go. (s-zdefaultcc): Write defaultPkgConfig. * Makefile.in: Rebuild. From-SVN: r244456
88 lines
1.7 KiB
Go
88 lines
1.7 KiB
Go
// Copyright 2014 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 rpc
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"net"
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
type shutdownCodec struct {
|
|
responded chan int
|
|
closed bool
|
|
}
|
|
|
|
func (c *shutdownCodec) WriteRequest(*Request, interface{}) error { return nil }
|
|
func (c *shutdownCodec) ReadResponseBody(interface{}) error { return nil }
|
|
func (c *shutdownCodec) ReadResponseHeader(*Response) error {
|
|
c.responded <- 1
|
|
return errors.New("shutdownCodec ReadResponseHeader")
|
|
}
|
|
func (c *shutdownCodec) Close() error {
|
|
c.closed = true
|
|
return nil
|
|
}
|
|
|
|
func TestCloseCodec(t *testing.T) {
|
|
codec := &shutdownCodec{responded: make(chan int)}
|
|
client := NewClientWithCodec(codec)
|
|
<-codec.responded
|
|
client.Close()
|
|
if !codec.closed {
|
|
t.Error("client.Close did not close codec")
|
|
}
|
|
}
|
|
|
|
// Test that errors in gob shut down the connection. Issue 7689.
|
|
|
|
type R struct {
|
|
msg []byte // Not exported, so R does not work with gob.
|
|
}
|
|
|
|
type S struct{}
|
|
|
|
func (s *S) Recv(nul *struct{}, reply *R) error {
|
|
*reply = R{[]byte("foo")}
|
|
return nil
|
|
}
|
|
|
|
func TestGobError(t *testing.T) {
|
|
defer func() {
|
|
err := recover()
|
|
if err == nil {
|
|
t.Fatal("no error")
|
|
}
|
|
if !strings.Contains("reading body EOF", err.(error).Error()) {
|
|
t.Fatal("expected `reading body EOF', got", err)
|
|
}
|
|
}()
|
|
Register(new(S))
|
|
|
|
listen, err := net.Listen("tcp", "127.0.0.1:0")
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
go Accept(listen)
|
|
|
|
client, err := Dial("tcp", listen.Addr().String())
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
var reply Reply
|
|
err = client.Call("S.Recv", &struct{}{}, &reply)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
fmt.Printf("%#v\n", reply)
|
|
client.Close()
|
|
|
|
listen.Close()
|
|
}
|