| package main |
| |
| import ( |
| "testing" |
| "time" |
| |
| "github.com/google/go-cmp/cmp" |
| "github.com/google/go-cmp/cmp/cmpopts" |
| "google.golang.org/api/appengine/v1" |
| ) |
| |
| func TestDecide(t *testing.T) { |
| recentTime := time.Now() |
| recentTime = recentTime.Truncate(time.Minute) |
| allocs := map[string]float64{"currentlyServingID": 1.0} |
| |
| tests := []struct { |
| desc string |
| versions []*appengine.Version |
| keepNumber int |
| wantKeep []version |
| wantDelete []version |
| wantErr bool |
| }{ |
| { |
| desc: "no versions", |
| }, |
| { |
| desc: "invalid Version time", |
| versions: []*appengine.Version{{Id: "invalid time", CreateTime: "abc123"}}, |
| wantErr: true, |
| }, |
| { |
| desc: "old versions", |
| versions: []*appengine.Version{{Id: "old one", CreateTime: "2018-01-02T15:04:05Z"}}, |
| wantDelete: []version{{ |
| AEVersion: &appengine.Version{Id: "old one", CreateTime: "2018-01-02T15:04:05Z"}, |
| Created: time.Date(2018, 1, 2, 15, 4, 5, 0, time.UTC), |
| }}, |
| }, |
| { |
| desc: "versions serving", |
| versions: []*appengine.Version{{Id: "currentlyServingID", CreateTime: "2018-01-02T15:04:05Z"}}, |
| wantKeep: []version{{ |
| AEVersion: &appengine.Version{Id: "currentlyServingID", CreateTime: "2018-01-02T15:04:05Z"}, |
| Created: time.Date(2018, 1, 2, 15, 4, 5, 0, time.UTC), |
| }}, |
| }, |
| { |
| desc: "within 24h", |
| versions: []*appengine.Version{{Id: "some id", CreateTime: recentTime.Format(time.RFC3339)}}, |
| wantKeep: []version{{ |
| AEVersion: &appengine.Version{Id: "some id", CreateTime: recentTime.Format(time.RFC3339)}, |
| Created: recentTime, |
| }}, |
| }, |
| { |
| desc: "keeps KeepNumber versions", |
| versions: []*appengine.Version{ |
| {Id: "some id", CreateTime: recentTime.Format(time.RFC3339)}, |
| {Id: "currentlyServingID", CreateTime: "2018-01-02T15:04:05Z"}, |
| {Id: "not serving", CreateTime: "2019-01-02T15:04:05Z"}, |
| {Id: "this one should be deleted", CreateTime: "2019-01-02T15:04:05Z"}, |
| }, |
| keepNumber: 3, |
| wantKeep: []version{ |
| { |
| AEVersion: &appengine.Version{Id: "some id", CreateTime: recentTime.Format(time.RFC3339)}, |
| Created: recentTime, |
| }, |
| { |
| AEVersion: &appengine.Version{Id: "currentlyServingID", CreateTime: "2018-01-02T15:04:05Z"}, |
| Created: time.Date(2018, 1, 2, 15, 4, 5, 0, time.UTC), |
| }, |
| { |
| AEVersion: &appengine.Version{Id: "not serving", CreateTime: "2019-01-02T15:04:05Z"}, |
| Created: time.Date(2019, 1, 2, 15, 4, 5, 0, time.UTC), |
| }, |
| }, |
| wantDelete: []version{{ |
| AEVersion: &appengine.Version{Id: "this one should be deleted", CreateTime: "2019-01-02T15:04:05Z"}, |
| Created: time.Date(2019, 1, 2, 15, 4, 5, 0, time.UTC), |
| }}, |
| }, |
| } |
| for _, tt := range tests { |
| t.Run(tt.desc, func(t *testing.T) { |
| bs, err := bucket(allocs, tt.versions, tt.keepNumber, 24*time.Hour) |
| if (err != nil) != tt.wantErr { |
| t.Errorf("bucket(%v, %v, %v, %v) = %v, %v, wantErr %v", allocs, tt.versions, tt.keepNumber, 24*time.Hour, bs, err, tt.wantErr) |
| return |
| } |
| ignoreFields := cmpopts.IgnoreFields(version{}, "Message") |
| if diff := cmp.Diff(tt.wantKeep, bs.keep, ignoreFields); diff != "" { |
| t.Errorf("c.Keep mismatch (-want +got):\n%s", diff) |
| } |
| if diff := cmp.Diff(tt.wantDelete, bs.delete, ignoreFields); diff != "" { |
| t.Errorf("c.Delete mismatch (-want +got):\n%s", diff) |
| } |
| }) |
| } |
| } |
| |
| func TestAct(t *testing.T) { |
| bs := buckets{delete: []version{{AEVersion: &appengine.Version{Id: "test ID"}}}} |
| if err := act(nil, bs, true); err != nil { |
| t.Errorf("c.act() = %v, wanted no error", err) |
| } |
| defer func(t *testing.T) { |
| t.Helper() |
| if recover() == nil { |
| // c.act() should panic with no asvs set, showing that the DryRun flag worked. |
| // faking out the appengine admin client is hard. |
| t.Errorf("recover() = nil, wanted panic") |
| } |
| }(t) |
| act(nil, bs, false) |
| } |