package indexes import ( "bytes" "io" "testing" "lol.mleku.dev/chk" "next.orly.dev/pkg/database/indexes/types" "next.orly.dev/pkg/utils" ) // TestNewPrefix tests the NewPrefix function with and without arguments func TestNewPrefix(t *testing.T) { // Test with no arguments (default prefix) defaultPrefix := NewPrefix() if len(defaultPrefix.Bytes()) != 3 { t.Errorf( "Default prefix should be 3 bytes, got %d", len(defaultPrefix.Bytes()), ) } // Test with a valid prefix index validPrefix := NewPrefix(Event) if string(validPrefix.Bytes()) != string(EventPrefix) { t.Errorf("Expected prefix %q, got %q", EventPrefix, validPrefix.Bytes()) } // Test with an invalid prefix index (should panic) defer func() { if r := recover(); r == nil { t.Errorf("NewPrefix should panic with invalid prefix index") } }() _ = NewPrefix(-1) // This should panic } // TestPrefixMethods tests the methods of the P struct func TestPrefixMethods(t *testing.T) { // Create a prefix prefix := NewPrefix(Event) // Test Bytes method if !utils.FastEqual(prefix.Bytes(), []byte(EventPrefix)) { t.Errorf( "Bytes method returned %v, expected %v", prefix.Bytes(), []byte(EventPrefix), ) } // Test MarshalWrite method buf := new(bytes.Buffer) err := prefix.MarshalWrite(buf) if chk.E(err) { t.Fatalf("MarshalWrite failed: %v", err) } if !utils.FastEqual(buf.Bytes(), []byte(EventPrefix)) { t.Errorf( "MarshalWrite wrote %v, expected %v", buf.Bytes(), []byte(EventPrefix), ) } // Test UnmarshalRead method newPrefix := &P{} err = newPrefix.UnmarshalRead(bytes.NewBuffer(buf.Bytes())) if chk.E(err) { t.Fatalf("UnmarshalRead failed: %v", err) } if !utils.FastEqual(newPrefix.Bytes(), []byte(EventPrefix)) { t.Errorf( "UnmarshalRead read %v, expected %v", newPrefix.Bytes(), []byte(EventPrefix), ) } } // TestPrefixFunction tests the Prefix function func TestPrefixFunction(t *testing.T) { testCases := []struct { name string index int expected I }{ {"Event", Event, EventPrefix}, {"ID", Id, IdPrefix}, {"FullIdPubkey", FullIdPubkey, FullIdPubkeyPrefix}, {"Pubkey", Pubkey, PubkeyPrefix}, {"CreatedAt", CreatedAt, CreatedAtPrefix}, {"TagPubkey", TagPubkey, TagPubkeyPrefix}, {"Tag", Tag, TagPrefix}, {"Kind", Kind, KindPrefix}, {"KindPubkey", KindPubkey, KindPubkeyPrefix}, {"TagKind", TagKind, TagKindPrefix}, { "TagKindPubkey", TagKindPubkey, TagKindPubkeyPrefix, }, {"Invalid", -1, ""}, } for _, tc := range testCases { t.Run( tc.name, func(t *testing.T) { result := Prefix(tc.index) if result != tc.expected { t.Errorf( "Prefix(%d) = %q, expected %q", tc.index, result, tc.expected, ) } }, ) } } // TestIdentify tests the Identify function func TestIdentify(t *testing.T) { testCases := []struct { name string prefix I expected int }{ {"Event", EventPrefix, Event}, {"ID", IdPrefix, Id}, {"FullIdPubkey", FullIdPubkeyPrefix, FullIdPubkey}, {"Pubkey", PubkeyPrefix, Pubkey}, {"CreatedAt", CreatedAtPrefix, CreatedAt}, {"TagPubkey", TagPubkeyPrefix, TagPubkey}, {"Tag", TagPrefix, Tag}, {"Kind", KindPrefix, Kind}, {"KindPubkey", KindPubkeyPrefix, KindPubkey}, {"TagKind", TagKindPrefix, TagKind}, { "TagKindPubkey", TagKindPubkeyPrefix, TagKindPubkey, }, } for _, tc := range testCases { t.Run( tc.name, func(t *testing.T) { result, err := Identify(bytes.NewReader([]byte(tc.prefix))) if chk.E(err) { t.Fatalf("Identify failed: %v", err) } if result != tc.expected { t.Errorf( "Identify(%q) = %d, expected %d", tc.prefix, result, tc.expected, ) } }, ) } // Test with invalid data t.Run( "Invalid", func(t *testing.T) { result, err := Identify(bytes.NewReader([]byte("xyz"))) if chk.E(err) { t.Fatalf("Identify failed: %v", err) } if result != 0 { t.Errorf( "Identify with invalid prefix should return 0, got %d", result, ) } }, ) // Test with error from reader t.Run( "ReaderError", func(t *testing.T) { errReader := &errorReader{} result, err := Identify(errReader) if err == nil { t.Errorf("Identify should return error with failing reader") } if result != -1 { t.Errorf( "Identify with reader error should return -1, got %d", result, ) } }, ) } // errorReader is a mock reader that always returns an error type errorReader struct{} func (e *errorReader) Read(p []byte) (n int, err error) { return 0, io.ErrUnexpectedEOF } // TestTStruct tests the T struct and its methods func TestTStruct(t *testing.T) { // Create some test encoders prefix := NewPrefix(Event) ser := new(types.Uint40) ser.Set(12345) // Test New function enc := New(prefix, ser) if len(enc.Encs) != 2 { t.Errorf("New should create T with 2 encoders, got %d", len(enc.Encs)) } // Test MarshalWrite buf := new(bytes.Buffer) err := enc.MarshalWrite(buf) if chk.E(err) { t.Fatalf("MarshalWrite failed: %v", err) } // Test UnmarshalRead dec := New(NewPrefix(), new(types.Uint40)) err = dec.UnmarshalRead(bytes.NewBuffer(buf.Bytes())) if chk.E(err) { t.Fatalf("UnmarshalRead failed: %v", err) } // Verify the decoded values decodedPrefix := dec.Encs[0].(*P) decodedSer := dec.Encs[1].(*types.Uint40) if !utils.FastEqual(decodedPrefix.Bytes(), prefix.Bytes()) { t.Errorf( "Decoded prefix %v, expected %v", decodedPrefix.Bytes(), prefix.Bytes(), ) } if decodedSer.Get() != ser.Get() { t.Errorf("Decoded serial %d, expected %d", decodedSer.Get(), ser.Get()) } // Test with nil encoder encWithNil := New(prefix, nil, ser) buf.Reset() err = encWithNil.MarshalWrite(buf) if chk.E(err) { t.Fatalf("MarshalWrite with nil encoder failed: %v", err) } } // TestEventFunctions tests the Event-related functions func TestEventFunctions(t *testing.T) { // Test EventVars ser := EventVars() if ser == nil { t.Fatalf("EventVars should return non-nil *types.Uint40") } // Set a value ser.Set(12345) // Test EventEnc enc := EventEnc(ser) if len(enc.Encs) != 2 { t.Errorf( "EventEnc should create T with 2 encoders, got %d", len(enc.Encs), ) } // Test EventDec dec := EventDec(ser) if len(dec.Encs) != 2 { t.Errorf( "EventDec should create T with 2 encoders, got %d", len(dec.Encs), ) } // Test marshaling and unmarshaling buf := new(bytes.Buffer) err := enc.MarshalWrite(buf) if chk.E(err) { t.Fatalf("MarshalWrite failed: %v", err) } // Create new variables for decoding newSer := new(types.Uint40) newDec := EventDec(newSer) err = newDec.UnmarshalRead(bytes.NewBuffer(buf.Bytes())) if chk.E(err) { t.Fatalf("UnmarshalRead failed: %v", err) } // Verify the decoded value if newSer.Get() != ser.Get() { t.Errorf("Decoded serial %d, expected %d", newSer.Get(), ser.Get()) } } // TestIdFunctions tests the Id-related functions func TestIdFunctions(t *testing.T) { // Test IdVars id, ser := IdVars() if id == nil || ser == nil { t.Fatalf("IdVars should return non-nil *types.IdHash and *types.Uint40") } // Set values id.Set([]byte{1, 2, 3, 4, 5, 6, 7, 8}) ser.Set(12345) // Test IdEnc enc := IdEnc(id, ser) if len(enc.Encs) != 3 { t.Errorf("IdEnc should create T with 3 encoders, got %d", len(enc.Encs)) } // Test IdDec dec := IdDec(id, ser) if len(dec.Encs) != 3 { t.Errorf("IdDec should create T with 3 encoders, got %d", len(dec.Encs)) } // Test marshaling and unmarshaling buf := new(bytes.Buffer) err := enc.MarshalWrite(buf) if chk.E(err) { t.Fatalf("MarshalWrite failed: %v", err) } // Create new variables for decoding newId, newSer := IdVars() newDec := IdDec(newId, newSer) err = newDec.UnmarshalRead(bytes.NewBuffer(buf.Bytes())) if chk.E(err) { t.Fatalf("UnmarshalRead failed: %v", err) } // Verify the decoded values if !utils.FastEqual(newId.Bytes(), id.Bytes()) { t.Errorf("Decoded id %v, expected %v", newId.Bytes(), id.Bytes()) } if newSer.Get() != ser.Get() { t.Errorf("Decoded serial %d, expected %d", newSer.Get(), ser.Get()) } } // TestIdPubkeyFunctions tests the FullIdPubkey-related functions func TestIdPubkeyFunctions(t *testing.T) { // Test FullIdPubkeyVars ser, fid, p, ca := FullIdPubkeyVars() if ser == nil || fid == nil || p == nil || ca == nil { t.Fatalf("FullIdPubkeyVars should return non-nil values") } // Set values ser.Set(12345) err := fid.FromId( []byte{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, }, ) if chk.E(err) { t.Fatalf("FromId failed: %v", err) } err = p.FromPubkey( []byte{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, }, ) if chk.E(err) { t.Fatalf("FromPubkey failed: %v", err) } ca.Set(98765) // Test FullIdPubkeyEnc enc := FullIdPubkeyEnc(ser, fid, p, ca) if len(enc.Encs) != 5 { t.Errorf( "FullIdPubkeyEnc should create T with 5 encoders, got %d", len(enc.Encs), ) } // Test FullIdPubkeyDec dec := FullIdPubkeyDec(ser, fid, p, ca) if len(dec.Encs) != 5 { t.Errorf( "FullIdPubkeyDec should create T with 5 encoders, got %d", len(dec.Encs), ) } // Test marshaling and unmarshaling buf := new(bytes.Buffer) err = enc.MarshalWrite(buf) if chk.E(err) { t.Fatalf("MarshalWrite failed: %v", err) } // Create new variables for decoding newSer, newFid, newP, newCa := FullIdPubkeyVars() newDec := FullIdPubkeyDec(newSer, newFid, newP, newCa) err = newDec.UnmarshalRead(bytes.NewBuffer(buf.Bytes())) if chk.E(err) { t.Fatalf("UnmarshalRead failed: %v", err) } // Verify the decoded values if newSer.Get() != ser.Get() { t.Errorf("Decoded serial %d, expected %d", newSer.Get(), ser.Get()) } if !utils.FastEqual(newFid.Bytes(), fid.Bytes()) { t.Errorf("Decoded id %v, expected %v", newFid.Bytes(), fid.Bytes()) } if !utils.FastEqual(newP.Bytes(), p.Bytes()) { t.Errorf("Decoded pubkey hash %v, expected %v", newP.Bytes(), p.Bytes()) } if newCa.Get() != ca.Get() { t.Errorf("Decoded created at %d, expected %d", newCa.Get(), ca.Get()) } } // TestCreatedAtFunctions tests the CreatedAt-related functions func TestCreatedAtFunctions(t *testing.T) { // Test CreatedAtVars ca, ser := CreatedAtVars() if ca == nil || ser == nil { t.Fatalf("CreatedAtVars should return non-nil values") } // Set values ca.Set(98765) ser.Set(12345) // Test CreatedAtEnc enc := CreatedAtEnc(ca, ser) if len(enc.Encs) != 3 { t.Errorf( "CreatedAtEnc should create T with 3 encoders, got %d", len(enc.Encs), ) } // Test CreatedAtDec dec := CreatedAtDec(ca, ser) if len(dec.Encs) != 3 { t.Errorf( "CreatedAtDec should create T with 3 encoders, got %d", len(dec.Encs), ) } // Test marshaling and unmarshaling buf := new(bytes.Buffer) err := enc.MarshalWrite(buf) if chk.E(err) { t.Fatalf("MarshalWrite failed: %v", err) } // Create new variables for decoding newCa, newSer := CreatedAtVars() newDec := CreatedAtDec(newCa, newSer) err = newDec.UnmarshalRead(bytes.NewBuffer(buf.Bytes())) if chk.E(err) { t.Fatalf("UnmarshalRead failed: %v", err) } // Verify the decoded values if newCa.Get() != ca.Get() { t.Errorf("Decoded created at %d, expected %d", newCa.Get(), ca.Get()) } if newSer.Get() != ser.Get() { t.Errorf("Decoded serial %d, expected %d", newSer.Get(), ser.Get()) } } // TestPubkeyFunctions tests the Pubkey-related functions func TestPubkeyFunctions(t *testing.T) { // Test PubkeyVars p, ca, ser := PubkeyVars() if p == nil || ca == nil || ser == nil { t.Fatalf("PubkeyVars should return non-nil values") } // Set values err := p.FromPubkey( []byte{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, }, ) if chk.E(err) { t.Fatalf("FromPubkey failed: %v", err) } ca.Set(98765) ser.Set(12345) // Test PubkeyEnc enc := PubkeyEnc(p, ca, ser) if len(enc.Encs) != 4 { t.Errorf( "PubkeyEnc should create T with 4 encoders, got %d", len(enc.Encs), ) } // Test PubkeyDec dec := PubkeyDec(p, ca, ser) if len(dec.Encs) != 4 { t.Errorf( "PubkeyDec should create T with 4 encoders, got %d", len(dec.Encs), ) } // Test marshaling and unmarshaling buf := new(bytes.Buffer) err = enc.MarshalWrite(buf) if chk.E(err) { t.Fatalf("MarshalWrite failed: %v", err) } // Create new variables for decoding newP, newCa, newSer := PubkeyVars() newDec := PubkeyDec(newP, newCa, newSer) err = newDec.UnmarshalRead(bytes.NewBuffer(buf.Bytes())) if chk.E(err) { t.Fatalf("UnmarshalRead failed: %v", err) } // Verify the decoded values if !utils.FastEqual(newP.Bytes(), p.Bytes()) { t.Errorf("Decoded pubkey hash %v, expected %v", newP.Bytes(), p.Bytes()) } if newCa.Get() != ca.Get() { t.Errorf("Decoded created at %d, expected %d", newCa.Get(), ca.Get()) } if newSer.Get() != ser.Get() { t.Errorf("Decoded serial %d, expected %d", newSer.Get(), ser.Get()) } } // TestPubkeyTagFunctions tests the TagPubkey-related functions func TestPubkeyTagFunctions(t *testing.T) { // Test TagPubkeyVars k, v, p, ca, ser := TagPubkeyVars() if p == nil || k == nil || v == nil || ca == nil || ser == nil { t.Fatalf("TagPubkeyVars should return non-nil values") } // Set values err := p.FromPubkey( []byte{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, }, ) if chk.E(err) { t.Fatalf("FromPubkey failed: %v", err) } k.Set('e') v.FromIdent([]byte("test-value")) if chk.E(err) { t.Fatalf("FromIdent failed: %v", err) } ca.Set(98765) ser.Set(12345) // Test TagPubkeyEnc enc := TagPubkeyEnc(k, v, p, ca, ser) if len(enc.Encs) != 6 { t.Errorf( "TagPubkeyEnc should create T with 6 encoders, got %d", len(enc.Encs), ) } // Test TagPubkeyDec dec := TagPubkeyDec(k, v, p, ca, ser) if len(dec.Encs) != 6 { t.Errorf( "TagPubkeyDec should create T with 6 encoders, got %d", len(dec.Encs), ) } // Test marshaling and unmarshaling buf := new(bytes.Buffer) err = enc.MarshalWrite(buf) if chk.E(err) { t.Fatalf("MarshalWrite failed: %v", err) } // Create new variables for decoding newK, newV, newP, newCa, newSer := TagPubkeyVars() newDec := TagPubkeyDec(newK, newV, newP, newCa, newSer) err = newDec.UnmarshalRead(bytes.NewBuffer(buf.Bytes())) if chk.E(err) { t.Fatalf("UnmarshalRead failed: %v", err) } // Verify the decoded values if !utils.FastEqual(newP.Bytes(), p.Bytes()) { t.Errorf("Decoded pubkey hash %v, expected %v", newP.Bytes(), p.Bytes()) } if newK.Letter() != k.Letter() { t.Errorf( "Decoded key letter %c, expected %c", newK.Letter(), k.Letter(), ) } if !utils.FastEqual(newV.Bytes(), v.Bytes()) { t.Errorf("Decoded value hash %v, expected %v", newV.Bytes(), v.Bytes()) } if newCa.Get() != ca.Get() { t.Errorf("Decoded created at %d, expected %d", newCa.Get(), ca.Get()) } if newSer.Get() != ser.Get() { t.Errorf("Decoded serial %d, expected %d", newSer.Get(), ser.Get()) } } // TestTagFunctions tests the Tag-related functions func TestTagFunctions(t *testing.T) { var err error // Test TagVars k, v, ca, ser := TagVars() if k == nil || v == nil || ca == nil || ser == nil { t.Fatalf("TagVars should return non-nil values") } // Set values k.Set('e') v.FromIdent([]byte("test-value")) if chk.E(err) { t.Fatalf("FromIdent failed: %v", err) } ca.Set(98765) ser.Set(12345) // Test TagEnc enc := TagEnc(k, v, ca, ser) if len(enc.Encs) != 5 { t.Errorf( "TagEnc should create T with 5 encoders, got %d", len(enc.Encs), ) } // Test TagDec dec := TagDec(k, v, ca, ser) if len(dec.Encs) != 5 { t.Errorf( "TagDec should create T with 5 encoders, got %d", len(dec.Encs), ) } // Test marshaling and unmarshaling buf := new(bytes.Buffer) err = enc.MarshalWrite(buf) if chk.E(err) { t.Fatalf("MarshalWrite failed: %v", err) } // Create new variables for decoding newK, newV, newCa, newSer := TagVars() newDec := TagDec(newK, newV, newCa, newSer) err = newDec.UnmarshalRead(bytes.NewBuffer(buf.Bytes())) if chk.E(err) { t.Fatalf("UnmarshalRead failed: %v", err) } // Verify the decoded values if newK.Letter() != k.Letter() { t.Errorf( "Decoded key letter %c, expected %c", newK.Letter(), k.Letter(), ) } if !utils.FastEqual(newV.Bytes(), v.Bytes()) { t.Errorf("Decoded value hash %v, expected %v", newV.Bytes(), v.Bytes()) } if newCa.Get() != ca.Get() { t.Errorf("Decoded created at %d, expected %d", newCa.Get(), ca.Get()) } if newSer.Get() != ser.Get() { t.Errorf("Decoded serial %d, expected %d", newSer.Get(), ser.Get()) } } // TestKindFunctions tests the Kind-related functions func TestKindFunctions(t *testing.T) { // Test KindVars ki, ca, ser := KindVars() if ki == nil || ca == nil || ser == nil { t.Fatalf("KindVars should return non-nil values") } // Set values ki.Set(1234) ca.Set(98765) ser.Set(12345) // Test KindEnc enc := KindEnc(ki, ca, ser) if len(enc.Encs) != 4 { t.Errorf( "KindEnc should create T with 4 encoders, got %d", len(enc.Encs), ) } // Test KindDec dec := KindDec(ki, ca, ser) if len(dec.Encs) != 4 { t.Errorf( "KindDec should create T with 4 encoders, got %d", len(dec.Encs), ) } // Test marshaling and unmarshaling buf := new(bytes.Buffer) err := enc.MarshalWrite(buf) if chk.E(err) { t.Fatalf("MarshalWrite failed: %v", err) } // Create new variables for decoding newKi, newCa, newSer := KindVars() newDec := KindDec(newKi, newCa, newSer) err = newDec.UnmarshalRead(bytes.NewBuffer(buf.Bytes())) if chk.E(err) { t.Fatalf("UnmarshalRead failed: %v", err) } // Verify the decoded values if newKi.Get() != ki.Get() { t.Errorf("Decoded kind %d, expected %d", newKi.Get(), ki.Get()) } if newCa.Get() != ca.Get() { t.Errorf("Decoded created at %d, expected %d", newCa.Get(), ca.Get()) } if newSer.Get() != ser.Get() { t.Errorf("Decoded serial %d, expected %d", newSer.Get(), ser.Get()) } } // TestKindTagFunctions tests the TagKind-related functions func TestKindTagFunctions(t *testing.T) { var err error // Test TagKindVars k, v, ki, ca, ser := TagKindVars() if ki == nil || k == nil || v == nil || ca == nil || ser == nil { t.Fatalf("TagKindVars should return non-nil values") } // Set values ki.Set(1234) k.Set('e') v.FromIdent([]byte("test-value")) if chk.E(err) { t.Fatalf("FromIdent failed: %v", err) } ca.Set(98765) ser.Set(12345) // Test TagKindEnc enc := TagKindEnc(k, v, ki, ca, ser) if len(enc.Encs) != 6 { t.Errorf( "TagKindEnc should create T with 6 encoders, got %d", len(enc.Encs), ) } // Test TagKindDec dec := TagKindDec(k, v, ki, ca, ser) if len(dec.Encs) != 6 { t.Errorf( "TagKindDec should create T with 6 encoders, got %d", len(dec.Encs), ) } // Test marshaling and unmarshaling buf := new(bytes.Buffer) err = enc.MarshalWrite(buf) if chk.E(err) { t.Fatalf("MarshalWrite failed: %v", err) } // Create new variables for decoding newK, newV, newKi, newCa, newSer := TagKindVars() newDec := TagKindDec(newK, newV, newKi, newCa, newSer) err = newDec.UnmarshalRead(bytes.NewBuffer(buf.Bytes())) if chk.E(err) { t.Fatalf("UnmarshalRead failed: %v", err) } // Verify the decoded values if newKi.Get() != ki.Get() { t.Errorf("Decoded kind %d, expected %d", newKi.Get(), ki.Get()) } if newK.Letter() != k.Letter() { t.Errorf( "Decoded key letter %c, expected %c", newK.Letter(), k.Letter(), ) } if !utils.FastEqual(newV.Bytes(), v.Bytes()) { t.Errorf("Decoded value hash %v, expected %v", newV.Bytes(), v.Bytes()) } if newCa.Get() != ca.Get() { t.Errorf("Decoded created at %d, expected %d", newCa.Get(), ca.Get()) } if newSer.Get() != ser.Get() { t.Errorf("Decoded serial %d, expected %d", newSer.Get(), ser.Get()) } } // TestKindPubkeyFunctions tests the KindPubkey-related functions func TestKindPubkeyFunctions(t *testing.T) { // Test KindPubkeyVars ki, p, ca, ser := KindPubkeyVars() if ki == nil || p == nil || ca == nil || ser == nil { t.Fatalf("KindPubkeyVars should return non-nil values") } // Set values ki.Set(1234) err := p.FromPubkey( []byte{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, }, ) if chk.E(err) { t.Fatalf("FromPubkey failed: %v", err) } ca.Set(98765) ser.Set(12345) // Test KindPubkeyEnc enc := KindPubkeyEnc(ki, p, ca, ser) if len(enc.Encs) != 5 { t.Errorf( "KindPubkeyEnc should create T with 5 encoders, got %d", len(enc.Encs), ) } // Test KindPubkeyDec dec := KindPubkeyDec(ki, p, ca, ser) if len(dec.Encs) != 5 { t.Errorf( "KindPubkeyDec should create T with 5 encoders, got %d", len(dec.Encs), ) } // Test marshaling and unmarshaling buf := new(bytes.Buffer) err = enc.MarshalWrite(buf) if chk.E(err) { t.Fatalf("MarshalWrite failed: %v", err) } // Create new variables for decoding newKi, newP, newCa, newSer := KindPubkeyVars() newDec := KindPubkeyDec(newKi, newP, newCa, newSer) err = newDec.UnmarshalRead(bytes.NewBuffer(buf.Bytes())) if chk.E(err) { t.Fatalf("UnmarshalRead failed: %v", err) } // Verify the decoded values if newKi.Get() != ki.Get() { t.Errorf("Decoded kind %d, expected %d", newKi.Get(), ki.Get()) } if !utils.FastEqual(newP.Bytes(), p.Bytes()) { t.Errorf("Decoded pubkey hash %v, expected %v", newP.Bytes(), p.Bytes()) } if newCa.Get() != ca.Get() { t.Errorf("Decoded created at %d, expected %d", newCa.Get(), ca.Get()) } if newSer.Get() != ser.Get() { t.Errorf("Decoded serial %d, expected %d", newSer.Get(), ser.Get()) } } // TestKindPubkeyTagFunctions tests the TagKindPubkey-related functions func TestKindPubkeyTagFunctions(t *testing.T) { // Test TagKindPubkeyVars k, v, ki, p, ca, ser := TagKindPubkeyVars() if ki == nil || p == nil || k == nil || v == nil || ca == nil || ser == nil { t.Fatalf("TagKindPubkeyVars should return non-nil values") } // Set values ki.Set(1234) err := p.FromPubkey( []byte{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, }, ) if chk.E(err) { t.Fatalf("FromPubkey failed: %v", err) } k.Set('e') v.FromIdent([]byte("test-value")) if chk.E(err) { t.Fatalf("FromIdent failed: %v", err) } ca.Set(98765) ser.Set(12345) // Test TagKindPubkeyEnc enc := TagKindPubkeyEnc(k, v, ki, p, ca, ser) if len(enc.Encs) != 7 { t.Errorf( "TagKindPubkeyEnc should create T with 7 encoders, got %d", len(enc.Encs), ) } // Test TagKindPubkeyDec dec := TagKindPubkeyDec(k, v, ki, p, ca, ser) if len(dec.Encs) != 7 { t.Errorf( "TagKindPubkeyDec should create T with 7 encoders, got %d", len(dec.Encs), ) } // Test marshaling and unmarshaling buf := new(bytes.Buffer) err = enc.MarshalWrite(buf) if chk.E(err) { t.Fatalf("MarshalWrite failed: %v", err) } // Create new variables for decoding newK, newV, newKi, newP, newCa, newSer := TagKindPubkeyVars() newDec := TagKindPubkeyDec(newK, newV, newKi, newP, newCa, newSer) err = newDec.UnmarshalRead(bytes.NewBuffer(buf.Bytes())) if chk.E(err) { t.Fatalf("UnmarshalRead failed: %v", err) } // Verify the decoded values if newKi.Get() != ki.Get() { t.Errorf("Decoded kind %d, expected %d", newKi.Get(), ki.Get()) } if !utils.FastEqual(newP.Bytes(), p.Bytes()) { t.Errorf("Decoded pubkey hash %v, expected %v", newP.Bytes(), p.Bytes()) } if newK.Letter() != k.Letter() { t.Errorf( "Decoded key letter %c, expected %c", newK.Letter(), k.Letter(), ) } if !utils.FastEqual(newV.Bytes(), v.Bytes()) { t.Errorf("Decoded value hash %v, expected %v", newV.Bytes(), v.Bytes()) } if newCa.Get() != ca.Get() { t.Errorf("Decoded created at %d, expected %d", newCa.Get(), ca.Get()) } if newSer.Get() != ser.Get() { t.Errorf("Decoded serial %d, expected %d", newSer.Get(), ser.Get()) } }