1 // Copyright (C) The Arvados Authors. All rights reserved.
3 // SPDX-License-Identifier: AGPL-3.0
8 "git.curoverse.com/arvados.git/sdk/go/arvadosclient"
9 "git.curoverse.com/arvados.git/sdk/go/arvadostest"
13 func (s *UnitSuite) TestCache(c *check.C) {
16 arv, err := arvadosclient.MakeArvadosClient()
17 c.Assert(err, check.Equals, nil)
19 cache := DefaultConfig().Cache
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
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, ". ")
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))
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, ". ")
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))
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++ {
62 target = arvadostest.HelloWorldCollection
64 target = arvadostest.FooBarDirCollection
66 _, err := cache.Get(arv, target, false)
67 c.Check(err, check.Equals, nil)
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))
76 func (s *UnitSuite) TestCacheForceReloadByPDH(c *check.C) {
79 arv, err := arvadosclient.MakeArvadosClient()
80 c.Assert(err, check.Equals, nil)
82 cache := DefaultConfig().Cache
84 for _, forceReload := range []bool{false, true, false, true} {
85 _, err := cache.Get(arv, arvadostest.FooPdh, forceReload)
86 c.Check(err, check.Equals, nil)
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))
96 func (s *UnitSuite) TestCacheForceReloadByUUID(c *check.C) {
99 arv, err := arvadosclient.MakeArvadosClient()
100 c.Assert(err, check.Equals, nil)
102 cache := DefaultConfig().Cache
104 for _, forceReload := range []bool{false, true, false, true} {
105 _, err := cache.Get(arv, arvadostest.FooCollection, forceReload)
106 c.Check(err, check.Equals, nil)
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))