Mercurial > hg > orthanc-tests
annotate Tests/Toolbox.py @ 337:ec13ace43bde
trying webdav tests
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Sat, 10 Oct 2020 11:44:17 +0200 |
parents | bac7cc80f240 |
children | 66a36befb208 |
rev | line source |
---|---|
0 | 1 #!/usr/bin/python |
2 | |
1 | 3 # Orthanc - A Lightweight, RESTful DICOM Store |
73 | 4 # Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics |
1 | 5 # Department, University Hospital of Liege, Belgium |
260
943166deebcb
upgrade to year 2020
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
249
diff
changeset
|
6 # Copyright (C) 2017-2020 Osimis S.A., Belgium |
1 | 7 # |
8 # This program is free software: you can redistribute it and/or | |
9 # modify it under the terms of the GNU General Public License as | |
10 # published by the Free Software Foundation, either version 3 of the | |
11 # License, or (at your option) any later version. | |
12 # | |
13 # This program is distributed in the hope that it will be useful, but | |
14 # WITHOUT ANY WARRANTY; without even the implied warranty of | |
15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
16 # General Public License for more details. | |
17 # | |
18 # You should have received a copy of the GNU General Public License | |
19 # along with this program. If not, see <http://www.gnu.org/licenses/>. | |
0 | 20 |
21 | |
22 import hashlib | |
23 import httplib2 | |
24 import json | |
4 | 25 import os |
1 | 26 import re |
4 | 27 import signal |
1 | 28 import subprocess |
291
cfa785074c64
test_modify_transcode
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
260
diff
changeset
|
29 import tempfile |
4 | 30 import threading |
83 | 31 import sys |
0 | 32 import time |
1 | 33 import zipfile |
0 | 34 |
337
ec13ace43bde
trying webdav tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
318
diff
changeset
|
35 from xml.dom import minidom |
ec13ace43bde
trying webdav tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
318
diff
changeset
|
36 |
304 | 37 from PIL import Image, ImageChops |
38 import math | |
39 import operator | |
40 | |
83 | 41 |
42 if (sys.version_info >= (3, 0)): | |
43 from urllib.parse import urlencode | |
44 from io import StringIO | |
45 from io import BytesIO | |
46 | |
47 else: | |
48 from urllib import urlencode | |
49 | |
50 # http://stackoverflow.com/a/1313868/881731 | |
51 try: | |
52 from cStringIO import StringIO | |
53 except: | |
54 from StringIO import StringIO | |
3 | 55 |
0 | 56 |
83 | 57 def _DecodeJson(s): |
58 t = s | |
59 | |
60 if (sys.version_info >= (3, 0)): | |
61 try: | |
62 t = s.decode() | |
63 except: | |
64 pass | |
65 | |
66 try: | |
67 return json.loads(t) | |
68 except: | |
69 return t | |
0 | 70 |
71 | |
13 | 72 def DefineOrthanc(server = 'localhost', |
73 restPort = 8042, | |
1 | 74 username = None, |
75 password = None, | |
76 aet = 'ORTHANC', | |
77 dicomPort = 4242): | |
13 | 78 #m = re.match(r'(http|https)://([^:]+):([^@]+)@([^@]+)', url) |
79 #if m != None: | |
80 # url = m.groups()[0] + '://' + m.groups()[3] | |
81 # username = m.groups()[1] | |
82 # password = m.groups()[2] | |
0 | 83 |
13 | 84 #if not url.endswith('/'): |
85 # url += '/' | |
0 | 86 |
1 | 87 return { |
13 | 88 'Server' : server, |
89 'Url' : 'http://%s:%d/' % (server, restPort), | |
1 | 90 'Username' : username, |
91 'Password' : password, | |
92 'DicomAet' : aet, | |
93 'DicomPort' : dicomPort | |
94 } | |
0 | 95 |
96 | |
97 def _SetupCredentials(orthanc, http): | |
1 | 98 if (orthanc['Username'] != None and |
99 orthanc['Password'] != None): | |
100 http.add_credentials(orthanc['Username'], orthanc['Password']) | |
0 | 101 |
28 | 102 def DoGetRaw(orthanc, uri, data = {}, body = None, headers = {}): |
0 | 103 d = '' |
104 if len(data.keys()) > 0: | |
105 d = '?' + urlencode(data) | |
106 | |
107 http = httplib2.Http() | |
21
2a29bcff60a7
tests of image decoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
13
diff
changeset
|
108 http.follow_redirects = False |
0 | 109 _SetupCredentials(orthanc, http) |
110 | |
1 | 111 resp, content = http.request(orthanc['Url'] + uri + d, 'GET', body = body, |
0 | 112 headers = headers) |
28 | 113 return (resp, content) |
114 | |
115 | |
116 def DoGet(orthanc, uri, data = {}, body = None, headers = {}): | |
117 (resp, content) = DoGetRaw(orthanc, uri, data = data, body = body, headers = headers) | |
118 | |
0 | 119 if not (resp.status in [ 200 ]): |
239
8980bd19e31d
dicomweb: test_allowed_methods
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
222
diff
changeset
|
120 raise Exception(resp.status, resp) |
0 | 121 else: |
83 | 122 return _DecodeJson(content) |
0 | 123 |
124 def _DoPutOrPost(orthanc, uri, method, data, contentType, headers): | |
125 http = httplib2.Http() | |
21
2a29bcff60a7
tests of image decoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
13
diff
changeset
|
126 http.follow_redirects = False |
0 | 127 _SetupCredentials(orthanc, http) |
128 | |
83 | 129 if isinstance(data, (str, bytearray, bytes)): |
0 | 130 body = data |
131 if len(contentType) != 0: | |
132 headers['content-type'] = contentType | |
133 else: | |
134 body = json.dumps(data) | |
135 headers['content-type'] = 'application/json' | |
136 | |
137 headers['expect'] = '' | |
138 | |
1 | 139 resp, content = http.request(orthanc['Url'] + uri, method, |
0 | 140 body = body, |
141 headers = headers) | |
142 if not (resp.status in [ 200, 302 ]): | |
239
8980bd19e31d
dicomweb: test_allowed_methods
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
222
diff
changeset
|
143 raise Exception(resp.status, resp) |
0 | 144 else: |
83 | 145 return _DecodeJson(content) |
0 | 146 |
147 def DoDelete(orthanc, uri): | |
148 http = httplib2.Http() | |
21
2a29bcff60a7
tests of image decoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
13
diff
changeset
|
149 http.follow_redirects = False |
0 | 150 _SetupCredentials(orthanc, http) |
151 | |
1 | 152 resp, content = http.request(orthanc['Url'] + uri, 'DELETE') |
0 | 153 if not (resp.status in [ 200 ]): |
239
8980bd19e31d
dicomweb: test_allowed_methods
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
222
diff
changeset
|
154 raise Exception(resp.status, resp) |
0 | 155 else: |
83 | 156 return _DecodeJson(content) |
0 | 157 |
158 def DoPut(orthanc, uri, data = {}, contentType = ''): | |
10 | 159 return _DoPutOrPost(orthanc, uri, 'PUT', data, contentType, {}) |
0 | 160 |
161 def DoPost(orthanc, uri, data = {}, contentType = '', headers = {}): | |
162 return _DoPutOrPost(orthanc, uri, 'POST', data, contentType, headers) | |
163 | |
13 | 164 def GetDatabasePath(filename): |
165 return os.path.join(os.path.dirname(__file__), '..', 'Database', filename) | |
166 | |
0 | 167 def UploadInstance(orthanc, filename): |
83 | 168 with open(GetDatabasePath(filename), 'rb') as f: |
169 d = f.read() | |
170 | |
0 | 171 return DoPost(orthanc, '/instances', d, 'application/dicom') |
172 | |
173 def UploadFolder(orthanc, path): | |
13 | 174 for i in os.listdir(GetDatabasePath(path)): |
1 | 175 try: |
176 UploadInstance(orthanc, os.path.join(path, i)) | |
177 except: | |
178 pass | |
0 | 179 |
180 def DropOrthanc(orthanc): | |
181 # Reset the Lua callbacks | |
182 DoPost(orthanc, '/tools/execute-script', 'function OnStoredInstance(instanceId, tags, metadata) end', 'application/lua') | |
183 | |
184 DoDelete(orthanc, '/exports') | |
185 | |
186 for s in DoGet(orthanc, '/patients'): | |
187 DoDelete(orthanc, '/patients/%s' % s) | |
188 | |
174 | 189 def InstallLuaScriptFromPath(orthanc, path): |
190 with open(GetDatabasePath(path), 'r') as f: | |
191 InstallLuaScript(orthanc, f.read()) | |
192 | |
193 def InstallLuaScript(orthanc, script): | |
194 DoPost(orthanc, '/tools/execute-script', script, 'application/lua') | |
195 | |
196 def UninstallLuaCallbacks(orthanc): | |
197 DoPost(orthanc, '/tools/execute-script', 'function OnStoredInstance() end', 'application/lua') | |
198 InstallLuaScriptFromPath(orthanc, 'Lua/TransferSyntaxEnable.lua') | |
199 | |
200 | |
0 | 201 def ComputeMD5(data): |
202 m = hashlib.md5() | |
203 m.update(data) | |
204 return m.hexdigest() | |
205 | |
249
24e5c8ca9440
DICOMweb: test_rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
239
diff
changeset
|
206 def UncompressImage(data): |
83 | 207 if (sys.version_info >= (3, 0)): |
208 return Image.open(BytesIO(data)) | |
209 else: | |
210 return Image.open(StringIO(data)) | |
0 | 211 |
249
24e5c8ca9440
DICOMweb: test_rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
239
diff
changeset
|
212 def GetImage(orthanc, uri, headers = {}): |
24e5c8ca9440
DICOMweb: test_rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
239
diff
changeset
|
213 # http://www.pythonware.com/library/pil/handbook/introduction.htm |
24e5c8ca9440
DICOMweb: test_rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
239
diff
changeset
|
214 return UncompressImage(DoGet(orthanc, uri, headers = headers)) |
24e5c8ca9440
DICOMweb: test_rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
239
diff
changeset
|
215 |
0 | 216 def GetArchive(orthanc, uri): |
217 # http://stackoverflow.com/a/1313868/881731 | |
218 s = DoGet(orthanc, uri) | |
83 | 219 |
220 if (sys.version_info >= (3, 0)): | |
221 return zipfile.ZipFile(BytesIO(s), "r") | |
222 else: | |
223 return zipfile.ZipFile(StringIO(s), "r") | |
0 | 224 |
192 | 225 def PostArchive(orthanc, uri, body): |
226 # http://stackoverflow.com/a/1313868/881731 | |
227 s = DoPost(orthanc, uri, body) | |
228 | |
229 if (sys.version_info >= (3, 0)): | |
230 return zipfile.ZipFile(BytesIO(s), "r") | |
231 else: | |
232 return zipfile.ZipFile(StringIO(s), "r") | |
233 | |
1 | 234 def IsDefinedInLua(orthanc, name): |
0 | 235 s = DoPost(orthanc, '/tools/execute-script', 'print(type(%s))' % name, 'application/lua') |
236 return (s.strip() != 'nil') | |
237 | |
1 | 238 def WaitEmpty(orthanc): |
0 | 239 while True: |
1 | 240 if len(DoGet(orthanc, '/instances')) == 0: |
0 | 241 return |
242 time.sleep(0.1) | |
243 | |
137
412d5f70447e
testing asynchronous c-move
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
130
diff
changeset
|
244 def WaitJobDone(orthanc, job): |
412d5f70447e
testing asynchronous c-move
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
130
diff
changeset
|
245 while True: |
412d5f70447e
testing asynchronous c-move
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
130
diff
changeset
|
246 s = DoGet(orthanc, '/jobs/%s' % job) ['State'] |
412d5f70447e
testing asynchronous c-move
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
130
diff
changeset
|
247 |
412d5f70447e
testing asynchronous c-move
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
130
diff
changeset
|
248 if s == 'Success': |
412d5f70447e
testing asynchronous c-move
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
130
diff
changeset
|
249 return True |
412d5f70447e
testing asynchronous c-move
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
130
diff
changeset
|
250 elif s == 'Failure': |
412d5f70447e
testing asynchronous c-move
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
130
diff
changeset
|
251 return False |
412d5f70447e
testing asynchronous c-move
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
130
diff
changeset
|
252 |
412d5f70447e
testing asynchronous c-move
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
130
diff
changeset
|
253 time.sleep(0.1) |
412d5f70447e
testing asynchronous c-move
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
130
diff
changeset
|
254 |
138 | 255 def MonitorJob(orthanc, func): # "func" is a lambda |
256 a = set(DoGet(orthanc, '/jobs')) | |
257 func() | |
258 b = set(DoGet(orthanc, '/jobs')) | |
259 | |
260 diff = list(b - a) | |
261 if len(diff) != 1: | |
262 print('No job was created!') | |
263 return False | |
264 else: | |
265 return WaitJobDone(orthanc, diff[0]) | |
266 | |
179
8a2dd77d4035
testing split/merge
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
174
diff
changeset
|
267 def MonitorJob2(orthanc, func): # "func" is a lambda |
8a2dd77d4035
testing split/merge
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
174
diff
changeset
|
268 a = set(DoGet(orthanc, '/jobs')) |
181 | 269 job = func() |
179
8a2dd77d4035
testing split/merge
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
174
diff
changeset
|
270 b = set(DoGet(orthanc, '/jobs')) |
8a2dd77d4035
testing split/merge
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
174
diff
changeset
|
271 |
8a2dd77d4035
testing split/merge
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
174
diff
changeset
|
272 diff = list(b - a) |
8a2dd77d4035
testing split/merge
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
174
diff
changeset
|
273 if len(diff) != 1: |
8a2dd77d4035
testing split/merge
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
174
diff
changeset
|
274 print('No job was created!') |
8a2dd77d4035
testing split/merge
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
174
diff
changeset
|
275 return None |
181 | 276 elif (not 'ID' in job or |
277 diff[0] != job['ID']): | |
278 print('Mismatch in the job ID') | |
279 return None | |
179
8a2dd77d4035
testing split/merge
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
174
diff
changeset
|
280 elif WaitJobDone(orthanc, diff[0]): |
8a2dd77d4035
testing split/merge
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
174
diff
changeset
|
281 return diff[0] |
8a2dd77d4035
testing split/merge
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
174
diff
changeset
|
282 else: |
8a2dd77d4035
testing split/merge
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
174
diff
changeset
|
283 print('Error while executing the job') |
8a2dd77d4035
testing split/merge
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
174
diff
changeset
|
284 return None |
8a2dd77d4035
testing split/merge
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
174
diff
changeset
|
285 |
220 | 286 def WaitAllNewJobsDone(orthanc, func): # "func" is a lambda |
287 a = set(DoGet(orthanc, '/jobs')) | |
288 func() | |
289 | |
290 first = True | |
291 | |
292 while True: | |
293 b = set(DoGet(orthanc, '/jobs')) | |
294 | |
295 diff = list(b - a) | |
296 if len(diff) == 0: | |
297 if first: | |
298 raise Exception('No job was created') | |
299 else: | |
300 return # We're done | |
301 else: | |
302 first = False | |
303 | |
304 if WaitJobDone(orthanc, diff[0]): | |
305 a.add(diff[0]) | |
306 else: | |
307 raise Exception('Error while executing the job') | |
308 | |
309 | |
1 | 310 def GetDockerHostAddress(): |
311 route = subprocess.check_output([ '/sbin/ip', 'route' ]) | |
312 m = re.search(r'default via ([0-9.]+)', route) | |
313 if m == None: | |
314 return 'localhost' | |
315 else: | |
316 return m.groups()[0] | |
4 | 317 |
44
ffa542cce638
Toolbox.FindExecutable()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
28
diff
changeset
|
318 def FindExecutable(name): |
ffa542cce638
Toolbox.FindExecutable()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
28
diff
changeset
|
319 p = os.path.join('/usr/local/bin', name) |
ffa542cce638
Toolbox.FindExecutable()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
28
diff
changeset
|
320 if os.path.isfile(p): |
ffa542cce638
Toolbox.FindExecutable()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
28
diff
changeset
|
321 return p |
ffa542cce638
Toolbox.FindExecutable()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
28
diff
changeset
|
322 |
ffa542cce638
Toolbox.FindExecutable()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
28
diff
changeset
|
323 p = os.path.join('/usr/local/sbin', name) |
ffa542cce638
Toolbox.FindExecutable()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
28
diff
changeset
|
324 if os.path.isfile(p): |
ffa542cce638
Toolbox.FindExecutable()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
28
diff
changeset
|
325 return p |
ffa542cce638
Toolbox.FindExecutable()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
28
diff
changeset
|
326 |
ffa542cce638
Toolbox.FindExecutable()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
28
diff
changeset
|
327 return name |
4 | 328 |
173 | 329 def IsOrthancVersionAbove(orthanc, major, minor, revision): |
330 v = DoGet(orthanc, '/system')['Version'] | |
331 | |
332 if v == 'mainline': | |
333 return True | |
334 else: | |
335 tmp = v.split('.') | |
336 a = int(tmp[0]) | |
337 b = int(tmp[1]) | |
338 c = int(tmp[2]) | |
339 return (a > major or | |
340 (a == major and b > minor) or | |
341 (a == major and b == minor and c >= revision)) | |
4 | 342 |
343 | |
344 class ExternalCommandThread: | |
345 @staticmethod | |
346 def ExternalCommandFunction(arg, stop_event, command, env): | |
318
bac7cc80f240
dicomweb: test_wado_transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
304
diff
changeset
|
347 with open(os.devnull, 'w') as devnull: |
bac7cc80f240
dicomweb: test_wado_transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
304
diff
changeset
|
348 external = subprocess.Popen(command, env = env, stderr = devnull) |
4 | 349 |
318
bac7cc80f240
dicomweb: test_wado_transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
304
diff
changeset
|
350 while (not stop_event.is_set()): |
bac7cc80f240
dicomweb: test_wado_transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
304
diff
changeset
|
351 error = external.poll() |
bac7cc80f240
dicomweb: test_wado_transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
304
diff
changeset
|
352 if error != None: |
bac7cc80f240
dicomweb: test_wado_transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
304
diff
changeset
|
353 # http://stackoverflow.com/a/1489838/881731 |
bac7cc80f240
dicomweb: test_wado_transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
304
diff
changeset
|
354 os._exit(-1) |
bac7cc80f240
dicomweb: test_wado_transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
304
diff
changeset
|
355 stop_event.wait(0.1) |
4 | 356 |
83 | 357 print('Stopping the external command') |
4 | 358 external.terminate() |
9 | 359 external.communicate() # Wait for the command to stop |
4 | 360 |
361 def __init__(self, command, env = None): | |
362 self.thread_stop = threading.Event() | |
363 self.thread = threading.Thread(target = self.ExternalCommandFunction, | |
364 args = (10, self.thread_stop, command, env)) | |
9 | 365 #self.daemon = True |
4 | 366 self.thread.start() |
367 | |
368 def stop(self): | |
369 self.thread_stop.set() | |
370 self.thread.join() | |
220 | 371 |
372 | |
222
0f03ee6ffa80
DICOMweb: test_wado_hierarchy, test_wado_bulk, test_bitbucket_issue_112
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
220
diff
changeset
|
373 def AssertAlmostEqualRecursive(self, a, b, places = 7, ignoreKeys = []): |
220 | 374 if type(a) is dict: |
375 self.assertTrue(type(b) is dict) | |
376 self.assertEqual(a.keys(), b.keys()) | |
377 for key, value in a.items(): | |
222
0f03ee6ffa80
DICOMweb: test_wado_hierarchy, test_wado_bulk, test_bitbucket_issue_112
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
220
diff
changeset
|
378 if not key in ignoreKeys: |
0f03ee6ffa80
DICOMweb: test_wado_hierarchy, test_wado_bulk, test_bitbucket_issue_112
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
220
diff
changeset
|
379 AssertAlmostEqualRecursive(self, a[key], b[key], places) |
220 | 380 |
381 elif type(a) is list: | |
382 self.assertTrue(type(b) is list) | |
383 self.assertEqual(len(a), len(b)) | |
384 for i in range(len(a)): | |
385 AssertAlmostEqualRecursive(self, a[i], b[i], places) | |
386 | |
387 else: | |
388 self.assertAlmostEqual(a, b, places = places) | |
291
cfa785074c64
test_modify_transcode
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
260
diff
changeset
|
389 |
cfa785074c64
test_modify_transcode
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
260
diff
changeset
|
390 |
cfa785074c64
test_modify_transcode
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
260
diff
changeset
|
391 def GetTransferSyntax(dicom): |
cfa785074c64
test_modify_transcode
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
260
diff
changeset
|
392 with tempfile.NamedTemporaryFile(delete = True) as f: |
cfa785074c64
test_modify_transcode
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
260
diff
changeset
|
393 f.write(dicom) |
cfa785074c64
test_modify_transcode
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
260
diff
changeset
|
394 f.flush() |
318
bac7cc80f240
dicomweb: test_wado_transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
304
diff
changeset
|
395 |
bac7cc80f240
dicomweb: test_wado_transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
304
diff
changeset
|
396 with open(os.devnull, 'w') as devnull: |
bac7cc80f240
dicomweb: test_wado_transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
304
diff
changeset
|
397 data = subprocess.check_output([ FindExecutable('dcm2xml'), f.name ], |
bac7cc80f240
dicomweb: test_wado_transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
304
diff
changeset
|
398 stderr = devnull) |
291
cfa785074c64
test_modify_transcode
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
260
diff
changeset
|
399 |
cfa785074c64
test_modify_transcode
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
260
diff
changeset
|
400 return re.search('<data-set xfer="(.*?)"', data).group(1) |
304 | 401 |
402 | |
403 def HasGdcmPlugin(orthanc): | |
404 plugins = DoGet(orthanc, '/plugins') | |
405 return ('gdcm' in plugins) | |
406 | |
407 | |
408 def _GetMaxImageDifference(im1, im2): | |
409 h = ImageChops.difference(im1, im2).histogram() | |
410 | |
411 if len(h) < 256: | |
412 raise Exception() | |
413 | |
414 i = len(h) - 1 | |
415 while h[i] == 0: | |
416 i -= 1 | |
417 | |
418 return i | |
419 | |
420 | |
421 def GetMaxImageDifference(im1, im2): | |
422 if im1.mode != im2.mode: | |
423 raise Exception('Incompatible image modes') | |
424 | |
425 if im1.mode == 'RGB': | |
426 red1, green1, blue1 = im1.split() | |
427 red2, green2, blue2 = im2.split() | |
428 return max([ _GetMaxImageDifference(red1, red2), | |
429 _GetMaxImageDifference(green1, green2), | |
430 _GetMaxImageDifference(blue1, blue2) ]) | |
431 else: | |
432 return _GetMaxImageDifference(im1, im2) | |
337
ec13ace43bde
trying webdav tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
318
diff
changeset
|
433 |
ec13ace43bde
trying webdav tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
318
diff
changeset
|
434 |
ec13ace43bde
trying webdav tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
318
diff
changeset
|
435 def DoPropFind(orthanc, uri, depth): |
ec13ace43bde
trying webdav tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
318
diff
changeset
|
436 http = httplib2.Http() |
ec13ace43bde
trying webdav tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
318
diff
changeset
|
437 http.follow_redirects = False |
ec13ace43bde
trying webdav tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
318
diff
changeset
|
438 _SetupCredentials(orthanc, http) |
ec13ace43bde
trying webdav tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
318
diff
changeset
|
439 |
ec13ace43bde
trying webdav tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
318
diff
changeset
|
440 resp, content = http.request(orthanc['Url'] + uri, 'PROPFIND', headers = { 'Depth' : str(depth) }) |
ec13ace43bde
trying webdav tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
318
diff
changeset
|
441 |
ec13ace43bde
trying webdav tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
318
diff
changeset
|
442 if not (resp.status in [ 207 ]): |
ec13ace43bde
trying webdav tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
318
diff
changeset
|
443 raise Exception(resp.status, resp) |
ec13ace43bde
trying webdav tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
318
diff
changeset
|
444 else: |
ec13ace43bde
trying webdav tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
318
diff
changeset
|
445 return minidom.parseString(content) |
ec13ace43bde
trying webdav tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
318
diff
changeset
|
446 |