0
|
1 /**
|
|
2 * Orthanc - A Lightweight, RESTful DICOM Store
|
|
3 * Copyright (C) 2012-2015 Sebastien Jodogne, Medical Physics
|
|
4 * Department, University Hospital of Liege, Belgium
|
|
5 *
|
|
6 * This program is free software: you can redistribute it and/or
|
|
7 * modify it under the terms of the GNU Affero General Public License
|
|
8 * as published by the Free Software Foundation, either version 3 of
|
|
9 * the License, or (at your option) any later version.
|
|
10 *
|
|
11 * This program is distributed in the hope that it will be useful, but
|
|
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
14 * Affero General Public License for more details.
|
|
15 *
|
|
16 * You should have received a copy of the GNU Affero General Public License
|
|
17 * along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
18 **/
|
|
19
|
|
20
|
|
21 #include <gtest/gtest.h>
|
|
22 #include <boost/lexical_cast.hpp>
|
|
23
|
|
24 static int argc_;
|
|
25 static char** argv_;
|
|
26
|
26
|
27 #include "../Orthanc/Core/OrthancException.h"
|
|
28 #include "../Orthanc/Core/Toolbox.h"
|
0
|
29 #include "../Plugin/Cache/CacheManager.h"
|
|
30 #include "../Plugin/Cache/CacheScheduler.h"
|
|
31 #include "../Plugin/Cache/ICacheFactory.h"
|
|
32 #include "../Plugin/Cache/ICacheFactory.h"
|
|
33
|
|
34 using namespace OrthancPlugins;
|
|
35
|
|
36
|
|
37 class CacheManagerTest : public testing::Test
|
|
38 {
|
|
39 private:
|
|
40 std::auto_ptr<Orthanc::FilesystemStorage> storage_;
|
|
41 std::auto_ptr<Orthanc::SQLite::Connection> db_;
|
|
42 std::auto_ptr<CacheManager> cache_;
|
|
43
|
|
44 public:
|
|
45 virtual void SetUp()
|
|
46 {
|
|
47 storage_.reset(new Orthanc::FilesystemStorage("UnitTestsResults"));
|
|
48 storage_->Clear();
|
|
49 Orthanc::Toolbox::RemoveFile("UnitTestsResults/cache.db");
|
|
50
|
|
51 db_.reset(new Orthanc::SQLite::Connection());
|
|
52 db_->Open("UnitTestsResults/cache.db");
|
|
53
|
|
54 cache_.reset(new CacheManager(*db_, *storage_));
|
|
55 cache_->SetSanityCheckEnabled(true);
|
|
56 }
|
|
57
|
|
58 virtual void TearDown()
|
|
59 {
|
|
60 cache_.reset(NULL);
|
|
61 db_.reset(NULL);
|
|
62 storage_.reset(NULL);
|
|
63 }
|
|
64
|
|
65 CacheManager& GetCache()
|
|
66 {
|
|
67 return *cache_;
|
|
68 }
|
|
69
|
|
70 Orthanc::FilesystemStorage& GetStorage()
|
|
71 {
|
|
72 return *storage_;
|
|
73 }
|
|
74 };
|
|
75
|
|
76
|
|
77
|
|
78 class TestF : public ICacheFactory
|
|
79 {
|
|
80 private:
|
|
81 int bundle_;
|
|
82
|
|
83 public:
|
|
84 TestF(int bundle) : bundle_(bundle)
|
|
85 {
|
|
86 }
|
|
87
|
|
88 virtual bool Create(std::string& content,
|
|
89 const std::string& key)
|
|
90 {
|
|
91 content = "Bundle " + boost::lexical_cast<std::string>(bundle_) + ", item " + key;
|
|
92 return true;
|
|
93 }
|
|
94 };
|
|
95
|
|
96
|
|
97 TEST_F(CacheManagerTest, DefaultQuota)
|
|
98 {
|
|
99 std::set<std::string> f;
|
|
100 GetStorage().ListAllFiles(f);
|
66
|
101 ASSERT_EQ(0u, f.size());
|
0
|
102
|
|
103 GetCache().SetDefaultQuota(10, 0);
|
66
|
104 for (unsigned int i = 0; i < 30; i++)
|
0
|
105 {
|
|
106 GetStorage().ListAllFiles(f);
|
66
|
107 ASSERT_EQ(i >= 10 ? 10u : i, f.size());
|
0
|
108 std::string s = boost::lexical_cast<std::string>(i);
|
|
109 GetCache().Store(0, s, "Test " + s);
|
|
110 }
|
|
111
|
|
112 GetStorage().ListAllFiles(f);
|
66
|
113 ASSERT_EQ(10u, f.size());
|
0
|
114
|
|
115 for (int i = 0; i < 30; i++)
|
|
116 {
|
|
117 ASSERT_EQ(i >= 20, GetCache().IsCached(0, boost::lexical_cast<std::string>(i)));
|
|
118 }
|
|
119
|
|
120 GetCache().SetDefaultQuota(5, 0);
|
|
121 GetStorage().ListAllFiles(f);
|
66
|
122 ASSERT_EQ(5u, f.size());
|
0
|
123 for (int i = 0; i < 30; i++)
|
|
124 {
|
|
125 ASSERT_EQ(i >= 25, GetCache().IsCached(0, boost::lexical_cast<std::string>(i)));
|
|
126 }
|
|
127
|
|
128 for (int i = 0; i < 15; i++)
|
|
129 {
|
|
130 std::string s = boost::lexical_cast<std::string>(i);
|
|
131 GetCache().Store(0, s, "Test " + s);
|
|
132 }
|
|
133
|
|
134 GetStorage().ListAllFiles(f);
|
66
|
135 ASSERT_EQ(5u, f.size());
|
0
|
136
|
|
137 for (int i = 0; i < 50; i++)
|
|
138 {
|
|
139 std::string s = boost::lexical_cast<std::string>(i);
|
|
140 if (i >= 10 && i < 15)
|
|
141 {
|
|
142 std::string tmp;
|
|
143 ASSERT_TRUE(GetCache().IsCached(0, s));
|
|
144 ASSERT_TRUE(GetCache().Access(tmp, 0, s));
|
|
145 ASSERT_EQ("Test " + s, tmp);
|
|
146 }
|
|
147 else
|
|
148 {
|
|
149 ASSERT_FALSE(GetCache().IsCached(0, s));
|
|
150 }
|
|
151 }
|
|
152 }
|
|
153
|
|
154
|
|
155
|
|
156 TEST_F(CacheManagerTest, Invalidate)
|
|
157 {
|
|
158 GetCache().SetDefaultQuota(10, 0);
|
|
159 for (int i = 0; i < 30; i++)
|
|
160 {
|
|
161 std::string s = boost::lexical_cast<std::string>(i);
|
|
162 GetCache().Store(0, s, "Test " + s);
|
|
163 }
|
|
164
|
|
165 std::set<std::string> f;
|
|
166 GetStorage().ListAllFiles(f);
|
66
|
167 ASSERT_EQ(10u, f.size());
|
0
|
168
|
|
169 GetCache().Invalidate(0, "25");
|
|
170 GetStorage().ListAllFiles(f);
|
66
|
171 ASSERT_EQ(9u, f.size());
|
0
|
172 for (int i = 0; i < 50; i++)
|
|
173 {
|
|
174 std::string s = boost::lexical_cast<std::string>(i);
|
|
175 ASSERT_EQ((i >= 20 && i < 30 && i != 25), GetCache().IsCached(0, s));
|
|
176 }
|
|
177
|
|
178 for (int i = 0; i < 50; i++)
|
|
179 {
|
|
180 GetCache().Invalidate(0, boost::lexical_cast<std::string>(i));
|
|
181 }
|
|
182
|
|
183 GetStorage().ListAllFiles(f);
|
66
|
184 ASSERT_EQ(0u, f.size());
|
0
|
185 }
|
|
186
|
|
187
|
|
188
|
|
189 int main(int argc, char **argv)
|
|
190 {
|
|
191 argc_ = argc;
|
|
192 argv_ = argv;
|
|
193
|
|
194 ::testing::InitGoogleTest(&argc, argv);
|
|
195
|
|
196 return RUN_ALL_TESTS();
|
|
197 }
|