/* NNCP -- Node to Node copy, utilities for store-and-forward data exchange Copyright (C) 2016-2021 Sergey Matveev This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3 of the License. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ package nncp import ( "bytes" "testing" "testing/quick" xdr "github.com/davecgh/go-xdr/xdr2" ) func TestPktEncWrite(t *testing.T) { nodeOur, err := NewNodeGenerate() if err != nil { panic(err) } nodeTheir, err := NewNodeGenerate() if err != nil { panic(err) } f := func(path string, pathSize uint8, data [1 << 16]byte, size, padSize uint16) bool { dataR := bytes.NewReader(data[:]) var ct bytes.Buffer if len(path) > int(pathSize) { path = path[:int(pathSize)] } pkt, err := NewPkt(PktTypeFile, 123, []byte(path)) if err != nil { panic(err) } _, err = PktEncWrite( nodeOur, nodeTheir.Their(), pkt, 123, int64(size), int64(padSize), dataR, &ct, ) if err != nil { return false } var pktEnc PktEnc if _, err = xdr.Unmarshal(&ct, &pktEnc); err != nil { return false } if *pktEnc.Sender != *nodeOur.Id { return false } return true } if err := quick.Check(f, nil); err != nil { t.Error(err) } } func TestPktEncRead(t *testing.T) { node1, err := NewNodeGenerate() if err != nil { panic(err) } node2, err := NewNodeGenerate() if err != nil { panic(err) } f := func( path string, pathSize uint8, data [1 << 16]byte, size, padSize uint16, junk []byte) bool { dataR := bytes.NewReader(data[:]) var ct bytes.Buffer if len(path) > int(pathSize) { path = path[:int(pathSize)] } pkt, err := NewPkt(PktTypeFile, 123, []byte(path)) if err != nil { panic(err) } _, err = PktEncWrite( node1, node2.Their(), pkt, 123, int64(size), int64(padSize), dataR, &ct, ) if err != nil { return false } ct.Write(junk) var pt bytes.Buffer nodes := make(map[NodeId]*Node) nodes[*node1.Id] = node1.Their() _, node, sizeGot, err := PktEncRead(node2, nodes, &ct, &pt, true, nil) if err != nil { return false } if *node.Id != *node1.Id { return false } if sizeGot != sizeWithTags(PktOverhead+int64(size)) { return false } var pktBuf bytes.Buffer xdr.Marshal(&pktBuf, &pkt) return bytes.Compare(pt.Bytes(), append(pktBuf.Bytes(), data[:int(size)]...)) == 0 } if err := quick.Check(f, nil); err != nil { t.Error(err) } }