Mercurial > hg > orthanc
comparison UnitTests/ServerIndex.cpp @ 262:2354560daf2f
primitives for recycling patients
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Fri, 07 Dec 2012 12:56:27 +0100 |
parents | bd009f0b1931 |
children | a08dca15790e |
comparison
equal
deleted
inserted
replaced
260:f1fb9d1aa444 | 262:2354560daf2f |
---|---|
1 #include "gtest/gtest.h" | 1 #include "gtest/gtest.h" |
2 | 2 |
3 #include "../OrthancServer/DatabaseWrapper.h" | 3 #include "../OrthancServer/DatabaseWrapper.h" |
4 #include "../Core/Toolbox.h" | |
4 | 5 |
5 #include <ctype.h> | 6 #include <ctype.h> |
6 #include <glog/logging.h> | 7 #include <glog/logging.h> |
7 | 8 |
8 using namespace Orthanc; | 9 using namespace Orthanc; |
10 namespace | 11 namespace |
11 { | 12 { |
12 class ServerIndexListener : public IServerIndexListener | 13 class ServerIndexListener : public IServerIndexListener |
13 { | 14 { |
14 public: | 15 public: |
15 std::set<std::string> deletedFiles_; | 16 std::vector<std::string> deletedFiles_; |
16 std::string ancestorId_; | 17 std::string ancestorId_; |
17 ResourceType ancestorType_; | 18 ResourceType ancestorType_; |
18 | 19 |
19 void Reset() | 20 void Reset() |
20 { | 21 { |
29 ancestorType_ = type; | 30 ancestorType_ = type; |
30 } | 31 } |
31 | 32 |
32 virtual void SignalFileDeleted(const std::string& fileUuid) | 33 virtual void SignalFileDeleted(const std::string& fileUuid) |
33 { | 34 { |
34 deletedFiles_.insert(fileUuid); | 35 deletedFiles_.push_back(fileUuid); |
35 LOG(INFO) << "A file must be removed: " << fileUuid; | 36 LOG(INFO) << "A file must be removed: " << fileUuid; |
36 } | 37 } |
37 }; | 38 }; |
38 } | 39 } |
39 | 40 |
168 ASSERT_EQ(1u, index.GetTableRecordCount("Metadata")); | 169 ASSERT_EQ(1u, index.GetTableRecordCount("Metadata")); |
169 ASSERT_EQ(1u, index.GetTableRecordCount("MainDicomTags")); | 170 ASSERT_EQ(1u, index.GetTableRecordCount("MainDicomTags")); |
170 index.DeleteResource(a[0]); | 171 index.DeleteResource(a[0]); |
171 | 172 |
172 ASSERT_EQ(2u, listener.deletedFiles_.size()); | 173 ASSERT_EQ(2u, listener.deletedFiles_.size()); |
173 ASSERT_FALSE(listener.deletedFiles_.find("my json file") == listener.deletedFiles_.end()); | 174 ASSERT_FALSE(std::find(listener.deletedFiles_.begin(), |
174 ASSERT_FALSE(listener.deletedFiles_.find("my dicom file") == listener.deletedFiles_.end()); | 175 listener.deletedFiles_.end(), |
176 "my json file") == listener.deletedFiles_.end()); | |
177 ASSERT_FALSE(std::find(listener.deletedFiles_.begin(), | |
178 listener.deletedFiles_.end(), | |
179 "my dicom file") == listener.deletedFiles_.end()); | |
175 | 180 |
176 ASSERT_EQ(2u, index.GetTableRecordCount("Resources")); | 181 ASSERT_EQ(2u, index.GetTableRecordCount("Resources")); |
177 ASSERT_EQ(0u, index.GetTableRecordCount("Metadata")); | 182 ASSERT_EQ(0u, index.GetTableRecordCount("Metadata")); |
178 ASSERT_EQ(1u, index.GetTableRecordCount("AttachedFiles")); | 183 ASSERT_EQ(1u, index.GetTableRecordCount("AttachedFiles")); |
179 ASSERT_EQ(0u, index.GetTableRecordCount("MainDicomTags")); | 184 ASSERT_EQ(0u, index.GetTableRecordCount("MainDicomTags")); |
181 ASSERT_EQ(0u, index.GetTableRecordCount("Resources")); | 186 ASSERT_EQ(0u, index.GetTableRecordCount("Resources")); |
182 ASSERT_EQ(0u, index.GetTableRecordCount("AttachedFiles")); | 187 ASSERT_EQ(0u, index.GetTableRecordCount("AttachedFiles")); |
183 ASSERT_EQ(2u, index.GetTableRecordCount("GlobalProperties")); | 188 ASSERT_EQ(2u, index.GetTableRecordCount("GlobalProperties")); |
184 | 189 |
185 ASSERT_EQ(3u, listener.deletedFiles_.size()); | 190 ASSERT_EQ(3u, listener.deletedFiles_.size()); |
186 ASSERT_FALSE(listener.deletedFiles_.find("world") == listener.deletedFiles_.end()); | 191 ASSERT_FALSE(std::find(listener.deletedFiles_.begin(), |
192 listener.deletedFiles_.end(), | |
193 "world") == listener.deletedFiles_.end()); | |
187 } | 194 } |
188 | 195 |
189 | 196 |
190 | 197 |
191 | 198 |
254 | 261 |
255 listener.Reset(); | 262 listener.Reset(); |
256 index.DeleteResource(a[6]); | 263 index.DeleteResource(a[6]); |
257 ASSERT_EQ("", listener.ancestorId_); // No more ancestor | 264 ASSERT_EQ("", listener.ancestorId_); // No more ancestor |
258 } | 265 } |
266 | |
267 | |
268 TEST(DatabaseWrapper, PatientRecycling) | |
269 { | |
270 ServerIndexListener listener; | |
271 DatabaseWrapper index(listener); | |
272 | |
273 std::vector<int64_t> patients; | |
274 for (int i = 0; i < 10; i++) | |
275 { | |
276 std::string p = "Patient " + boost::lexical_cast<std::string>(i); | |
277 patients.push_back(index.CreateResource(p, ResourceType_Patient)); | |
278 index.AddAttachment(patients[i], FileInfo(p, FileContentType_Dicom, i + 10)); | |
279 ASSERT_FALSE(index.IsProtectedPatient(patients[i])); | |
280 } | |
281 | |
282 ASSERT_EQ(10u, index.GetTableRecordCount("Resources")); | |
283 ASSERT_EQ(10u, index.GetTableRecordCount("PatientRecyclingOrder")); | |
284 | |
285 listener.Reset(); | |
286 | |
287 index.DeleteResource(patients[5]); | |
288 index.DeleteResource(patients[0]); | |
289 ASSERT_EQ(8u, index.GetTableRecordCount("Resources")); | |
290 ASSERT_EQ(8u, index.GetTableRecordCount("PatientRecyclingOrder")); | |
291 | |
292 ASSERT_EQ(2u, listener.deletedFiles_.size()); | |
293 ASSERT_EQ("Patient 5", listener.deletedFiles_[0]); | |
294 ASSERT_EQ("Patient 0", listener.deletedFiles_[1]); | |
295 | |
296 int64_t p; | |
297 ASSERT_TRUE(index.SelectPatientToRecycle(p)); ASSERT_EQ(p, patients[1]); | |
298 index.DeleteResource(p); | |
299 ASSERT_TRUE(index.SelectPatientToRecycle(p)); ASSERT_EQ(p, patients[2]); | |
300 index.DeleteResource(p); | |
301 ASSERT_TRUE(index.SelectPatientToRecycle(p)); ASSERT_EQ(p, patients[3]); | |
302 index.DeleteResource(p); | |
303 ASSERT_TRUE(index.SelectPatientToRecycle(p)); ASSERT_EQ(p, patients[4]); | |
304 index.DeleteResource(p); | |
305 ASSERT_TRUE(index.SelectPatientToRecycle(p)); ASSERT_EQ(p, patients[6]); | |
306 index.DeleteResource(p); | |
307 index.DeleteResource(patients[8]); | |
308 ASSERT_TRUE(index.SelectPatientToRecycle(p)); ASSERT_EQ(p, patients[7]); | |
309 index.DeleteResource(p); | |
310 ASSERT_TRUE(index.SelectPatientToRecycle(p)); ASSERT_EQ(p, patients[9]); | |
311 index.DeleteResource(p); | |
312 ASSERT_FALSE(index.SelectPatientToRecycle(p)); | |
313 | |
314 ASSERT_EQ(10u, listener.deletedFiles_.size()); | |
315 ASSERT_EQ(0u, index.GetTableRecordCount("Resources")); | |
316 ASSERT_EQ(0u, index.GetTableRecordCount("PatientRecyclingOrder")); | |
317 } | |
318 | |
319 | |
320 TEST(DatabaseWrapper, PatientProtection) | |
321 { | |
322 Toolbox::RemoveFile("hi.sqlite"); | |
323 ServerIndexListener listener; | |
324 DatabaseWrapper index("hi.sqlite", listener); | |
325 | |
326 std::vector<int64_t> patients; | |
327 for (int i = 0; i < 5; i++) | |
328 { | |
329 std::string p = "Patient " + boost::lexical_cast<std::string>(i); | |
330 patients.push_back(index.CreateResource(p, ResourceType_Patient)); | |
331 index.AddAttachment(patients[i], FileInfo(p, FileContentType_Dicom, i + 10)); | |
332 ASSERT_FALSE(index.IsProtectedPatient(patients[i])); | |
333 } | |
334 | |
335 ASSERT_EQ(5u, index.GetTableRecordCount("Resources")); | |
336 ASSERT_EQ(5u, index.GetTableRecordCount("PatientRecyclingOrder")); | |
337 | |
338 ASSERT_FALSE(index.IsProtectedPatient(patients[2])); | |
339 index.SetProtectedPatient(patients[2], true); | |
340 ASSERT_TRUE(index.IsProtectedPatient(patients[2])); | |
341 ASSERT_EQ(4u, index.GetTableRecordCount("PatientRecyclingOrder")); | |
342 ASSERT_EQ(5u, index.GetTableRecordCount("Resources")); | |
343 | |
344 index.SetProtectedPatient(patients[2], true); | |
345 ASSERT_TRUE(index.IsProtectedPatient(patients[2])); | |
346 ASSERT_EQ(4u, index.GetTableRecordCount("PatientRecyclingOrder")); | |
347 index.SetProtectedPatient(patients[2], false); | |
348 ASSERT_FALSE(index.IsProtectedPatient(patients[2])); | |
349 ASSERT_EQ(5u, index.GetTableRecordCount("PatientRecyclingOrder")); | |
350 index.SetProtectedPatient(patients[2], false); | |
351 ASSERT_FALSE(index.IsProtectedPatient(patients[2])); | |
352 ASSERT_EQ(5u, index.GetTableRecordCount("PatientRecyclingOrder")); | |
353 | |
354 ASSERT_EQ(5u, index.GetTableRecordCount("Resources")); | |
355 ASSERT_EQ(5u, index.GetTableRecordCount("PatientRecyclingOrder")); | |
356 index.SetProtectedPatient(patients[2], true); | |
357 ASSERT_TRUE(index.IsProtectedPatient(patients[2])); | |
358 ASSERT_EQ(4u, index.GetTableRecordCount("PatientRecyclingOrder")); | |
359 index.SetProtectedPatient(patients[2], false); | |
360 ASSERT_FALSE(index.IsProtectedPatient(patients[2])); | |
361 ASSERT_EQ(5u, index.GetTableRecordCount("PatientRecyclingOrder")); | |
362 index.SetProtectedPatient(patients[3], true); | |
363 ASSERT_TRUE(index.IsProtectedPatient(patients[3])); | |
364 ASSERT_EQ(4u, index.GetTableRecordCount("PatientRecyclingOrder")); | |
365 | |
366 ASSERT_EQ(5u, index.GetTableRecordCount("Resources")); | |
367 ASSERT_EQ(0u, listener.deletedFiles_.size()); | |
368 | |
369 // Unprotecting a patient puts it at the last position in the recycling queue | |
370 int64_t p; | |
371 ASSERT_TRUE(index.SelectPatientToRecycle(p)); ASSERT_EQ(p, patients[0]); | |
372 index.DeleteResource(p); | |
373 ASSERT_TRUE(index.SelectPatientToRecycle(p)); ASSERT_EQ(p, patients[1]); | |
374 index.DeleteResource(p); | |
375 ASSERT_TRUE(index.SelectPatientToRecycle(p)); ASSERT_EQ(p, patients[4]); | |
376 index.DeleteResource(p); | |
377 ASSERT_TRUE(index.SelectPatientToRecycle(p)); ASSERT_EQ(p, patients[2]); | |
378 index.DeleteResource(p); | |
379 // "patients[3]" is still protected | |
380 ASSERT_FALSE(index.SelectPatientToRecycle(p)); | |
381 | |
382 ASSERT_EQ(4u, listener.deletedFiles_.size()); | |
383 ASSERT_EQ(1u, index.GetTableRecordCount("Resources")); | |
384 ASSERT_EQ(0u, index.GetTableRecordCount("PatientRecyclingOrder")); | |
385 | |
386 index.SetProtectedPatient(patients[3], false); | |
387 ASSERT_EQ(1u, index.GetTableRecordCount("PatientRecyclingOrder")); | |
388 ASSERT_TRUE(index.SelectPatientToRecycle(p)); ASSERT_EQ(p, patients[3]); | |
389 index.DeleteResource(p); | |
390 | |
391 ASSERT_EQ(5u, listener.deletedFiles_.size()); | |
392 ASSERT_EQ(0u, index.GetTableRecordCount("Resources")); | |
393 ASSERT_EQ(0u, index.GetTableRecordCount("PatientRecyclingOrder")); | |
394 } |