181
|
1 #include "gtest/gtest.h"
|
|
2
|
183
|
3 #include "../OrthancServer/DatabaseWrapper.h"
|
|
4
|
181
|
5 #include <ctype.h>
|
|
6 #include <glog/logging.h>
|
|
7
|
|
8
|
183
|
9 using namespace Orthanc;
|
181
|
10
|
183
|
11 namespace
|
|
12 {
|
181
|
13 class ServerIndexListener : public IServerIndexListener
|
|
14 {
|
|
15 public:
|
183
|
16 std::set<std::string> deletedFiles_;
|
|
17 std::string ancestorId_;
|
|
18 ResourceType ancestorType_;
|
|
19
|
|
20 void Reset()
|
181
|
21 {
|
183
|
22 ancestorId_ = "";
|
|
23 deletedFiles_.clear();
|
|
24 }
|
|
25
|
|
26 virtual void SignalRemainingAncestor(ResourceType type,
|
|
27 const std::string& publicId)
|
|
28 {
|
|
29 ancestorId_ = publicId;
|
|
30 ancestorType_ = type;
|
181
|
31 }
|
|
32
|
|
33 virtual void SignalFileDeleted(const std::string& fileUuid)
|
|
34 {
|
183
|
35 deletedFiles_.insert(fileUuid);
|
181
|
36 LOG(INFO) << "A file must be removed: " << fileUuid;
|
|
37 }
|
|
38 };
|
|
39 }
|
|
40
|
|
41
|
183
|
42 TEST(DatabaseWrapper, Simple)
|
181
|
43 {
|
|
44 ServerIndexListener listener;
|
183
|
45 DatabaseWrapper index(listener);
|
181
|
46
|
|
47 int64_t a[] = {
|
182
|
48 index.CreateResource("a", ResourceType_Patient), // 0
|
|
49 index.CreateResource("b", ResourceType_Study), // 1
|
|
50 index.CreateResource("c", ResourceType_Series), // 2
|
|
51 index.CreateResource("d", ResourceType_Instance), // 3
|
|
52 index.CreateResource("e", ResourceType_Instance), // 4
|
|
53 index.CreateResource("f", ResourceType_Instance), // 5
|
|
54 index.CreateResource("g", ResourceType_Study) // 6
|
181
|
55 };
|
|
56
|
|
57 index.SetGlobalProperty("Hello", "World");
|
|
58
|
|
59 index.AttachChild(a[0], a[1]);
|
|
60 index.AttachChild(a[1], a[2]);
|
|
61 index.AttachChild(a[2], a[3]);
|
|
62 index.AttachChild(a[2], a[4]);
|
|
63 index.AttachChild(a[6], a[5]);
|
182
|
64
|
|
65 std::string s;
|
|
66
|
|
67 ASSERT_FALSE(index.GetParentPublicId(s, a[0]));
|
|
68 ASSERT_FALSE(index.GetParentPublicId(s, a[6]));
|
|
69 ASSERT_TRUE(index.GetParentPublicId(s, a[1])); ASSERT_EQ("a", s);
|
|
70 ASSERT_TRUE(index.GetParentPublicId(s, a[2])); ASSERT_EQ("b", s);
|
|
71 ASSERT_TRUE(index.GetParentPublicId(s, a[3])); ASSERT_EQ("c", s);
|
|
72 ASSERT_TRUE(index.GetParentPublicId(s, a[4])); ASSERT_EQ("c", s);
|
|
73 ASSERT_TRUE(index.GetParentPublicId(s, a[5])); ASSERT_EQ("g", s);
|
|
74
|
184
|
75 /*
|
|
76 std::list<std::string> l;
|
182
|
77 index.GetChildrenPublicId(l, a[0]); ASSERT_EQ(1, l.size()); ASSERT_EQ("b", l.front());
|
|
78 index.GetChildrenPublicId(l, a[1]); ASSERT_EQ(1, l.size()); ASSERT_EQ("c", l.front());
|
|
79 index.GetChildrenPublicId(l, a[3]); ASSERT_EQ(0, l.size());
|
|
80 index.GetChildrenPublicId(l, a[4]); ASSERT_EQ(0, l.size());
|
|
81 index.GetChildrenPublicId(l, a[5]); ASSERT_EQ(0, l.size());
|
|
82 index.GetChildrenPublicId(l, a[6]); ASSERT_EQ(1, l.size()); ASSERT_EQ("f", l.front());
|
|
83
|
|
84 index.GetChildrenPublicId(l, a[2]); ASSERT_EQ(2, l.size());
|
|
85 if (l.front() == "d")
|
|
86 {
|
|
87 ASSERT_EQ("e", l.back());
|
|
88 }
|
|
89 else
|
|
90 {
|
|
91 ASSERT_EQ("d", l.back());
|
|
92 ASSERT_EQ("e", l.front());
|
|
93 }
|
184
|
94 */
|
182
|
95
|
183
|
96 index.AttachFile(a[4], "_json", "my json file", 21, 42, CompressionType_Zlib);
|
|
97 index.AttachFile(a[4], "_dicom", "my dicom file", 42);
|
|
98 index.AttachFile(a[6], "_hello", "world", 44);
|
|
99 index.SetMetadata(a[4], MetadataType_Instance_RemoteAet, "PINNACLE");
|
182
|
100
|
183
|
101 ASSERT_EQ(21 + 42 + 44, index.GetTotalCompressedSize());
|
|
102 ASSERT_EQ(42 + 42 + 44, index.GetTotalUncompressedSize());
|
181
|
103
|
|
104 DicomMap m;
|
|
105 m.SetValue(0x0010, 0x0010, "PatientName");
|
|
106 index.SetMainDicomTags(a[3], m);
|
|
107
|
|
108 int64_t b;
|
|
109 ResourceType t;
|
|
110 ASSERT_TRUE(index.FindResource("g", b, t));
|
|
111 ASSERT_EQ(7, b);
|
|
112 ASSERT_EQ(ResourceType_Study, t);
|
|
113
|
|
114 ASSERT_TRUE(index.FindMetadata(s, a[4], MetadataType_Instance_RemoteAet));
|
|
115 ASSERT_FALSE(index.FindMetadata(s, a[4], MetadataType_Instance_IndexInSeries));
|
|
116 ASSERT_EQ("PINNACLE", s);
|
|
117 ASSERT_EQ("PINNACLE", index.GetMetadata(a[4], MetadataType_Instance_RemoteAet));
|
|
118 ASSERT_EQ("None", index.GetMetadata(a[4], MetadataType_Instance_IndexInSeries, "None"));
|
|
119
|
|
120 ASSERT_TRUE(index.FindGlobalProperty(s, "Hello"));
|
|
121 ASSERT_FALSE(index.FindGlobalProperty(s, "Hello2"));
|
|
122 ASSERT_EQ("World", s);
|
|
123 ASSERT_EQ("World", index.GetGlobalProperty("Hello"));
|
|
124 ASSERT_EQ("None", index.GetGlobalProperty("Hello2", "None"));
|
|
125
|
183
|
126 size_t us, cs;
|
181
|
127 CompressionType ct;
|
183
|
128 ASSERT_TRUE(index.FindFile(a[4], "_json", s, cs, us, ct));
|
181
|
129 ASSERT_EQ("my json file", s);
|
183
|
130 ASSERT_EQ(21, cs);
|
181
|
131 ASSERT_EQ(42, us);
|
|
132 ASSERT_EQ(CompressionType_Zlib, ct);
|
|
133
|
183
|
134 ASSERT_EQ(0, listener.deletedFiles_.size());
|
181
|
135 ASSERT_EQ(7, index.GetTableRecordCount("Resources"));
|
183
|
136 ASSERT_EQ(3, index.GetTableRecordCount("AttachedFiles"));
|
181
|
137 ASSERT_EQ(1, index.GetTableRecordCount("Metadata"));
|
|
138 ASSERT_EQ(1, index.GetTableRecordCount("MainDicomTags"));
|
|
139 index.DeleteResource(a[0]);
|
183
|
140
|
|
141 ASSERT_EQ(2, listener.deletedFiles_.size());
|
|
142 ASSERT_NE(listener.deletedFiles_.end(), listener.deletedFiles_.find("my json file"));
|
|
143 ASSERT_NE(listener.deletedFiles_.end(), listener.deletedFiles_.find("my dicom file"));
|
|
144
|
181
|
145 ASSERT_EQ(2, index.GetTableRecordCount("Resources"));
|
|
146 ASSERT_EQ(0, index.GetTableRecordCount("Metadata"));
|
183
|
147 ASSERT_EQ(1, index.GetTableRecordCount("AttachedFiles"));
|
|
148 ASSERT_EQ(0, index.GetTableRecordCount("MainDicomTags"));
|
|
149 index.DeleteResource(a[5]);
|
|
150 ASSERT_EQ(0, index.GetTableRecordCount("Resources"));
|
181
|
151 ASSERT_EQ(0, index.GetTableRecordCount("AttachedFiles"));
|
183
|
152 ASSERT_EQ(1, index.GetTableRecordCount("GlobalProperties"));
|
|
153
|
|
154 ASSERT_EQ(3, listener.deletedFiles_.size());
|
|
155 ASSERT_NE(listener.deletedFiles_.end(), listener.deletedFiles_.find("world"));
|
|
156 }
|
|
157
|
|
158
|
|
159
|
|
160
|
|
161 TEST(DatabaseWrapper, Upward)
|
|
162 {
|
|
163 ServerIndexListener listener;
|
|
164 DatabaseWrapper index(listener);
|
|
165
|
|
166 int64_t a[] = {
|
|
167 index.CreateResource("a", ResourceType_Patient), // 0
|
|
168 index.CreateResource("b", ResourceType_Study), // 1
|
|
169 index.CreateResource("c", ResourceType_Series), // 2
|
|
170 index.CreateResource("d", ResourceType_Instance), // 3
|
|
171 index.CreateResource("e", ResourceType_Instance), // 4
|
|
172 index.CreateResource("f", ResourceType_Study), // 5
|
|
173 index.CreateResource("g", ResourceType_Series), // 6
|
|
174 index.CreateResource("h", ResourceType_Series) // 7
|
|
175 };
|
|
176
|
|
177 index.AttachChild(a[0], a[1]);
|
|
178 index.AttachChild(a[1], a[2]);
|
|
179 index.AttachChild(a[2], a[3]);
|
|
180 index.AttachChild(a[2], a[4]);
|
|
181 index.AttachChild(a[1], a[6]);
|
|
182 index.AttachChild(a[0], a[5]);
|
|
183 index.AttachChild(a[5], a[7]);
|
|
184
|
|
185 listener.Reset();
|
|
186 index.DeleteResource(a[3]);
|
|
187 ASSERT_EQ("c", listener.ancestorId_);
|
|
188 ASSERT_EQ(ResourceType_Series, listener.ancestorType_);
|
|
189
|
|
190 listener.Reset();
|
|
191 index.DeleteResource(a[4]);
|
|
192 ASSERT_EQ("b", listener.ancestorId_);
|
|
193 ASSERT_EQ(ResourceType_Study, listener.ancestorType_);
|
|
194
|
|
195 listener.Reset();
|
|
196 index.DeleteResource(a[7]);
|
|
197 ASSERT_EQ("a", listener.ancestorId_);
|
|
198 ASSERT_EQ(ResourceType_Patient, listener.ancestorType_);
|
|
199
|
|
200 listener.Reset();
|
181
|
201 index.DeleteResource(a[6]);
|
183
|
202 ASSERT_EQ("", listener.ancestorId_); // No more ancestor
|
181
|
203 }
|