Skip to content

Commit 0e5cf24

Browse files
committed
test: add failing tests for multiple Refresh() calls
Add test cases that demonstrate the current limitation where Refresh() can only be called once during an Updater's lifetime. - TestMultipleRefreshCalls: Tests calling Refresh() multiple times with metadata updates between calls - TestMultipleRefreshCallsNoChanges: Tests calling Refresh() multiple times when no changes are available These tests currently fail with "cannot update timestamp after snapshot" errors due to TrustedMetadata state machine restrictions. Related to #593 Signed-off-by: James Carnegie <[email protected]>
1 parent 3ace7ea commit 0e5cf24

File tree

1 file changed

+78
-0
lines changed

1 file changed

+78
-0
lines changed

metadata/updater/updater_top_level_update_test.go

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1081,3 +1081,81 @@ func TestTimestampEqVersionsCheck(t *testing.T) {
10811081
assert.NoError(t, err)
10821082
assert.Equal(t, initialTimestampMetadataVer, timestamp.Signed.Meta["snapshot.json"].Version)
10831083
}
1084+
1085+
func TestMultipleRefreshCalls(t *testing.T) {
1086+
// Test that Refresh() can be called multiple times on the same Updater instance
1087+
// and that it successfully updates metadata when changes are available.
1088+
1089+
err := loadOrResetTrustedRootMetadata()
1090+
assert.NoError(t, err)
1091+
1092+
updaterConfig, err := loadUpdaterConfig()
1093+
assert.NoError(t, err)
1094+
1095+
// Create an updater and perform first refresh
1096+
updater := initUpdater(updaterConfig)
1097+
err = updater.Refresh()
1098+
assert.NoError(t, err)
1099+
1100+
// Verify initial versions
1101+
assertVersionEquals(t, metadata.TIMESTAMP, 1)
1102+
assertVersionEquals(t, metadata.SNAPSHOT, 1)
1103+
assertVersionEquals(t, metadata.TARGETS, 1)
1104+
1105+
// Update metadata on the repository
1106+
simulator.Sim.MDTargets.Signed.Version += 1
1107+
simulator.Sim.UpdateSnapshot()
1108+
1109+
// Call Refresh() again on the same updater instance
1110+
err = updater.Refresh()
1111+
assert.NoError(t, err)
1112+
1113+
// Verify that metadata was updated
1114+
assertVersionEquals(t, metadata.TIMESTAMP, 2)
1115+
assertVersionEquals(t, metadata.SNAPSHOT, 2)
1116+
assertVersionEquals(t, metadata.TARGETS, 2)
1117+
1118+
// Update metadata again
1119+
simulator.Sim.MDTargets.Signed.Version += 1
1120+
simulator.Sim.UpdateSnapshot()
1121+
1122+
// Call Refresh() a third time
1123+
err = updater.Refresh()
1124+
assert.NoError(t, err)
1125+
1126+
// Verify that metadata was updated again
1127+
assertVersionEquals(t, metadata.TIMESTAMP, 3)
1128+
assertVersionEquals(t, metadata.SNAPSHOT, 3)
1129+
assertVersionEquals(t, metadata.TARGETS, 3)
1130+
}
1131+
1132+
func TestMultipleRefreshCallsNoChanges(t *testing.T) {
1133+
// Test that Refresh() can be called multiple times even when there are no changes
1134+
// and returns nil (not an error) when everything is already up-to-date.
1135+
1136+
err := loadOrResetTrustedRootMetadata()
1137+
assert.NoError(t, err)
1138+
1139+
updaterConfig, err := loadUpdaterConfig()
1140+
assert.NoError(t, err)
1141+
1142+
// Create an updater and perform first refresh
1143+
updater := initUpdater(updaterConfig)
1144+
err = updater.Refresh()
1145+
assert.NoError(t, err)
1146+
1147+
// Verify initial versions
1148+
assertVersionEquals(t, metadata.TIMESTAMP, 1)
1149+
assertVersionEquals(t, metadata.SNAPSHOT, 1)
1150+
assertVersionEquals(t, metadata.TARGETS, 1)
1151+
1152+
// Call Refresh() again without any changes
1153+
// Should return nil (no error) since everything is up-to-date
1154+
err = updater.Refresh()
1155+
assert.NoError(t, err)
1156+
1157+
// Verify versions haven't changed
1158+
assertVersionEquals(t, metadata.TIMESTAMP, 1)
1159+
assertVersionEquals(t, metadata.SNAPSHOT, 1)
1160+
assertVersionEquals(t, metadata.TARGETS, 1)
1161+
}

0 commit comments

Comments
 (0)