diff --git a/message/message1_1/message.go b/message/message1_1/message.go deleted file mode 100644 index c52471f..0000000 --- a/message/message1_1/message.go +++ /dev/null @@ -1,196 +0,0 @@ -package message1_1 - -import ( - "bytes" - "io" - - "github.com/ipfs/go-cid" - "github.com/ipld/go-ipld-prime" - "github.com/ipld/go-ipld-prime/codec/dagcbor" - "github.com/ipld/go-ipld-prime/datamodel" - cborgen "github.com/whyrusleeping/cbor-gen" - xerrors "golang.org/x/xerrors" - - datatransfer "github.com/filecoin-project/go-data-transfer/v2" - "github.com/filecoin-project/go-data-transfer/v2/encoding" - "github.com/filecoin-project/go-data-transfer/v2/message/types" -) - -// NewRequest generates a new request for the data transfer protocol -func NewRequest(id datatransfer.TransferID, isRestart bool, isPull bool, vtype datatransfer.TypeIdentifier, voucher encoding.Encodable, baseCid cid.Cid, selector ipld.Node) (datatransfer.Request, error) { - vbytes, err := encoding.Encode(voucher) - if err != nil { - return nil, xerrors.Errorf("Creating request: %w", err) - } - if baseCid == cid.Undef { - return nil, xerrors.Errorf("base CID must be defined") - } - selBytes, err := encoding.Encode(selector) - if err != nil { - return nil, xerrors.Errorf("Error encoding selector") - } - - var typ uint64 - if isRestart { - typ = uint64(types.RestartMessage) - } else { - typ = uint64(types.NewMessage) - } - - return &TransferRequest1_1{ - Type: typ, - Pull: isPull, - Vouch: &cborgen.Deferred{Raw: vbytes}, - Stor: &cborgen.Deferred{Raw: selBytes}, - BCid: &baseCid, - VTyp: vtype, - XferID: uint64(id), - }, nil -} - -// RestartExistingChannelRequest creates a request to ask the other side to restart an existing channel -func RestartExistingChannelRequest(channelId datatransfer.ChannelID) datatransfer.Request { - - return &TransferRequest1_1{Type: uint64(types.RestartExistingChannelRequestMessage), - RestartChannel: channelId} -} - -// CancelRequest request generates a request to cancel an in progress request -func CancelRequest(id datatransfer.TransferID) datatransfer.Request { - return &TransferRequest1_1{ - Type: uint64(types.CancelMessage), - XferID: uint64(id), - } -} - -// UpdateRequest generates a new request update -func UpdateRequest(id datatransfer.TransferID, isPaused bool) datatransfer.Request { - return &TransferRequest1_1{ - Type: uint64(types.UpdateMessage), - Paus: isPaused, - XferID: uint64(id), - } -} - -// VoucherRequest generates a new request for the data transfer protocol -func VoucherRequest(id datatransfer.TransferID, vtype datatransfer.TypeIdentifier, voucher encoding.Encodable) (datatransfer.Request, error) { - vbytes, err := encoding.Encode(voucher) - if err != nil { - return nil, xerrors.Errorf("Creating request: %w", err) - } - return &TransferRequest1_1{ - Type: uint64(types.VoucherMessage), - Vouch: &cborgen.Deferred{Raw: vbytes}, - VTyp: vtype, - XferID: uint64(id), - }, nil -} - -// RestartResponse builds a new Data Transfer response -func RestartResponse(id datatransfer.TransferID, accepted bool, isPaused bool, voucherResultType datatransfer.TypeIdentifier, voucherResult encoding.Encodable) (datatransfer.Response, error) { - vbytes, err := encoding.Encode(voucherResult) - if err != nil { - return nil, xerrors.Errorf("Creating request: %w", err) - } - return &TransferResponse1_1{ - Acpt: accepted, - Type: uint64(types.RestartMessage), - Paus: isPaused, - XferID: uint64(id), - VTyp: voucherResultType, - VRes: &cborgen.Deferred{Raw: vbytes}, - }, nil -} - -// NewResponse builds a new Data Transfer response -func NewResponse(id datatransfer.TransferID, accepted bool, isPaused bool, voucherResultType datatransfer.TypeIdentifier, voucherResult encoding.Encodable) (datatransfer.Response, error) { - vbytes, err := encoding.Encode(voucherResult) - if err != nil { - return nil, xerrors.Errorf("Creating request: %w", err) - } - return &TransferResponse1_1{ - Acpt: accepted, - Type: uint64(types.NewMessage), - Paus: isPaused, - XferID: uint64(id), - VTyp: voucherResultType, - VRes: &cborgen.Deferred{Raw: vbytes}, - }, nil -} - -// VoucherResultResponse builds a new response for a voucher result -func VoucherResultResponse(id datatransfer.TransferID, accepted bool, isPaused bool, voucherResultType datatransfer.TypeIdentifier, voucherResult encoding.Encodable) (datatransfer.Response, error) { - vbytes, err := encoding.Encode(voucherResult) - if err != nil { - return nil, xerrors.Errorf("Creating request: %w", err) - } - return &TransferResponse1_1{ - Acpt: accepted, - Type: uint64(types.VoucherResultMessage), - Paus: isPaused, - XferID: uint64(id), - VTyp: voucherResultType, - VRes: &cborgen.Deferred{Raw: vbytes}, - }, nil -} - -// UpdateResponse returns a new update response -func UpdateResponse(id datatransfer.TransferID, isPaused bool) datatransfer.Response { - return &TransferResponse1_1{ - Type: uint64(types.UpdateMessage), - Paus: isPaused, - XferID: uint64(id), - } -} - -// CancelResponse makes a new cancel response message -func CancelResponse(id datatransfer.TransferID) datatransfer.Response { - return &TransferResponse1_1{ - Type: uint64(types.CancelMessage), - XferID: uint64(id), - } -} - -// CompleteResponse returns a new complete response message -func CompleteResponse(id datatransfer.TransferID, isAccepted bool, isPaused bool, voucherResultType datatransfer.TypeIdentifier, voucherResult encoding.Encodable) (datatransfer.Response, error) { - vbytes, err := encoding.Encode(voucherResult) - if err != nil { - return nil, xerrors.Errorf("Creating request: %w", err) - } - return &TransferResponse1_1{ - Type: uint64(types.CompleteMessage), - Acpt: isAccepted, - Paus: isPaused, - VTyp: voucherResultType, - VRes: &cborgen.Deferred{Raw: vbytes}, - XferID: uint64(id), - }, nil -} - -// FromNet can read a network stream to deserialize a GraphSyncMessage -func FromNet(r io.Reader) (datatransfer.Message, error) { - tresp := TransferMessage1_1{} - err := tresp.UnmarshalCBOR(r) - if err != nil { - return nil, err - } - - if (tresp.IsRequest() && tresp.Request == nil) || (!tresp.IsRequest() && tresp.Response == nil) { - return nil, xerrors.Errorf("invalid/malformed message") - } - - if tresp.IsRequest() { - return tresp.Request, nil - } - return tresp.Response, nil -} - -// FromNet can read a network stream to deserialize a GraphSyncMessage -func FromIPLD(nd datamodel.Node) (datatransfer.Message, error) { - buf := new(bytes.Buffer) - err := dagcbor.Encode(nd, buf) - if err != nil { - return nil, err - } - return FromNet(buf) -} diff --git a/message/message1_1/message_test.go b/message/message1_1/message_test.go deleted file mode 100644 index 3e69fa9..0000000 --- a/message/message1_1/message_test.go +++ /dev/null @@ -1,549 +0,0 @@ -package message1_1_test - -import ( - "bytes" - "encoding/hex" - "fmt" - "math/rand" - "testing" - - "github.com/ipfs/go-cid" - basicnode "github.com/ipld/go-ipld-prime/node/basic" - "github.com/ipld/go-ipld-prime/traversal/selector/builder" - "github.com/libp2p/go-libp2p-core/peer" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - - datatransfer "github.com/filecoin-project/go-data-transfer/v2" - "github.com/filecoin-project/go-data-transfer/v2/message/message1_1" - "github.com/filecoin-project/go-data-transfer/v2/testutil" -) - -func TestNewRequest(t *testing.T) { - baseCid := testutil.GenerateCids(1)[0] - selector := builder.NewSelectorSpecBuilder(basicnode.Prototype.Any).Matcher().Node() - isPull := true - id := datatransfer.TransferID(rand.Int31()) - voucher := testutil.NewFakeDTType() - request, err := message1_1.NewRequest(id, false, isPull, voucher.Type(), voucher, baseCid, selector) - require.NoError(t, err) - assert.Equal(t, id, request.TransferID()) - assert.False(t, request.IsCancel()) - assert.False(t, request.IsUpdate()) - assert.True(t, request.IsPull()) - assert.True(t, request.IsRequest()) - assert.Equal(t, baseCid.String(), request.BaseCid().String()) - testutil.AssertFakeDTVoucher(t, request, voucher) - receivedSelector, err := request.Selector() - require.NoError(t, err) - require.Equal(t, selector, receivedSelector) - // Sanity check to make sure we can cast to datatransfer.Message - msg, ok := request.(datatransfer.Message) - require.True(t, ok) - - assert.True(t, msg.IsRequest()) - assert.Equal(t, request.TransferID(), msg.TransferID()) - assert.False(t, msg.IsRestart()) - assert.True(t, msg.IsNew()) -} - -func TestRestartRequest(t *testing.T) { - baseCid := testutil.GenerateCids(1)[0] - selector := builder.NewSelectorSpecBuilder(basicnode.Prototype.Any).Matcher().Node() - isPull := true - id := datatransfer.TransferID(rand.Int31()) - voucher := testutil.NewFakeDTType() - request, err := message1_1.NewRequest(id, true, isPull, voucher.Type(), voucher, baseCid, selector) - require.NoError(t, err) - assert.Equal(t, id, request.TransferID()) - assert.False(t, request.IsCancel()) - assert.False(t, request.IsUpdate()) - assert.True(t, request.IsPull()) - assert.True(t, request.IsRequest()) - assert.Equal(t, baseCid.String(), request.BaseCid().String()) - testutil.AssertFakeDTVoucher(t, request, voucher) - receivedSelector, err := request.Selector() - require.NoError(t, err) - require.Equal(t, selector, receivedSelector) - // Sanity check to make sure we can cast to datatransfer.Message - msg, ok := request.(datatransfer.Message) - require.True(t, ok) - - assert.True(t, msg.IsRequest()) - assert.Equal(t, request.TransferID(), msg.TransferID()) - assert.True(t, msg.IsRestart()) - assert.False(t, msg.IsNew()) -} - -func TestRestartExistingChannelRequest(t *testing.T) { - t.Run("round-trip", func(t *testing.T) { - peers := testutil.GeneratePeers(2) - tid := uint64(1) - chid := datatransfer.ChannelID{Initiator: peers[0], - Responder: peers[1], ID: datatransfer.TransferID(tid)} - req := message1_1.RestartExistingChannelRequest(chid) - - wbuf := new(bytes.Buffer) - require.NoError(t, req.ToNet(wbuf)) - - desMsg, err := message1_1.FromNet(wbuf) - require.NoError(t, err) - req, ok := (desMsg).(datatransfer.Request) - require.True(t, ok) - require.True(t, req.IsRestartExistingChannelRequest()) - achid, err := req.RestartChannelId() - require.NoError(t, err) - require.Equal(t, chid, achid) - }) - t.Run("ipld-prime compat", func(t *testing.T) { - msg, _ := hex.DecodeString("a36449735271f56752657175657374aa6442436964f66454797065076450617573f46450617274f46450756c6cf46453746f72f665566f756368f664565479706066586665724944006e526573746172744368616e6e656c83613161320168526573706f6e7365f6") - desMsg, err := message1_1.FromNet(bytes.NewReader(msg)) - require.NoError(t, err) - req, ok := (desMsg).(datatransfer.Request) - require.True(t, ok) - require.True(t, req.IsRestartExistingChannelRequest()) - achid, err := req.RestartChannelId() - require.NoError(t, err) - tid := uint64(1) - chid := datatransfer.ChannelID{Initiator: peer.ID("1"), - Responder: peer.ID("2"), ID: datatransfer.TransferID(tid)} - require.Equal(t, chid, achid) - }) -} - -func TestTransferRequest_MarshalCBOR(t *testing.T) { - // sanity check MarshalCBOR does its thing w/o error - req, err := NewTestTransferRequest() - require.NoError(t, err) - wbuf := new(bytes.Buffer) - require.NoError(t, req.MarshalCBOR(wbuf)) - assert.Greater(t, wbuf.Len(), 0) -} -func TestTransferRequest_UnmarshalCBOR(t *testing.T) { - t.Run("round-trip", func(t *testing.T) { - req, err := NewTestTransferRequest() - require.NoError(t, err) - wbuf := new(bytes.Buffer) - // use ToNet / message1_1.FromNet - require.NoError(t, req.ToNet(wbuf)) - - desMsg, err := message1_1.FromNet(wbuf) - require.NoError(t, err) - - // Verify round-trip - assert.Equal(t, req.TransferID(), desMsg.TransferID()) - assert.Equal(t, req.IsRequest(), desMsg.IsRequest()) - - desReq := desMsg.(datatransfer.Request) - assert.Equal(t, req.IsPull(), desReq.IsPull()) - assert.Equal(t, req.IsCancel(), desReq.IsCancel()) - assert.Equal(t, req.BaseCid(), desReq.BaseCid()) - testutil.AssertEqualFakeDTVoucher(t, &req, desReq) - testutil.AssertEqualSelector(t, &req, desReq) - }) - t.Run("ipld-prime compat", func(t *testing.T) { - req, err := NewTestTransferRequest() - require.NoError(t, err) - - msg, _ := hex.DecodeString("a36449735271f56752657175657374aa6442436964d82a58230012204bf5122f344554c53bde2ebb8cd2b7e3d1600ad631c385a5d7cce23c7785459a6450617274f46450617573f46450756c6cf46453746f72a1612ea064547970650064565479706a46616b6544545479706565566f756368817864f55ff8f12508b63ef2bfeca7557ae90df6311a5ec1631b4a1fa843310bd9c3a710eaace5a1bdd72ad0bfe049771c11e756338bd93865e645f1adec9b9c99ef407fbd4fc6859e7904c5ad7dc9bd10a5cc16973d5b28ec1a6dd43d9f82f9f18c3d03418e35665866657249441a4d6582216e526573746172744368616e6e656c8360600068526573706f6e7365f6") - desMsg, err := message1_1.FromNet(bytes.NewReader(msg)) - require.NoError(t, err) - - // Verify round-trip - assert.Equal(t, datatransfer.TransferID(1298498081), desMsg.TransferID()) - assert.Equal(t, req.IsRequest(), desMsg.IsRequest()) - - desReq := desMsg.(datatransfer.Request) - assert.Equal(t, req.IsPull(), desReq.IsPull()) - assert.Equal(t, req.IsCancel(), desReq.IsCancel()) - c, _ := cid.Parse("QmTTA2daxGqo5denp6SwLzzkLJm3fuisYEi9CoWsuHpzfb") - assert.Equal(t, c, desReq.BaseCid()) - testutil.AssertEqualFakeDTVoucher(t, &req, desReq) - testutil.AssertEqualSelector(t, &req, desReq) - }) -} - -func TestResponses(t *testing.T) { - id := datatransfer.TransferID(rand.Int31()) - voucherResult := testutil.NewFakeDTType() - response, err := message1_1.NewResponse(id, false, true, voucherResult.Type(), voucherResult) // not accepted - require.NoError(t, err) - assert.Equal(t, response.TransferID(), id) - assert.False(t, response.Accepted()) - assert.True(t, response.IsNew()) - assert.False(t, response.IsUpdate()) - assert.True(t, response.IsPaused()) - assert.False(t, response.IsRequest()) - testutil.AssertFakeDTVoucherResult(t, response, voucherResult) - // Sanity check to make sure we can cast to datatransfer.Message - msg, ok := response.(datatransfer.Message) - require.True(t, ok) - - assert.False(t, msg.IsRequest()) - assert.True(t, msg.IsNew()) - assert.False(t, msg.IsUpdate()) - assert.True(t, msg.IsPaused()) - assert.Equal(t, response.TransferID(), msg.TransferID()) -} - -func TestTransferResponse_MarshalCBOR(t *testing.T) { - id := datatransfer.TransferID(rand.Int31()) - voucherResult := testutil.NewFakeDTType() - response, err := message1_1.NewResponse(id, true, false, voucherResult.Type(), voucherResult) // accepted - require.NoError(t, err) - - // sanity check that we can marshal data - wbuf := new(bytes.Buffer) - require.NoError(t, response.ToNet(wbuf)) - assert.Greater(t, wbuf.Len(), 0) -} - -func TestTransferResponse_UnmarshalCBOR(t *testing.T) { - t.Run("round-trip", func(t *testing.T) { - id := datatransfer.TransferID(rand.Int31()) - voucherResult := testutil.NewFakeDTType() - response, err := message1_1.NewResponse(id, true, false, voucherResult.Type(), voucherResult) // accepted - require.NoError(t, err) - - wbuf := new(bytes.Buffer) - require.NoError(t, response.ToNet(wbuf)) - - // verify round trip - desMsg, err := message1_1.FromNet(wbuf) - require.NoError(t, err) - assert.False(t, desMsg.IsRequest()) - assert.True(t, desMsg.IsNew()) - assert.False(t, desMsg.IsUpdate()) - assert.False(t, desMsg.IsPaused()) - assert.Equal(t, id, desMsg.TransferID()) - - desResp, ok := desMsg.(datatransfer.Response) - require.True(t, ok) - assert.True(t, desResp.Accepted()) - assert.True(t, desResp.IsNew()) - assert.False(t, desResp.IsUpdate()) - assert.False(t, desMsg.IsPaused()) - testutil.AssertFakeDTVoucherResult(t, desResp, voucherResult) - }) - t.Run("ipld-prime compat", func(t *testing.T) { - voucherResult := testutil.NewFakeDTType() - voucherResult.Data = "\xf5_\xf8\xf1%\b\xb6>\xf2\xbf\xec\xa7Uz\xe9\r\xf61\x1a^\xc1c\x1bJ\x1f\xa8C1\v\xd9ç\x10\xea\xac塽\xd7*п\xe0Iw\x1c\x11\xe7V3\x8b\xd98e\xe6E\xf1\xad웜\x99\xef@\u007f\xbdOƅ\x9ey\x04ŭ}ɽ\x10\xa5\xcc\x16\x97=[(\xec\x1am\xd4=\x9f\x82\xf9\xf1\x8c=\x03A\x8e5" - - msg, _ := hex.DecodeString("a36449735271f46752657175657374f668526573706f6e7365a66441637074f56450617573f46454797065006456526573817864f55ff8f12508b63ef2bfeca7557ae90df6311a5ec1631b4a1fa843310bd9c3a710eaace5a1bdd72ad0bfe049771c11e756338bd93865e645f1adec9b9c99ef407fbd4fc6859e7904c5ad7dc9bd10a5cc16973d5b28ec1a6dd43d9f82f9f18c3d03418e3564565479706a46616b65445454797065665866657249441a4d658221") - desMsg, err := message1_1.FromNet(bytes.NewReader(msg)) - require.NoError(t, err) - assert.False(t, desMsg.IsRequest()) - assert.True(t, desMsg.IsNew()) - assert.False(t, desMsg.IsUpdate()) - assert.False(t, desMsg.IsPaused()) - assert.Equal(t, datatransfer.TransferID(1298498081), desMsg.TransferID()) - - desResp, ok := desMsg.(datatransfer.Response) - require.True(t, ok) - assert.True(t, desResp.Accepted()) - assert.True(t, desResp.IsNew()) - assert.False(t, desResp.IsUpdate()) - assert.False(t, desMsg.IsPaused()) - testutil.AssertFakeDTVoucherResult(t, desResp, voucherResult) - }) -} - -func TestRequestCancel(t *testing.T) { - t.Run("round-trip", func(t *testing.T) { - id := datatransfer.TransferID(rand.Int31()) - req := message1_1.CancelRequest(id) - require.Equal(t, req.TransferID(), id) - require.True(t, req.IsRequest()) - require.True(t, req.IsCancel()) - require.False(t, req.IsUpdate()) - - wbuf := new(bytes.Buffer) - require.NoError(t, req.ToNet(wbuf)) - - deserialized, err := message1_1.FromNet(wbuf) - require.NoError(t, err) - - deserializedRequest, ok := deserialized.(datatransfer.Request) - require.True(t, ok) - require.Equal(t, deserializedRequest.TransferID(), req.TransferID()) - require.Equal(t, deserializedRequest.IsCancel(), req.IsCancel()) - require.Equal(t, deserializedRequest.IsRequest(), req.IsRequest()) - require.Equal(t, deserializedRequest.IsUpdate(), req.IsUpdate()) - }) - t.Run("ipld-prime compat", func(t *testing.T) { - id := datatransfer.TransferID(1298498081) - req := message1_1.CancelRequest(id) - require.Equal(t, req.TransferID(), id) - require.True(t, req.IsRequest()) - require.True(t, req.IsCancel()) - require.False(t, req.IsUpdate()) - - msg, _ := hex.DecodeString("a36449735271f56752657175657374aa6442436964f66450617274f46450617573f46450756c6cf46453746f72f664547970650264565479706065566f756368f6665866657249441a4d6582216e526573746172744368616e6e656c8360600068526573706f6e7365f6") - deserialized, err := message1_1.FromNet(bytes.NewReader(msg)) - require.NoError(t, err) - - deserializedRequest, ok := deserialized.(datatransfer.Request) - require.True(t, ok) - require.Equal(t, deserializedRequest.TransferID(), req.TransferID()) - require.Equal(t, deserializedRequest.IsCancel(), req.IsCancel()) - require.Equal(t, deserializedRequest.IsRequest(), req.IsRequest()) - require.Equal(t, deserializedRequest.IsUpdate(), req.IsUpdate()) - }) -} - -func TestRequestUpdate(t *testing.T) { - t.Run("round-trip", func(t *testing.T) { - id := datatransfer.TransferID(rand.Int31()) - req := message1_1.UpdateRequest(id, true) - require.Equal(t, req.TransferID(), id) - require.True(t, req.IsRequest()) - require.False(t, req.IsCancel()) - require.True(t, req.IsUpdate()) - require.True(t, req.IsPaused()) - - wbuf := new(bytes.Buffer) - require.NoError(t, req.ToNet(wbuf)) - - deserialized, err := message1_1.FromNet(wbuf) - require.NoError(t, err) - - deserializedRequest, ok := deserialized.(datatransfer.Request) - require.True(t, ok) - require.Equal(t, deserializedRequest.TransferID(), req.TransferID()) - require.Equal(t, deserializedRequest.IsCancel(), req.IsCancel()) - require.Equal(t, deserializedRequest.IsRequest(), req.IsRequest()) - require.Equal(t, deserializedRequest.IsUpdate(), req.IsUpdate()) - require.Equal(t, deserializedRequest.IsPaused(), req.IsPaused()) - }) - t.Run("ipld-prime compat", func(t *testing.T) { - id := datatransfer.TransferID(1298498081) - req := message1_1.UpdateRequest(id, true) - - msg, _ := hex.DecodeString("a36449735271f56752657175657374aa6442436964f66450617274f46450617573f56450756c6cf46453746f72f664547970650164565479706065566f756368f6665866657249441a4d6582216e526573746172744368616e6e656c8360600068526573706f6e7365f6") - deserialized, err := message1_1.FromNet(bytes.NewReader(msg)) - require.NoError(t, err) - - deserializedRequest, ok := deserialized.(datatransfer.Request) - require.True(t, ok) - require.Equal(t, deserializedRequest.TransferID(), req.TransferID()) - require.Equal(t, deserializedRequest.IsCancel(), req.IsCancel()) - require.Equal(t, deserializedRequest.IsRequest(), req.IsRequest()) - require.Equal(t, deserializedRequest.IsUpdate(), req.IsUpdate()) - require.Equal(t, deserializedRequest.IsPaused(), req.IsPaused()) - }) -} - -func TestUpdateResponse(t *testing.T) { - id := datatransfer.TransferID(rand.Int31()) - response := message1_1.UpdateResponse(id, true) // not accepted - assert.Equal(t, response.TransferID(), id) - assert.False(t, response.Accepted()) - assert.False(t, response.IsNew()) - assert.True(t, response.IsUpdate()) - assert.True(t, response.IsPaused()) - assert.False(t, response.IsRequest()) - - // Sanity check to make sure we can cast to datatransfer.Message - msg, ok := response.(datatransfer.Message) - require.True(t, ok) - - assert.False(t, msg.IsRequest()) - assert.False(t, msg.IsNew()) - assert.True(t, msg.IsUpdate()) - assert.True(t, msg.IsPaused()) - assert.Equal(t, response.TransferID(), msg.TransferID()) -} - -func TestCancelResponse(t *testing.T) { - id := datatransfer.TransferID(rand.Int31()) - response := message1_1.CancelResponse(id) - assert.Equal(t, response.TransferID(), id) - assert.False(t, response.IsNew()) - assert.False(t, response.IsUpdate()) - assert.True(t, response.IsCancel()) - assert.False(t, response.IsRequest()) - // Sanity check to make sure we can cast to datatransfer.Message - msg, ok := response.(datatransfer.Message) - require.True(t, ok) - - assert.False(t, msg.IsRequest()) - assert.False(t, msg.IsNew()) - assert.False(t, msg.IsUpdate()) - assert.True(t, msg.IsCancel()) - assert.Equal(t, response.TransferID(), msg.TransferID()) -} - -func TestCompleteResponse(t *testing.T) { - id := datatransfer.TransferID(rand.Int31()) - response, err := message1_1.CompleteResponse(id, true, true, datatransfer.EmptyTypeIdentifier, nil) - require.NoError(t, err) - assert.Equal(t, response.TransferID(), id) - assert.False(t, response.IsNew()) - assert.False(t, response.IsUpdate()) - assert.True(t, response.IsPaused()) - assert.True(t, response.IsValidationResult()) - assert.True(t, response.EmptyVoucherResult()) - assert.True(t, response.IsComplete()) - assert.False(t, response.IsRequest()) - // Sanity check to make sure we can cast to datatransfer.Message - msg, ok := response.(datatransfer.Message) - require.True(t, ok) - - assert.False(t, msg.IsRequest()) - assert.False(t, msg.IsNew()) - assert.False(t, msg.IsUpdate()) - assert.Equal(t, response.TransferID(), msg.TransferID()) -} -func TestToNetFromNetEquivalency(t *testing.T) { - t.Run("round-trip", func(t *testing.T) { - baseCid := testutil.GenerateCids(1)[0] - selector := builder.NewSelectorSpecBuilder(basicnode.Prototype.Any).Matcher().Node() - isPull := false - id := datatransfer.TransferID(rand.Int31()) - accepted := false - voucher := testutil.NewFakeDTType() - voucherResult := testutil.NewFakeDTType() - request, err := message1_1.NewRequest(id, false, isPull, voucher.Type(), voucher, baseCid, selector) - require.NoError(t, err) - buf := new(bytes.Buffer) - err = request.ToNet(buf) - require.NoError(t, err) - require.Greater(t, buf.Len(), 0) - deserialized, err := message1_1.FromNet(buf) - require.NoError(t, err) - - deserializedRequest, ok := deserialized.(datatransfer.Request) - require.True(t, ok) - - require.Equal(t, deserializedRequest.TransferID(), request.TransferID()) - require.Equal(t, deserializedRequest.IsCancel(), request.IsCancel()) - require.Equal(t, deserializedRequest.IsPull(), request.IsPull()) - require.Equal(t, deserializedRequest.IsRequest(), request.IsRequest()) - require.Equal(t, deserializedRequest.BaseCid(), request.BaseCid()) - testutil.AssertEqualFakeDTVoucher(t, request, deserializedRequest) - testutil.AssertEqualSelector(t, request, deserializedRequest) - - response, err := message1_1.NewResponse(id, accepted, false, voucherResult.Type(), voucherResult) - require.NoError(t, err) - err = response.ToNet(buf) - require.NoError(t, err) - deserialized, err = message1_1.FromNet(buf) - require.NoError(t, err) - - deserializedResponse, ok := deserialized.(datatransfer.Response) - require.True(t, ok) - - require.Equal(t, deserializedResponse.TransferID(), response.TransferID()) - require.Equal(t, deserializedResponse.Accepted(), response.Accepted()) - require.Equal(t, deserializedResponse.IsRequest(), response.IsRequest()) - require.Equal(t, deserializedResponse.IsUpdate(), response.IsUpdate()) - require.Equal(t, deserializedResponse.IsPaused(), response.IsPaused()) - testutil.AssertEqualFakeDTVoucherResult(t, response, deserializedResponse) - - request = message1_1.CancelRequest(id) - err = request.ToNet(buf) - require.NoError(t, err) - deserialized, err = message1_1.FromNet(buf) - require.NoError(t, err) - - deserializedRequest, ok = deserialized.(datatransfer.Request) - require.True(t, ok) - - require.Equal(t, deserializedRequest.TransferID(), request.TransferID()) - require.Equal(t, deserializedRequest.IsCancel(), request.IsCancel()) - require.Equal(t, deserializedRequest.IsRequest(), request.IsRequest()) - }) - t.Run("ipld-prime compat", func(t *testing.T) { - baseCid := testutil.GenerateCids(1)[0] - selector := builder.NewSelectorSpecBuilder(basicnode.Prototype.Any).Matcher().Node() - isPull := false - id := datatransfer.TransferID(1298498081) - accepted := false - voucher := testutil.NewFakeDTType() - voucherResult := testutil.NewFakeDTType() - request, err := message1_1.NewRequest(id, false, isPull, voucher.Type(), voucher, baseCid, selector) - require.NoError(t, err) - buf := new(bytes.Buffer) - err = request.ToNet(buf) - require.NoError(t, err) - require.Greater(t, buf.Len(), 0) - msg, _ := hex.DecodeString("a36449735271f56752657175657374aa6442436964d82a58230012204bf5122f344554c53bde2ebb8cd2b7e3d1600ad631c385a5d7cce23c7785459a6450617274f46450617573f46450756c6cf46453746f72a1612ea064547970650064565479706a46616b6544545479706565566f756368817864f55ff8f12508b63ef2bfeca7557ae90df6311a5ec1631b4a1fa843310bd9c3a710eaace5a1bdd72ad0bfe049771c11e756338bd93865e645f1adec9b9c99ef407fbd4fc6859e7904c5ad7dc9bd10a5cc16973d5b28ec1a6dd43d9f82f9f18c3d03418e35665866657249441a4d6582216e526573746172744368616e6e656c8360600068526573706f6e7365f6") - deserialized, err := message1_1.FromNet(bytes.NewReader(msg)) - require.NoError(t, err) - - deserializedRequest, ok := deserialized.(datatransfer.Request) - require.True(t, ok) - - require.Equal(t, deserializedRequest.TransferID(), request.TransferID()) - require.Equal(t, deserializedRequest.IsCancel(), request.IsCancel()) - require.Equal(t, deserializedRequest.IsPull(), request.IsPull()) - require.Equal(t, deserializedRequest.IsRequest(), request.IsRequest()) - c, _ := cid.Parse("QmTTA2daxGqo5denp6SwLzzkLJm3fuisYEi9CoWsuHpzfb") - assert.Equal(t, c, deserializedRequest.BaseCid()) - testutil.AssertEqualFakeDTVoucher(t, request, deserializedRequest) - testutil.AssertEqualSelector(t, request, deserializedRequest) - - response, err := message1_1.NewResponse(id, accepted, false, voucherResult.Type(), voucherResult) - require.NoError(t, err) - err = response.ToNet(buf) - require.NoError(t, err) - msg, _ = hex.DecodeString("a36449735271f46752657175657374f668526573706f6e7365a66441637074f46450617573f464547970650064565265738178644204cb9a1e34c5f08e9b20aa76090e70020bb56c0ca3d3af7296cd1058a5112890fed218488f084d8df9e4835fb54ad045ffd936e3bf7261b0426c51352a097816ed74482bb9084b4a7ed8adc517f3371e0e0434b511625cd1a41792243dccdcfe88094b64565479706a46616b65445454797065665866657249441a4d658221") - deserialized, err = message1_1.FromNet(bytes.NewReader(msg)) - require.NoError(t, err) - - deserializedResponse, ok := deserialized.(datatransfer.Response) - require.True(t, ok) - - require.Equal(t, deserializedResponse.TransferID(), response.TransferID()) - require.Equal(t, deserializedResponse.Accepted(), response.Accepted()) - require.Equal(t, deserializedResponse.IsRequest(), response.IsRequest()) - require.Equal(t, deserializedResponse.IsUpdate(), response.IsUpdate()) - require.Equal(t, deserializedResponse.IsPaused(), response.IsPaused()) - testutil.AssertEqualFakeDTVoucherResult(t, response, deserializedResponse) - - request = message1_1.CancelRequest(id) - err = request.ToNet(buf) - require.NoError(t, err) - msg, _ = hex.DecodeString("a36449735271f56752657175657374aa6442436964f66450617274f46450617573f46450756c6cf46453746f72f664547970650264565479706065566f756368f6665866657249441a4d6582216e526573746172744368616e6e656c8360600068526573706f6e7365f6") - deserialized, err = message1_1.FromNet(bytes.NewReader(msg)) - require.NoError(t, err) - - deserializedRequest, ok = deserialized.(datatransfer.Request) - require.True(t, ok) - - require.Equal(t, deserializedRequest.TransferID(), request.TransferID()) - require.Equal(t, deserializedRequest.IsCancel(), request.IsCancel()) - require.Equal(t, deserializedRequest.IsRequest(), request.IsRequest()) - }) -} - -func TestFromNetMessageValidation(t *testing.T) { - // craft request message with nil request struct - buf := []byte{0x83, 0xf5, 0xf6, 0xf6} - msg, err := message1_1.FromNet(bytes.NewBuffer(buf)) - assert.Error(t, err) - assert.Nil(t, msg) - - // craft response message with nil response struct - buf = []byte{0x83, 0xf4, 0xf6, 0xf6} - msg, err = message1_1.FromNet(bytes.NewBuffer(buf)) - assert.Error(t, err) - assert.Nil(t, msg) -} - -func NewTestTransferRequest() (message1_1.TransferRequest1_1, error) { - bcid := testutil.GenerateCids(1)[0] - selector := builder.NewSelectorSpecBuilder(basicnode.Prototype.Any).Matcher().Node() - isPull := false - id := datatransfer.TransferID(rand.Int31()) - voucher := testutil.NewFakeDTType() - req, err := message1_1.NewRequest(id, false, isPull, voucher.Type(), voucher, bcid, selector) - if err != nil { - return message1_1.TransferRequest1_1{}, err - } - tr, ok := req.(*message1_1.TransferRequest1_1) - if !ok { - return message1_1.TransferRequest1_1{}, fmt.Errorf("expected *TransferRequest1_1") - } - return *tr, nil -} diff --git a/message/message1_1/transfer_message.go b/message/message1_1/transfer_message.go deleted file mode 100644 index f4e04f3..0000000 --- a/message/message1_1/transfer_message.go +++ /dev/null @@ -1,59 +0,0 @@ -package message1_1 - -import ( - "bytes" - "io" - - "github.com/ipld/go-ipld-prime/codec/dagcbor" - "github.com/ipld/go-ipld-prime/datamodel" - basicnode "github.com/ipld/go-ipld-prime/node/basic" - - datatransfer "github.com/filecoin-project/go-data-transfer/v2" -) - -//go:generate cbor-gen-for --map-encoding TransferMessage1_1 - -// transferMessage1_1 is the transfer message for the 1.1 Data Transfer Protocol. -type TransferMessage1_1 struct { - IsRq bool - - Request *TransferRequest1_1 - Response *TransferResponse1_1 -} - -// ========= datatransfer.Message interface - -// IsRequest returns true if this message is a data request -func (tm *TransferMessage1_1) IsRequest() bool { - return tm.IsRq -} - -// TransferID returns the TransferID of this message -func (tm *TransferMessage1_1) TransferID() datatransfer.TransferID { - if tm.IsRequest() { - return tm.Request.TransferID() - } - return tm.Response.TransferID() -} - -// ToNet serializes a transfer message type. It is simply a wrapper for MarshalCBOR, to provide -// symmetry with FromNet -func (tm *TransferMessage1_1) ToIPLD() (datamodel.Node, error) { - buf := new(bytes.Buffer) - err := tm.ToNet(buf) - if err != nil { - return nil, err - } - nb := basicnode.Prototype.Any.NewBuilder() - err = dagcbor.Decode(nb, buf) - if err != nil { - return nil, err - } - return nb.Build(), nil -} - -// ToNet serializes a transfer message type. It is simply a wrapper for MarshalCBOR, to provide -// symmetry with FromNet -func (tm *TransferMessage1_1) ToNet(w io.Writer) error { - return tm.MarshalCBOR(w) -} diff --git a/message/message1_1/transfer_message_cbor_gen.go b/message/message1_1/transfer_message_cbor_gen.go deleted file mode 100644 index b7b25e8..0000000 --- a/message/message1_1/transfer_message_cbor_gen.go +++ /dev/null @@ -1,179 +0,0 @@ -// Code generated by github.com/whyrusleeping/cbor-gen. DO NOT EDIT. - -package message1_1 - -import ( - "fmt" - "io" - "sort" - - cid "github.com/ipfs/go-cid" - cbg "github.com/whyrusleeping/cbor-gen" - xerrors "golang.org/x/xerrors" -) - -var _ = xerrors.Errorf -var _ = cid.Undef -var _ = sort.Sort - -func (t *TransferMessage1_1) MarshalCBOR(w io.Writer) error { - if t == nil { - _, err := w.Write(cbg.CborNull) - return err - } - if _, err := w.Write([]byte{163}); err != nil { - return err - } - - scratch := make([]byte, 9) - - // t.IsRq (bool) (bool) - if len("IsRq") > cbg.MaxLength { - return xerrors.Errorf("Value in field \"IsRq\" was too long") - } - - if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajTextString, uint64(len("IsRq"))); err != nil { - return err - } - if _, err := io.WriteString(w, string("IsRq")); err != nil { - return err - } - - if err := cbg.WriteBool(w, t.IsRq); err != nil { - return err - } - - // t.Request (message1_1.TransferRequest1_1) (struct) - if len("Request") > cbg.MaxLength { - return xerrors.Errorf("Value in field \"Request\" was too long") - } - - if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajTextString, uint64(len("Request"))); err != nil { - return err - } - if _, err := io.WriteString(w, string("Request")); err != nil { - return err - } - - if err := t.Request.MarshalCBOR(w); err != nil { - return err - } - - // t.Response (message1_1.TransferResponse1_1) (struct) - if len("Response") > cbg.MaxLength { - return xerrors.Errorf("Value in field \"Response\" was too long") - } - - if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajTextString, uint64(len("Response"))); err != nil { - return err - } - if _, err := io.WriteString(w, string("Response")); err != nil { - return err - } - - if err := t.Response.MarshalCBOR(w); err != nil { - return err - } - return nil -} - -func (t *TransferMessage1_1) UnmarshalCBOR(r io.Reader) error { - *t = TransferMessage1_1{} - - br := cbg.GetPeeker(r) - scratch := make([]byte, 8) - - maj, extra, err := cbg.CborReadHeaderBuf(br, scratch) - if err != nil { - return err - } - if maj != cbg.MajMap { - return fmt.Errorf("cbor input should be of type map") - } - - if extra > cbg.MaxLength { - return fmt.Errorf("TransferMessage1_1: map struct too large (%d)", extra) - } - - var name string - n := extra - - for i := uint64(0); i < n; i++ { - - { - sval, err := cbg.ReadStringBuf(br, scratch) - if err != nil { - return err - } - - name = string(sval) - } - - switch name { - // t.IsRq (bool) (bool) - case "IsRq": - - maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) - if err != nil { - return err - } - if maj != cbg.MajOther { - return fmt.Errorf("booleans must be major type 7") - } - switch extra { - case 20: - t.IsRq = false - case 21: - t.IsRq = true - default: - return fmt.Errorf("booleans are either major type 7, value 20 or 21 (got %d)", extra) - } - // t.Request (message1_1.TransferRequest1_1) (struct) - case "Request": - - { - - b, err := br.ReadByte() - if err != nil { - return err - } - if b != cbg.CborNull[0] { - if err := br.UnreadByte(); err != nil { - return err - } - t.Request = new(TransferRequest1_1) - if err := t.Request.UnmarshalCBOR(br); err != nil { - return xerrors.Errorf("unmarshaling t.Request pointer: %w", err) - } - } - - } - // t.Response (message1_1.TransferResponse1_1) (struct) - case "Response": - - { - - b, err := br.ReadByte() - if err != nil { - return err - } - if b != cbg.CborNull[0] { - if err := br.UnreadByte(); err != nil { - return err - } - t.Response = new(TransferResponse1_1) - if err := t.Response.UnmarshalCBOR(br); err != nil { - return xerrors.Errorf("unmarshaling t.Response pointer: %w", err) - } - } - - } - - default: - // Field doesn't exist on this type, so ignore it - cbg.ScanForLinks(r, func(cid.Cid) {}) - } - } - - return nil -} diff --git a/message/message1_1/transfer_request.go b/message/message1_1/transfer_request.go deleted file mode 100644 index a751ed3..0000000 --- a/message/message1_1/transfer_request.go +++ /dev/null @@ -1,166 +0,0 @@ -package message1_1 - -import ( - "bytes" - "io" - - "github.com/ipfs/go-cid" - "github.com/ipld/go-ipld-prime" - "github.com/ipld/go-ipld-prime/codec/dagcbor" - "github.com/ipld/go-ipld-prime/datamodel" - basicnode "github.com/ipld/go-ipld-prime/node/basic" - "github.com/libp2p/go-libp2p-core/protocol" - cbg "github.com/whyrusleeping/cbor-gen" - xerrors "golang.org/x/xerrors" - - datatransfer "github.com/filecoin-project/go-data-transfer/v2" - "github.com/filecoin-project/go-data-transfer/v2/encoding" - "github.com/filecoin-project/go-data-transfer/v2/message/types" -) - -//go:generate cbor-gen-for --map-encoding TransferRequest1_1 - -// TransferRequest1_1 is a struct for the 1.1 Data Transfer Protocol that fulfills the datatransfer.Request interface. -// its members are exported to be used by cbor-gen -type TransferRequest1_1 struct { - BCid *cid.Cid - Type uint64 - Paus bool - Part bool - Pull bool - Stor *cbg.Deferred - Vouch *cbg.Deferred - VTyp datatransfer.TypeIdentifier - XferID uint64 - - RestartChannel datatransfer.ChannelID -} - -func (trq *TransferRequest1_1) MessageForProtocol(targetProtocol protocol.ID) (datatransfer.Message, error) { - switch targetProtocol { - case datatransfer.ProtocolDataTransfer1_2: - return trq, nil - default: - return nil, xerrors.Errorf("protocol not supported") - } -} - -// IsRequest always returns true in this case because this is a transfer request -func (trq *TransferRequest1_1) IsRequest() bool { - return true -} - -func (trq *TransferRequest1_1) IsRestart() bool { - return trq.Type == uint64(types.RestartMessage) -} - -func (trq *TransferRequest1_1) IsRestartExistingChannelRequest() bool { - return trq.Type == uint64(types.RestartExistingChannelRequestMessage) -} - -func (trq *TransferRequest1_1) RestartChannelId() (datatransfer.ChannelID, error) { - if !trq.IsRestartExistingChannelRequest() { - return datatransfer.ChannelID{}, xerrors.New("not a restart request") - } - return trq.RestartChannel, nil -} - -func (trq *TransferRequest1_1) IsNew() bool { - return trq.Type == uint64(types.NewMessage) -} - -func (trq *TransferRequest1_1) IsUpdate() bool { - return trq.Type == uint64(types.UpdateMessage) -} - -func (trq *TransferRequest1_1) IsVoucher() bool { - return trq.Type == uint64(types.VoucherMessage) || trq.Type == uint64(types.NewMessage) -} - -func (trq *TransferRequest1_1) IsPaused() bool { - return trq.Paus -} - -func (trq *TransferRequest1_1) TransferID() datatransfer.TransferID { - return datatransfer.TransferID(trq.XferID) -} - -// ========= datatransfer.Request interface -// IsPull returns true if this is a data pull request -func (trq *TransferRequest1_1) IsPull() bool { - return trq.Pull -} - -// VoucherType returns the Voucher ID -func (trq *TransferRequest1_1) VoucherType() datatransfer.TypeIdentifier { - return trq.VTyp -} - -// Voucher returns the Voucher bytes -func (trq *TransferRequest1_1) Voucher(decoder encoding.Decoder) (encoding.Encodable, error) { - if trq.Vouch == nil { - return nil, xerrors.New("No voucher present to read") - } - return decoder.DecodeFromCbor(trq.Vouch.Raw) -} - -func (trq *TransferRequest1_1) EmptyVoucher() bool { - return trq.VTyp == datatransfer.EmptyTypeIdentifier -} - -// BaseCid returns the Base CID -func (trq *TransferRequest1_1) BaseCid() cid.Cid { - if trq.BCid == nil { - return cid.Undef - } - return *trq.BCid -} - -// Selector returns the message Selector bytes -func (trq *TransferRequest1_1) Selector() (ipld.Node, error) { - if trq.Stor == nil { - return nil, xerrors.New("No selector present to read") - } - builder := basicnode.Prototype.Any.NewBuilder() - reader := bytes.NewReader(trq.Stor.Raw) - err := dagcbor.Decode(builder, reader) - if err != nil { - return nil, xerrors.Errorf("Error decoding selector: %w", err) - } - return builder.Build(), nil -} - -// IsCancel returns true if this is a cancel request -func (trq *TransferRequest1_1) IsCancel() bool { - return trq.Type == uint64(types.CancelMessage) -} - -// IsPartial returns true if this is a partial request -func (trq *TransferRequest1_1) IsPartial() bool { - return trq.Part -} - -func (trq *TransferRequest1_1) ToIPLD() (datamodel.Node, error) { - buf := new(bytes.Buffer) - err := trq.ToNet(buf) - if err != nil { - return nil, err - } - nb := basicnode.Prototype.Any.NewBuilder() - err = dagcbor.Decode(nb, buf) - if err != nil { - return nil, err - } - return nb.Build(), nil -} - -// ToNet serializes a transfer request. It's a wrapper for MarshalCBOR to provide -// symmetry with FromNet -func (trq *TransferRequest1_1) ToNet(w io.Writer) error { - msg := TransferMessage1_1{ - IsRq: true, - Request: trq, - Response: nil, - } - return msg.MarshalCBOR(w) -} diff --git a/message/message1_1/transfer_request_cbor_gen.go b/message/message1_1/transfer_request_cbor_gen.go deleted file mode 100644 index 056fe96..0000000 --- a/message/message1_1/transfer_request_cbor_gen.go +++ /dev/null @@ -1,397 +0,0 @@ -// Code generated by github.com/whyrusleeping/cbor-gen. DO NOT EDIT. - -package message1_1 - -import ( - "fmt" - "io" - "sort" - - datatransfer "github.com/filecoin-project/go-data-transfer/v2" - cid "github.com/ipfs/go-cid" - cbg "github.com/whyrusleeping/cbor-gen" - xerrors "golang.org/x/xerrors" -) - -var _ = xerrors.Errorf -var _ = cid.Undef -var _ = sort.Sort - -func (t *TransferRequest1_1) MarshalCBOR(w io.Writer) error { - if t == nil { - _, err := w.Write(cbg.CborNull) - return err - } - if _, err := w.Write([]byte{170}); err != nil { - return err - } - - scratch := make([]byte, 9) - - // t.BCid (cid.Cid) (struct) - if len("BCid") > cbg.MaxLength { - return xerrors.Errorf("Value in field \"BCid\" was too long") - } - - if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajTextString, uint64(len("BCid"))); err != nil { - return err - } - if _, err := io.WriteString(w, string("BCid")); err != nil { - return err - } - - if t.BCid == nil { - if _, err := w.Write(cbg.CborNull); err != nil { - return err - } - } else { - if err := cbg.WriteCidBuf(scratch, w, *t.BCid); err != nil { - return xerrors.Errorf("failed to write cid field t.BCid: %w", err) - } - } - - // t.Type (uint64) (uint64) - if len("Type") > cbg.MaxLength { - return xerrors.Errorf("Value in field \"Type\" was too long") - } - - if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajTextString, uint64(len("Type"))); err != nil { - return err - } - if _, err := io.WriteString(w, string("Type")); err != nil { - return err - } - - if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajUnsignedInt, uint64(t.Type)); err != nil { - return err - } - - // t.Paus (bool) (bool) - if len("Paus") > cbg.MaxLength { - return xerrors.Errorf("Value in field \"Paus\" was too long") - } - - if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajTextString, uint64(len("Paus"))); err != nil { - return err - } - if _, err := io.WriteString(w, string("Paus")); err != nil { - return err - } - - if err := cbg.WriteBool(w, t.Paus); err != nil { - return err - } - - // t.Part (bool) (bool) - if len("Part") > cbg.MaxLength { - return xerrors.Errorf("Value in field \"Part\" was too long") - } - - if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajTextString, uint64(len("Part"))); err != nil { - return err - } - if _, err := io.WriteString(w, string("Part")); err != nil { - return err - } - - if err := cbg.WriteBool(w, t.Part); err != nil { - return err - } - - // t.Pull (bool) (bool) - if len("Pull") > cbg.MaxLength { - return xerrors.Errorf("Value in field \"Pull\" was too long") - } - - if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajTextString, uint64(len("Pull"))); err != nil { - return err - } - if _, err := io.WriteString(w, string("Pull")); err != nil { - return err - } - - if err := cbg.WriteBool(w, t.Pull); err != nil { - return err - } - - // t.Stor (typegen.Deferred) (struct) - if len("Stor") > cbg.MaxLength { - return xerrors.Errorf("Value in field \"Stor\" was too long") - } - - if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajTextString, uint64(len("Stor"))); err != nil { - return err - } - if _, err := io.WriteString(w, string("Stor")); err != nil { - return err - } - - if err := t.Stor.MarshalCBOR(w); err != nil { - return err - } - - // t.Vouch (typegen.Deferred) (struct) - if len("Vouch") > cbg.MaxLength { - return xerrors.Errorf("Value in field \"Vouch\" was too long") - } - - if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajTextString, uint64(len("Vouch"))); err != nil { - return err - } - if _, err := io.WriteString(w, string("Vouch")); err != nil { - return err - } - - if err := t.Vouch.MarshalCBOR(w); err != nil { - return err - } - - // t.VTyp (datatransfer.TypeIdentifier) (string) - if len("VTyp") > cbg.MaxLength { - return xerrors.Errorf("Value in field \"VTyp\" was too long") - } - - if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajTextString, uint64(len("VTyp"))); err != nil { - return err - } - if _, err := io.WriteString(w, string("VTyp")); err != nil { - return err - } - - if len(t.VTyp) > cbg.MaxLength { - return xerrors.Errorf("Value in field t.VTyp was too long") - } - - if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajTextString, uint64(len(t.VTyp))); err != nil { - return err - } - if _, err := io.WriteString(w, string(t.VTyp)); err != nil { - return err - } - - // t.XferID (uint64) (uint64) - if len("XferID") > cbg.MaxLength { - return xerrors.Errorf("Value in field \"XferID\" was too long") - } - - if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajTextString, uint64(len("XferID"))); err != nil { - return err - } - if _, err := io.WriteString(w, string("XferID")); err != nil { - return err - } - - if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajUnsignedInt, uint64(t.XferID)); err != nil { - return err - } - - // t.RestartChannel (datatransfer.ChannelID) (struct) - if len("RestartChannel") > cbg.MaxLength { - return xerrors.Errorf("Value in field \"RestartChannel\" was too long") - } - - if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajTextString, uint64(len("RestartChannel"))); err != nil { - return err - } - if _, err := io.WriteString(w, string("RestartChannel")); err != nil { - return err - } - - if err := t.RestartChannel.MarshalCBOR(w); err != nil { - return err - } - return nil -} - -func (t *TransferRequest1_1) UnmarshalCBOR(r io.Reader) error { - *t = TransferRequest1_1{} - - br := cbg.GetPeeker(r) - scratch := make([]byte, 8) - - maj, extra, err := cbg.CborReadHeaderBuf(br, scratch) - if err != nil { - return err - } - if maj != cbg.MajMap { - return fmt.Errorf("cbor input should be of type map") - } - - if extra > cbg.MaxLength { - return fmt.Errorf("TransferRequest1_1: map struct too large (%d)", extra) - } - - var name string - n := extra - - for i := uint64(0); i < n; i++ { - - { - sval, err := cbg.ReadStringBuf(br, scratch) - if err != nil { - return err - } - - name = string(sval) - } - - switch name { - // t.BCid (cid.Cid) (struct) - case "BCid": - - { - - b, err := br.ReadByte() - if err != nil { - return err - } - if b != cbg.CborNull[0] { - if err := br.UnreadByte(); err != nil { - return err - } - - c, err := cbg.ReadCid(br) - if err != nil { - return xerrors.Errorf("failed to read cid field t.BCid: %w", err) - } - - t.BCid = &c - } - - } - // t.Type (uint64) (uint64) - case "Type": - - { - - maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) - if err != nil { - return err - } - if maj != cbg.MajUnsignedInt { - return fmt.Errorf("wrong type for uint64 field") - } - t.Type = uint64(extra) - - } - // t.Paus (bool) (bool) - case "Paus": - - maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) - if err != nil { - return err - } - if maj != cbg.MajOther { - return fmt.Errorf("booleans must be major type 7") - } - switch extra { - case 20: - t.Paus = false - case 21: - t.Paus = true - default: - return fmt.Errorf("booleans are either major type 7, value 20 or 21 (got %d)", extra) - } - // t.Part (bool) (bool) - case "Part": - - maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) - if err != nil { - return err - } - if maj != cbg.MajOther { - return fmt.Errorf("booleans must be major type 7") - } - switch extra { - case 20: - t.Part = false - case 21: - t.Part = true - default: - return fmt.Errorf("booleans are either major type 7, value 20 or 21 (got %d)", extra) - } - // t.Pull (bool) (bool) - case "Pull": - - maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) - if err != nil { - return err - } - if maj != cbg.MajOther { - return fmt.Errorf("booleans must be major type 7") - } - switch extra { - case 20: - t.Pull = false - case 21: - t.Pull = true - default: - return fmt.Errorf("booleans are either major type 7, value 20 or 21 (got %d)", extra) - } - // t.Stor (typegen.Deferred) (struct) - case "Stor": - - { - - t.Stor = new(cbg.Deferred) - - if err := t.Stor.UnmarshalCBOR(br); err != nil { - return xerrors.Errorf("failed to read deferred field: %w", err) - } - } - // t.Vouch (typegen.Deferred) (struct) - case "Vouch": - - { - - t.Vouch = new(cbg.Deferred) - - if err := t.Vouch.UnmarshalCBOR(br); err != nil { - return xerrors.Errorf("failed to read deferred field: %w", err) - } - } - // t.VTyp (datatransfer.TypeIdentifier) (string) - case "VTyp": - - { - sval, err := cbg.ReadStringBuf(br, scratch) - if err != nil { - return err - } - - t.VTyp = datatransfer.TypeIdentifier(sval) - } - // t.XferID (uint64) (uint64) - case "XferID": - - { - - maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) - if err != nil { - return err - } - if maj != cbg.MajUnsignedInt { - return fmt.Errorf("wrong type for uint64 field") - } - t.XferID = uint64(extra) - - } - // t.RestartChannel (datatransfer.ChannelID) (struct) - case "RestartChannel": - - { - - if err := t.RestartChannel.UnmarshalCBOR(br); err != nil { - return xerrors.Errorf("unmarshaling t.RestartChannel: %w", err) - } - - } - - default: - // Field doesn't exist on this type, so ignore it - cbg.ScanForLinks(r, func(cid.Cid) {}) - } - } - - return nil -} diff --git a/message/message1_1/transfer_request_test.go b/message/message1_1/transfer_request_test.go deleted file mode 100644 index 7ea148f..0000000 --- a/message/message1_1/transfer_request_test.go +++ /dev/null @@ -1,41 +0,0 @@ -package message1_1_test - -import ( - "math/rand" - "testing" - - basicnode "github.com/ipld/go-ipld-prime/node/basic" - "github.com/ipld/go-ipld-prime/traversal/selector/builder" - "github.com/stretchr/testify/require" - - datatransfer "github.com/filecoin-project/go-data-transfer/v2" - "github.com/filecoin-project/go-data-transfer/v2/message/message1_1" - "github.com/filecoin-project/go-data-transfer/v2/testutil" -) - -func TestRequestMessageForProtocol(t *testing.T) { - baseCid := testutil.GenerateCids(1)[0] - selector := builder.NewSelectorSpecBuilder(basicnode.Prototype.Any).Matcher().Node() - isPull := true - id := datatransfer.TransferID(rand.Int31()) - voucher := testutil.NewFakeDTType() - - // for the new protocols - request, err := message1_1.NewRequest(id, false, isPull, voucher.Type(), voucher, baseCid, selector) - require.NoError(t, err) - - out12, err := request.MessageForProtocol(datatransfer.ProtocolDataTransfer1_2) - require.NoError(t, err) - require.Equal(t, request, out12) - - req, ok := out12.(datatransfer.Request) - require.True(t, ok) - require.False(t, req.IsRestart()) - require.False(t, req.IsRestartExistingChannelRequest()) - require.Equal(t, baseCid, req.BaseCid()) - require.True(t, req.IsPull()) - n, err := req.Selector() - require.NoError(t, err) - require.Equal(t, selector, n) - require.Equal(t, voucher.Type(), req.VoucherType()) -} diff --git a/message/message1_1/transfer_response.go b/message/message1_1/transfer_response.go deleted file mode 100644 index 105e19a..0000000 --- a/message/message1_1/transfer_response.go +++ /dev/null @@ -1,127 +0,0 @@ -package message1_1 - -import ( - "bytes" - "io" - - "github.com/ipld/go-ipld-prime/codec/dagcbor" - "github.com/ipld/go-ipld-prime/datamodel" - basicnode "github.com/ipld/go-ipld-prime/node/basic" - "github.com/libp2p/go-libp2p-core/protocol" - cbg "github.com/whyrusleeping/cbor-gen" - xerrors "golang.org/x/xerrors" - - datatransfer "github.com/filecoin-project/go-data-transfer/v2" - "github.com/filecoin-project/go-data-transfer/v2/encoding" - "github.com/filecoin-project/go-data-transfer/v2/message/types" -) - -//go:generate cbor-gen-for --map-encoding TransferResponse1_1 - -// TransferResponse1_1 is a private struct that satisfies the datatransfer.Response interface -// It is the response message for the Data Transfer 1.1 and 1.2 Protocol. -type TransferResponse1_1 struct { - Type uint64 - Acpt bool - Paus bool - XferID uint64 - VRes *cbg.Deferred - VTyp datatransfer.TypeIdentifier -} - -func (trsp *TransferResponse1_1) TransferID() datatransfer.TransferID { - return datatransfer.TransferID(trsp.XferID) -} - -// IsRequest always returns false in this case because this is a transfer response -func (trsp *TransferResponse1_1) IsRequest() bool { - return false -} - -// IsNew returns true if this is the first response sent -func (trsp *TransferResponse1_1) IsNew() bool { - return trsp.Type == uint64(types.NewMessage) -} - -// IsUpdate returns true if this response is an update -func (trsp *TransferResponse1_1) IsUpdate() bool { - return trsp.Type == uint64(types.UpdateMessage) -} - -// IsPaused returns true if the responder is paused -func (trsp *TransferResponse1_1) IsPaused() bool { - return trsp.Paus -} - -// IsCancel returns true if the responder has cancelled this response -func (trsp *TransferResponse1_1) IsCancel() bool { - return trsp.Type == uint64(types.CancelMessage) -} - -// IsComplete returns true if the responder has completed this response -func (trsp *TransferResponse1_1) IsComplete() bool { - return trsp.Type == uint64(types.CompleteMessage) -} - -func (trsp *TransferResponse1_1) IsValidationResult() bool { - return trsp.Type == uint64(types.VoucherResultMessage) || trsp.Type == uint64(types.NewMessage) || trsp.Type == uint64(types.CompleteMessage) || - trsp.Type == uint64(types.RestartMessage) -} - -// Accepted returns true if the request is accepted in the response -func (trsp *TransferResponse1_1) Accepted() bool { - return trsp.Acpt -} - -func (trsp *TransferResponse1_1) VoucherResultType() datatransfer.TypeIdentifier { - return trsp.VTyp -} - -func (trsp *TransferResponse1_1) VoucherResult(decoder encoding.Decoder) (encoding.Encodable, error) { - if trsp.VRes == nil { - return nil, xerrors.New("No voucher present to read") - } - return decoder.DecodeFromCbor(trsp.VRes.Raw) -} - -func (trq *TransferResponse1_1) IsRestart() bool { - return trq.Type == uint64(types.RestartMessage) -} - -func (trsp *TransferResponse1_1) EmptyVoucherResult() bool { - return trsp.VTyp == datatransfer.EmptyTypeIdentifier -} - -func (trsp *TransferResponse1_1) MessageForProtocol(targetProtocol protocol.ID) (datatransfer.Message, error) { - switch targetProtocol { - case datatransfer.ProtocolDataTransfer1_2: - return trsp, nil - default: - return nil, xerrors.Errorf("protocol %s not supported", targetProtocol) - } -} - -func (trsp *TransferResponse1_1) ToIPLD() (datamodel.Node, error) { - buf := new(bytes.Buffer) - err := trsp.ToNet(buf) - if err != nil { - return nil, err - } - nb := basicnode.Prototype.Any.NewBuilder() - err = dagcbor.Decode(nb, buf) - if err != nil { - return nil, err - } - return nb.Build(), nil -} - -// ToNet serializes a transfer response. It's a wrapper for MarshalCBOR to provide -// symmetry with FromNet -func (trsp *TransferResponse1_1) ToNet(w io.Writer) error { - msg := TransferMessage1_1{ - IsRq: false, - Request: nil, - Response: trsp, - } - return msg.MarshalCBOR(w) -} diff --git a/message/message1_1/transfer_response_cbor_gen.go b/message/message1_1/transfer_response_cbor_gen.go deleted file mode 100644 index 0a9badc..0000000 --- a/message/message1_1/transfer_response_cbor_gen.go +++ /dev/null @@ -1,265 +0,0 @@ -// Code generated by github.com/whyrusleeping/cbor-gen. DO NOT EDIT. - -package message1_1 - -import ( - "fmt" - "io" - "sort" - - datatransfer "github.com/filecoin-project/go-data-transfer/v2" - cid "github.com/ipfs/go-cid" - cbg "github.com/whyrusleeping/cbor-gen" - xerrors "golang.org/x/xerrors" -) - -var _ = xerrors.Errorf -var _ = cid.Undef -var _ = sort.Sort - -func (t *TransferResponse1_1) MarshalCBOR(w io.Writer) error { - if t == nil { - _, err := w.Write(cbg.CborNull) - return err - } - if _, err := w.Write([]byte{166}); err != nil { - return err - } - - scratch := make([]byte, 9) - - // t.Type (uint64) (uint64) - if len("Type") > cbg.MaxLength { - return xerrors.Errorf("Value in field \"Type\" was too long") - } - - if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajTextString, uint64(len("Type"))); err != nil { - return err - } - if _, err := io.WriteString(w, string("Type")); err != nil { - return err - } - - if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajUnsignedInt, uint64(t.Type)); err != nil { - return err - } - - // t.Acpt (bool) (bool) - if len("Acpt") > cbg.MaxLength { - return xerrors.Errorf("Value in field \"Acpt\" was too long") - } - - if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajTextString, uint64(len("Acpt"))); err != nil { - return err - } - if _, err := io.WriteString(w, string("Acpt")); err != nil { - return err - } - - if err := cbg.WriteBool(w, t.Acpt); err != nil { - return err - } - - // t.Paus (bool) (bool) - if len("Paus") > cbg.MaxLength { - return xerrors.Errorf("Value in field \"Paus\" was too long") - } - - if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajTextString, uint64(len("Paus"))); err != nil { - return err - } - if _, err := io.WriteString(w, string("Paus")); err != nil { - return err - } - - if err := cbg.WriteBool(w, t.Paus); err != nil { - return err - } - - // t.XferID (uint64) (uint64) - if len("XferID") > cbg.MaxLength { - return xerrors.Errorf("Value in field \"XferID\" was too long") - } - - if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajTextString, uint64(len("XferID"))); err != nil { - return err - } - if _, err := io.WriteString(w, string("XferID")); err != nil { - return err - } - - if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajUnsignedInt, uint64(t.XferID)); err != nil { - return err - } - - // t.VRes (typegen.Deferred) (struct) - if len("VRes") > cbg.MaxLength { - return xerrors.Errorf("Value in field \"VRes\" was too long") - } - - if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajTextString, uint64(len("VRes"))); err != nil { - return err - } - if _, err := io.WriteString(w, string("VRes")); err != nil { - return err - } - - if err := t.VRes.MarshalCBOR(w); err != nil { - return err - } - - // t.VTyp (datatransfer.TypeIdentifier) (string) - if len("VTyp") > cbg.MaxLength { - return xerrors.Errorf("Value in field \"VTyp\" was too long") - } - - if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajTextString, uint64(len("VTyp"))); err != nil { - return err - } - if _, err := io.WriteString(w, string("VTyp")); err != nil { - return err - } - - if len(t.VTyp) > cbg.MaxLength { - return xerrors.Errorf("Value in field t.VTyp was too long") - } - - if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajTextString, uint64(len(t.VTyp))); err != nil { - return err - } - if _, err := io.WriteString(w, string(t.VTyp)); err != nil { - return err - } - return nil -} - -func (t *TransferResponse1_1) UnmarshalCBOR(r io.Reader) error { - *t = TransferResponse1_1{} - - br := cbg.GetPeeker(r) - scratch := make([]byte, 8) - - maj, extra, err := cbg.CborReadHeaderBuf(br, scratch) - if err != nil { - return err - } - if maj != cbg.MajMap { - return fmt.Errorf("cbor input should be of type map") - } - - if extra > cbg.MaxLength { - return fmt.Errorf("TransferResponse1_1: map struct too large (%d)", extra) - } - - var name string - n := extra - - for i := uint64(0); i < n; i++ { - - { - sval, err := cbg.ReadStringBuf(br, scratch) - if err != nil { - return err - } - - name = string(sval) - } - - switch name { - // t.Type (uint64) (uint64) - case "Type": - - { - - maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) - if err != nil { - return err - } - if maj != cbg.MajUnsignedInt { - return fmt.Errorf("wrong type for uint64 field") - } - t.Type = uint64(extra) - - } - // t.Acpt (bool) (bool) - case "Acpt": - - maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) - if err != nil { - return err - } - if maj != cbg.MajOther { - return fmt.Errorf("booleans must be major type 7") - } - switch extra { - case 20: - t.Acpt = false - case 21: - t.Acpt = true - default: - return fmt.Errorf("booleans are either major type 7, value 20 or 21 (got %d)", extra) - } - // t.Paus (bool) (bool) - case "Paus": - - maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) - if err != nil { - return err - } - if maj != cbg.MajOther { - return fmt.Errorf("booleans must be major type 7") - } - switch extra { - case 20: - t.Paus = false - case 21: - t.Paus = true - default: - return fmt.Errorf("booleans are either major type 7, value 20 or 21 (got %d)", extra) - } - // t.XferID (uint64) (uint64) - case "XferID": - - { - - maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) - if err != nil { - return err - } - if maj != cbg.MajUnsignedInt { - return fmt.Errorf("wrong type for uint64 field") - } - t.XferID = uint64(extra) - - } - // t.VRes (typegen.Deferred) (struct) - case "VRes": - - { - - t.VRes = new(cbg.Deferred) - - if err := t.VRes.UnmarshalCBOR(br); err != nil { - return xerrors.Errorf("failed to read deferred field: %w", err) - } - } - // t.VTyp (datatransfer.TypeIdentifier) (string) - case "VTyp": - - { - sval, err := cbg.ReadStringBuf(br, scratch) - if err != nil { - return err - } - - t.VTyp = datatransfer.TypeIdentifier(sval) - } - - default: - // Field doesn't exist on this type, so ignore it - cbg.ScanForLinks(r, func(cid.Cid) {}) - } - } - - return nil -} diff --git a/message/message1_1/transfer_response_test.go b/message/message1_1/transfer_response_test.go deleted file mode 100644 index 02c9cff..0000000 --- a/message/message1_1/transfer_response_test.go +++ /dev/null @@ -1,35 +0,0 @@ -package message1_1_test - -import ( - "math/rand" - "testing" - - "github.com/stretchr/testify/require" - - datatransfer "github.com/filecoin-project/go-data-transfer/v2" - "github.com/filecoin-project/go-data-transfer/v2/message/message1_1" - "github.com/filecoin-project/go-data-transfer/v2/testutil" -) - -func TestResponseMessageForProtocol(t *testing.T) { - id := datatransfer.TransferID(rand.Int31()) - voucherResult := testutil.NewFakeDTType() - response, err := message1_1.NewResponse(id, false, true, voucherResult.Type(), voucherResult) // not accepted - require.NoError(t, err) - - // v1.2 protocol - out, err := response.MessageForProtocol(datatransfer.ProtocolDataTransfer1_2) - require.NoError(t, err) - require.Equal(t, response, out) - - resp, ok := (out).(datatransfer.Response) - require.True(t, ok) - require.True(t, resp.IsPaused()) - require.Equal(t, voucherResult.Type(), resp.VoucherResultType()) - require.True(t, resp.IsValidationResult()) - - // random protocol - out, err = response.MessageForProtocol("RAND") - require.Error(t, err) - require.Nil(t, out) -}