From ed9a4332213b5cb609c62f7e25205dbeb8ea5f7d Mon Sep 17 00:00:00 2001 From: giogam <151543+giogam@users.noreply.github.com> Date: Wed, 4 Jun 2025 16:20:24 +0200 Subject: [PATCH 1/2] feat(datastore) adds more serialization/deserialization tests --- datastore/memory_address_ref_store_test.go | 100 ++++++++++++++++++ .../memory_contract_metadata_store_test.go | 74 +++++++++++++ 2 files changed, 174 insertions(+) diff --git a/datastore/memory_address_ref_store_test.go b/datastore/memory_address_ref_store_test.go index c2a3fd6..13d95b4 100644 --- a/datastore/memory_address_ref_store_test.go +++ b/datastore/memory_address_ref_store_test.go @@ -1,6 +1,7 @@ package datastore import ( + "encoding/json" "testing" "github.com/Masterminds/semver/v3" @@ -579,3 +580,102 @@ func TestMemoryAddressRefStore_Filter(t *testing.T) { }) } } + +func TestMemoryAddressRefStore_RecordsOrdering(t *testing.T) { + t.Parallel() + + var ( + recordOne = AddressRef{ + Address: "0x1111111", + ChainSelector: 1, + Type: "contract1", + Version: semver.MustParse("1.0.0"), + Qualifier: "qual1", + Labels: NewLabelSet( + "label1", "label2", + ), + } + + recordTwo = AddressRef{ + Address: "0x2222222", + ChainSelector: 2, + Type: "contract2", + Version: semver.MustParse("2.0.0"), + Qualifier: "qual2", + Labels: NewLabelSet( + "label3", "label4", + ), + } + + recordThree = AddressRef{ + Address: "0x3333333", + ChainSelector: 3, + Type: "contract3", + Version: semver.MustParse("3.0.0"), + Qualifier: "qual3", + Labels: NewLabelSet( + "label5", "label6", + ), + } + + recordFour = AddressRef{ + Address: "0x4444444", + ChainSelector: 4, + Type: "contract4", + Version: semver.MustParse("4.0.0"), + Qualifier: "qual4", + Labels: NewLabelSet( + "label7", "label8", + ), + } + ) + + // Create a store with records in specific order + originalStore := MemoryAddressRefStore{ + Records: []AddressRef{ + recordOne, + recordTwo, + recordThree, + recordFour, + }, + } + + // marshal the store to JSON + data, err := json.Marshal(&originalStore) + require.NoError(t, err, "Failed to marshal store") + + // unmarshal back to a new store instance + var unmarshaledStore MemoryAddressRefStore + err = json.Unmarshal(data, &unmarshaledStore) + require.NoError(t, err, "Failed to unmarshal store") + + // verify the records are in the same order + require.Equal(t, len(originalStore.Records), len(unmarshaledStore.Records), + "number of records should match after unmarshaling") + + // compare each record to ensure order is maintained + for i, originalRecord := range originalStore.Records { + require.Equal(t, originalRecord.Address, unmarshaledStore.Records[i].Address, + "address at position %d should match", i) + require.Equal(t, originalRecord.ChainSelector, unmarshaledStore.Records[i].ChainSelector, + "chainSelector at position %d should match", i) + require.Equal(t, originalRecord.Type, unmarshaledStore.Records[i].Type, + "type at position %d should match", i) + require.Equal(t, originalRecord.Qualifier, unmarshaledStore.Records[i].Qualifier, + "qualifier at position %d should match", i) + + // Version is a pointer, so we need to compare the actual version string + require.NotNil(t, unmarshaledStore.Records[i].Version, "Version at position %d should not be nil", i) + require.Equal(t, originalRecord.Version.String(), unmarshaledStore.Records[i].Version.String(), + "version at position %d should match", i) + + require.Equal(t, originalRecord.Labels, unmarshaledStore.Records[i].Labels, + "labels at position %d should match", i) + } + + // additionally, verify the keys and lookups still work + for i, originalRecord := range originalStore.Records { + idx := unmarshaledStore.indexOf(originalRecord.Key()) + require.Equal(t, i, idx, "Index lookup for record %d should match original position", i) + } +} diff --git a/datastore/memory_contract_metadata_store_test.go b/datastore/memory_contract_metadata_store_test.go index e129d43..4556744 100644 --- a/datastore/memory_contract_metadata_store_test.go +++ b/datastore/memory_contract_metadata_store_test.go @@ -1,6 +1,7 @@ package datastore import ( + "encoding/json" "testing" "github.com/stretchr/testify/require" @@ -519,3 +520,76 @@ func TestMemoryContractMetadataStore_Filter(t *testing.T) { }) } } + +func TestMemoryContractMetadataStore_RecordsOrdering(t *testing.T) { + t.Parallel() + + var ( + recordOne = ContractMetadata{ + ChainSelector: 1, + Address: "0x1111111", + Metadata: testMetadata{Field: "metadata1", ChainSelector: 1}, + } + + recordTwo = ContractMetadata{ + ChainSelector: 2, + Address: "0x2222222", + Metadata: testMetadata{Field: "metadata2", ChainSelector: 2}, + } + + recordThree = ContractMetadata{ + ChainSelector: 3, + Address: "0x3333333", + Metadata: testMetadata{Field: "metadata3", ChainSelector: 3}, + } + + recordFour = ContractMetadata{ + ChainSelector: 4, + Address: "0x4444444", + Metadata: testMetadata{Field: "metadata4", ChainSelector: 4}, + } + ) + + // Create a store with records in specific order + originalStore := MemoryContractMetadataStore{ + Records: []ContractMetadata{ + recordOne, + recordTwo, + recordThree, + recordFour, + }, + } + + // Marshal the store to JSON + data, err := json.Marshal(&originalStore) + require.NoError(t, err, "Failed to marshal store") + + // Unmarshal back to a new store instance + var unmarshaledStore MemoryContractMetadataStore + err = json.Unmarshal(data, &unmarshaledStore) + require.NoError(t, err, "Failed to unmarshal store") + + // Verify the records are in the same order + require.Equal(t, len(originalStore.Records), len(unmarshaledStore.Records), + "number of records should match after unmarshaling") + + // Compare each record to ensure order is maintained + for i, originalRecord := range originalStore.Records { + require.Equal(t, originalRecord.Address, unmarshaledStore.Records[i].Address, + "address at position %d should match", i) + require.Equal(t, originalRecord.ChainSelector, unmarshaledStore.Records[i].ChainSelector, + "chainSelector at position %d should match", i) + + // Compare metadata fields + originalMetadata, err := As[testMetadata](originalRecord.Metadata) + require.NoError(t, err, "failed to convert original metadata to testMetadata at position %d", i) + + unmarshaledMetadata, err := As[testMetadata](unmarshaledStore.Records[i].Metadata) + require.NoError(t, err, "failed to convert unmarshaled metadata to testMetadata at position %d", i) + + require.Equal(t, originalMetadata.Field, unmarshaledMetadata.Field, + "metadata field at position %d should match", i) + require.Equal(t, originalMetadata.ChainSelector, unmarshaledMetadata.ChainSelector, + "metadata chain selector at position %d should match", i) + } +} From beb74f2261eb9193e52324d525e731c997a09b75 Mon Sep 17 00:00:00 2001 From: giogam <151543+giogam@users.noreply.github.com> Date: Wed, 4 Jun 2025 16:38:44 +0200 Subject: [PATCH 2/2] chore: fix linter issues --- datastore/memory_address_ref_store_test.go | 2 +- datastore/memory_contract_metadata_store_test.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/datastore/memory_address_ref_store_test.go b/datastore/memory_address_ref_store_test.go index 13d95b4..16dbd51 100644 --- a/datastore/memory_address_ref_store_test.go +++ b/datastore/memory_address_ref_store_test.go @@ -650,7 +650,7 @@ func TestMemoryAddressRefStore_RecordsOrdering(t *testing.T) { require.NoError(t, err, "Failed to unmarshal store") // verify the records are in the same order - require.Equal(t, len(originalStore.Records), len(unmarshaledStore.Records), + require.Len(t, originalStore.Records, len(unmarshaledStore.Records), "number of records should match after unmarshaling") // compare each record to ensure order is maintained diff --git a/datastore/memory_contract_metadata_store_test.go b/datastore/memory_contract_metadata_store_test.go index 4556744..fdcd584 100644 --- a/datastore/memory_contract_metadata_store_test.go +++ b/datastore/memory_contract_metadata_store_test.go @@ -570,7 +570,7 @@ func TestMemoryContractMetadataStore_RecordsOrdering(t *testing.T) { require.NoError(t, err, "Failed to unmarshal store") // Verify the records are in the same order - require.Equal(t, len(originalStore.Records), len(unmarshaledStore.Records), + require.Len(t, originalStore.Records, len(unmarshaledStore.Records), "number of records should match after unmarshaling") // Compare each record to ensure order is maintained