Rewrote serialization
							parent
							
								
									1eb6479169
								
							
						
					
					
						commit
						7314c74087
					
				| @ -0,0 +1,38 @@ | ||||
| package graphvent | ||||
| 
 | ||||
| import ( | ||||
| 	badger "github.com/dgraph-io/badger/v3" | ||||
| ) | ||||
| 
 | ||||
| func WriteNodeInit(ctx *Context, node *Node) error { | ||||
|   return ctx.DB.Update(func(db *badger.Txn) error { | ||||
|     // Write node private key
 | ||||
|     // Write node type
 | ||||
|     // Write Node buffer size
 | ||||
|     // Write node extension list
 | ||||
|     // For each extension:
 | ||||
|       // Write each extension's current value
 | ||||
|     return nil | ||||
|   }) | ||||
| } | ||||
| 
 | ||||
| func WriteNodeChanges(ctx *Context, node *Node, changes map[ExtType]Changes) error { | ||||
|   return ctx.DB.Update(func(db *badger.Txn) error { | ||||
|     // Write the signal queue if it needs to be written
 | ||||
|     // For each ext in changes
 | ||||
|       // Write each change
 | ||||
|     return nil | ||||
|   }) | ||||
| } | ||||
| 
 | ||||
| func LoadNode(ctx *Context, id NodeID) (*Node, error) { | ||||
|   err := ctx.DB.Update(func(db *badger.Txn) error { | ||||
|     return nil | ||||
|   }) | ||||
| 
 | ||||
|   if err != nil { | ||||
|     return nil, err | ||||
|   } | ||||
| 
 | ||||
|   return nil, nil | ||||
| }  | ||||
| @ -0,0 +1,200 @@ | ||||
| package graphvent | ||||
| 
 | ||||
| import ( | ||||
|   "testing" | ||||
|   "reflect" | ||||
|   "github.com/google/uuid" | ||||
| ) | ||||
| 
 | ||||
| func testTypeStack[T any](t *testing.T, ctx *Context) { | ||||
|   reflect_type := reflect.TypeFor[T]() | ||||
|   stack, err := TypeStack(ctx, reflect_type) | ||||
|   fatalErr(t, err) | ||||
| 
 | ||||
|   ctx.Log.Logf("test", "TypeStack[%s]: %+v", reflect_type, stack) | ||||
| 
 | ||||
|   unwrapped_type, rest, err := UnwrapStack(ctx, stack) | ||||
|   fatalErr(t, err) | ||||
| 
 | ||||
|   if len(rest) != 0 { | ||||
|     t.Errorf("Types remaining after unwrapping %s: %+v", unwrapped_type, stack) | ||||
|   } | ||||
| 
 | ||||
|   if unwrapped_type != reflect_type { | ||||
|     t.Errorf("Unwrapped type[%+v] doesn't match original[%+v]", unwrapped_type, reflect_type) | ||||
|   } | ||||
| 
 | ||||
|   ctx.Log.Logf("test", "Unwrapped type[%s]: %s", reflect_type, reflect_type) | ||||
| } | ||||
| 
 | ||||
| func TestSerializeTypes(t *testing.T) { | ||||
|   ctx := logTestContext(t, []string{"test"}) | ||||
| 
 | ||||
|   testTypeStack[int](t, ctx) | ||||
|   testTypeStack[map[int]string](t, ctx) | ||||
|   testTypeStack[string](t, ctx) | ||||
|   testTypeStack[*string](t, ctx) | ||||
|   testTypeStack[*map[string]*map[*string]int](t, ctx) | ||||
|   testTypeStack[[5]int](t, ctx) | ||||
|   testTypeStack[uuid.UUID](t, ctx) | ||||
|   testTypeStack[NodeID](t, ctx) | ||||
| } | ||||
| 
 | ||||
