github.com/pf-qiu/concourse/v6@v6.7.3-0.20201207032516-1f455d73275f/atc/gc/resource_config_check_session_collector_test.go (about)

     1  package gc_test
     2  
     3  import (
     4  	"context"
     5  	"time"
     6  
     7  	sq "github.com/Masterminds/squirrel"
     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/dbtest"
    11  	"github.com/pf-qiu/concourse/v6/atc/gc"
    12  
    13  	. "github.com/onsi/ginkgo"
    14  	. "github.com/onsi/gomega"
    15  )
    16  
    17  var _ = Describe("ResourceConfigCheckSessionCollector", func() {
    18  	var (
    19  		collector                           GcCollector
    20  		resourceConfigCheckSessionLifecycle db.ResourceConfigCheckSessionLifecycle
    21  		ownerExpiries                       db.ContainerOwnerExpiries
    22  	)
    23  
    24  	BeforeEach(func() {
    25  		resourceConfigCheckSessionLifecycle = db.NewResourceConfigCheckSessionLifecycle(dbConn)
    26  		resourceConfigFactory = db.NewResourceConfigFactory(dbConn, lockFactory)
    27  		collector = gc.NewResourceConfigCheckSessionCollector(resourceConfigCheckSessionLifecycle)
    28  	})
    29  
    30  	Describe("Run", func() {
    31  		var scenario *dbtest.Scenario
    32  		var resourceConfig db.ResourceConfig
    33  
    34  		var owner db.ContainerOwner
    35  
    36  		ownerExpiries = db.ContainerOwnerExpiries{
    37  			Min: 10 * time.Second,
    38  			Max: 10 * time.Second,
    39  		}
    40  
    41  		BeforeEach(func() {
    42  			scenario = dbtest.Setup(
    43  				builder.WithBaseWorker(),
    44  				builder.WithPipeline(atc.Config{
    45  					Resources: atc.ResourceConfigs{
    46  						{
    47  							Name:   "some-resource",
    48  							Type:   dbtest.BaseResourceType,
    49  							Source: atc.Source{"some": "source"},
    50  						},
    51  					},
    52  				}),
    53  				builder.WithResourceVersions("some-resource", atc.Version{"some": "version"}),
    54  			)
    55  
    56  			resource := scenario.Resource("some-resource")
    57  
    58  			var found bool
    59  			var err error
    60  			resourceConfig, found, err = resourceConfigFactory.FindResourceConfigByID(resource.ResourceConfigID())
    61  			Expect(err).ToNot(HaveOccurred())
    62  			Expect(found).To(BeTrue())
    63  
    64  			owner = db.NewResourceConfigCheckSessionContainerOwner(
    65  				resourceConfig.ID(),
    66  				resourceConfig.OriginBaseResourceType().ID,
    67  				ownerExpiries,
    68  			)
    69  
    70  			_, err = scenario.Workers[0].CreateContainer(owner, db.ContainerMetadata{})
    71  			Expect(err).NotTo(HaveOccurred())
    72  		})
    73  
    74  		resourceConfigCheckSessionExists := func(resourceConfig db.ResourceConfig) bool {
    75  			var count int
    76  			err = psql.Select("COUNT(*)").
    77  				From("resource_config_check_sessions").
    78  				Where(sq.Eq{"resource_config_id": resourceConfig.ID()}).
    79  				RunWith(dbConn).
    80  				QueryRow().
    81  				Scan(&count)
    82  			Expect(err).NotTo(HaveOccurred())
    83  			return count == 1
    84  		}
    85  
    86  		JustBeforeEach(func() {
    87  			Expect(collector.Run(context.TODO())).To(Succeed())
    88  		})
    89  
    90  		Context("when the resource is active", func() {
    91  			It("keeps the resource config check session", func() {
    92  				Expect(resourceConfigCheckSessionExists(resourceConfig)).To(BeTrue())
    93  			})
    94  		})
    95  
    96  		Context("when the resource config check session is expired", func() {
    97  			BeforeEach(func() {
    98  				res, err := psql.Update("resource_config_check_sessions").
    99  					Set("expires_at", sq.Expr("now()")).
   100  					Where(sq.Eq{"resource_config_id": resourceConfig.ID()}).
   101  					RunWith(dbConn).
   102  					Exec()
   103  				Expect(err).ToNot(HaveOccurred())
   104  
   105  				rows, err := res.RowsAffected()
   106  				Expect(err).ToNot(HaveOccurred())
   107  				Expect(rows).To(Equal(int64(1)))
   108  			})
   109  
   110  			It("removes the resource config check session", func() {
   111  				Expect(resourceConfigCheckSessionExists(resourceConfig)).To(BeFalse())
   112  			})
   113  		})
   114  
   115  		Context("when the resource config changes", func() {
   116  			BeforeEach(func() {
   117  				scenario.Run(
   118  					builder.WithPipeline(atc.Config{
   119  						Resources: atc.ResourceConfigs{
   120  							{
   121  								Name:   "some-resource",
   122  								Type:   dbtest.BaseResourceType,
   123  								Source: atc.Source{"some": "different-source"},
   124  							},
   125  						},
   126  					}),
   127  					builder.WithResourceVersions("some-resource", atc.Version{"some": "different-version"}),
   128  				)
   129  			})
   130  
   131  			It("removes the resource config check session", func() {
   132  				Expect(resourceConfigCheckSessionExists(resourceConfig)).To(BeFalse())
   133  			})
   134  		})
   135  
   136  		Context("when the resource is removed", func() {
   137  			BeforeEach(func() {
   138  				scenario.Run(
   139  					builder.WithPipeline(atc.Config{}),
   140  				)
   141  			})
   142  
   143  			It("removes the resource config check session", func() {
   144  				Expect(resourceConfigCheckSessionExists(resourceConfig)).To(BeFalse())
   145  			})
   146  		})
   147  	})
   148  })