summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjEzEk <[email protected]>2018-10-26 03:45:55 +0200
committerjEzEk <[email protected]>2018-10-26 03:52:53 +0200
commit788010f11d65572ca0cea2caf65ade6db4a274de (patch)
treef8a599e858f2feacdeb5b487d8b90bc9bf5f5005
parent10df72a1f6ebc4703bef26e015c364ee155dc51f (diff)
tests double close, close with pending requests
(*Conn).Close panic recover in tests
-rw-r--r--xgb_test.go62
1 files changed, 46 insertions, 16 deletions
diff --git a/xgb_test.go b/xgb_test.go
index b10f4bf..6931c3d 100644
--- a/xgb_test.go
+++ b/xgb_test.go
@@ -217,6 +217,17 @@ func TestConnOnNonBlockingDummyXServer(t *testing.T) {
return nil
}
}
+ checkClosed := func(c *Conn) error {
+ select {
+ case eoe, ok := <-c.eventChan:
+ if ok {
+ return fmt.Errorf("(*Conn).eventChan should be closed, but is not and returns %v", eoe)
+ }
+ case <-time.After(timeout):
+ return fmt.Errorf("(*Conn).eventChan should be closed, but is not and was blocking for %v", timeout)
+ }
+ return nil
+ }
testCases := []struct {
description string
@@ -225,6 +236,14 @@ func TestConnOnNonBlockingDummyXServer(t *testing.T) {
{"close",
[]func(*Conn) error{},
},
+ {"double close",
+ []func(*Conn) error{
+ func(c *Conn) error {
+ c.Close()
+ return nil
+ },
+ },
+ },
{"checked requests with reply",
[]func(*Conn) error{
checkedReply(false),
@@ -261,23 +280,28 @@ func TestConnOnNonBlockingDummyXServer(t *testing.T) {
waitEvent(false),
},
},
+ {"close with pending requests",
+ []func(*Conn) error{
+ func(c *Conn) error {
+ c.conn.(*dNC).ReadLock()
+ defer c.conn.(*dNC).ReadUnlock()
+ c.NewRequest([]byte("reply"), c.NewCookie(false, true))
+ c.Close()
+ return nil
+ },
+ checkClosed,
+ },
+ },
{"unexpected conn close",
[]func(*Conn) error{
func(c *Conn) error {
c.conn.Close()
if ev, err := c.WaitForEvent(); ev != nil || err != nil {
- return fmt.Errorf("after conn close WaitForEvent() = (%v, %v), want (nil, nil)", ev, err)
- }
- select {
- case eoe, ok := <-c.eventChan:
- if ok {
- return fmt.Errorf("(*Conn).eventChan should be closed by now, but is not and returns %v", eoe)
- }
- case <-time.After(timeout):
- return fmt.Errorf("(*Conn).eventChan should be closed by now, but is not and was blocking for %v", timeout)
+ return fmt.Errorf("WaitForEvent() = (%v, %v), want (nil, nil)", ev, err)
}
return nil
},
+ checkClosed,
},
},
}
@@ -338,14 +362,20 @@ func TestConnOnNonBlockingDummyXServer(t *testing.T) {
}
}
- c.Close()
- select {
- case eoe, ok := <-c.eventChan:
- if ok {
- t.Errorf("(*Conn).eventChan should be closed after (*Conn),Close(), but is not and returned %v", eoe)
+ recovered := false
+ func() {
+ defer func() {
+ if err := recover(); err != nil {
+ t.Errorf("(*Conn).Close() panic recover: %v", err)
+ recovered = true
+ }
+ }()
+ c.Close()
+ }()
+ if !recovered {
+ if err := checkClosed(c); err != nil {
+ t.Error(err)
}
- case <-time.After(timeout):
- t.Errorf("(*Conn).eventChan should be closed after (*Conn),Close(), but is not and was blocking for %v", timeout)
}
rlm.checkTesting(t)