package backup import ( "context" "testing" "time" "gitea.dooplex.hu/admin/felhom-agent/internal/proxmox" ) // R-1232 — the 2026-10-23 test night: a reinstalled box (new install, new PBS key, same customer namespace, same guest // number 9201) found the OLD box's archive (2.6 days old) when the due-check asked „when did this tier last land?", so // the whole-guest tier read „not due" for up to its 168-h cadence and the ep0 copy stayed the OLD box's. The due-check // now counts only archives written with THIS storage's key (the R-727 discriminator; the archive carries no host id). // The CONSEQUENCE asserted: with only a foreign archive the answer is „none found" (the tier is due); with the box's // own archive, that archive's time. COMPANION RED-PROOF: drop the key filter in NewestArchiveTime → case 1 returns the // old box's time. func TestR1232_TheDueCheckCountsOnlyThisBoxsArchives(t *testing.T) { oldBox := proxmox.StorageContent{VolID: "felhom-pbsdr:backup/ct/9201/2026-10-20T21:10:00Z", Content: "backup", VMID: 9201, Size: 3490689830, CTime: time.Date(2026, 10, 20, 21, 10, 0, 0, time.UTC).Unix(), Encrypted: earlierBox1} api := &fakeBackupAPI{ storages: []proxmox.Storage{{Storage: "felhom-pbsdr", Type: "pbs", EncryptionKey: thisBoxKey}}, content: []proxmox.StorageContent{oldBox}, } r := NewBackupRunner(api, "felhom-pbsdr", proxmox.ModeSnapshot, "", "keep-last=1", quiet()) // 1. The fresh box has written nothing yet: the old box's archive must not count. when, found, err := r.NewestArchiveTime(context.Background(), 9201) if err != nil { t.Fatal(err) } if found { t.Fatalf("the due-check counted ANOTHER box's archive (%s) as this tier's last backup — the tier would wait a week", when) } // 2. After the box's own first copy, that copy is the answer. own := proxmox.StorageContent{VolID: "felhom-pbsdr:backup/ct/9201/2026-10-24T02:30:00Z", Content: "backup", VMID: 9201, Size: 3600000000, CTime: time.Date(2026, 10, 24, 2, 30, 0, 0, time.UTC).Unix(), Encrypted: thisBoxKey} api.content = append(api.content, own) when, found, err = r.NewestArchiveTime(context.Background(), 9201) if err != nil || !found || when.Unix() != own.CTime { t.Fatalf("want this box's own archive time %d, got %v found=%v err=%v", own.CTime, when, found, err) } } // An unencrypted storage (a local dir) holds only this box's vzdumps: no key filter, the newest counts. func TestR1232_UnencryptedStorageCountsEveryArchive(t *testing.T) { api := &fakeBackupAPI{ storages: []proxmox.Storage{{Storage: "local", Type: "dir"}}, content: []proxmox.StorageContent{{VolID: "local:backup/vzdump-lxc-9201-2026_10_25-21_27_05.tar.zst", Content: "backup", VMID: 9201, Size: 955425507, CTime: 1793050025}}, } r := NewBackupRunner(api, "local", proxmox.ModeSnapshot, "", "keep-last=1", quiet()) if _, found, err := r.NewestArchiveTime(context.Background(), 9201); err != nil || !found { t.Fatalf("an unencrypted local archive was not counted: found=%v err=%v", found, err) } }