diff --git a/aggsender/aggsender.go b/aggsender/aggsender.go index 801c54a9f..142c19b16 100644 --- a/aggsender/aggsender.go +++ b/aggsender/aggsender.go @@ -589,7 +589,7 @@ func (a *AggSender) shouldSendCertificate() (bool, error) { // checkLastCertificateFromAgglayer checks the last certificate from agglayer func (a *AggSender) checkLastCertificateFromAgglayer(ctx context.Context) error { networkID := a.l2Syncer.OriginNetwork() - a.log.Infof("recovery: checking last certificate from AggLayer for network %s", networkID) + a.log.Infof("recovery: checking last certificate from AggLayer for network %d", networkID) aggLayerLastCert, err := a.aggLayerClient.GetLatestKnownCertificateHeader(networkID) if err != nil { return fmt.Errorf("recovery: error getting latest known certificate header from agglayer: %w", err) @@ -621,14 +621,15 @@ func (a *AggSender) checkLastCertificateFromAgglayer(ctx context.Context) error localLastCert.String(), aggLayerLastCert.String()) return fmt.Errorf("recovery: mismatch between local and agglayer certificates") } - + // CASE 4: AggSender and AggLayer are at same page + // just update status err = a.updateCertificateStatus(ctx, localLastCert, aggLayerLastCert) if err != nil { log.Errorf("recovery: error updating status certificate: %s status: %w", aggLayerLastCert.String(), err) return fmt.Errorf("recovery: error updating certificate status: %w", err) } - a.log.Infof("recovery: successfully checked last certificate from AggLayer for network %s", networkID) + a.log.Infof("recovery: successfully checked last certificate from AggLayer for network %d", networkID) return nil } diff --git a/aggsender/aggsender_test.go b/aggsender/aggsender_test.go index 25cf721dc..ddb358234 100644 --- a/aggsender/aggsender_test.go +++ b/aggsender/aggsender_test.go @@ -31,6 +31,10 @@ const ( networkIDTest = uint32(1234) ) +var ( + testError = errors.New("unitest error") +) + func TestExploratoryGetCertificateHeader(t *testing.T) { t.Skip("This test is exploratory and should be skipped") aggLayerClient := agglayer.NewAggLayerClient("http://localhost:32796") @@ -1722,20 +1726,65 @@ func TestCheckLastCertificateFromAgglayer_Case2NoCertLocalCertRemoteErrorStorage testData.agglayerClientMock.EXPECT().GetLatestKnownCertificateHeader(networkIDTest). Return(certInfoToCertHeader(&testData.testCerts[0], networkIDTest), nil).Once() testData.storageMock.EXPECT().GetLastSentCertificate().Return(nil, nil) - testData.storageMock.EXPECT().SaveLastSentCertificate(mock.Anything, mock.Anything).Return(fmt.Errorf("unittest error")) + testData.storageMock.EXPECT().SaveLastSentCertificate(mock.Anything, mock.Anything).Return(testError).Once() err := testData.sut.checkLastCertificateFromAgglayer(testData.ctx) require.Error(t, err) } -// // CASE 3: AggSender and AggLayer not same certificateID +// CASE 3: AggSender and AggLayer not same certificateID func TestCheckLastCertificateFromAgglayer_Case3Mismatch(t *testing.T) { testData := newAggsenderTestData(t, testDataFlagMockStorage) testData.l2syncerMock.EXPECT().OriginNetwork().Return(networkIDTest).Once() testData.agglayerClientMock.EXPECT().GetLatestKnownCertificateHeader(networkIDTest). Return(certInfoToCertHeader(&testData.testCerts[0], networkIDTest), nil).Once() - testData.storageMock.EXPECT().GetLastSentCertificate().Return(&testData.testCerts[1], nil) + + err := testData.sut.checkLastCertificateFromAgglayer(testData.ctx) + + require.Error(t, err) +} + +// CASE 4: AggSender and AggLayer same certificateID and same status +func TestCheckLastCertificateFromAgglayer_Case4SameStatus(t *testing.T) { + testData := newAggsenderTestData(t, testDataFlagMockStorage) + testData.l2syncerMock.EXPECT().OriginNetwork().Return(networkIDTest).Once() + testData.agglayerClientMock.EXPECT().GetLatestKnownCertificateHeader(networkIDTest). + Return(certInfoToCertHeader(&testData.testCerts[0], networkIDTest), nil).Once() + testData.storageMock.EXPECT().GetLastSentCertificate().Return(&testData.testCerts[0], nil) + + err := testData.sut.checkLastCertificateFromAgglayer(testData.ctx) + + require.NoError(t, err) +} + +// CASE 4: AggSender and AggLayer same certificateID and differ on status +func TestCheckLastCertificateFromAgglayer_Case4UpdateStatus(t *testing.T) { + testData := newAggsenderTestData(t, testDataFlagMockStorage) + testData.l2syncerMock.EXPECT().OriginNetwork().Return(networkIDTest).Once() + aggLayerCert := certInfoToCertHeader(&testData.testCerts[0], networkIDTest) + aggLayerCert.Status = agglayer.Settled + testData.agglayerClientMock.EXPECT().GetLatestKnownCertificateHeader(networkIDTest). + Return(aggLayerCert, nil).Once() + testData.storageMock.EXPECT().GetLastSentCertificate().Return(&testData.testCerts[0], nil) + testData.storageMock.EXPECT().UpdateCertificate(mock.Anything, mock.Anything).Return(nil).Once() + + err := testData.sut.checkLastCertificateFromAgglayer(testData.ctx) + + require.NoError(t, err) +} + +// CASE 4: AggSender and AggLayer same certificateID and differ on status but fails update +func TestCheckLastCertificateFromAgglayer_Case4ErrorUpdateStatus(t *testing.T) { + testData := newAggsenderTestData(t, testDataFlagMockStorage) + testData.l2syncerMock.EXPECT().OriginNetwork().Return(networkIDTest).Once() + aggLayerCert := certInfoToCertHeader(&testData.testCerts[0], networkIDTest) + aggLayerCert.Status = agglayer.Settled + testData.agglayerClientMock.EXPECT().GetLatestKnownCertificateHeader(networkIDTest). + Return(aggLayerCert, nil).Once() + testData.storageMock.EXPECT().GetLastSentCertificate().Return(&testData.testCerts[0], nil) + testData.storageMock.EXPECT().UpdateCertificate(mock.Anything, mock.Anything).Return(testError).Once() + err := testData.sut.checkLastCertificateFromAgglayer(testData.ctx) require.Error(t, err)