Skip to content
This repository was archived by the owner on Jul 18, 2025. It is now read-only.

Commit 3c28884

Browse files
committed
Reduce libchan interface in favor using Pipe for nesting
Signed-off-by: Derek McGowan <derek@mcgstyle.net> (github: dmcgowan)
1 parent 1f39afd commit 3c28884

7 files changed

Lines changed: 17 additions & 171 deletions

File tree

copy_test.go

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -28,17 +28,14 @@ func TestChannelProxy(t *testing.T) {
2828
}
2929
client := func(t *testing.T, sender Sender) {
3030
for i, m := range messages {
31-
nestedReceiver, remoteSender, err := sender.CreateNestedReceiver()
32-
if err != nil {
33-
t.Fatalf("Error creating nested receiver: %s", err)
34-
}
31+
nestedReceiver, remoteSender := Pipe()
3532

3633
message := &ProxiedMessage{
3734
Message: m,
3835
Ret: remoteSender,
3936
}
4037

41-
err = sender.Send(message)
38+
err := sender.Send(message)
4239
if err != nil {
4340
t.Fatalf("Error sending message: %s", err)
4441
}
@@ -167,10 +164,6 @@ func SpawnProxyTest(t *testing.T, client SendTestRoutine, server ReceiveTestRout
167164
go func() {
168165
defer close(endServer)
169166
server(t, receiver2)
170-
err := receiver2.Close()
171-
if err != nil {
172-
t.Errorf("Error closing receiver: %s", err)
173-
}
174167
}()
175168

176169
timeout := time.After(RoutineTimeout)

inmem_test.go

Lines changed: 6 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,10 @@ type InMemMessage struct {
1919

2020
func TestInmemRetPipe(t *testing.T) {
2121
client := func(t *testing.T, w Sender) {
22-
ret, retPipe, err := w.CreateNestedReceiver()
23-
if err != nil {
24-
t.Fatal(err)
25-
}
22+
ret, retPipe := Pipe()
2623
message := &InMemMessage{Data: "hello", Ret: retPipe}
2724

28-
err = w.Send(message)
25+
err := w.Send(message)
2926
if err != nil {
3027
t.Fatal(err)
3128
}
@@ -85,12 +82,9 @@ func TestSimpleSend(t *testing.T) {
8582

8683
func TestSendReply(t *testing.T) {
8784
client := func(t *testing.T, w Sender) {
88-
ret, retPipe, err := w.CreateNestedReceiver()
89-
if err != nil {
90-
t.Fatal(err)
91-
}
85+
ret, retPipe := Pipe()
9286
message := &InMemMessage{Data: "this is the request", Ret: retPipe}
93-
err = w.Send(message)
87+
err := w.Send(message)
9488
if err != nil {
9589
t.Fatal(err)
9690
}
@@ -181,14 +175,8 @@ type SimpleMessage struct {
181175

182176
func TestComplexMessage(t *testing.T) {
183177
client := func(t *testing.T, w Sender) {
184-
send, remoteRecv, err := w.CreateNestedSender()
185-
if err != nil {
186-
t.Fatalf("Error creating sender: %s", err)
187-
}
188-
recv, remoteSend, err := w.CreateNestedReceiver()
189-
if err != nil {
190-
t.Fatalf("Error creating sender: %s", err)
191-
}
178+
remoteRecv, send := Pipe()
179+
recv, remoteSend := Pipe()
192180
bs, bsRemote := net.Pipe()
193181

194182
m1 := &ComplexMessage{
@@ -350,10 +338,6 @@ func SpawnPipeTestRoutines(t *testing.T, s SendTestRoutine, r ReceiveTestRoutine
350338
go func() {
351339
defer close(end2)
352340
r(t, receiver)
353-
err := receiver.Close()
354-
if err != nil {
355-
t.Fatalf("Error closing receiver: %s", err)
356-
}
357341
}()
358342

359343
timeout := time.After(RoutineTimeout)

libchan.go

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -22,16 +22,6 @@ type Sender interface {
2222

2323
// Close closes the channel.
2424
Close() error
25-
26-
// CreatePipeReceiver creates a receive-only pipe. The sender
27-
// should be sent across the channel, any call to send directly
28-
// will throw an error on any channel on a transport.
29-
CreateNestedReceiver() (Receiver, Sender, error)
30-
31-
// CreateNestedSender creates a send-only pipe. The receiver
32-
// should be sent across the channel, any call to receive directly
33-
// will throw an error on any channel on a transport.
34-
CreateNestedSender() (Sender, Receiver, error)
3525
}
3626

3727
// Receiver is a channel which can receive messages of any
@@ -46,9 +36,4 @@ type Receiver interface {
4636
// the receive object is incompatible, Receiver will
4737
// throw an error.
4838
Receive(message interface{}) error
49-
50-
// Close closes the channel. Closing does not keep the remote
51-
// sender from sending messages. Normally a receiver can be
52-
// automatically closed through receiving an EOF.
53-
Close() error
5439
}

spdy/pipe.go

Lines changed: 1 addition & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ type pipeReceiver struct {
1717
receiver libchan.Receiver
1818
}
1919

20-
// Pipe creates a channel pipe using an in memory transport.
20+
// Pipe creates a top-level channel pipe using an in memory transport.
2121
func Pipe() (libchan.Sender, libchan.Receiver, error) {
2222
c1, c2 := net.Pipe()
2323

@@ -72,22 +72,6 @@ func (p *pipeSender) CreateByteStream() (io.ReadWriteCloser, error) {
7272
return p.session.createByteStream()
7373
}
7474

75-
func (p *pipeSender) CreateNestedReceiver() (libchan.Receiver, libchan.Sender, error) {
76-
return p.sender.CreateNestedReceiver()
77-
}
78-
79-
func (p *pipeSender) CreateNestedSender() (libchan.Sender, libchan.Receiver, error) {
80-
return p.sender.CreateNestedSender()
81-
}
82-
8375
func (p *pipeReceiver) Receive(message interface{}) error {
8476
return p.receiver.Receive(message)
8577
}
86-
87-
func (p *pipeReceiver) Close() error {
88-
err := p.receiver.Close()
89-
if err != nil {
90-
return err
91-
}
92-
return p.session.Close()
93-
}

spdy/pipe_test.go

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,7 @@ func TestSendFirstPipe(t *testing.T) {
2525
client := func(t *testing.T, sender libchan.Sender) {
2626
bs, bsRemote := net.Pipe()
2727

28-
nestedReceiver, remoteSender, err := sender.CreateNestedReceiver()
29-
if err != nil {
30-
t.Fatalf("Error creating nested receiver: %s", err)
31-
}
28+
nestedReceiver, remoteSender := libchan.Pipe()
3229

3330
m1 := &PipeMessage{
3431
Message: message1,
@@ -63,11 +60,6 @@ func TestSendFirstPipe(t *testing.T) {
6360
if string(readData) != message4 {
6461
t.Fatalf("Unexpected message\n\tExpected: %s\n\tActual: %s", message4, string(readData))
6562
}
66-
67-
closeErr := nestedReceiver.Close()
68-
if closeErr != nil {
69-
t.Fatalf("Error closing nested receiver: %s", closeErr)
70-
}
7163
}
7264
server := func(t *testing.T, receiver libchan.Receiver) {
7365
m1 := &PipeMessage{}
@@ -132,10 +124,6 @@ func SpawnPipeTest(t *testing.T, client PipeSenderRoutine, server PipeReceiverRo
132124
go func() {
133125
defer close(endServer)
134126
server(t, receiver)
135-
err := receiver.Close()
136-
if err != nil {
137-
t.Fatalf("Error closing receiver: %s", err)
138-
}
139127
}()
140128

141129
timeout := time.After(ClientServerTimeout)

spdy/proxy_test.go

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -30,17 +30,14 @@ func TestChannelProxy(t *testing.T) {
3030
}
3131
client := func(t *testing.T, sender libchan.Sender) {
3232
for i, m := range messages {
33-
nestedReceiver, remoteSender, err := sender.CreateNestedReceiver()
34-
if err != nil {
35-
t.Fatalf("Error creating nested receiver: %s", err)
36-
}
33+
nestedReceiver, remoteSender := libchan.Pipe()
3734

3835
message := &ProxiedMessage{
3936
Message: m,
4037
Ret: remoteSender,
4138
}
4239

43-
err = sender.Send(message)
40+
err := sender.Send(message)
4441
if err != nil {
4542
t.Fatalf("Error sending message: %s", err)
4643
}
@@ -173,10 +170,6 @@ func SpawnProxyTest(t *testing.T, client PipeSenderRoutine, server PipeReceiverR
173170
go func() {
174171
defer close(endServer)
175172
server(t, receiver2)
176-
err := receiver2.Close()
177-
if err != nil {
178-
t.Errorf("Error closing receiver: %s", err)
179-
}
180173
}()
181174

182175
timeout := time.After(ClientServerTimeout)

spdy/session_test.go

Lines changed: 5 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -23,15 +23,8 @@ type SimpleMessage struct {
2323

2424
func TestChannelEncoding(t *testing.T) {
2525
client := func(t *testing.T, sender libchan.Sender, s *Transport) {
26-
recv, s1, err1 := sender.CreateNestedReceiver()
27-
if err1 != nil {
28-
t.Fatalf("Error creating receive channel: %s", err1)
29-
}
30-
31-
send, r1, err2 := sender.CreateNestedSender()
32-
if err2 != nil {
33-
t.Fatalf("Error creating send channel: %s", err2)
34-
}
26+
recv, s1 := libchan.Pipe()
27+
r1, send := libchan.Pipe()
3528

3629
m1 := &InOutMessage{
3730
Message: "WithInOut",
@@ -62,11 +55,6 @@ func TestChannelEncoding(t *testing.T) {
6255
if closeErr != nil {
6356
t.Fatalf("Error closing s1: %s", closeErr)
6457
}
65-
66-
closeErr = recv.Close()
67-
if closeErr != nil {
68-
t.Fatalf("Error closing s1: %s", closeErr)
69-
}
7058
}
7159
server := func(t *testing.T, receiver libchan.Receiver, s *Transport) {
7260
m1 := &InOutMessage{}
@@ -102,12 +90,7 @@ func TestChannelEncoding(t *testing.T) {
10290
t.Fatalf("Error sending SimpleMessage: %s", sendErr)
10391
}
10492

105-
closeErr := m1.Recv.Close()
106-
if closeErr != nil {
107-
t.Fatalf("Error closing recv connection: %s", closeErr)
108-
}
109-
110-
closeErr = m1.Send.Close()
93+
closeErr := m1.Send.Close()
11194
if closeErr != nil {
11295
t.Fatalf("Error closing send connection: %s", closeErr)
11396
}
@@ -122,10 +105,7 @@ type AbstractionMessage struct {
122105

123106
func TestChannelAbstraction(t *testing.T) {
124107
client := func(t *testing.T, sender libchan.Sender, s *Transport) {
125-
send, recv, channelErr := sender.CreateNestedSender()
126-
if channelErr != nil {
127-
t.Fatalf("Error creating sub channel: %s", channelErr)
128-
}
108+
recv, send := libchan.Pipe()
129109

130110
m1 := &AbstractionMessage{
131111
Message: "irrelevant content",
@@ -152,61 +132,6 @@ func TestChannelAbstraction(t *testing.T) {
152132
if expected := "irrelevant content"; m1.Message != expected {
153133
t.Fatalf("Unexpected message value:\n\tExpected: %s\n\tActual: %s", expected, m1.Message)
154134
}
155-
156-
closeErr := m1.Channel.(libchan.Receiver).Close()
157-
if closeErr != nil {
158-
t.Fatalf("Error closing channel: %s", closeErr)
159-
}
160-
}
161-
SpawnClientServerTest(t, "localhost:12943", ClientSendWrapper(client), ServerReceiveWrapper(server))
162-
}
163-
164-
type MessageWithInput struct {
165-
Message string
166-
Input libchan.Receiver
167-
}
168-
169-
func TestBadDirection(t *testing.T) {
170-
client := func(t *testing.T, sender libchan.Sender, s *Transport) {
171-
send, recv, channelErr := sender.CreateNestedSender()
172-
if channelErr != nil {
173-
t.Fatalf("Error creating sub channel: %s", channelErr)
174-
}
175-
176-
m1 := &MessageWithInput{
177-
Message: "contentless",
178-
Input: recv,
179-
}
180-
181-
sendErr := sender.Send(m1)
182-
if sendErr != nil {
183-
t.Fatalf("Error sending channel: %s", sendErr)
184-
}
185-
186-
m2 := &SimpleMessage{"Supposedly input"}
187-
commErr := recv.Receive(m2)
188-
if commErr == nil {
189-
t.Fatalf("No error receiving on sender")
190-
} else if commErr != ErrWrongDirection {
191-
t.Fatalf("Error receiving message: %s", commErr)
192-
}
193-
194-
closeErr := send.Close()
195-
if closeErr != nil {
196-
t.Fatalf("Error closing sender: %s", closeErr)
197-
}
198-
}
199-
server := func(t *testing.T, receiver libchan.Receiver, s *Transport) {
200-
m1 := &MessageWithInput{}
201-
recvErr := receiver.Receive(m1)
202-
if recvErr != nil {
203-
t.Fatalf("Error receiving message: %s", recvErr)
204-
}
205-
206-
closeErr := m1.Input.Close()
207-
if closeErr != nil {
208-
t.Fatalf("Error closing channel: %s", closeErr)
209-
}
210135
}
211136
SpawnClientServerTest(t, "localhost:12943", ClientSendWrapper(client), ServerReceiveWrapper(server))
212137
}
@@ -222,7 +147,6 @@ func TestByteStream(t *testing.T) {
222147
if bsErr != nil {
223148
t.Fatalf("Error creating byte stream: %s", bsErr)
224149
}
225-
//bs, bsRemote := net.Pipe()
226150

227151
m1 := &MessageWithByteStream{
228152
Message: "with a byte stream",
@@ -410,12 +334,7 @@ func ServerReceiveWrapper(f func(t *testing.T, c libchan.Receiver, s *Transport)
410334

411335
f(t, receiver, session)
412336

413-
closeErr := receiver.Close()
414-
if closeErr != nil {
415-
t.Fatalf("Error closing receiver: %s", closeErr)
416-
}
417-
418-
closeErr = session.Close()
337+
closeErr := session.Close()
419338
if closeErr != nil {
420339
t.Fatalf("Error closing connection: %s", closeErr)
421340
}

0 commit comments

Comments
 (0)