Mercurial > hg > orthanc
annotate UnitTests/MemoryCache.cpp @ 507:c4122c3a47c1
access to oldest item in LRUCache
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Fri, 16 Aug 2013 10:24:49 +0200 |
parents | f59e4518fd57 |
children | e7841864c97c |
rev | line source |
---|---|
282 | 1 #include "gtest/gtest.h" |
2 | |
283 | 3 #include <glog/logging.h> |
282 | 4 #include <memory> |
283 | 5 #include <boost/thread.hpp> |
6 #include <boost/lexical_cast.hpp> | |
282 | 7 #include "../Core/IDynamicObject.h" |
284
06aa7b7b6723
implementation of a single-threaded cache mechanism
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
283
diff
changeset
|
8 #include "../Core/Cache/MemoryCache.h" |
282 | 9 |
10 | |
505
f59e4518fd57
rename CacheIndex as LeastRecentlyUsedIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
285
diff
changeset
|
11 TEST(LRU, Basic) |
282 | 12 { |
505
f59e4518fd57
rename CacheIndex as LeastRecentlyUsedIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
285
diff
changeset
|
13 Orthanc::LeastRecentlyUsedIndex<std::string> r; |
282 | 14 |
15 r.Add("d"); | |
16 r.Add("a"); | |
17 r.Add("c"); | |
18 r.Add("b"); | |
19 | |
20 r.TagAsMostRecent("a"); | |
21 r.TagAsMostRecent("d"); | |
22 r.TagAsMostRecent("b"); | |
23 r.TagAsMostRecent("c"); | |
24 r.TagAsMostRecent("d"); | |
25 r.TagAsMostRecent("c"); | |
26 | |
507
c4122c3a47c1
access to oldest item in LRUCache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
505
diff
changeset
|
27 ASSERT_EQ("a", r.GetOldest()); |
282 | 28 ASSERT_EQ("a", r.RemoveOldest()); |
507
c4122c3a47c1
access to oldest item in LRUCache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
505
diff
changeset
|
29 ASSERT_EQ("b", r.GetOldest()); |
282 | 30 ASSERT_EQ("b", r.RemoveOldest()); |
507
c4122c3a47c1
access to oldest item in LRUCache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
505
diff
changeset
|
31 ASSERT_EQ("d", r.GetOldest()); |
282 | 32 ASSERT_EQ("d", r.RemoveOldest()); |
507
c4122c3a47c1
access to oldest item in LRUCache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
505
diff
changeset
|
33 ASSERT_EQ("c", r.GetOldest()); |
282 | 34 ASSERT_EQ("c", r.RemoveOldest()); |
35 | |
36 ASSERT_TRUE(r.IsEmpty()); | |
507
c4122c3a47c1
access to oldest item in LRUCache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
505
diff
changeset
|
37 |
c4122c3a47c1
access to oldest item in LRUCache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
505
diff
changeset
|
38 ASSERT_THROW(r.GetOldest(), Orthanc::OrthancException); |
c4122c3a47c1
access to oldest item in LRUCache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
505
diff
changeset
|
39 ASSERT_THROW(r.RemoveOldest(), Orthanc::OrthancException); |
282 | 40 } |
41 | |
42 | |
505
f59e4518fd57
rename CacheIndex as LeastRecentlyUsedIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
285
diff
changeset
|
43 TEST(LRU, Payload) |
282 | 44 { |
505
f59e4518fd57
rename CacheIndex as LeastRecentlyUsedIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
285
diff
changeset
|
45 Orthanc::LeastRecentlyUsedIndex<std::string, int> r; |
282 | 46 |
47 r.Add("a", 420); | |
48 r.Add("b", 421); | |
49 r.Add("c", 422); | |
50 r.Add("d", 423); | |
51 | |
52 r.TagAsMostRecent("a"); | |
53 r.TagAsMostRecent("d"); | |
54 r.TagAsMostRecent("b"); | |
55 r.TagAsMostRecent("c"); | |
56 r.TagAsMostRecent("d"); | |
57 r.TagAsMostRecent("c"); | |
58 | |
59 ASSERT_TRUE(r.Contains("b")); | |
60 ASSERT_EQ(421, r.Invalidate("b")); | |
61 ASSERT_FALSE(r.Contains("b")); | |
62 | |
63 int p; | |
283 | 64 ASSERT_TRUE(r.Contains("a", p)); ASSERT_EQ(420, p); |
65 ASSERT_TRUE(r.Contains("c", p)); ASSERT_EQ(422, p); | |
66 ASSERT_TRUE(r.Contains("d", p)); ASSERT_EQ(423, p); | |
67 | |
507
c4122c3a47c1
access to oldest item in LRUCache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
505
diff
changeset
|
68 ASSERT_EQ("a", r.GetOldest()); |
c4122c3a47c1
access to oldest item in LRUCache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
505
diff
changeset
|
69 ASSERT_EQ(420, r.GetOldestPayload()); |
282 | 70 ASSERT_EQ("a", r.RemoveOldest(p)); ASSERT_EQ(420, p); |
507
c4122c3a47c1
access to oldest item in LRUCache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
505
diff
changeset
|
71 |
c4122c3a47c1
access to oldest item in LRUCache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
505
diff
changeset
|
72 ASSERT_EQ("d", r.GetOldest()); |
c4122c3a47c1
access to oldest item in LRUCache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
505
diff
changeset
|
73 ASSERT_EQ(423, r.GetOldestPayload()); |
282 | 74 ASSERT_EQ("d", r.RemoveOldest(p)); ASSERT_EQ(423, p); |
507
c4122c3a47c1
access to oldest item in LRUCache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
505
diff
changeset
|
75 |
c4122c3a47c1
access to oldest item in LRUCache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
505
diff
changeset
|
76 ASSERT_EQ("c", r.GetOldest()); |
c4122c3a47c1
access to oldest item in LRUCache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
505
diff
changeset
|
77 ASSERT_EQ(422, r.GetOldestPayload()); |
282 | 78 ASSERT_EQ("c", r.RemoveOldest(p)); ASSERT_EQ(422, p); |
79 | |
80 ASSERT_TRUE(r.IsEmpty()); | |
81 } | |
82 | |
83 | |
283 | 84 |
85 | |
86 namespace | |
87 { | |
88 class Integer : public Orthanc::IDynamicObject | |
89 { | |
90 private: | |
91 std::string& log_; | |
92 int value_; | |
282 | 93 |
94 public: | |
283 | 95 Integer(std::string& log, int v) : log_(log), value_(v) |
96 { | |
97 } | |
98 | |
99 virtual ~Integer() | |
100 { | |
101 LOG(INFO) << "Removing cache entry for " << value_; | |
102 log_ += boost::lexical_cast<std::string>(value_) + " "; | |
103 } | |
104 | |
105 int GetValue() const | |
106 { | |
107 return value_; | |
108 } | |
109 }; | |
110 | |
284
06aa7b7b6723
implementation of a single-threaded cache mechanism
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
283
diff
changeset
|
111 class IntegerProvider : public Orthanc::ICachePageProvider |
283 | 112 { |
113 public: | |
114 std::string log_; | |
115 | |
116 Orthanc::IDynamicObject* Provide(const std::string& s) | |
117 { | |
118 LOG(INFO) << "Providing " << s; | |
119 return new Integer(log_, boost::lexical_cast<int>(s)); | |
120 } | |
282 | 121 }; |
122 } | |
283 | 123 |
124 | |
125 TEST(MemoryCache, Basic) | |
126 { | |
127 IntegerProvider provider; | |
128 | |
129 { | |
130 Orthanc::MemoryCache cache(provider, 3); | |
285
4031f73fe0e4
access to the raw dicom tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
284
diff
changeset
|
131 cache.Access("42"); // 42 -> exit |
4031f73fe0e4
access to the raw dicom tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
284
diff
changeset
|
132 cache.Access("43"); // 43, 42 -> exit |
4031f73fe0e4
access to the raw dicom tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
284
diff
changeset
|
133 cache.Access("45"); // 45, 43, 42 -> exit |
4031f73fe0e4
access to the raw dicom tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
284
diff
changeset
|
134 cache.Access("42"); // 42, 45, 43 -> exit |
4031f73fe0e4
access to the raw dicom tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
284
diff
changeset
|
135 cache.Access("43"); // 43, 42, 45 -> exit |
4031f73fe0e4
access to the raw dicom tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
284
diff
changeset
|
136 cache.Access("47"); // 45 is removed; 47, 43, 42 -> exit |
4031f73fe0e4
access to the raw dicom tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
284
diff
changeset
|
137 cache.Access("44"); // 42 is removed; 44, 47, 43 -> exit |
4031f73fe0e4
access to the raw dicom tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
284
diff
changeset
|
138 cache.Access("42"); // 43 is removed; 42, 44, 47 -> exit |
283 | 139 // Closing the cache: 47, 44, 42 are successively removed |
140 } | |
141 | |
142 ASSERT_EQ("45 42 43 47 44 42 ", provider.log_); | |
143 } |