mirror of
https://github.com/ipfs/kubo.git
synced 2025-07-23 09:45:08 +08:00
merkledag objects
This commit is contained in:
@ -59,3 +59,15 @@ func (n *Node) getPBNode() *PBNode {
|
|||||||
pbn.Data = n.Data
|
pbn.Data = n.Data
|
||||||
return pbn
|
return pbn
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (n *Node) Encoded(force bool) ([]byte, error) {
|
||||||
|
if n.encoded == nil || force {
|
||||||
|
var err error
|
||||||
|
n.encoded, err = n.Marshal()
|
||||||
|
if err != nil {
|
||||||
|
return []byte{}, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return n.encoded, nil
|
||||||
|
}
|
||||||
|
@ -9,6 +9,9 @@ import (
|
|||||||
type Node struct {
|
type Node struct {
|
||||||
Links []*Link
|
Links []*Link
|
||||||
Data []byte
|
Data []byte
|
||||||
|
|
||||||
|
// cache encoded/marshaled value
|
||||||
|
encoded []byte
|
||||||
}
|
}
|
||||||
|
|
||||||
// An IPFS Merkle DAG Link
|
// An IPFS Merkle DAG Link
|
||||||
@ -23,17 +26,43 @@ type Link struct {
|
|||||||
Hash mh.Multihash
|
Hash mh.Multihash
|
||||||
}
|
}
|
||||||
|
|
||||||
type EncodedNode []byte
|
func (n *Node) AddNodeLink(name string, that *Node) error {
|
||||||
|
s, err := that.Size()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
h, err := that.Multihash()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
n.Links = append(n.Links, &Link{
|
||||||
|
Name: name,
|
||||||
|
Size: s,
|
||||||
|
Hash: h,
|
||||||
|
})
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func (n *Node) Size() (uint64, error) {
|
func (n *Node) Size() (uint64, error) {
|
||||||
d, err := n.Marshal()
|
b, err := n.Encoded(false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
|
|
||||||
s := uint64(len(d))
|
s := uint64(len(b))
|
||||||
for _, l := range n.Links {
|
for _, l := range n.Links {
|
||||||
s += l.Size
|
s += l.Size
|
||||||
}
|
}
|
||||||
return s, nil
|
return s, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (n *Node) Multihash() (mh.Multihash, error) {
|
||||||
|
b, err := n.Encoded(false)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return mh.Sum(b, mh.SHA2_256, -1)
|
||||||
|
}
|
||||||
|
48
merkledag/merkledag_test.go
Normal file
48
merkledag/merkledag_test.go
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
package merkledag
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
// mh "github.com/jbenet/go-multihash"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestNode(t *testing.T) {
|
||||||
|
|
||||||
|
n1 := &Node{Data: []byte("beep")}
|
||||||
|
n2 := &Node{Data: []byte("boop")}
|
||||||
|
n3 := &Node{Data: []byte("beep boop")}
|
||||||
|
if err := n3.AddNodeLink("beep-link", n1); err != nil {
|
||||||
|
t.Error(err)
|
||||||
|
}
|
||||||
|
if err := n3.AddNodeLink("boop-link", n2); err != nil {
|
||||||
|
t.Error(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
printn := func(name string, n *Node) {
|
||||||
|
fmt.Println(">", name)
|
||||||
|
fmt.Println("data:", string(n.Data))
|
||||||
|
|
||||||
|
fmt.Println("links:")
|
||||||
|
for _, l := range n.Links {
|
||||||
|
fmt.Println("-", l.Name, l.Size, l.Hash)
|
||||||
|
}
|
||||||
|
|
||||||
|
e, err := n.Encoded(false)
|
||||||
|
if err != nil {
|
||||||
|
t.Error(err)
|
||||||
|
} else {
|
||||||
|
fmt.Println("encoded:", e)
|
||||||
|
}
|
||||||
|
|
||||||
|
h, err := n.Multihash()
|
||||||
|
if err != nil {
|
||||||
|
t.Error(err)
|
||||||
|
} else {
|
||||||
|
fmt.Println("hash:", h)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
printn("beep", n1)
|
||||||
|
printn("boop", n2)
|
||||||
|
printn("beep boop", n3)
|
||||||
|
}
|
802
merkledag/node.pb.go
Normal file
802
merkledag/node.pb.go
Normal file
@ -0,0 +1,802 @@
|
|||||||
|
// Code generated by protoc-gen-gogo.
|
||||||
|
// source: node.proto
|
||||||
|
// DO NOT EDIT!
|
||||||
|
|
||||||
|
/*
|
||||||
|
Package merkledag is a generated protocol buffer package.
|
||||||
|
|
||||||
|
It is generated from these files:
|
||||||
|
node.proto
|
||||||
|
|
||||||
|
It has these top-level messages:
|
||||||
|
PBLink
|
||||||
|
PBNode
|
||||||
|
*/
|
||||||
|
package merkledag
|
||||||
|
|
||||||
|
import proto "code.google.com/p/gogoprotobuf/proto"
|
||||||
|
import json "encoding/json"
|
||||||
|
import math "math"
|
||||||
|
|
||||||
|
// discarding unused import gogoproto "code.google.com/p/gogoprotobuf/gogoproto/gogo.pb"
|
||||||
|
|
||||||
|
import io "io"
|
||||||
|
import code_google_com_p_gogoprotobuf_proto "code.google.com/p/gogoprotobuf/proto"
|
||||||
|
|
||||||
|
import fmt "fmt"
|
||||||
|
import strings "strings"
|
||||||
|
import reflect "reflect"
|
||||||
|
|
||||||
|
import fmt1 "fmt"
|
||||||
|
import strings1 "strings"
|
||||||
|
import code_google_com_p_gogoprotobuf_proto1 "code.google.com/p/gogoprotobuf/proto"
|
||||||
|
import sort "sort"
|
||||||
|
import strconv "strconv"
|
||||||
|
import reflect1 "reflect"
|
||||||
|
|
||||||
|
import fmt2 "fmt"
|
||||||
|
import bytes "bytes"
|
||||||
|
|
||||||
|
// Reference proto, json, and math imports to suppress error if they are not otherwise used.
|
||||||
|
var _ = proto.Marshal
|
||||||
|
var _ = &json.SyntaxError{}
|
||||||
|
var _ = math.Inf
|
||||||
|
|
||||||
|
// An IPFS MerkleDAG Link
|
||||||
|
type PBLink struct {
|
||||||
|
// multihash of the target object
|
||||||
|
Hash []byte `protobuf:"bytes,1,opt" json:"Hash,omitempty"`
|
||||||
|
// utf string name. should be unique per object
|
||||||
|
Name *string `protobuf:"bytes,2,opt" json:"Name,omitempty"`
|
||||||
|
// cumulative size of target object
|
||||||
|
Tsize *uint64 `protobuf:"varint,3,opt" json:"Tsize,omitempty"`
|
||||||
|
XXX_unrecognized []byte `json:"-"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *PBLink) Reset() { *m = PBLink{} }
|
||||||
|
func (*PBLink) ProtoMessage() {}
|
||||||
|
|
||||||
|
func (m *PBLink) GetHash() []byte {
|
||||||
|
if m != nil {
|
||||||
|
return m.Hash
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *PBLink) GetName() string {
|
||||||
|
if m != nil && m.Name != nil {
|
||||||
|
return *m.Name
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *PBLink) GetTsize() uint64 {
|
||||||
|
if m != nil && m.Tsize != nil {
|
||||||
|
return *m.Tsize
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
// An IPFS MerkleDAG Node
|
||||||
|
type PBNode struct {
|
||||||
|
// refs to other objects
|
||||||
|
Links []*PBLink `protobuf:"bytes,2,rep" json:"Links,omitempty"`
|
||||||
|
// opaque user data
|
||||||
|
Data []byte `protobuf:"bytes,1,opt" json:"Data,omitempty"`
|
||||||
|
XXX_unrecognized []byte `json:"-"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *PBNode) Reset() { *m = PBNode{} }
|
||||||
|
func (*PBNode) ProtoMessage() {}
|
||||||
|
|
||||||
|
func (m *PBNode) GetLinks() []*PBLink {
|
||||||
|
if m != nil {
|
||||||
|
return m.Links
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *PBNode) GetData() []byte {
|
||||||
|
if m != nil {
|
||||||
|
return m.Data
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
}
|
||||||
|
func (m *PBLink) Unmarshal(data []byte) error {
|
||||||
|
l := len(data)
|
||||||
|
index := 0
|
||||||
|
for index < l {
|
||||||
|
var wire uint64
|
||||||
|
for shift := uint(0); ; shift += 7 {
|
||||||
|
if index >= l {
|
||||||
|
return io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
b := data[index]
|
||||||
|
index++
|
||||||
|
wire |= (uint64(b) & 0x7F) << shift
|
||||||
|
if b < 0x80 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fieldNum := int32(wire >> 3)
|
||||||
|
wireType := int(wire & 0x7)
|
||||||
|
switch fieldNum {
|
||||||
|
case 1:
|
||||||
|
if wireType != 2 {
|
||||||
|
return code_google_com_p_gogoprotobuf_proto.ErrWrongType
|
||||||
|
}
|
||||||
|
var byteLen int
|
||||||
|
for shift := uint(0); ; shift += 7 {
|
||||||
|
if index >= l {
|
||||||
|
return io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
b := data[index]
|
||||||
|
index++
|
||||||
|
byteLen |= (int(b) & 0x7F) << shift
|
||||||
|
if b < 0x80 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
postIndex := index + byteLen
|
||||||
|
if postIndex > l {
|
||||||
|
return io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
m.Hash = append(m.Hash, data[index:postIndex]...)
|
||||||
|
index = postIndex
|
||||||
|
case 2:
|
||||||
|
if wireType != 2 {
|
||||||
|
return code_google_com_p_gogoprotobuf_proto.ErrWrongType
|
||||||
|
}
|
||||||
|
var stringLen uint64
|
||||||
|
for shift := uint(0); ; shift += 7 {
|
||||||
|
if index >= l {
|
||||||
|
return io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
b := data[index]
|
||||||
|
index++
|
||||||
|
stringLen |= (uint64(b) & 0x7F) << shift
|
||||||
|
if b < 0x80 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
postIndex := index + int(stringLen)
|
||||||
|
if postIndex > l {
|
||||||
|
return io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
s := string(data[index:postIndex])
|
||||||
|
m.Name = &s
|
||||||
|
index = postIndex
|
||||||
|
case 3:
|
||||||
|
if wireType != 0 {
|
||||||
|
return code_google_com_p_gogoprotobuf_proto.ErrWrongType
|
||||||
|
}
|
||||||
|
var v uint64
|
||||||
|
for shift := uint(0); ; shift += 7 {
|
||||||
|
if index >= l {
|
||||||
|
return io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
b := data[index]
|
||||||
|
index++
|
||||||
|
v |= (uint64(b) & 0x7F) << shift
|
||||||
|
if b < 0x80 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
m.Tsize = &v
|
||||||
|
default:
|
||||||
|
var sizeOfWire int
|
||||||
|
for {
|
||||||
|
sizeOfWire++
|
||||||
|
wire >>= 7
|
||||||
|
if wire == 0 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
index -= sizeOfWire
|
||||||
|
skippy, err := code_google_com_p_gogoprotobuf_proto.Skip(data[index:])
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if (index + skippy) > l {
|
||||||
|
return io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
m.XXX_unrecognized = append(m.XXX_unrecognized, data[index:index+skippy]...)
|
||||||
|
index += skippy
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
func (m *PBNode) Unmarshal(data []byte) error {
|
||||||
|
l := len(data)
|
||||||
|
index := 0
|
||||||
|
for index < l {
|
||||||
|
var wire uint64
|
||||||
|
for shift := uint(0); ; shift += 7 {
|
||||||
|
if index >= l {
|
||||||
|
return io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
b := data[index]
|
||||||
|
index++
|
||||||
|
wire |= (uint64(b) & 0x7F) << shift
|
||||||
|
if b < 0x80 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fieldNum := int32(wire >> 3)
|
||||||
|
wireType := int(wire & 0x7)
|
||||||
|
switch fieldNum {
|
||||||
|
case 2:
|
||||||
|
if wireType != 2 {
|
||||||
|
return code_google_com_p_gogoprotobuf_proto.ErrWrongType
|
||||||
|
}
|
||||||
|
var msglen int
|
||||||
|
for shift := uint(0); ; shift += 7 {
|
||||||
|
if index >= l {
|
||||||
|
return io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
b := data[index]
|
||||||
|
index++
|
||||||
|
msglen |= (int(b) & 0x7F) << shift
|
||||||
|
if b < 0x80 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
postIndex := index + msglen
|
||||||
|
if postIndex > l {
|
||||||
|
return io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
m.Links = append(m.Links, &PBLink{})
|
||||||
|
m.Links[len(m.Links)-1].Unmarshal(data[index:postIndex])
|
||||||
|
index = postIndex
|
||||||
|
case 1:
|
||||||
|
if wireType != 2 {
|
||||||
|
return code_google_com_p_gogoprotobuf_proto.ErrWrongType
|
||||||
|
}
|
||||||
|
var byteLen int
|
||||||
|
for shift := uint(0); ; shift += 7 {
|
||||||
|
if index >= l {
|
||||||
|
return io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
b := data[index]
|
||||||
|
index++
|
||||||
|
byteLen |= (int(b) & 0x7F) << shift
|
||||||
|
if b < 0x80 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
postIndex := index + byteLen
|
||||||
|
if postIndex > l {
|
||||||
|
return io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
m.Data = append(m.Data, data[index:postIndex]...)
|
||||||
|
index = postIndex
|
||||||
|
default:
|
||||||
|
var sizeOfWire int
|
||||||
|
for {
|
||||||
|
sizeOfWire++
|
||||||
|
wire >>= 7
|
||||||
|
if wire == 0 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
index -= sizeOfWire
|
||||||
|
skippy, err := code_google_com_p_gogoprotobuf_proto.Skip(data[index:])
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if (index + skippy) > l {
|
||||||
|
return io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
m.XXX_unrecognized = append(m.XXX_unrecognized, data[index:index+skippy]...)
|
||||||
|
index += skippy
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
func (this *PBLink) String() string {
|
||||||
|
if this == nil {
|
||||||
|
return "nil"
|
||||||
|
}
|
||||||
|
s := strings.Join([]string{`&PBLink{`,
|
||||||
|
`Hash:` + valueToStringNode(this.Hash) + `,`,
|
||||||
|
`Name:` + valueToStringNode(this.Name) + `,`,
|
||||||
|
`Tsize:` + valueToStringNode(this.Tsize) + `,`,
|
||||||
|
`XXX_unrecognized:` + fmt.Sprintf("%v", this.XXX_unrecognized) + `,`,
|
||||||
|
`}`,
|
||||||
|
}, "")
|
||||||
|
return s
|
||||||
|
}
|
||||||
|
func (this *PBNode) String() string {
|
||||||
|
if this == nil {
|
||||||
|
return "nil"
|
||||||
|
}
|
||||||
|
s := strings.Join([]string{`&PBNode{`,
|
||||||
|
`Links:` + strings.Replace(fmt.Sprintf("%v", this.Links), "PBLink", "PBLink", 1) + `,`,
|
||||||
|
`Data:` + valueToStringNode(this.Data) + `,`,
|
||||||
|
`XXX_unrecognized:` + fmt.Sprintf("%v", this.XXX_unrecognized) + `,`,
|
||||||
|
`}`,
|
||||||
|
}, "")
|
||||||
|
return s
|
||||||
|
}
|
||||||
|
func valueToStringNode(v interface{}) string {
|
||||||
|
rv := reflect.ValueOf(v)
|
||||||
|
if rv.IsNil() {
|
||||||
|
return "nil"
|
||||||
|
}
|
||||||
|
pv := reflect.Indirect(rv).Interface()
|
||||||
|
return fmt.Sprintf("*%v", pv)
|
||||||
|
}
|
||||||
|
func (m *PBLink) Size() (n int) {
|
||||||
|
var l int
|
||||||
|
_ = l
|
||||||
|
if m.Hash != nil {
|
||||||
|
l = len(m.Hash)
|
||||||
|
n += 1 + l + sovNode(uint64(l))
|
||||||
|
}
|
||||||
|
if m.Name != nil {
|
||||||
|
l = len(*m.Name)
|
||||||
|
n += 1 + l + sovNode(uint64(l))
|
||||||
|
}
|
||||||
|
if m.Tsize != nil {
|
||||||
|
n += 1 + sovNode(uint64(*m.Tsize))
|
||||||
|
}
|
||||||
|
if m.XXX_unrecognized != nil {
|
||||||
|
n += len(m.XXX_unrecognized)
|
||||||
|
}
|
||||||
|
return n
|
||||||
|
}
|
||||||
|
func (m *PBNode) Size() (n int) {
|
||||||
|
var l int
|
||||||
|
_ = l
|
||||||
|
if len(m.Links) > 0 {
|
||||||
|
for _, e := range m.Links {
|
||||||
|
l = e.Size()
|
||||||
|
n += 1 + l + sovNode(uint64(l))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if m.Data != nil {
|
||||||
|
l = len(m.Data)
|
||||||
|
n += 1 + l + sovNode(uint64(l))
|
||||||
|
}
|
||||||
|
if m.XXX_unrecognized != nil {
|
||||||
|
n += len(m.XXX_unrecognized)
|
||||||
|
}
|
||||||
|
return n
|
||||||
|
}
|
||||||
|
|
||||||
|
func sovNode(x uint64) (n int) {
|
||||||
|
for {
|
||||||
|
n++
|
||||||
|
x >>= 7
|
||||||
|
if x == 0 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return n
|
||||||
|
}
|
||||||
|
func sozNode(x uint64) (n int) {
|
||||||
|
return sovNode(uint64((x << 1) ^ uint64((int64(x) >> 63))))
|
||||||
|
}
|
||||||
|
func NewPopulatedPBLink(r randyNode, easy bool) *PBLink {
|
||||||
|
this := &PBLink{}
|
||||||
|
if r.Intn(10) != 0 {
|
||||||
|
v1 := r.Intn(100)
|
||||||
|
this.Hash = make([]byte, v1)
|
||||||
|
for i := 0; i < v1; i++ {
|
||||||
|
this.Hash[i] = byte(r.Intn(256))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if r.Intn(10) != 0 {
|
||||||
|
v2 := randStringNode(r)
|
||||||
|
this.Name = &v2
|
||||||
|
}
|
||||||
|
if r.Intn(10) != 0 {
|
||||||
|
v3 := uint64(r.Uint32())
|
||||||
|
this.Tsize = &v3
|
||||||
|
}
|
||||||
|
if !easy && r.Intn(10) != 0 {
|
||||||
|
this.XXX_unrecognized = randUnrecognizedNode(r, 4)
|
||||||
|
}
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewPopulatedPBNode(r randyNode, easy bool) *PBNode {
|
||||||
|
this := &PBNode{}
|
||||||
|
if r.Intn(10) != 0 {
|
||||||
|
v4 := r.Intn(10)
|
||||||
|
this.Links = make([]*PBLink, v4)
|
||||||
|
for i := 0; i < v4; i++ {
|
||||||
|
this.Links[i] = NewPopulatedPBLink(r, easy)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if r.Intn(10) != 0 {
|
||||||
|
v5 := r.Intn(100)
|
||||||
|
this.Data = make([]byte, v5)
|
||||||
|
for i := 0; i < v5; i++ {
|
||||||
|
this.Data[i] = byte(r.Intn(256))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if !easy && r.Intn(10) != 0 {
|
||||||
|
this.XXX_unrecognized = randUnrecognizedNode(r, 3)
|
||||||
|
}
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
type randyNode interface {
|
||||||
|
Float32() float32
|
||||||
|
Float64() float64
|
||||||
|
Int63() int64
|
||||||
|
Int31() int32
|
||||||
|
Uint32() uint32
|
||||||
|
Intn(n int) int
|
||||||
|
}
|
||||||
|
|
||||||
|
func randUTF8RuneNode(r randyNode) rune {
|
||||||
|
res := rune(r.Uint32() % 1112064)
|
||||||
|
if 55296 <= res {
|
||||||
|
res += 2047
|
||||||
|
}
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
func randStringNode(r randyNode) string {
|
||||||
|
v6 := r.Intn(100)
|
||||||
|
tmps := make([]rune, v6)
|
||||||
|
for i := 0; i < v6; i++ {
|
||||||
|
tmps[i] = randUTF8RuneNode(r)
|
||||||
|
}
|
||||||
|
return string(tmps)
|
||||||
|
}
|
||||||
|
func randUnrecognizedNode(r randyNode, maxFieldNumber int) (data []byte) {
|
||||||
|
l := r.Intn(5)
|
||||||
|
for i := 0; i < l; i++ {
|
||||||
|
wire := r.Intn(4)
|
||||||
|
if wire == 3 {
|
||||||
|
wire = 5
|
||||||
|
}
|
||||||
|
fieldNumber := maxFieldNumber + r.Intn(100)
|
||||||
|
data = randFieldNode(data, r, fieldNumber, wire)
|
||||||
|
}
|
||||||
|
return data
|
||||||
|
}
|
||||||
|
func randFieldNode(data []byte, r randyNode, fieldNumber int, wire int) []byte {
|
||||||
|
key := uint32(fieldNumber)<<3 | uint32(wire)
|
||||||
|
switch wire {
|
||||||
|
case 0:
|
||||||
|
data = encodeVarintPopulateNode(data, uint64(key))
|
||||||
|
v7 := r.Int63()
|
||||||
|
if r.Intn(2) == 0 {
|
||||||
|
v7 *= -1
|
||||||
|
}
|
||||||
|
data = encodeVarintPopulateNode(data, uint64(v7))
|
||||||
|
case 1:
|
||||||
|
data = encodeVarintPopulateNode(data, uint64(key))
|
||||||
|
data = append(data, byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)))
|
||||||
|
case 2:
|
||||||
|
data = encodeVarintPopulateNode(data, uint64(key))
|
||||||
|
ll := r.Intn(100)
|
||||||
|
data = encodeVarintPopulateNode(data, uint64(ll))
|
||||||
|
for j := 0; j < ll; j++ {
|
||||||
|
data = append(data, byte(r.Intn(256)))
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
data = encodeVarintPopulateNode(data, uint64(key))
|
||||||
|
data = append(data, byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)))
|
||||||
|
}
|
||||||
|
return data
|
||||||
|
}
|
||||||
|
func encodeVarintPopulateNode(data []byte, v uint64) []byte {
|
||||||
|
for v >= 1<<7 {
|
||||||
|
data = append(data, uint8(uint64(v)&0x7f|0x80))
|
||||||
|
v >>= 7
|
||||||
|
}
|
||||||
|
data = append(data, uint8(v))
|
||||||
|
return data
|
||||||
|
}
|
||||||
|
func (m *PBLink) Marshal() (data []byte, err error) {
|
||||||
|
size := m.Size()
|
||||||
|
data = make([]byte, size)
|
||||||
|
n, err := m.MarshalTo(data)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return data[:n], nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *PBLink) MarshalTo(data []byte) (n int, err error) {
|
||||||
|
var i int
|
||||||
|
_ = i
|
||||||
|
var l int
|
||||||
|
_ = l
|
||||||
|
if m.Hash != nil {
|
||||||
|
data[i] = 0xa
|
||||||
|
i++
|
||||||
|
i = encodeVarintNode(data, i, uint64(len(m.Hash)))
|
||||||
|
i += copy(data[i:], m.Hash)
|
||||||
|
}
|
||||||
|
if m.Name != nil {
|
||||||
|
data[i] = 0x12
|
||||||
|
i++
|
||||||
|
i = encodeVarintNode(data, i, uint64(len(*m.Name)))
|
||||||
|
i += copy(data[i:], *m.Name)
|
||||||
|
}
|
||||||
|
if m.Tsize != nil {
|
||||||
|
data[i] = 0x18
|
||||||
|
i++
|
||||||
|
i = encodeVarintNode(data, i, uint64(*m.Tsize))
|
||||||
|
}
|
||||||
|
if m.XXX_unrecognized != nil {
|
||||||
|
i += copy(data[i:], m.XXX_unrecognized)
|
||||||
|
}
|
||||||
|
return i, nil
|
||||||
|
}
|
||||||
|
func (m *PBNode) Marshal() (data []byte, err error) {
|
||||||
|
size := m.Size()
|
||||||
|
data = make([]byte, size)
|
||||||
|
n, err := m.MarshalTo(data)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return data[:n], nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *PBNode) MarshalTo(data []byte) (n int, err error) {
|
||||||
|
var i int
|
||||||
|
_ = i
|
||||||
|
var l int
|
||||||
|
_ = l
|
||||||
|
if len(m.Links) > 0 {
|
||||||
|
for _, msg := range m.Links {
|
||||||
|
data[i] = 0x12
|
||||||
|
i++
|
||||||
|
i = encodeVarintNode(data, i, uint64(msg.Size()))
|
||||||
|
n, err := msg.MarshalTo(data[i:])
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
i += n
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if m.Data != nil {
|
||||||
|
data[i] = 0xa
|
||||||
|
i++
|
||||||
|
i = encodeVarintNode(data, i, uint64(len(m.Data)))
|
||||||
|
i += copy(data[i:], m.Data)
|
||||||
|
}
|
||||||
|
if m.XXX_unrecognized != nil {
|
||||||
|
i += copy(data[i:], m.XXX_unrecognized)
|
||||||
|
}
|
||||||
|
return i, nil
|
||||||
|
}
|
||||||
|
func encodeFixed64Node(data []byte, offset int, v uint64) int {
|
||||||
|
data[offset] = uint8(v)
|
||||||
|
data[offset+1] = uint8(v >> 8)
|
||||||
|
data[offset+2] = uint8(v >> 16)
|
||||||
|
data[offset+3] = uint8(v >> 24)
|
||||||
|
data[offset+4] = uint8(v >> 32)
|
||||||
|
data[offset+5] = uint8(v >> 40)
|
||||||
|
data[offset+6] = uint8(v >> 48)
|
||||||
|
data[offset+7] = uint8(v >> 56)
|
||||||
|
return offset + 8
|
||||||
|
}
|
||||||
|
func encodeFixed32Node(data []byte, offset int, v uint32) int {
|
||||||
|
data[offset] = uint8(v)
|
||||||
|
data[offset+1] = uint8(v >> 8)
|
||||||
|
data[offset+2] = uint8(v >> 16)
|
||||||
|
data[offset+3] = uint8(v >> 24)
|
||||||
|
return offset + 4
|
||||||
|
}
|
||||||
|
func encodeVarintNode(data []byte, offset int, v uint64) int {
|
||||||
|
for v >= 1<<7 {
|
||||||
|
data[offset] = uint8(v&0x7f | 0x80)
|
||||||
|
v >>= 7
|
||||||
|
offset++
|
||||||
|
}
|
||||||
|
data[offset] = uint8(v)
|
||||||
|
return offset + 1
|
||||||
|
}
|
||||||
|
func (this *PBLink) GoString() string {
|
||||||
|
if this == nil {
|
||||||
|
return "nil"
|
||||||
|
}
|
||||||
|
s := strings1.Join([]string{`&merkledag.PBLink{` + `Hash:` + valueToGoStringNode(this.Hash, "byte"), `Name:` + valueToGoStringNode(this.Name, "string"), `Tsize:` + valueToGoStringNode(this.Tsize, "uint64"), `XXX_unrecognized:` + fmt1.Sprintf("%#v", this.XXX_unrecognized) + `}`}, ", ")
|
||||||
|
return s
|
||||||
|
}
|
||||||
|
func (this *PBNode) GoString() string {
|
||||||
|
if this == nil {
|
||||||
|
return "nil"
|
||||||
|
}
|
||||||
|
s := strings1.Join([]string{`&merkledag.PBNode{` + `Links:` + fmt1.Sprintf("%#v", this.Links), `Data:` + valueToGoStringNode(this.Data, "byte"), `XXX_unrecognized:` + fmt1.Sprintf("%#v", this.XXX_unrecognized) + `}`}, ", ")
|
||||||
|
return s
|
||||||
|
}
|
||||||
|
func valueToGoStringNode(v interface{}, typ string) string {
|
||||||
|
rv := reflect1.ValueOf(v)
|
||||||
|
if rv.IsNil() {
|
||||||
|
return "nil"
|
||||||
|
}
|
||||||
|
pv := reflect1.Indirect(rv).Interface()
|
||||||
|
return fmt1.Sprintf("func(v %v) *%v { return &v } ( %#v )", typ, typ, pv)
|
||||||
|
}
|
||||||
|
func extensionToGoStringNode(e map[int32]code_google_com_p_gogoprotobuf_proto1.Extension) string {
|
||||||
|
if e == nil {
|
||||||
|
return "nil"
|
||||||
|
}
|
||||||
|
s := "map[int32]proto.Extension{"
|
||||||
|
keys := make([]int, 0, len(e))
|
||||||
|
for k := range e {
|
||||||
|
keys = append(keys, int(k))
|
||||||
|
}
|
||||||
|
sort.Ints(keys)
|
||||||
|
ss := []string{}
|
||||||
|
for _, k := range keys {
|
||||||
|
ss = append(ss, strconv.Itoa(k)+": "+e[int32(k)].GoString())
|
||||||
|
}
|
||||||
|
s += strings1.Join(ss, ",") + "}"
|
||||||
|
return s
|
||||||
|
}
|
||||||
|
func (this *PBLink) VerboseEqual(that interface{}) error {
|
||||||
|
if that == nil {
|
||||||
|
if this == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return fmt2.Errorf("that == nil && this != nil")
|
||||||
|
}
|
||||||
|
|
||||||
|
that1, ok := that.(*PBLink)
|
||||||
|
if !ok {
|
||||||
|
return fmt2.Errorf("that is not of type *PBLink")
|
||||||
|
}
|
||||||
|
if that1 == nil {
|
||||||
|
if this == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return fmt2.Errorf("that is type *PBLink but is nil && this != nil")
|
||||||
|
} else if this == nil {
|
||||||
|
return fmt2.Errorf("that is type *PBLinkbut is not nil && this == nil")
|
||||||
|
}
|
||||||
|
if !bytes.Equal(this.Hash, that1.Hash) {
|
||||||
|
return fmt2.Errorf("Hash this(%v) Not Equal that(%v)", this.Hash, that1.Hash)
|
||||||
|
}
|
||||||
|
if this.Name != nil && that1.Name != nil {
|
||||||
|
if *this.Name != *that1.Name {
|
||||||
|
return fmt2.Errorf("Name this(%v) Not Equal that(%v)", *this.Name, *that1.Name)
|
||||||
|
}
|
||||||
|
} else if this.Name != nil {
|
||||||
|
return fmt2.Errorf("this.Name == nil && that.Name != nil")
|
||||||
|
} else if that1.Name != nil {
|
||||||
|
return fmt2.Errorf("Name this(%v) Not Equal that(%v)", this.Name, that1.Name)
|
||||||
|
}
|
||||||
|
if this.Tsize != nil && that1.Tsize != nil {
|
||||||
|
if *this.Tsize != *that1.Tsize {
|
||||||
|
return fmt2.Errorf("Tsize this(%v) Not Equal that(%v)", *this.Tsize, *that1.Tsize)
|
||||||
|
}
|
||||||
|
} else if this.Tsize != nil {
|
||||||
|
return fmt2.Errorf("this.Tsize == nil && that.Tsize != nil")
|
||||||
|
} else if that1.Tsize != nil {
|
||||||
|
return fmt2.Errorf("Tsize this(%v) Not Equal that(%v)", this.Tsize, that1.Tsize)
|
||||||
|
}
|
||||||
|
if !bytes.Equal(this.XXX_unrecognized, that1.XXX_unrecognized) {
|
||||||
|
return fmt2.Errorf("XXX_unrecognized this(%v) Not Equal that(%v)", this.XXX_unrecognized, that1.XXX_unrecognized)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
func (this *PBLink) Equal(that interface{}) bool {
|
||||||
|
if that == nil {
|
||||||
|
if this == nil {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
that1, ok := that.(*PBLink)
|
||||||
|
if !ok {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
if that1 == nil {
|
||||||
|
if this == nil {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
} else if this == nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
if !bytes.Equal(this.Hash, that1.Hash) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
if this.Name != nil && that1.Name != nil {
|
||||||
|
if *this.Name != *that1.Name {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
} else if this.Name != nil {
|
||||||
|
return false
|
||||||
|
} else if that1.Name != nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
if this.Tsize != nil && that1.Tsize != nil {
|
||||||
|
if *this.Tsize != *that1.Tsize {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
} else if this.Tsize != nil {
|
||||||
|
return false
|
||||||
|
} else if that1.Tsize != nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
if !bytes.Equal(this.XXX_unrecognized, that1.XXX_unrecognized) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
func (this *PBNode) VerboseEqual(that interface{}) error {
|
||||||
|
if that == nil {
|
||||||
|
if this == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return fmt2.Errorf("that == nil && this != nil")
|
||||||
|
}
|
||||||
|
|
||||||
|
that1, ok := that.(*PBNode)
|
||||||
|
if !ok {
|
||||||
|
return fmt2.Errorf("that is not of type *PBNode")
|
||||||
|
}
|
||||||
|
if that1 == nil {
|
||||||
|
if this == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return fmt2.Errorf("that is type *PBNode but is nil && this != nil")
|
||||||
|
} else if this == nil {
|
||||||
|
return fmt2.Errorf("that is type *PBNodebut is not nil && this == nil")
|
||||||
|
}
|
||||||
|
if len(this.Links) != len(that1.Links) {
|
||||||
|
return fmt2.Errorf("Links this(%v) Not Equal that(%v)", len(this.Links), len(that1.Links))
|
||||||
|
}
|
||||||
|
for i := range this.Links {
|
||||||
|
if !this.Links[i].Equal(that1.Links[i]) {
|
||||||
|
return fmt2.Errorf("Links this[%v](%v) Not Equal that[%v](%v)", i, this.Links[i], i, that1.Links[i])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if !bytes.Equal(this.Data, that1.Data) {
|
||||||
|
return fmt2.Errorf("Data this(%v) Not Equal that(%v)", this.Data, that1.Data)
|
||||||
|
}
|
||||||
|
if !bytes.Equal(this.XXX_unrecognized, that1.XXX_unrecognized) {
|
||||||
|
return fmt2.Errorf("XXX_unrecognized this(%v) Not Equal that(%v)", this.XXX_unrecognized, that1.XXX_unrecognized)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
func (this *PBNode) Equal(that interface{}) bool {
|
||||||
|
if that == nil {
|
||||||
|
if this == nil {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
that1, ok := that.(*PBNode)
|
||||||
|
if !ok {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
if that1 == nil {
|
||||||
|
if this == nil {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
} else if this == nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
if len(this.Links) != len(that1.Links) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
for i := range this.Links {
|
||||||
|
if !this.Links[i].Equal(that1.Links[i]) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if !bytes.Equal(this.Data, that1.Data) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
if !bytes.Equal(this.XXX_unrecognized, that1.XXX_unrecognized) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
472
merkledag/nodepb_test.go
Normal file
472
merkledag/nodepb_test.go
Normal file
@ -0,0 +1,472 @@
|
|||||||
|
// Code generated by protoc-gen-gogo.
|
||||||
|
// source: node.proto
|
||||||
|
// DO NOT EDIT!
|
||||||
|
|
||||||
|
/*
|
||||||
|
Package merkledag is a generated protocol buffer package.
|
||||||
|
|
||||||
|
It is generated from these files:
|
||||||
|
node.proto
|
||||||
|
|
||||||
|
It has these top-level messages:
|
||||||
|
PBLink
|
||||||
|
PBNode
|
||||||
|
*/
|
||||||
|
package merkledag
|
||||||
|
|
||||||
|
import testing "testing"
|
||||||
|
import math_rand "math/rand"
|
||||||
|
import time "time"
|
||||||
|
import code_google_com_p_gogoprotobuf_proto "code.google.com/p/gogoprotobuf/proto"
|
||||||
|
import testing1 "testing"
|
||||||
|
import math_rand1 "math/rand"
|
||||||
|
import time1 "time"
|
||||||
|
import encoding_json "encoding/json"
|
||||||
|
import testing2 "testing"
|
||||||
|
import math_rand2 "math/rand"
|
||||||
|
import time2 "time"
|
||||||
|
import code_google_com_p_gogoprotobuf_proto1 "code.google.com/p/gogoprotobuf/proto"
|
||||||
|
import math_rand3 "math/rand"
|
||||||
|
import time3 "time"
|
||||||
|
import testing3 "testing"
|
||||||
|
import fmt "fmt"
|
||||||
|
import math_rand4 "math/rand"
|
||||||
|
import time4 "time"
|
||||||
|
import testing4 "testing"
|
||||||
|
import code_google_com_p_gogoprotobuf_proto2 "code.google.com/p/gogoprotobuf/proto"
|
||||||
|
import math_rand5 "math/rand"
|
||||||
|
import time5 "time"
|
||||||
|
import testing5 "testing"
|
||||||
|
import fmt1 "fmt"
|
||||||
|
import go_parser "go/parser"
|
||||||
|
import math_rand6 "math/rand"
|
||||||
|
import time6 "time"
|
||||||
|
import testing6 "testing"
|
||||||
|
import code_google_com_p_gogoprotobuf_proto3 "code.google.com/p/gogoprotobuf/proto"
|
||||||
|
|
||||||
|
func TestPBLinkProto(t *testing.T) {
|
||||||
|
popr := math_rand.New(math_rand.NewSource(time.Now().UnixNano()))
|
||||||
|
p := NewPopulatedPBLink(popr, false)
|
||||||
|
data, err := code_google_com_p_gogoprotobuf_proto.Marshal(p)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
msg := &PBLink{}
|
||||||
|
if err := code_google_com_p_gogoprotobuf_proto.Unmarshal(data, msg); err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
for i := range data {
|
||||||
|
data[i] = byte(popr.Intn(256))
|
||||||
|
}
|
||||||
|
if err := p.VerboseEqual(msg); err != nil {
|
||||||
|
t.Fatalf("%#v !VerboseProto %#v, since %v", msg, p, err)
|
||||||
|
}
|
||||||
|
if !p.Equal(msg) {
|
||||||
|
t.Fatalf("%#v !Proto %#v", msg, p)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPBLinkMarshalTo(t *testing.T) {
|
||||||
|
popr := math_rand.New(math_rand.NewSource(time.Now().UnixNano()))
|
||||||
|
p := NewPopulatedPBLink(popr, false)
|
||||||
|
size := p.Size()
|
||||||
|
data := make([]byte, size)
|
||||||
|
for i := range data {
|
||||||
|
data[i] = byte(popr.Intn(256))
|
||||||
|
}
|
||||||
|
_, err := p.MarshalTo(data)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
msg := &PBLink{}
|
||||||
|
if err := code_google_com_p_gogoprotobuf_proto.Unmarshal(data, msg); err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
for i := range data {
|
||||||
|
data[i] = byte(popr.Intn(256))
|
||||||
|
}
|
||||||
|
if err := p.VerboseEqual(msg); err != nil {
|
||||||
|
t.Fatalf("%#v !VerboseProto %#v, since %v", msg, p, err)
|
||||||
|
}
|
||||||
|
if !p.Equal(msg) {
|
||||||
|
t.Fatalf("%#v !Proto %#v", msg, p)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func BenchmarkPBLinkProtoMarshal(b *testing.B) {
|
||||||
|
popr := math_rand.New(math_rand.NewSource(616))
|
||||||
|
total := 0
|
||||||
|
pops := make([]*PBLink, 10000)
|
||||||
|
for i := 0; i < 10000; i++ {
|
||||||
|
pops[i] = NewPopulatedPBLink(popr, false)
|
||||||
|
}
|
||||||
|
b.ResetTimer()
|
||||||
|
for i := 0; i < b.N; i++ {
|
||||||
|
data, err := code_google_com_p_gogoprotobuf_proto.Marshal(pops[i%10000])
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
total += len(data)
|
||||||
|
}
|
||||||
|
b.SetBytes(int64(total / b.N))
|
||||||
|
}
|
||||||
|
|
||||||
|
func BenchmarkPBLinkProtoUnmarshal(b *testing.B) {
|
||||||
|
popr := math_rand.New(math_rand.NewSource(616))
|
||||||
|
total := 0
|
||||||
|
datas := make([][]byte, 10000)
|
||||||
|
for i := 0; i < 10000; i++ {
|
||||||
|
data, err := code_google_com_p_gogoprotobuf_proto.Marshal(NewPopulatedPBLink(popr, false))
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
datas[i] = data
|
||||||
|
}
|
||||||
|
msg := &PBLink{}
|
||||||
|
b.ResetTimer()
|
||||||
|
for i := 0; i < b.N; i++ {
|
||||||
|
total += len(datas[i%10000])
|
||||||
|
if err := code_google_com_p_gogoprotobuf_proto.Unmarshal(datas[i%10000], msg); err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
b.SetBytes(int64(total / b.N))
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPBNodeProto(t *testing.T) {
|
||||||
|
popr := math_rand.New(math_rand.NewSource(time.Now().UnixNano()))
|
||||||
|
p := NewPopulatedPBNode(popr, false)
|
||||||
|
data, err := code_google_com_p_gogoprotobuf_proto.Marshal(p)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
msg := &PBNode{}
|
||||||
|
if err := code_google_com_p_gogoprotobuf_proto.Unmarshal(data, msg); err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
for i := range data {
|
||||||
|
data[i] = byte(popr.Intn(256))
|
||||||
|
}
|
||||||
|
if err := p.VerboseEqual(msg); err != nil {
|
||||||
|
t.Fatalf("%#v !VerboseProto %#v, since %v", msg, p, err)
|
||||||
|
}
|
||||||
|
if !p.Equal(msg) {
|
||||||
|
t.Fatalf("%#v !Proto %#v", msg, p)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPBNodeMarshalTo(t *testing.T) {
|
||||||
|
popr := math_rand.New(math_rand.NewSource(time.Now().UnixNano()))
|
||||||
|
p := NewPopulatedPBNode(popr, false)
|
||||||
|
size := p.Size()
|
||||||
|
data := make([]byte, size)
|
||||||
|
for i := range data {
|
||||||
|
data[i] = byte(popr.Intn(256))
|
||||||
|
}
|
||||||
|
_, err := p.MarshalTo(data)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
msg := &PBNode{}
|
||||||
|
if err := code_google_com_p_gogoprotobuf_proto.Unmarshal(data, msg); err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
for i := range data {
|
||||||
|
data[i] = byte(popr.Intn(256))
|
||||||
|
}
|
||||||
|
if err := p.VerboseEqual(msg); err != nil {
|
||||||
|
t.Fatalf("%#v !VerboseProto %#v, since %v", msg, p, err)
|
||||||
|
}
|
||||||
|
if !p.Equal(msg) {
|
||||||
|
t.Fatalf("%#v !Proto %#v", msg, p)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func BenchmarkPBNodeProtoMarshal(b *testing.B) {
|
||||||
|
popr := math_rand.New(math_rand.NewSource(616))
|
||||||
|
total := 0
|
||||||
|
pops := make([]*PBNode, 10000)
|
||||||
|
for i := 0; i < 10000; i++ {
|
||||||
|
pops[i] = NewPopulatedPBNode(popr, false)
|
||||||
|
}
|
||||||
|
b.ResetTimer()
|
||||||
|
for i := 0; i < b.N; i++ {
|
||||||
|
data, err := code_google_com_p_gogoprotobuf_proto.Marshal(pops[i%10000])
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
total += len(data)
|
||||||
|
}
|
||||||
|
b.SetBytes(int64(total / b.N))
|
||||||
|
}
|
||||||
|
|
||||||
|
func BenchmarkPBNodeProtoUnmarshal(b *testing.B) {
|
||||||
|
popr := math_rand.New(math_rand.NewSource(616))
|
||||||
|
total := 0
|
||||||
|
datas := make([][]byte, 10000)
|
||||||
|
for i := 0; i < 10000; i++ {
|
||||||
|
data, err := code_google_com_p_gogoprotobuf_proto.Marshal(NewPopulatedPBNode(popr, false))
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
datas[i] = data
|
||||||
|
}
|
||||||
|
msg := &PBNode{}
|
||||||
|
b.ResetTimer()
|
||||||
|
for i := 0; i < b.N; i++ {
|
||||||
|
total += len(datas[i%10000])
|
||||||
|
if err := code_google_com_p_gogoprotobuf_proto.Unmarshal(datas[i%10000], msg); err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
b.SetBytes(int64(total / b.N))
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPBLinkJSON(t *testing1.T) {
|
||||||
|
popr := math_rand1.New(math_rand1.NewSource(time1.Now().UnixNano()))
|
||||||
|
p := NewPopulatedPBLink(popr, true)
|
||||||
|
jsondata, err := encoding_json.Marshal(p)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
msg := &PBLink{}
|
||||||
|
err = encoding_json.Unmarshal(jsondata, msg)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
if err := p.VerboseEqual(msg); err != nil {
|
||||||
|
t.Fatalf("%#v !VerboseProto %#v, since %v", msg, p, err)
|
||||||
|
}
|
||||||
|
if !p.Equal(msg) {
|
||||||
|
t.Fatalf("%#v !Json Equal %#v", msg, p)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
func TestPBNodeJSON(t *testing1.T) {
|
||||||
|
popr := math_rand1.New(math_rand1.NewSource(time1.Now().UnixNano()))
|
||||||
|
p := NewPopulatedPBNode(popr, true)
|
||||||
|
jsondata, err := encoding_json.Marshal(p)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
msg := &PBNode{}
|
||||||
|
err = encoding_json.Unmarshal(jsondata, msg)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
if err := p.VerboseEqual(msg); err != nil {
|
||||||
|
t.Fatalf("%#v !VerboseProto %#v, since %v", msg, p, err)
|
||||||
|
}
|
||||||
|
if !p.Equal(msg) {
|
||||||
|
t.Fatalf("%#v !Json Equal %#v", msg, p)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
func TestPBLinkProtoText(t *testing2.T) {
|
||||||
|
popr := math_rand2.New(math_rand2.NewSource(time2.Now().UnixNano()))
|
||||||
|
p := NewPopulatedPBLink(popr, true)
|
||||||
|
data := code_google_com_p_gogoprotobuf_proto1.MarshalTextString(p)
|
||||||
|
msg := &PBLink{}
|
||||||
|
if err := code_google_com_p_gogoprotobuf_proto1.UnmarshalText(data, msg); err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
if err := p.VerboseEqual(msg); err != nil {
|
||||||
|
t.Fatalf("%#v !VerboseProto %#v, since %v", msg, p, err)
|
||||||
|
}
|
||||||
|
if !p.Equal(msg) {
|
||||||
|
t.Fatalf("%#v !Proto %#v", msg, p)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPBLinkProtoCompactText(t *testing2.T) {
|
||||||
|
popr := math_rand2.New(math_rand2.NewSource(time2.Now().UnixNano()))
|
||||||
|
p := NewPopulatedPBLink(popr, true)
|
||||||
|
data := code_google_com_p_gogoprotobuf_proto1.CompactTextString(p)
|
||||||
|
msg := &PBLink{}
|
||||||
|
if err := code_google_com_p_gogoprotobuf_proto1.UnmarshalText(data, msg); err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
if err := p.VerboseEqual(msg); err != nil {
|
||||||
|
t.Fatalf("%#v !VerboseProto %#v, since %v", msg, p, err)
|
||||||
|
}
|
||||||
|
if !p.Equal(msg) {
|
||||||
|
t.Fatalf("%#v !Proto %#v", msg, p)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPBNodeProtoText(t *testing2.T) {
|
||||||
|
popr := math_rand2.New(math_rand2.NewSource(time2.Now().UnixNano()))
|
||||||
|
p := NewPopulatedPBNode(popr, true)
|
||||||
|
data := code_google_com_p_gogoprotobuf_proto1.MarshalTextString(p)
|
||||||
|
msg := &PBNode{}
|
||||||
|
if err := code_google_com_p_gogoprotobuf_proto1.UnmarshalText(data, msg); err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
if err := p.VerboseEqual(msg); err != nil {
|
||||||
|
t.Fatalf("%#v !VerboseProto %#v, since %v", msg, p, err)
|
||||||
|
}
|
||||||
|
if !p.Equal(msg) {
|
||||||
|
t.Fatalf("%#v !Proto %#v", msg, p)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPBNodeProtoCompactText(t *testing2.T) {
|
||||||
|
popr := math_rand2.New(math_rand2.NewSource(time2.Now().UnixNano()))
|
||||||
|
p := NewPopulatedPBNode(popr, true)
|
||||||
|
data := code_google_com_p_gogoprotobuf_proto1.CompactTextString(p)
|
||||||
|
msg := &PBNode{}
|
||||||
|
if err := code_google_com_p_gogoprotobuf_proto1.UnmarshalText(data, msg); err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
if err := p.VerboseEqual(msg); err != nil {
|
||||||
|
t.Fatalf("%#v !VerboseProto %#v, since %v", msg, p, err)
|
||||||
|
}
|
||||||
|
if !p.Equal(msg) {
|
||||||
|
t.Fatalf("%#v !Proto %#v", msg, p)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPBLinkStringer(t *testing3.T) {
|
||||||
|
popr := math_rand3.New(math_rand3.NewSource(time3.Now().UnixNano()))
|
||||||
|
p := NewPopulatedPBLink(popr, false)
|
||||||
|
s1 := p.String()
|
||||||
|
s2 := fmt.Sprintf("%v", p)
|
||||||
|
if s1 != s2 {
|
||||||
|
t.Fatalf("String want %v got %v", s1, s2)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
func TestPBNodeStringer(t *testing3.T) {
|
||||||
|
popr := math_rand3.New(math_rand3.NewSource(time3.Now().UnixNano()))
|
||||||
|
p := NewPopulatedPBNode(popr, false)
|
||||||
|
s1 := p.String()
|
||||||
|
s2 := fmt.Sprintf("%v", p)
|
||||||
|
if s1 != s2 {
|
||||||
|
t.Fatalf("String want %v got %v", s1, s2)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
func TestPBLinkSize(t *testing4.T) {
|
||||||
|
popr := math_rand4.New(math_rand4.NewSource(time4.Now().UnixNano()))
|
||||||
|
p := NewPopulatedPBLink(popr, true)
|
||||||
|
size2 := code_google_com_p_gogoprotobuf_proto2.Size(p)
|
||||||
|
data, err := code_google_com_p_gogoprotobuf_proto2.Marshal(p)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
size := p.Size()
|
||||||
|
if len(data) != size {
|
||||||
|
t.Fatalf("size %v != marshalled size %v", size, len(data))
|
||||||
|
}
|
||||||
|
if size2 != size {
|
||||||
|
t.Fatalf("size %v != before marshal proto.Size %v", size, size2)
|
||||||
|
}
|
||||||
|
size3 := code_google_com_p_gogoprotobuf_proto2.Size(p)
|
||||||
|
if size3 != size {
|
||||||
|
t.Fatalf("size %v != after marshal proto.Size %v", size, size3)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func BenchmarkPBLinkSize(b *testing4.B) {
|
||||||
|
popr := math_rand4.New(math_rand4.NewSource(616))
|
||||||
|
total := 0
|
||||||
|
pops := make([]*PBLink, 1000)
|
||||||
|
for i := 0; i < 1000; i++ {
|
||||||
|
pops[i] = NewPopulatedPBLink(popr, false)
|
||||||
|
}
|
||||||
|
b.ResetTimer()
|
||||||
|
for i := 0; i < b.N; i++ {
|
||||||
|
total += pops[i%1000].Size()
|
||||||
|
}
|
||||||
|
b.SetBytes(int64(total / b.N))
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPBNodeSize(t *testing4.T) {
|
||||||
|
popr := math_rand4.New(math_rand4.NewSource(time4.Now().UnixNano()))
|
||||||
|
p := NewPopulatedPBNode(popr, true)
|
||||||
|
size2 := code_google_com_p_gogoprotobuf_proto2.Size(p)
|
||||||
|
data, err := code_google_com_p_gogoprotobuf_proto2.Marshal(p)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
size := p.Size()
|
||||||
|
if len(data) != size {
|
||||||
|
t.Fatalf("size %v != marshalled size %v", size, len(data))
|
||||||
|
}
|
||||||
|
if size2 != size {
|
||||||
|
t.Fatalf("size %v != before marshal proto.Size %v", size, size2)
|
||||||
|
}
|
||||||
|
size3 := code_google_com_p_gogoprotobuf_proto2.Size(p)
|
||||||
|
if size3 != size {
|
||||||
|
t.Fatalf("size %v != after marshal proto.Size %v", size, size3)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func BenchmarkPBNodeSize(b *testing4.B) {
|
||||||
|
popr := math_rand4.New(math_rand4.NewSource(616))
|
||||||
|
total := 0
|
||||||
|
pops := make([]*PBNode, 1000)
|
||||||
|
for i := 0; i < 1000; i++ {
|
||||||
|
pops[i] = NewPopulatedPBNode(popr, false)
|
||||||
|
}
|
||||||
|
b.ResetTimer()
|
||||||
|
for i := 0; i < b.N; i++ {
|
||||||
|
total += pops[i%1000].Size()
|
||||||
|
}
|
||||||
|
b.SetBytes(int64(total / b.N))
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPBLinkGoString(t *testing5.T) {
|
||||||
|
popr := math_rand5.New(math_rand5.NewSource(time5.Now().UnixNano()))
|
||||||
|
p := NewPopulatedPBLink(popr, false)
|
||||||
|
s1 := p.GoString()
|
||||||
|
s2 := fmt1.Sprintf("%#v", p)
|
||||||
|
if s1 != s2 {
|
||||||
|
t.Fatalf("GoString want %v got %v", s1, s2)
|
||||||
|
}
|
||||||
|
_, err := go_parser.ParseExpr(s1)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
func TestPBNodeGoString(t *testing5.T) {
|
||||||
|
popr := math_rand5.New(math_rand5.NewSource(time5.Now().UnixNano()))
|
||||||
|
p := NewPopulatedPBNode(popr, false)
|
||||||
|
s1 := p.GoString()
|
||||||
|
s2 := fmt1.Sprintf("%#v", p)
|
||||||
|
if s1 != s2 {
|
||||||
|
t.Fatalf("GoString want %v got %v", s1, s2)
|
||||||
|
}
|
||||||
|
_, err := go_parser.ParseExpr(s1)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
func TestPBLinkVerboseEqual(t *testing6.T) {
|
||||||
|
popr := math_rand6.New(math_rand6.NewSource(time6.Now().UnixNano()))
|
||||||
|
p := NewPopulatedPBLink(popr, false)
|
||||||
|
data, err := code_google_com_p_gogoprotobuf_proto3.Marshal(p)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
msg := &PBLink{}
|
||||||
|
if err := code_google_com_p_gogoprotobuf_proto3.Unmarshal(data, msg); err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
if err := p.VerboseEqual(msg); err != nil {
|
||||||
|
t.Fatalf("%#v !VerboseEqual %#v, since %v", msg, p, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
func TestPBNodeVerboseEqual(t *testing6.T) {
|
||||||
|
popr := math_rand6.New(math_rand6.NewSource(time6.Now().UnixNano()))
|
||||||
|
p := NewPopulatedPBNode(popr, false)
|
||||||
|
data, err := code_google_com_p_gogoprotobuf_proto3.Marshal(p)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
msg := &PBNode{}
|
||||||
|
if err := code_google_com_p_gogoprotobuf_proto3.Unmarshal(data, msg); err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
if err := p.VerboseEqual(msg); err != nil {
|
||||||
|
t.Fatalf("%#v !VerboseEqual %#v, since %v", msg, p, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//These tests are generated by code.google.com/p/gogoprotobuf/plugin/testgen
|
Reference in New Issue
Block a user