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 }