| func testSerializeCompare[T comparable](t *testing.T, ctx *Context, value T) { | ||||
|   serialized, err := SerializeValue(ctx, reflect.ValueOf(value)) | ||||
|   fatalErr(t, err) | ||||
| 
 | ||||
|   ctx.Log.Logf("test", "Serialized Value[%s : %+v]: %+v", reflect.TypeFor[T](), value, serialized) | ||||
| 
 | ||||
|   deserialized, left, err := DeserializeValue(ctx, serialized, reflect.TypeFor[T]()) | ||||
|   fatalErr(t, err) | ||||
| 
 | ||||
|   if len(left) != 0 { | ||||
|     t.Fatalf("Data left after deserialize[%+v]: %+v", deserialized, left) | ||||
|   } | ||||
| 
 | ||||
|   if reflect.TypeFor[T]() != deserialized.Type() { | ||||
|     t.Fatalf("Type mismatch after deserialize %s != %s", reflect.TypeFor[T](), deserialized.Type()) | ||||
|   } | ||||
| 
 | ||||
|   val, ok := deserialized.Interface().(T) | ||||
|   if ok == false { | ||||
|     t.Fatalf("Deserialized type[%s] can't cast to type %s", deserialized.Type(), reflect.TypeFor[T]()) | ||||
|   } | ||||
| 
 | ||||
|   if value != val { | ||||
|     t.Fatalf("Deserialized value[%+v] doesn't match original[%+v]", value, deserialized) | ||||
|   } | ||||
| 
 | ||||
|   ctx.Log.Logf("test", "Deserialized Value[%+v]: %+v", value, val) | ||||
| } | ||||
| 
 | ||||
