Merge branch '11917-dont-clear-cache'
[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         c.Skip("see #11945")
15
16         arv, err := arvadosclient.MakeArvadosClient()
17         c.Assert(err, check.Equals, nil)
18
19         cache := DefaultConfig().Cache
20
21         // Hit the same collection 5 times using the same token. Only
22         // the first req should cause an API call; the next 4 should
23         // hit all caches.
24         arv.ApiToken = arvadostest.AdminToken
25         for i := 0; i < 5; i++ {
26                 coll, err := cache.Get(arv, arvadostest.FooCollection, false)
27                 c.Check(err, check.Equals, nil)
28                 c.Assert(coll, check.NotNil)
29                 c.Check(coll.PortableDataHash, check.Equals, arvadostest.FooPdh)
30                 c.Check(coll.ManifestText[:2], check.Equals, ". ")
31         }
32         c.Check(cache.Stats().Requests, check.Equals, uint64(5))
33         c.Check(cache.Stats().CollectionHits, check.Equals, uint64(4))
34         c.Check(cache.Stats().PermissionHits, check.Equals, uint64(4))
35         c.Check(cache.Stats().PDHHits, check.Equals, uint64(4))
36         c.Check(cache.Stats().APICalls, check.Equals, uint64(1))
37
38         // Hit the same collection 2 more times, this time requesting
39         // it by PDH and using a different token. The first req should
40         // miss the permission cache. Both reqs should hit the
41         // Collection cache and skip the API lookup.
42         arv.ApiToken = arvadostest.ActiveToken
43         for i := 0; i < 2; i++ {
44                 coll, err := cache.Get(arv, arvadostest.FooPdh, false)
45                 c.Check(err, check.Equals, nil)
46                 c.Assert(coll, check.NotNil)
47                 c.Check(coll.PortableDataHash, check.Equals, arvadostest.FooPdh)
48                 c.Check(coll.ManifestText[:2], check.Equals, ". ")
49         }
50         c.Check(cache.Stats().Requests, check.Equals, uint64(5+2))
51         c.Check(cache.Stats().CollectionHits, check.Equals, uint64(4+2))
52         c.Check(cache.Stats().PermissionHits, check.Equals, uint64(4+1))
53         c.Check(cache.Stats().PDHHits, check.Equals, uint64(4+0))
54         c.Check(cache.Stats().APICalls, check.Equals, uint64(1+1))
55
56         // Alternating between two collections N times should produce
57         // only 2 more API calls.
58         arv.ApiToken = arvadostest.AdminToken
59         for i := 0; i < 20; i++ {
60                 var target string
61                 if i%2 == 0 {
62                         target = arvadostest.HelloWorldCollection
63                 } else {
64                         target = arvadostest.FooBarDirCollection
65                 }
66                 _, err := cache.Get(arv, target, false)
67                 c.Check(err, check.Equals, nil)
68         }
69         c.Check(cache.Stats().Requests, check.Equals, uint64(5+2+20))
70         c.Check(cache.Stats().CollectionHits, check.Equals, uint64(4+2+18))
71         c.Check(cache.Stats().PermissionHits, check.Equals, uint64(4+1+18))
72         c.Check(cache.Stats().PDHHits, check.Equals, uint64(4+0+18))
73         c.Check(cache.Stats().APICalls, check.Equals, uint64(1+1+2))
74 }
75
76 func (s *UnitSuite) TestCacheForceReloadByPDH(c *check.C) {
77         c.Skip("see #11945")
78
79         arv, err := arvadosclient.MakeArvadosClient()
80         c.Assert(err, check.Equals, nil)
81
82         cache := DefaultConfig().Cache
83
84         for _, forceReload := range []bool{false, true, false, true} {
85                 _, err := cache.Get(arv, arvadostest.FooPdh, forceReload)
86                 c.Check(err, check.Equals, nil)
87         }
88
89         c.Check(cache.Stats().Requests, check.Equals, uint64(4))
90         c.Check(cache.Stats().CollectionHits, check.Equals, uint64(3))
91         c.Check(cache.Stats().PermissionHits, check.Equals, uint64(1))
92         c.Check(cache.Stats().PDHHits, check.Equals, uint64(0))
93         c.Check(cache.Stats().APICalls, check.Equals, uint64(3))
94 }
95
96 func (s *UnitSuite) TestCacheForceReloadByUUID(c *check.C) {
97         c.Skip("see #11945")
98
99         arv, err := arvadosclient.MakeArvadosClient()
100         c.Assert(err, check.Equals, nil)
101
102         cache := DefaultConfig().Cache
103
104         for _, forceReload := range []bool{false, true, false, true} {
105                 _, err := cache.Get(arv, arvadostest.FooCollection, forceReload)
106                 c.Check(err, check.Equals, nil)
107         }
108
109         c.Check(cache.Stats().Requests, check.Equals, uint64(4))
110         c.Check(cache.Stats().CollectionHits, check.Equals, uint64(3))
111         c.Check(cache.Stats().PermissionHits, check.Equals, uint64(1))
112         c.Check(cache.Stats().PDHHits, check.Equals, uint64(3))
113         c.Check(cache.Stats().APICalls, check.Equals, uint64(3))
114 }