]> Cypherpunks.ru repositories - nncp.git/blobdiff - src/pkt_test.go
Full go modules usage
[nncp.git] / src / pkt_test.go
diff --git a/src/pkt_test.go b/src/pkt_test.go
new file mode 100644 (file)
index 0000000..678cbf4
--- /dev/null
@@ -0,0 +1,132 @@
+/*
+NNCP -- Node to Node copy, utilities for store-and-forward data exchange
+Copyright (C) 2016-2019 Sergey Matveev <stargrave@stargrave.org>
+
+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 <http://www.gnu.org/licenses/>.
+*/
+
+package nncp
+
+import (
+       "bytes"
+       "testing"
+       "testing/quick"
+
+       "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)
+               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)
+       }
+}