keel/trigger/poll/watcher_test.go

209 lines
5.1 KiB
Go
Raw Normal View History

2017-07-02 12:29:29 +00:00
package poll
import (
"testing"
2017-09-24 12:06:28 +00:00
"time"
2017-07-02 12:29:29 +00:00
2017-09-24 12:06:28 +00:00
"github.com/rusenask/keel/approvals"
"github.com/rusenask/keel/cache/memory"
2017-07-02 12:29:29 +00:00
"github.com/rusenask/keel/provider"
"github.com/rusenask/keel/registry"
"github.com/rusenask/keel/types"
2017-09-24 12:06:28 +00:00
"github.com/rusenask/keel/util/codecs"
"github.com/rusenask/keel/util/image"
2017-07-02 12:29:29 +00:00
)
// ======== fake registry client for testing =======
type fakeRegistryClient struct {
opts registry.Opts // opts set if anything called Digest(opts Opts)
digestToReturn string
2017-07-16 19:45:48 +00:00
tagsToReturn []string
2017-07-02 12:29:29 +00:00
}
func (c *fakeRegistryClient) Get(opts registry.Opts) (*registry.Repository, error) {
2017-07-16 19:45:48 +00:00
return &registry.Repository{
Name: opts.Name,
Tags: c.tagsToReturn,
}, nil
2017-07-02 12:29:29 +00:00
}
func (c *fakeRegistryClient) Digest(opts registry.Opts) (digest string, err error) {
return c.digestToReturn, nil
}
// ======== fake provider for testing =======
type fakeProvider struct {
submitted []types.Event
2017-07-20 20:45:21 +00:00
images []*types.TrackedImage
2017-07-02 12:29:29 +00:00
}
func (p *fakeProvider) Submit(event types.Event) error {
p.submitted = append(p.submitted, event)
return nil
}
func (p *fakeProvider) GetName() string {
return "fakeProvider"
}
2017-07-20 20:45:21 +00:00
func (p *fakeProvider) Stop() {
return
}
func (p *fakeProvider) TrackedImages() ([]*types.TrackedImage, error) {
return p.images, nil
}
2017-07-02 12:29:29 +00:00
func TestWatchTagJob(t *testing.T) {
fp := &fakeProvider{}
2017-09-24 12:06:28 +00:00
mem := memory.NewMemoryCache(100*time.Millisecond, 100*time.Millisecond, 10*time.Millisecond)
am := approvals.New(mem, codecs.DefaultSerializer())
providers := provider.New([]provider.Provider{fp}, am)
2017-07-02 12:29:29 +00:00
frc := &fakeRegistryClient{
digestToReturn: "sha256:0604af35299dd37ff23937d115d103532948b568a9dd8197d14c256a8ab8b0bb",
}
reference, _ := image.Parse("foo/bar:1.1")
details := &watchDetails{
imageRef: reference,
digest: "sha256:123123123",
}
job := NewWatchTagJob(providers, frc, details)
job.Run()
// checking whether new job was submitted
submitted := fp.submitted[0]
2017-07-16 19:45:48 +00:00
if submitted.Repository.Name != "index.docker.io/foo/bar" {
2017-07-02 12:29:29 +00:00
t.Errorf("unexpected event repository name: %s", submitted.Repository.Name)
}
if submitted.Repository.Tag != "1.1" {
t.Errorf("unexpected event repository tag: %s", submitted.Repository.Tag)
}
if submitted.Repository.Digest != frc.digestToReturn {
t.Errorf("unexpected event repository digest: %s", submitted.Repository.Digest)
}
// digest should be updated
if job.details.digest != frc.digestToReturn {
t.Errorf("job details digest wasn't updated")
}
}
func TestWatchTagJobLatest(t *testing.T) {
fp := &fakeProvider{}
2017-09-24 12:06:28 +00:00
mem := memory.NewMemoryCache(100*time.Millisecond, 100*time.Millisecond, 10*time.Millisecond)
am := approvals.New(mem, codecs.DefaultSerializer())
providers := provider.New([]provider.Provider{fp}, am)
2017-07-02 12:29:29 +00:00
frc := &fakeRegistryClient{
digestToReturn: "sha256:0604af35299dd37ff23937d115d103532948b568a9dd8197d14c256a8ab8b0bb",
}
reference, _ := image.Parse("foo/bar:latest")
details := &watchDetails{
imageRef: reference,
digest: "sha256:123123123",
}
job := NewWatchTagJob(providers, frc, details)
job.Run()
// checking whether new job was submitted
submitted := fp.submitted[0]
2017-07-16 19:45:48 +00:00
if submitted.Repository.Name != "index.docker.io/foo/bar" {
2017-07-02 12:29:29 +00:00
t.Errorf("unexpected event repository name: %s", submitted.Repository.Name)
}
if submitted.Repository.Tag != "latest" {
t.Errorf("unexpected event repository tag: %s", submitted.Repository.Tag)
}
if submitted.Repository.Digest != frc.digestToReturn {
t.Errorf("unexpected event repository digest: %s", submitted.Repository.Digest)
}
// digest should be updated
if job.details.digest != frc.digestToReturn {
t.Errorf("job details digest wasn't updated")
}
}
2017-07-16 19:45:48 +00:00
func TestWatchAllTagsJob(t *testing.T) {
fp := &fakeProvider{}
2017-09-24 12:06:28 +00:00
mem := memory.NewMemoryCache(100*time.Millisecond, 100*time.Millisecond, 10*time.Millisecond)
am := approvals.New(mem, codecs.DefaultSerializer())
providers := provider.New([]provider.Provider{fp}, am)
2017-07-16 19:45:48 +00:00
frc := &fakeRegistryClient{
tagsToReturn: []string{"1.1.2", "1.1.3", "0.9.1"},
}
reference, _ := image.Parse("foo/bar:1.1.0")
details := &watchDetails{
imageRef: reference,
}
job := NewWatchRepositoryTagsJob(providers, frc, details)
job.Run()
// checking whether new job was submitted
submitted := fp.submitted[0]
if submitted.Repository.Name != "index.docker.io/foo/bar" {
t.Errorf("unexpected event repository name: %s", submitted.Repository.Name)
}
if submitted.Repository.Tag != "1.1.3" {
t.Errorf("expected event repository tag 1.1.3, but got: %s", submitted.Repository.Tag)
}
}
2017-07-16 19:54:39 +00:00
func TestWatchAllTagsJobCurrentLatest(t *testing.T) {
fp := &fakeProvider{}
2017-09-24 12:06:28 +00:00
mem := memory.NewMemoryCache(100*time.Millisecond, 100*time.Millisecond, 10*time.Millisecond)
am := approvals.New(mem, codecs.DefaultSerializer())
providers := provider.New([]provider.Provider{fp}, am)
2017-07-16 19:54:39 +00:00
frc := &fakeRegistryClient{
tagsToReturn: []string{"1.1.2", "1.1.3", "0.9.1"},
}
reference, _ := image.Parse("foo/bar:latest")
details := &watchDetails{
imageRef: reference,
}
job := NewWatchRepositoryTagsJob(providers, frc, details)
job.Run()
// checking whether new job was submitted
if len(fp.submitted) != 0 {
t.Errorf("expected 0 submitted events but got something: %s", fp.submitted[0].Repository)
}
}