| 1 | package hostops |
| 2 | |
| 3 | import ( |
| 4 | "crypto/ed25519" |
| 5 | "testing" |
| 6 | "time" |
| 7 | |
| 8 | "github.com/carlosframework/platform/internal/release" |
| 9 | ) |
| 10 | |
| 11 | func TestPlan9Fix1RepeatedResetExpiryNeverPermanentlyPinsETag(t *testing.T) { |
| 12 | tr, r, o, _ := resetTransportFixture(t) |
| 13 | w, err := NewControlWriter(tr.Store, tr.Directory.PublicKey, tr.Now) |
| 14 | if err != nil { |
| 15 | t.Fatal(err) |
| 16 | } |
| 17 | h := o.Claim.Holder |
| 18 | grant := lifecycleGrant{kind: "app", account: h.Account, app: h.App, appID: "app", operation: "reset", owner: r.Admission.Owner, epoch: 1, w: w, registration: RegistrationWakeRetryReset, incarnation: h.Incarnation} |
| 19 | ctx := withLifecycleGrant(t.Context(), grant) |
| 20 | signer := release.RootSigner(ed25519.NewKeyFromSeed(make([]byte, 32))) |
| 21 | issue := func() (WakeResetRequest, error) { |
| 22 | return w.RequestWakeReset(ctx, tr, signer, r.Console, r.ConsoleEnrollment, r.Namespace, o, r.Attempt) |
| 23 | } |
| 24 | first, err := issue() |
| 25 | if err != nil { |
| 26 | t.Fatal(err) |
| 27 | } |
| 28 | if err := tr.Store.Delete(t.Context(), first.Key()); err != nil { |
| 29 | t.Fatal(err) |
| 30 | } |
| 31 | for round := uint64(0); round < 64; round++ { |
| 32 | expired := first |
| 33 | expired.Round = round |
| 34 | expired.IssuedAt = tr.Now().Add(-3 * time.Minute) |
| 35 | expired.Expires = expired.IssuedAt.Add(WakeResetLifetime) |
| 36 | expired.ID = wakeResetID(expired) |
| 37 | raw, err := release.SignRootEnvelope(signer, expired) |
| 38 | if err != nil { |
| 39 | t.Fatal(err) |
| 40 | } |
| 41 | if _, err := tr.Store.Put(t.Context(), wakeResetArchiveKey(expired), raw, ""); err != nil { |
| 42 | t.Fatal(err) |
| 43 | } |
| 44 | } |
| 45 | fresh, err := issue() |
| 46 | if err != nil { |
| 47 | t.Fatalf("repeated expiries permanently pinned claim ETag: %v", err) |
| 48 | } |
| 49 | if fresh.ClaimETag != first.ClaimETag || !fresh.Expires.After(tr.Now()) { |
| 50 | t.Fatalf("did not issue a live reset for the same ETag: %+v", fresh) |
| 51 | } |
| 52 | } |
| 53 | |