func TestV1DataVersioningBiggerToEmpty(t *testing.T) { //expTwoSet := CapnpEncode("(mylist = [(val = 27, duo = 26),(val = 42, duo = 41)])", "HoldsVerTwoDataList") //expOneDataOneDefault := CapnpEncode("(mylist = [(val = 27, duo = 0),(val = 42, duo = 0)])", "HoldsVerTwoDataList") //expTwoEmpty := CapnpEncode("(mylist = [(),()])", "HoldsVerTwoDataList") //expEmpty := CapnpEncode("(mylist = [(),()])", "HoldsVerEmptyList") //expOne := CapnpEncode("(mylist = [(val = 27),(val = 42)])", "HoldsVerOneDataList") cv.Convey("Given a struct with 0 data/0 ptr fields, and a newer version of the struct with 2 data fields", t, func() { cv.Convey("then reading serialized bigger-struct-list into the smaller (empty or one data-member) list should work, truncating/ignoring the new fields", func() { seg := capn.NewBuffer(nil) scratch := capn.NewBuffer(nil) holder := air.NewRootHoldsVerTwoDataList(seg) twolist := air.NewVerTwoDataList(scratch, 2) plist := capn.PointerList(twolist) d0 := air.NewVerTwoData(scratch) d0.SetVal(27) d0.SetDuo(26) d1 := air.NewVerTwoData(scratch) d1.SetVal(42) d1.SetDuo(41) plist.Set(0, capn.Object(d0)) plist.Set(1, capn.Object(d1)) holder.SetMylist(twolist) ShowSeg(" before serializing out, segment scratch is:", scratch) ShowSeg(" before serializing out, segment seg is:", seg) // serialize out buf := bytes.Buffer{} seg.WriteTo(&buf) segbytes := buf.Bytes() // and read-back in using smaller expectations reseg, _, err := capn.ReadFromMemoryZeroCopy(segbytes) if err != nil { panic(err) } ShowSeg(" after re-reading segbytes, segment reseg is:", reseg) fmt.Printf("segbytes decoded by capnp as HoldsVerEmptyList: '%s'\n", string(CapnpDecode(segbytes, "HoldsVerEmptyList"))) fmt.Printf("segbytes decoded by capnp as HoldsVerOneDataList: '%s'\n", string(CapnpDecode(segbytes, "HoldsVerOneDataList"))) fmt.Printf("segbytes decoded by capnp as HoldsVerTwoDataList: '%s'\n", string(CapnpDecode(segbytes, "HoldsVerTwoDataList"))) reHolder := air.ReadRootHoldsVerEmptyList(reseg) elist := reHolder.Mylist() lene := elist.Len() cv.So(lene, cv.ShouldEqual, 2) reHolder1 := air.ReadRootHoldsVerOneDataList(reseg) onelist := reHolder1.Mylist() lenone := onelist.Len() cv.So(lenone, cv.ShouldEqual, 2) for i := 0; i < 2; i++ { ele := onelist.At(i) val := ele.Val() cv.So(val, cv.ShouldEqual, twolist.At(i).Val()) } reHolder2 := air.ReadRootHoldsVerTwoDataList(reseg) twolist2 := reHolder2.Mylist() lentwo2 := twolist2.Len() cv.So(lentwo2, cv.ShouldEqual, 2) for i := 0; i < 2; i++ { ele := twolist2.At(i) val := ele.Val() duo := ele.Duo() cv.So(val, cv.ShouldEqual, twolist.At(i).Val()) cv.So(duo, cv.ShouldEqual, twolist.At(i).Duo()) } }) }) }
func TestDataVersioningZeroPointersToTwo(t *testing.T) { cv.Convey("Given a struct with 2 ptr fields, and another version of the struct with 0 or 1 pointer fields", t, func() { cv.Convey("then reading serialized bigger-struct-list into the smaller (empty or one data-pointer) list should work, truncating/ignoring the new fields", func() { seg := capn.NewBuffer(nil) scratch := capn.NewBuffer(nil) holder := air.NewRootHoldsVerTwoTwoList(seg) twolist := air.NewVerTwoDataTwoPtrList(scratch, 2) plist := capn.PointerList(twolist) d0 := air.NewVerTwoDataTwoPtr(scratch) d0.SetVal(27) d0.SetDuo(26) v1 := air.NewVerOneData(scratch) v1.SetVal(25) v2 := air.NewVerOneData(scratch) v2.SetVal(23) d0.SetPtr1(v1) d0.SetPtr2(v2) d1 := air.NewVerTwoDataTwoPtr(scratch) d1.SetVal(42) d1.SetDuo(41) w1 := air.NewVerOneData(scratch) w1.SetVal(40) w2 := air.NewVerOneData(scratch) w2.SetVal(38) d1.SetPtr1(w1) d1.SetPtr2(w2) plist.Set(0, capn.Object(d0)) plist.Set(1, capn.Object(d1)) holder.SetMylist(twolist) ShowSeg(" before serializing out, segment scratch is:", scratch) ShowSeg(" before serializing out, segment seg is:", seg) // serialize out buf := bytes.Buffer{} seg.WriteTo(&buf) segbytes := buf.Bytes() // and read-back in using smaller expectations reseg, _, err := capn.ReadFromMemoryZeroCopy(segbytes) if err != nil { panic(err) } ShowSeg(" after re-reading segbytes, segment reseg is:", reseg) fmt.Printf("segbytes decoded by capnp as HoldsVerEmptyList: '%s'\n", string(CapnpDecode(segbytes, "HoldsVerEmptyList"))) fmt.Printf("segbytes decoded by capnp as HoldsVerOnePtrList: '%s'\n", string(CapnpDecode(segbytes, "HoldsVerOnePtrList"))) fmt.Printf("segbytes decoded by capnp as HoldsVerTwoTwoList: '%s'\n", string(CapnpDecode(segbytes, "HoldsVerTwoTwoList"))) reHolder := air.ReadRootHoldsVerEmptyList(reseg) elist := reHolder.Mylist() lene := elist.Len() cv.So(lene, cv.ShouldEqual, 2) reHolder1 := air.ReadRootHoldsVerOnePtrList(reseg) onelist := reHolder1.Mylist() lenone := onelist.Len() cv.So(lenone, cv.ShouldEqual, 2) for i := 0; i < 2; i++ { ele := onelist.At(i) ptr1 := ele.Ptr() cv.So(ptr1.Val(), cv.ShouldEqual, twolist.At(i).Ptr1().Val()) } reHolder2 := air.ReadRootHoldsVerTwoTwoPlus(reseg) twolist2 := reHolder2.Mylist() lentwo2 := twolist2.Len() cv.So(lentwo2, cv.ShouldEqual, 2) for i := 0; i < 2; i++ { ele := twolist2.At(i) ptr1 := ele.Ptr1() ptr2 := ele.Ptr2() cv.So(ptr1.Val(), cv.ShouldEqual, twolist.At(i).Ptr1().Val()) //cv.So(ptr1.Duo(), cv.ShouldEqual, twolist.At(i).Ptr1().Duo()) cv.So(ptr2.Val(), cv.ShouldEqual, twolist.At(i).Ptr2().Val()) //cv.So(ptr2.Duo(), cv.ShouldEqual, twolist.At(i).Ptr2().Duo()) cv.So(ele.Tre(), cv.ShouldEqual, 0) cv.So(ele.Lst3().Len(), cv.ShouldEqual, 0) } }) }) }