| func testSerializeList[L []T, T comparable](t *testing.T, ctx *Context, value L) { | ||||
|   serialized, err := SerializeValue(ctx, reflect.ValueOf(value)) | ||||
|   fatalErr(t, err) | ||||
| 
 | ||||
|   ctx.Log.Logf("test", "Serialized Value[%s : %+v]: %+v", reflect.TypeFor[L](), value, serialized) | ||||
| 
 | ||||
|   deserialized, left, err := DeserializeValue(ctx, serialized, reflect.TypeFor[L]()) | ||||
|   fatalErr(t, err) | ||||
| 
 | ||||
|   if len(left) != 0 { | ||||
|     t.Fatalf("Data left after deserialize[%+v]: %+v", deserialized, left) | ||||
|   } | ||||
| 
 | ||||
|   if reflect.TypeFor[L]() != deserialized.Type() { | ||||
|     t.Fatalf("Type mismatch after deserialize %s != %s", reflect.TypeFor[L](), deserialized.Type()) | ||||
|   } | ||||
| 
 | ||||
|   val, ok := deserialized.Interface().(L) | ||||
|   if ok == false { | ||||
|     t.Fatalf("Deserialized type[%s] can't cast to type %s", deserialized.Type(), reflect.TypeFor[L]()) | ||||
|   } | ||||
| 
 | ||||
|   for i, item := range(value) { | ||||
|     if item != val[i] { | ||||
|       t.Fatalf("Deserialized list %+v does not match original %+v", value, val) | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   ctx.Log.Logf("test", "Deserialized Value[%+v]: %+v", value, val) | ||||
| } | ||||
| 
 | ||||
| func testSerializePointer[P interface {*T}, T comparable](t *testing.T, ctx *Context, value P) { | ||||
|   serialized, err := SerializeValue(ctx, reflect.ValueOf(value)) | ||||
|   fatalErr(t, err) | ||||
| 
 | ||||
|   ctx.Log.Logf("test", "Serialized Value[%s : %+v]: %+v", reflect.TypeFor[P](), value, serialized) | ||||
| 
 | ||||
|   deserialized, left, err := DeserializeValue(ctx, serialized, reflect.TypeFor[P]()) | ||||
|   fatalErr(t, err) | ||||
| 
 | ||||
|   if len(left) != 0 { | ||||
|     t.Fatalf("Data left after deserialize[%+v]: %+v", deserialized, left) | ||||
|   } | ||||
| 
 | ||||
|   if reflect.TypeFor[P]() != deserialized.Type() { | ||||
|     t.Fatalf("Type mismatch after deserialize %s != %s", reflect.TypeFor[P](), deserialized.Type()) | ||||
|   } | ||||
| 
 | ||||
|   val, ok := deserialized.Interface().(P) | ||||
|   if ok == false { | ||||
|     t.Fatalf("Deserialized type[%s] can't cast to type %s", deserialized.Type(), reflect.TypeFor[P]()) | ||||
|   } | ||||
| 
 | ||||
|   if value == nil && val == nil { | ||||
|     ctx.Log.Logf("test", "Deserialized nil") | ||||
|   } else if value == nil { | ||||
|     t.Fatalf("Non-nil value[%+v] returned for nil value", val) | ||||
|   } else if val == nil { | ||||
|     t.Fatalf("Nil value returned for non-nil value[%+v]", value) | ||||
|   } else if *val != *value { | ||||
|     t.Fatalf("Deserialized value[%+v] doesn't match original[%+v]", value, deserialized) | ||||
|   } else { | ||||
|     ctx.Log.Logf("test", "Deserialized Value[%+v]: %+v", *value, *val) | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| func testSerialize[T any](t *testing.T, ctx *Context, value T) { | ||||
|   serialized, err := SerializeValue(ctx, reflect.ValueOf(value)) | ||||
|   fatalErr(t, err) | ||||
| 
 | ||||
|   ctx.Log.Logf("test", "Serialized Value[%s : %+v]: %+v", reflect.TypeFor[T](), value, serialized) | ||||
| 
 | ||||
|   deserialized, left, err := DeserializeValue(ctx, serialized, reflect.TypeFor[T]()) | ||||
|   fatalErr(t, err) | ||||
| 
 | ||||
|   if len(left) != 0 { | ||||
|     t.Fatalf("Data left after deserialize[%+v]: %+v", deserialized, left) | ||||
|   } | ||||
| 
 | ||||
|   if reflect.TypeFor[T]() != deserialized.Type() { | ||||
|     t.Fatalf("Type mismatch after deserialize %s != %s", reflect.TypeFor[T](), deserialized.Type()) | ||||
|   } | ||||
| 
 | ||||
|   val, ok := deserialized.Interface().(T) | ||||
|   if ok == false { | ||||
|     t.Fatalf("Deserialized type[%s] can't cast to type %s", deserialized.Type(), reflect.TypeFor[T]()) | ||||
|   } | ||||
| 
 | ||||
|   ctx.Log.Logf("test", "Deserialized Value[%+v]: %+v", value, val) | ||||
| } | ||||
| 
 | ||||
| func TestSerializeValues(t *testing.T) { | ||||
|   ctx := logTestContext(t, []string{"test"}) | ||||
| 
 | ||||
|   testSerializeCompare[int8](t, ctx, -64) | ||||
|   testSerializeCompare[int16](t, ctx, -64) | ||||
|   testSerializeCompare[int32](t, ctx, -64) | ||||
|   testSerializeCompare[int64](t, ctx, -64) | ||||
|   testSerializeCompare[int](t, ctx, -64) | ||||
| 
 | ||||
|   testSerializeCompare[uint8](t, ctx, 64) | ||||
|   testSerializeCompare[uint16](t, ctx, 64) | ||||
|   testSerializeCompare[uint32](t, ctx, 64) | ||||
|   testSerializeCompare[uint64](t, ctx, 64) | ||||
|   testSerializeCompare[uint](t, ctx, 64) | ||||
| 
 | ||||
|   testSerializeCompare[string](t, ctx, "test") | ||||
| 
 | ||||
|   a := 12 | ||||
|   testSerializePointer[*int](t, ctx, &a) | ||||
| 
 | ||||
|   b := "test" | ||||
|   testSerializePointer[*string](t, ctx, nil) | ||||
|   testSerializePointer[*string](t, ctx, &b) | ||||
| 
 | ||||
|   testSerializeList(t, ctx, []int{1, 2, 3, 4, 5}) | ||||
| 
 | ||||
|   testSerializeCompare[bool](t, ctx, true) | ||||
|   testSerializeCompare[bool](t, ctx, false) | ||||
|   testSerializeCompare[int](t, ctx, -1) | ||||
|   testSerializeCompare[uint](t, ctx, 1) | ||||
|   testSerializeCompare[NodeID](t, ctx, RandID()) | ||||
|   testSerializeCompare[*int](t, ctx, nil) | ||||
|   testSerializeCompare(t, ctx, "string") | ||||
| 
 | ||||
|   node, err := NewNode(ctx, nil, "Base", 100) | ||||
|   fatalErr(t, err) | ||||
|   testSerialize(t, ctx, node) | ||||
| } | ||||
		Loading…
	
		Reference in New Issue