github.com/pf-qiu/concourse/v6@v6.7.3-0.20201207032516-1f455d73275f/atc/lidar/scanner_test.go (about) 1 package lidar_test 2 3 import ( 4 "context" 5 "errors" 6 "time" 7 8 "github.com/pf-qiu/concourse/v6/atc" 9 "github.com/pf-qiu/concourse/v6/atc/db" 10 "github.com/pf-qiu/concourse/v6/atc/db/dbfakes" 11 "github.com/pf-qiu/concourse/v6/atc/lidar" 12 . "github.com/onsi/ginkgo" 13 . "github.com/onsi/gomega" 14 ) 15 16 type Scanner interface { 17 Run(ctx context.Context) error 18 } 19 20 var _ = Describe("Scanner", func() { 21 var ( 22 err error 23 24 fakeCheckFactory *dbfakes.FakeCheckFactory 25 26 scanner Scanner 27 ) 28 29 BeforeEach(func() { 30 fakeCheckFactory = new(dbfakes.FakeCheckFactory) 31 32 scanner = lidar.NewScanner(fakeCheckFactory) 33 }) 34 35 JustBeforeEach(func() { 36 err = scanner.Run(context.TODO()) 37 }) 38 39 Describe("Run", func() { 40 Context("when fetching resources fails", func() { 41 BeforeEach(func() { 42 fakeCheckFactory.ResourcesReturns(nil, errors.New("nope")) 43 }) 44 45 It("errors", func() { 46 Expect(err).To(HaveOccurred()) 47 }) 48 }) 49 50 Context("when fetching resources succeeds", func() { 51 var fakeResource *dbfakes.FakeResource 52 53 BeforeEach(func() { 54 fakeResource = new(dbfakes.FakeResource) 55 fakeResource.NameReturns("some-name") 56 fakeResource.TagsReturns([]string{"tag-a", "tag-b"}) 57 fakeResource.SourceReturns(atc.Source{"some": "source"}) 58 59 fakeCheckFactory.ResourcesReturns([]db.Resource{fakeResource}, nil) 60 }) 61 62 Context("when fetching resource types fails", func() { 63 BeforeEach(func() { 64 fakeCheckFactory.ResourceTypesReturns(nil, errors.New("nope")) 65 }) 66 67 It("errors", func() { 68 Expect(err).To(HaveOccurred()) 69 }) 70 }) 71 72 Context("when fetching resources types succeeds", func() { 73 var fakeResourceType *dbfakes.FakeResourceType 74 75 BeforeEach(func() { 76 fakeResourceType = new(dbfakes.FakeResourceType) 77 fakeResourceType.NameReturns("some-type") 78 fakeResourceType.TypeReturns("some-base-type") 79 fakeResourceType.TagsReturns([]string{"some-tag"}) 80 fakeResourceType.SourceReturns(atc.Source{"some": "type-source"}) 81 82 fakeCheckFactory.ResourceTypesReturns([]db.ResourceType{fakeResourceType}, nil) 83 }) 84 85 Context("when the resource parent type is a base type", func() { 86 BeforeEach(func() { 87 fakeCheckFactory.ResourceTypesReturns([]db.ResourceType{}, nil) 88 fakeResource.TypeReturns("some-type") 89 }) 90 91 Context("when the last check end time is past our interval", func() { 92 It("creates a check", func() { 93 Expect(fakeCheckFactory.TryCreateCheckCallCount()).To(Equal(1)) 94 }) 95 96 Context("when try creating a check panics", func() { 97 BeforeEach(func() { 98 fakeCheckFactory.TryCreateCheckStub = func(context.Context, db.Checkable, db.ResourceTypes, atc.Version, bool) (db.Build, bool, error) { 99 panic("something went wrong") 100 } 101 }) 102 103 It("recovers from the panic", func() { 104 Expect(err).ToNot(HaveOccurred()) 105 }) 106 }) 107 }) 108 109 Context("when the checkable has a pinned version", func() { 110 BeforeEach(func() { 111 fakeResource.CurrentPinnedVersionReturns(atc.Version{"some": "version"}) 112 }) 113 114 It("creates a check", func() { 115 Expect(fakeCheckFactory.TryCreateCheckCallCount()).To(Equal(1)) 116 _, _, _, fromVersion, _ := fakeCheckFactory.TryCreateCheckArgsForCall(0) 117 Expect(fromVersion).To(Equal(atc.Version{"some": "version"})) 118 }) 119 }) 120 121 Context("when the checkable does not have a pinned version", func() { 122 BeforeEach(func() { 123 fakeResource.CurrentPinnedVersionReturns(nil) 124 }) 125 126 It("creates a check", func() { 127 Expect(fakeCheckFactory.TryCreateCheckCallCount()).To(Equal(1)) 128 _, _, _, fromVersion, _ := fakeCheckFactory.TryCreateCheckArgsForCall(0) 129 Expect(fromVersion).To(BeNil()) 130 }) 131 }) 132 }) 133 134 Context("when the resource has a parent type", func() { 135 BeforeEach(func() { 136 fakeResource.TypeReturns("custom-type") 137 fakeResource.PipelineIDReturns(1) 138 fakeResourceType.NameReturns("custom-type") 139 fakeResourceType.PipelineIDReturns(1) 140 }) 141 142 It("creates a check for both the parent and the resource", func() { 143 Expect(fakeCheckFactory.TryCreateCheckCallCount()).To(Equal(2)) 144 145 _, checkable, _, _, manuallyTriggered := fakeCheckFactory.TryCreateCheckArgsForCall(0) 146 Expect(checkable).To(Equal(fakeResourceType)) 147 Expect(manuallyTriggered).To(BeFalse()) 148 149 _, checkable, _, _, manuallyTriggered = fakeCheckFactory.TryCreateCheckArgsForCall(1) 150 Expect(checkable).To(Equal(fakeResource)) 151 Expect(manuallyTriggered).To(BeFalse()) 152 }) 153 }) 154 }) 155 }) 156 157 Context("when there are multiple resources that use the same resource type", func() { 158 var fakeResource1, fakeResource2 *dbfakes.FakeResource 159 var fakeResourceType *dbfakes.FakeResourceType 160 161 BeforeEach(func() { 162 fakeResource1 = new(dbfakes.FakeResource) 163 fakeResource1.NameReturns("some-name") 164 fakeResource1.SourceReturns(atc.Source{"some": "source"}) 165 fakeResource1.TypeReturns("custom-type") 166 fakeResource1.PipelineIDReturns(1) 167 fakeResource1.LastCheckEndTimeReturns(time.Now().Add(-time.Hour)) 168 169 fakeResource2 = new(dbfakes.FakeResource) 170 fakeResource2.NameReturns("some-name") 171 fakeResource2.SourceReturns(atc.Source{"some": "source"}) 172 fakeResource2.TypeReturns("custom-type") 173 fakeResource2.PipelineIDReturns(1) 174 fakeResource2.LastCheckEndTimeReturns(time.Now().Add(-time.Hour)) 175 176 fakeCheckFactory.ResourcesReturns([]db.Resource{fakeResource1, fakeResource2}, nil) 177 178 fakeResourceType = new(dbfakes.FakeResourceType) 179 fakeResourceType.NameReturns("custom-type") 180 fakeResourceType.PipelineIDReturns(1) 181 fakeResourceType.TypeReturns("some-base-type") 182 fakeResourceType.SourceReturns(atc.Source{"some": "type-source"}) 183 fakeResourceType.LastCheckEndTimeReturns(time.Now().Add(-time.Hour)) 184 185 fakeCheckFactory.ResourceTypesReturns([]db.ResourceType{fakeResourceType}, nil) 186 }) 187 188 It("only tries to create a check for the resource type once", func() { 189 Expect(fakeCheckFactory.TryCreateCheckCallCount()).To(Equal(3)) 190 191 var checked []string 192 _, checkable, _, _, _ := fakeCheckFactory.TryCreateCheckArgsForCall(0) 193 checked = append(checked, checkable.Name()) 194 195 _, checkable, _, _, _ = fakeCheckFactory.TryCreateCheckArgsForCall(1) 196 checked = append(checked, checkable.Name()) 197 198 _, checkable, _, _, _ = fakeCheckFactory.TryCreateCheckArgsForCall(2) 199 checked = append(checked, checkable.Name()) 200 201 Expect(checked).To(ConsistOf([]string{fakeResourceType.Name(), fakeResource1.Name(), fakeResource2.Name()})) 202 }) 203 }) 204 }) 205 })