From 5bce07a79cb721fe3b32028d210f4ecc8a36919e Mon Sep 17 00:00:00 2001 From: Sean DuBois Date: Fri, 31 Jan 2020 16:00:42 -0800 Subject: [PATCH] Add TestAssocAbort Add test to assert that sending an abort takes the assocation to closed. --- association_test.go | 34 ++++++++++++++++++++++++++++++++++ chunk_abort.go | 12 +++++++++++- 2 files changed, 45 insertions(+), 1 deletion(-) diff --git a/association_test.go b/association_test.go index c0a18d56..465aa5c0 100644 --- a/association_test.go +++ b/association_test.go @@ -2186,6 +2186,40 @@ func TestAssocReset(t *testing.T) { }) } +func TestAssocAbort(t *testing.T) { + const si uint16 = 1 + const msg = "ABC" + br := test.NewBridge() + + a0, a1, err := createNewAssociationPair(br, ackModeNoDelay, 0) + assert.NoError(t, err) + + abort := &chunkAbort{ + errorCauses: []errorCause{&errorCauseProtocolViolation{ + errorCauseHeader: errorCauseHeader{code: protocolViolation}, + }}, + } + packet, err := a0.createPacket([]chunk{abort}).marshal() + assert.NoError(t, err) + + _, _, err = establishSessionPair(br, a0, a1, si) + assert.NoError(t, err) + + // Both associations are established + assert.Equal(t, established, a0.getState()) + assert.Equal(t, established, a1.getState()) + + _, err = a0.netConn.Write(packet) + assert.NoError(t, err) + br.Process() + + // The receiving association should be closed because it got an ABORT + assert.Equal(t, established, a0.getState()) + assert.Equal(t, closed, a1.getState()) + + closeAssociationPair(br, a0, a1) +} + type fakeEchoConn struct { echo chan []byte done chan struct{} diff --git a/chunk_abort.go b/chunk_abort.go index aef1a8e4..caae026d 100644 --- a/chunk_abort.go +++ b/chunk_abort.go @@ -58,7 +58,17 @@ func (a *chunkAbort) unmarshal(raw []byte) error { return nil } func (a *chunkAbort) marshal() ([]byte, error) { - return nil, errors.Errorf("Unimplemented") + a.chunkHeader.typ = ctAbort + a.flags = 0x00 + a.raw = []byte{} + for _, ec := range a.errorCauses { + raw, err := ec.marshal() + if err != nil { + return nil, err + } + a.raw = append(a.raw, raw...) + } + return a.chunkHeader.marshal() } func (a *chunkAbort) check() (abort bool, err error) {