11917: Do not clear rails cache at boot time.
[arvados.git] / services / keep-web / cache_test.go
1 // Copyright (C) The Arvados Authors. All rights reserved.
2 //
3 // SPDX-License-Identifier: AGPL-3.0
4
5 package main
6
7 import (
8         "git.curoverse.com/arvados.git/sdk/go/arvadosclient"
9         "git.curoverse.com/arvados.git/sdk/go/arvadostest"
10         "gopkg.in/check.v1"
11 )
12
13 func (s *UnitSuite) TestCache(c *check.C) {
14         arv, err := arvadosclient.MakeArvadosClient()
15         c.Assert(err, check.Equals, nil)
16
17         cache := DefaultConfig().Cache
18
19         // Hit the same collection 5 times using the same token. Only
20         // the first req should cause an API call; the next 4 should
21         // hit all caches.
22         arv.ApiToken = arvadostest.AdminToken
23         for i := 0; i < 5; i++ {
24                 coll, err := cache.Get(arv, arvadostest.FooCollection, false)
25                 c.Check(err, check.Equals, nil)
26                 c.Assert(coll, check.NotNil)
27                 c.Check(coll.PortableDataHash, check.Equals, arvadostest.FooPdh)
28                 c.Check(coll.ManifestText[:2], check.Equals, ". ")
29         }
30         c.Check(cache.Stats().Requests, check.Equals, uint64(5))
31         c.Check(cache.Stats().CollectionHits, check.Equals, uint64(4))
32         c.Check(cache.Stats().PermissionHits, check.Equals, uint64(4))
33         c.Check(cache.Stats().PDHHits, check.Equals, uint64(4))
34         c.Check(cache.Stats().APICalls, check.Equals, uint64(1))
35
36         // Hit the same collection 2 more times, this time requesting
37         // it by PDH and using a different token. The first req should
38         // miss the permission cache. Both reqs should hit the
39         // Collection cache and skip the API lookup.
40         arv.ApiToken = arvadostest.ActiveToken
41         for i := 0; i < 2; i++ {
42                 coll, err := cache.Get(arv, arvadostest.FooPdh, false)
43                 c.Check(err, check.Equals, nil)
44                 c.Assert(coll, check.NotNil)
45                 c.Check(coll.PortableDataHash, check.Equals, arvadostest.FooPdh)
46                 c.Check(coll.ManifestText[:2], check.Equals, ". ")
47         }
48         c.Check(cache.Stats().Requests, check.Equals, uint64(5+2))
49         c.Check(cache.Stats().CollectionHits, check.Equals, uint64(4+2))
50         c.Check(cache.Stats().PermissionHits, check.Equals, uint64(4+1))
51         c.Check(cache.Stats().PDHHits, check.Equals, uint64(4+0))
52         c.Check(cache.Stats().APICalls, check.Equals, uint64(1+1))
53
54         // Alternating between two collections N times should produce
55         // only 2 more API calls.
56         arv.ApiToken = arvadostest.AdminToken
57         for i := 0; i < 20; i++ {
58                 var target string
59                 if i%2 == 0 {
60                         target = arvadostest.HelloWorldCollection
61                 } else {
62                         target = arvadostest.FooBarDirCollection
63                 }
64                 _, err := cache.Get(arv, target, false)
65                 c.Check(err, check.Equals, nil)
66         }
67         c.Check(cache.Stats().Requests, check.Equals, uint64(5+2+20))
68         c.Check(cache.Stats().CollectionHits, check.Equals, uint64(4+2+18))
69         c.Check(cache.Stats().PermissionHits, check.Equals, uint64(4+1+18))
70         c.Check(cache.Stats().PDHHits, check.Equals, uint64(4+0+18))
71         c.Check(cache.Stats().APICalls, check.Equals, uint64(1+1+2))
72 }
73
74 func (s *UnitSuite) TestCacheForceReloadByPDH(c *check.C) {
75         arv, err := arvadosclient.MakeArvadosClient()
76         c.Assert(err, check.Equals, nil)
77
78         cache := DefaultConfig().Cache
79
80         for _, forceReload := range []bool{false, true, false, true} {
81                 _, err := cache.Get(arv, arvadostest.FooPdh, forceReload)
82                 c.Check(err, check.Equals, nil)
83         }
84
85         c.Check(cache.Stats().Requests, check.Equals, uint64(4))
86         c.Check(cache.Stats().CollectionHits, check.Equals, uint64(3))
87         c.Check(cache.Stats().PermissionHits, check.Equals, uint64(1))
88         c.Check(cache.Stats().PDHHits, check.Equals, uint64(0))
89         c.Check(cache.Stats().APICalls, check.Equals, uint64(3))
90 }
91
92 func (s *UnitSuite) TestCacheForceReloadByUUID(c *check.C) {
93         arv, err := arvadosclient.MakeArvadosClient()
94         c.Assert(err, check.Equals, nil)
95
96         cache := DefaultConfig().Cache
97
98         for _, forceReload := range []bool{false, true, false, true} {
99                 _, err := cache.Get(arv, arvadostest.FooCollection, forceReload)
100                 c.Check(err, check.Equals, nil)
101         }
102
103         c.Check(cache.Stats().Requests, check.Equals, uint64(4))
104         c.Check(cache.Stats().CollectionHits, check.Equals, uint64(3))
105         c.Check(cache.Stats().PermissionHits, check.Equals, uint64(1))
106         c.Check(cache.Stats().PDHHits, check.Equals, uint64(3))
107         c.Check(cache.Stats().APICalls, check.Equals, uint64(3))
108 }