Skip to content

Commit

Permalink
Merge pull request #159 from onflow/bastian/custom-debug-comparator
Browse files Browse the repository at this point in the history
Use custom comparator when comparing values, don't assume deep equality
  • Loading branch information
fxamacker authored Oct 6, 2021
2 parents 7789897 + 7571d7a commit e695bb5
Show file tree
Hide file tree
Showing 6 changed files with 261 additions and 61 deletions.
62 changes: 53 additions & 9 deletions array_debug.go
Original file line number Diff line number Diff line change
Expand Up @@ -374,6 +374,7 @@ func ValidArraySerialization(
cborEncMode cbor.EncMode,
decodeStorable StorableDecoder,
decodeTypeInfo TypeInfoDecoder,
compare StorableComparator,
) error {
return validArraySlabSerialization(
a.Storage,
Expand All @@ -382,6 +383,7 @@ func ValidArraySerialization(
cborEncMode,
decodeStorable,
decodeTypeInfo,
compare,
)
}

Expand All @@ -392,6 +394,7 @@ func validArraySlabSerialization(
cborEncMode cbor.EncMode,
decodeStorable StorableDecoder,
decodeTypeInfo TypeInfoDecoder,
compare StorableComparator,
) error {

slab, err := getArraySlab(storage, id)
Expand Down Expand Up @@ -448,7 +451,16 @@ func validArraySlabSerialization(
}

// Compare slabs
err = arrayDataSlabEqual(dataSlab, decodedDataSlab, storage, cborDecMode, cborEncMode, decodeStorable, decodeTypeInfo)
err = arrayDataSlabEqual(
dataSlab,
decodedDataSlab,
storage,
cborDecMode,
cborEncMode,
decodeStorable,
decodeTypeInfo,
compare,
)
if err != nil {
return fmt.Errorf("data slab %d round-trip serialization failed: %w", id, err)
}
Expand All @@ -474,7 +486,15 @@ func validArraySlabSerialization(

for _, h := range metaSlab.childrenHeaders {
// Verify child slabs
err = validArraySlabSerialization(storage, h.id, cborDecMode, cborEncMode, decodeStorable, decodeTypeInfo)
err = validArraySlabSerialization(
storage,
h.id,
cborDecMode,
cborEncMode,
decodeStorable,
decodeTypeInfo,
compare,
)
if err != nil {
return err
}
Expand All @@ -491,6 +511,7 @@ func arrayDataSlabEqual(
cborEncMode cbor.EncMode,
decodeStorable StorableDecoder,
decodeTypeInfo TypeInfoDecoder,
compare StorableComparator,
) error {

// Compare extra data
Expand Down Expand Up @@ -518,7 +539,7 @@ func arrayDataSlabEqual(
for i := 0; i < len(expected.elements); i++ {
ee := expected.elements[i]
ae := actual.elements[i]
if !reflect.DeepEqual(ee, ae) {
if !compare(ee, ae) {
return fmt.Errorf("element %d %+v is wrong, want %+v", i, ae, ee)
}

Expand All @@ -530,7 +551,14 @@ func arrayDataSlabEqual(
return err
}

return ValidValueSerialization(ev, cborDecMode, cborEncMode, decodeStorable, decodeTypeInfo)
return ValidValueSerialization(
ev,
cborDecMode,
cborEncMode,
decodeStorable,
decodeTypeInfo,
compare,
)
}
}

Expand Down Expand Up @@ -603,13 +631,29 @@ func ValidValueSerialization(
cborDecMode cbor.DecMode,
cborEncMode cbor.EncMode,
decodeStorable StorableDecoder,
decodeTypeInfo TypeInfoDecoder) error {
decodeTypeInfo TypeInfoDecoder,
compare StorableComparator,
) error {

switch v := value.(type) {
case (*Array):
return ValidArraySerialization(v, cborDecMode, cborEncMode, decodeStorable, decodeTypeInfo)
case (*OrderedMap):
return ValidMapSerialization(v, cborDecMode, cborEncMode, decodeStorable, decodeTypeInfo)
case *Array:
return ValidArraySerialization(
v,
cborDecMode,
cborEncMode,
decodeStorable,
decodeTypeInfo,
compare,
)
case *OrderedMap:
return ValidMapSerialization(
v,
cborDecMode,
cborEncMode,
decodeStorable,
decodeTypeInfo,
compare,
)
}
return nil
}
4 changes: 4 additions & 0 deletions array_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import (
"fmt"
"math"
"math/rand"
"reflect"
"testing"
"time"

Expand Down Expand Up @@ -3104,5 +3105,8 @@ func validArraySerialization(array *Array, storage *PersistentSlabStorage) error
storage.cborEncMode,
storage.DecodeStorable,
storage.DecodeTypeInfo,
func(a, b Storable) bool {
return reflect.DeepEqual(a, b)
},
)
}
Loading

0 comments on commit e695bb5

Please sign in to comment.