annotate Plugins/DicomWeb/Run.py @ 225:4d5af1f49cb2

cont
author Sebastien Jodogne <s.jodogne@gmail.com>
date Tue, 26 Feb 2019 18:30:31 +0100
parents f5414254ccaa
children 230aede7f8d5
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
32
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1 #!/usr/bin/python
224
f5414254ccaa test_bitbucket_issue_113
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 223
diff changeset
2 # -*- coding: utf-8 -*-
f5414254ccaa test_bitbucket_issue_113
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 223
diff changeset
3
32
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
4
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
5 # Orthanc - A Lightweight, RESTful DICOM Store
73
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 33
diff changeset
6 # Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics
32
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
7 # Department, University Hospital of Liege, Belgium
195
af8e034f4262 preparing for 2019
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 184
diff changeset
8 # Copyright (C) 2017-2019 Osimis S.A., Belgium
32
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
9 #
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
10 # This program is free software: you can redistribute it and/or
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
11 # modify it under the terms of the GNU General Public License as
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
12 # published by the Free Software Foundation, either version 3 of the
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
13 # License, or (at your option) any later version.
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
14 #
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
15 # This program is distributed in the hope that it will be useful, but
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
16 # WITHOUT ANY WARRANTY; without even the implied warranty of
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
17 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
18 # General Public License for more details.
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
19 #
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
20 # You should have received a copy of the GNU General Public License
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
21 # along with this program. If not, see <http://www.gnu.org/licenses/>.
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
22
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
23
85
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 84
diff changeset
24
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 84
diff changeset
25 # You must add the following to the configuration file:
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 84
diff changeset
26 #
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 84
diff changeset
27 # "DicomWeb" : {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 84
diff changeset
28 # "Servers" : {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 84
diff changeset
29 # "sample" : [ "http://localhost:8042/dicom-web/", "alice", "orthanctest" ]
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 84
diff changeset
30 # }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 84
diff changeset
31 # }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 84
diff changeset
32
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 84
diff changeset
33
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 84
diff changeset
34
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 84
diff changeset
35
32
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
36 import os
33
eb6d219af210 test stow
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 32
diff changeset
37 import pprint
32
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
38 import sys
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
39 import argparse
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
40 import unittest
83
3f2170efa8d2 patches for python3
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 73
diff changeset
41 import re
33
eb6d219af210 test stow
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 32
diff changeset
42 from DicomWeb import *
32
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
43
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
44 sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..', 'Tests'))
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
45 from Toolbox import *
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
46
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
47
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
48 ##
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
49 ## Parse the command-line arguments
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
50 ##
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
51
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
52 parser = argparse.ArgumentParser(description = 'Run the integration tests for the DICOMweb plugin.')
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
53
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
54 parser.add_argument('--server',
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
55 default = 'localhost',
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
56 help = 'Address of the Orthanc server to test')
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
57 parser.add_argument('--rest',
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
58 type = int,
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
59 default = 8042,
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
60 help = 'Port to the REST API')
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
61 parser.add_argument('--username',
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
62 default = 'alice',
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
63 help = 'Username to the REST API')
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
64 parser.add_argument('--password',
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
65 default = 'orthanctest',
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
66 help = 'Password to the REST API')
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
67 parser.add_argument('--wado',
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
68 default = '/wado',
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
69 help = 'Path to the WADO API')
33
eb6d219af210 test stow
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 32
diff changeset
70 parser.add_argument('--dicomweb',
32
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
71 default = '/dicom-web/',
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
72 help = 'Path to the DICOMweb API')
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
73 parser.add_argument('--force', help = 'Do not warn the user',
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
74 action = 'store_true')
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
75 parser.add_argument('options', metavar = 'N', nargs = '*',
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
76 help='Arguments to Python unittest')
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
77
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
78 args = parser.parse_args()
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
79
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
80
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
81 ##
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
82 ## Configure the testing context
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
83 ##
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
84
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
85 if not args.force:
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
86 print("""
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
87 WARNING: This test will remove all the content of your
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
88 Orthanc instance running on %s!
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
89
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
90 Are you sure ["yes" to go on]?""" % args.server)
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
91
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
92 if sys.stdin.readline().strip() != 'yes':
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
93 print('Aborting...')
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
94 exit(0)
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
95
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
96
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
97 ORTHANC = DefineOrthanc(server = args.server,
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
98 username = args.username,
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
99 password = args.password,
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
100 restPort = args.rest)
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
101
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
102
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
103 ##
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
104 ## The tests
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
105 ##
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
106
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
107 class Orthanc(unittest.TestCase):
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
108 def setUp(self):
83
3f2170efa8d2 patches for python3
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 73
diff changeset
109 if (sys.version_info >= (3, 0)):
3f2170efa8d2 patches for python3
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 73
diff changeset
110 # Remove annoying warnings about unclosed socket in Python 3
3f2170efa8d2 patches for python3
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 73
diff changeset
111 import warnings
3f2170efa8d2 patches for python3
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 73
diff changeset
112 warnings.simplefilter("ignore", ResourceWarning)
3f2170efa8d2 patches for python3
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 73
diff changeset
113
32
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
114 DropOrthanc(ORTHANC)
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
115
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
116 def test_wado_dicom(self):
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
117 UploadInstance(ORTHANC, 'Brainix/Flair/IM-0001-0001.dcm')
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
118
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
119 SIZE = 169478
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
120 INSTANCE = '1.3.46.670589.11.0.0.11.4.2.0.8743.5.5396.2006120114314079549'
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
121 SERIES = '1.3.46.670589.11.0.0.11.4.2.0.8743.5.5396.2006120114285654497'
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
122 STUDY = '2.16.840.1.113669.632.20.1211.10000357775'
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
123
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
124 self.assertRaises(Exception, lambda: DoGet(ORTHANC, args.wado))
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
125 self.assertRaises(Exception, lambda: DoGet(ORTHANC, args.wado + '?requestType=WADO'))
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
126 self.assertRaises(Exception, lambda: DoGet(ORTHANC, args.wado + '?objectUID=%s' % INSTANCE))
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
127
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
128 dicom = DoGet(ORTHANC, args.wado + '?contentType=application/dicom&requestType=WADO&objectUID=%s' % INSTANCE)
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
129 self.assertEqual(SIZE, len(dicom))
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
130
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
131 dicom = DoGet(ORTHANC, args.wado + '?contentType=application/dicom&requestType=WADO&objectUID=%s&seriesUID=%s' % (INSTANCE, SERIES))
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
132 self.assertEqual(SIZE, len(dicom))
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
133
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
134 dicom = DoGet(ORTHANC, args.wado + '?contentType=application/dicom&requestType=WADO&objectUID=%s&seriesUID=%s&studyUID=%s' % (INSTANCE, SERIES, STUDY))
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
135 self.assertEqual(SIZE, len(dicom))
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
136
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
137 dicom = DoGet(ORTHANC, args.wado + '?contentType=application/dicom&requestType=WADO&objectUID=%s&seriesUID=%s' % (INSTANCE, SERIES))
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
138 self.assertEqual(SIZE, len(dicom))
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
139
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
140 dicom = DoGet(ORTHANC, args.wado + '?contentType=application/dicom&requestType=WADO&objectUID=%s&studyUID=%s' % (INSTANCE, STUDY))
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
141 self.assertEqual(SIZE, len(dicom))
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
142
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
143 self.assertRaises(Exception, lambda: DoGet(ORTHANC, args.wado + '?requestType=WADO&objectUID=%s&seriesUID=nope' % INSTANCE))
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
144 self.assertRaises(Exception, lambda: DoGet(ORTHANC, args.wado + '?requestType=WADO&objectUID=%s&studyUID=nope' % INSTANCE))
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
145 self.assertRaises(Exception, lambda: DoGet(ORTHANC, args.wado + '?requestType=WADO&objectUID=%s&seriesUID=nope&studyUID=nope' % INSTANCE))
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
146
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
147 def test_wado_image(self):
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
148 UploadInstance(ORTHANC, 'Phenix/IM-0001-0001.dcm')
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
149 INSTANCE = '1.2.840.113704.7.1.1.6632.1127829031.2'
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
150
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
151 im = GetImage(ORTHANC, args.wado + '?requestType=WADO&objectUID=%s' % INSTANCE)
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
152 self.assertEqual('JPEG', im.format)
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
153 self.assertEqual('L', im.mode)
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
154 self.assertEqual(512, im.size[0])
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
155 self.assertEqual(358, im.size[1])
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
156
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
157 im = GetImage(ORTHANC, args.wado + '?contentType=image/jpg&requestType=WADO&objectUID=%s' % INSTANCE)
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
158 self.assertEqual('JPEG', im.format)
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
159
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
160 im = GetImage(ORTHANC, args.wado + '?contentType=image/png&requestType=WADO&objectUID=%s' % INSTANCE)
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
161 self.assertEqual('PNG', im.format)
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
162 self.assertEqual('L', im.mode)
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
163 self.assertEqual(512, im.size[0])
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
164 self.assertEqual(358, im.size[1])
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
165
33
eb6d219af210 test stow
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 32
diff changeset
166 def test_stow(self):
eb6d219af210 test stow
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 32
diff changeset
167 self.assertEqual(0, len(DoGet(ORTHANC, '/instances')))
eb6d219af210 test stow
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 32
diff changeset
168 SendStow(ORTHANC, args.dicomweb + '/studies', GetDatabasePath('Phenix/IM-0001-0001.dcm'))
eb6d219af210 test stow
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 32
diff changeset
169 self.assertEqual(1, len(DoGet(ORTHANC, '/instances')))
eb6d219af210 test stow
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 32
diff changeset
170 a = SendStow(ORTHANC, args.dicomweb + '/studies', GetDatabasePath('Phenix/IM-0001-0001.dcm'))
eb6d219af210 test stow
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 32
diff changeset
171 self.assertEqual(1, len(DoGet(ORTHANC, '/instances')))
eb6d219af210 test stow
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 32
diff changeset
172
eb6d219af210 test stow
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 32
diff changeset
173 self.assertEqual(0, len(a['00081198']['Value'])) # No error
eb6d219af210 test stow
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 32
diff changeset
174 self.assertEqual(1, len(a['00081199']['Value'])) # 1 success
eb6d219af210 test stow
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 32
diff changeset
175
eb6d219af210 test stow
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 32
diff changeset
176 self.assertTrue(a['00081190']['Value'][0].endswith('studies/2.16.840.1.113669.632.20.1211.10000098591'))
eb6d219af210 test stow
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 32
diff changeset
177 self.assertTrue(a['00081199']['Value'][0]['00081190']['Value'][0].
eb6d219af210 test stow
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 32
diff changeset
178 endswith('series/1.2.840.113704.1.111.5692.1127828999.2/instances/1.2.840.113704.7.1.1.6632.1127829031.2'))
eb6d219af210 test stow
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 32
diff changeset
179
83
3f2170efa8d2 patches for python3
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 73
diff changeset
180 # Remove the "http://localhost:8042" prefix
3f2170efa8d2 patches for python3
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 73
diff changeset
181 url = a['00081190']['Value'][0]
3f2170efa8d2 patches for python3
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 73
diff changeset
182 url = re.sub(r'(http|https)://[^/]+(/.*)', r'\2', url)
3f2170efa8d2 patches for python3
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 73
diff changeset
183
3f2170efa8d2 patches for python3
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 73
diff changeset
184 # Get the content-length of all the multiparts of this WADO-RS request
3f2170efa8d2 patches for python3
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 73
diff changeset
185 b = DoGet(ORTHANC, url).decode('utf-8', 'ignore')
3f2170efa8d2 patches for python3
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 73
diff changeset
186 parts = re.findall(r'^Content-Length:\s*(\d+)\s*', b, re.IGNORECASE | re.MULTILINE)
3f2170efa8d2 patches for python3
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 73
diff changeset
187 self.assertEqual(1, len(parts))
3f2170efa8d2 patches for python3
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 73
diff changeset
188 self.assertEqual(os.path.getsize(GetDatabasePath('Phenix/IM-0001-0001.dcm')), int(parts[0]))
33
eb6d219af210 test stow
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 32
diff changeset
189
84
dc90b87471a8 tests for dicomweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 83
diff changeset
190 def test_server_get(self):
dc90b87471a8 tests for dicomweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 83
diff changeset
191 UploadInstance(ORTHANC, 'Knee/T1/IM-0001-0001.dcm')
dc90b87471a8 tests for dicomweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 83
diff changeset
192
dc90b87471a8 tests for dicomweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 83
diff changeset
193 self.assertEqual(1, len(DoGet(ORTHANC, '/dicom-web/servers')))
dc90b87471a8 tests for dicomweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 83
diff changeset
194 self.assertTrue('sample' in DoGet(ORTHANC, '/dicom-web/servers'))
dc90b87471a8 tests for dicomweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 83
diff changeset
195
129
53d522dd4a38 added tests for ?expand in /dicom-web/servers route
amazy
parents: 114
diff changeset
196 serversReadback = DoGet(ORTHANC, '/dicom-web/servers?expand')
53d522dd4a38 added tests for ?expand in /dicom-web/servers route
amazy
parents: 114
diff changeset
197 self.assertEqual('http://localhost:8042/dicom-web/', serversReadback['sample']['Url'])
53d522dd4a38 added tests for ?expand in /dicom-web/servers route
amazy
parents: 114
diff changeset
198 self.assertEqual('alice', serversReadback['sample']['Username'])
53d522dd4a38 added tests for ?expand in /dicom-web/servers route
amazy
parents: 114
diff changeset
199
84
dc90b87471a8 tests for dicomweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 83
diff changeset
200 sample = DoGet(ORTHANC, '/dicom-web/servers/sample')
dc90b87471a8 tests for dicomweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 83
diff changeset
201 self.assertEqual(3, len(sample))
dc90b87471a8 tests for dicomweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 83
diff changeset
202 self.assertTrue('stow' in sample)
dc90b87471a8 tests for dicomweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 83
diff changeset
203 self.assertTrue('retrieve' in sample)
dc90b87471a8 tests for dicomweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 83
diff changeset
204 self.assertTrue('get' in sample)
dc90b87471a8 tests for dicomweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 83
diff changeset
205
dc90b87471a8 tests for dicomweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 83
diff changeset
206 # application/dicom+xml
131
90e5331ddee9 application/dicom+json is now the default in DICOMweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 130
diff changeset
207 self.assertEqual(2, len(re.findall('^--', DoGet(ORTHANC, '/dicom-web/studies',
90e5331ddee9 application/dicom+json is now the default in DICOMweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 130
diff changeset
208 headers = { 'Accept' : 'application/dicom+xml' }),
90e5331ddee9 application/dicom+json is now the default in DICOMweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 130
diff changeset
209 re.MULTILINE)))
90e5331ddee9 application/dicom+json is now the default in DICOMweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 130
diff changeset
210 self.assertEqual(2, len(re.findall('^--', DoPost
90e5331ddee9 application/dicom+json is now the default in DICOMweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 130
diff changeset
211 (ORTHANC, '/dicom-web/servers/sample/get',
90e5331ddee9 application/dicom+json is now the default in DICOMweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 130
diff changeset
212 { 'Uri' : '/studies',
90e5331ddee9 application/dicom+json is now the default in DICOMweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 130
diff changeset
213 'HttpHeaders' : { 'Accept' : 'application/dicom+xml' }
90e5331ddee9 application/dicom+json is now the default in DICOMweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 130
diff changeset
214 }), re.MULTILINE)))
84
dc90b87471a8 tests for dicomweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 83
diff changeset
215
dc90b87471a8 tests for dicomweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 83
diff changeset
216 # application/dicom+json
131
90e5331ddee9 application/dicom+json is now the default in DICOMweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 130
diff changeset
217 self.assertEqual(1, len(DoGet(ORTHANC, '/dicom-web/studies',
90e5331ddee9 application/dicom+json is now the default in DICOMweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 130
diff changeset
218 headers = { 'Accept' : 'application/dicom+json' })))
90e5331ddee9 application/dicom+json is now the default in DICOMweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 130
diff changeset
219 self.assertEqual(1, len(DoPost(ORTHANC, '/dicom-web/servers/sample/get',
90e5331ddee9 application/dicom+json is now the default in DICOMweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 130
diff changeset
220 { 'Uri' : '/studies',
90e5331ddee9 application/dicom+json is now the default in DICOMweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 130
diff changeset
221 'HttpHeaders' : { 'Accept' : 'application/dicom+json' }})))
90e5331ddee9 application/dicom+json is now the default in DICOMweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 130
diff changeset
222
90e5331ddee9 application/dicom+json is now the default in DICOMweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 130
diff changeset
223 # application/json
90e5331ddee9 application/dicom+json is now the default in DICOMweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 130
diff changeset
224 self.assertEqual(1, len(DoGet(ORTHANC, '/dicom-web/studies',
90e5331ddee9 application/dicom+json is now the default in DICOMweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 130
diff changeset
225 headers = { 'Accept' : 'application/json' })))
84
dc90b87471a8 tests for dicomweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 83
diff changeset
226 self.assertEqual(1, len(DoPost(ORTHANC, '/dicom-web/servers/sample/get',
dc90b87471a8 tests for dicomweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 83
diff changeset
227 { 'Uri' : '/studies',
dc90b87471a8 tests for dicomweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 83
diff changeset
228 'HttpHeaders' : { 'Accept' : 'application/json' }})))
dc90b87471a8 tests for dicomweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 83
diff changeset
229
131
90e5331ddee9 application/dicom+json is now the default in DICOMweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 130
diff changeset
230 # application/dicom+json is the default as of OrthancDicomWeb-0.5
90e5331ddee9 application/dicom+json is now the default in DICOMweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 130
diff changeset
231 self.assertEqual(1, len(DoGet(ORTHANC, '/dicom-web/studies')))
90e5331ddee9 application/dicom+json is now the default in DICOMweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 130
diff changeset
232 self.assertEqual(1, len(DoPost(ORTHANC, '/dicom-web/servers/sample/get',
90e5331ddee9 application/dicom+json is now the default in DICOMweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 130
diff changeset
233 { 'Uri' : '/studies' })))
90e5331ddee9 application/dicom+json is now the default in DICOMweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 130
diff changeset
234
84
dc90b87471a8 tests for dicomweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 83
diff changeset
235
dc90b87471a8 tests for dicomweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 83
diff changeset
236 def test_server_stow(self):
dc90b87471a8 tests for dicomweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 83
diff changeset
237 UploadInstance(ORTHANC, 'Knee/T1/IM-0001-0001.dcm')
dc90b87471a8 tests for dicomweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 83
diff changeset
238
dc90b87471a8 tests for dicomweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 83
diff changeset
239 self.assertRaises(Exception, lambda:
dc90b87471a8 tests for dicomweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 83
diff changeset
240 DoPost(ORTHANC, '/dicom-web/servers/sample/stow',
dc90b87471a8 tests for dicomweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 83
diff changeset
241 { 'Resources' : [ 'nope' ]})) # inexisting resource
dc90b87471a8 tests for dicomweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 83
diff changeset
242
dc90b87471a8 tests for dicomweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 83
diff changeset
243 self.assertEqual(0, len(DoPost(ORTHANC, '/dicom-web/servers/sample/stow',
dc90b87471a8 tests for dicomweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 83
diff changeset
244 { 'Resources' : [ 'ca29faea-b6a0e17f-067743a1-8b778011-a48b2a17' ]}))) # patient
dc90b87471a8 tests for dicomweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 83
diff changeset
245
dc90b87471a8 tests for dicomweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 83
diff changeset
246 self.assertEqual(0, len(DoPost(ORTHANC, '/dicom-web/servers/sample/stow',
dc90b87471a8 tests for dicomweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 83
diff changeset
247 { 'Resources' : [ '0a9b3153-2512774b-2d9580de-1fc3dcf6-3bd83918' ]}))) # study
dc90b87471a8 tests for dicomweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 83
diff changeset
248
dc90b87471a8 tests for dicomweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 83
diff changeset
249 self.assertEqual(0, len(DoPost(ORTHANC, '/dicom-web/servers/sample/stow',
dc90b87471a8 tests for dicomweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 83
diff changeset
250 { 'Resources' : [ '6de73705-c4e65c1b-9d9ea1b5-cabcd8e7-f15e4285' ]}))) # series
dc90b87471a8 tests for dicomweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 83
diff changeset
251
dc90b87471a8 tests for dicomweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 83
diff changeset
252 self.assertEqual(0, len(DoPost(ORTHANC, '/dicom-web/servers/sample/stow',
dc90b87471a8 tests for dicomweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 83
diff changeset
253 { 'Resources' : [ 'c8df6478-d7794217-0f11c293-a41237c9-31d98357' ]}))) # instance
dc90b87471a8 tests for dicomweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 83
diff changeset
254
dc90b87471a8 tests for dicomweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 83
diff changeset
255 self.assertEqual(0, len(DoPost(ORTHANC, '/dicom-web/servers/sample/stow',
dc90b87471a8 tests for dicomweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 83
diff changeset
256 { 'Resources' : [
dc90b87471a8 tests for dicomweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 83
diff changeset
257 'ca29faea-b6a0e17f-067743a1-8b778011-a48b2a17',
dc90b87471a8 tests for dicomweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 83
diff changeset
258 '0a9b3153-2512774b-2d9580de-1fc3dcf6-3bd83918',
dc90b87471a8 tests for dicomweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 83
diff changeset
259 '6de73705-c4e65c1b-9d9ea1b5-cabcd8e7-f15e4285',
dc90b87471a8 tests for dicomweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 83
diff changeset
260 'c8df6478-d7794217-0f11c293-a41237c9-31d98357' ]}))) # altogether
dc90b87471a8 tests for dicomweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 83
diff changeset
261
dc90b87471a8 tests for dicomweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 83
diff changeset
262
dc90b87471a8 tests for dicomweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 83
diff changeset
263 def test_server_retrieve(self):
dc90b87471a8 tests for dicomweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 83
diff changeset
264 UploadInstance(ORTHANC, 'Knee/T1/IM-0001-0001.dcm')
dc90b87471a8 tests for dicomweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 83
diff changeset
265 UploadInstance(ORTHANC, 'Knee/T1/IM-0001-0002.dcm')
dc90b87471a8 tests for dicomweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 83
diff changeset
266 UploadInstance(ORTHANC, 'Knee/T2/IM-0001-0001.dcm')
dc90b87471a8 tests for dicomweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 83
diff changeset
267
dc90b87471a8 tests for dicomweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 83
diff changeset
268 self.assertRaises(Exception, lambda:
dc90b87471a8 tests for dicomweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 83
diff changeset
269 DoPost(ORTHANC, '/dicom-web/servers/sample/retrieve',
dc90b87471a8 tests for dicomweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 83
diff changeset
270 { 'Resources' : [ { 'Study' : 'nope' } ]})) # inexisting resource
dc90b87471a8 tests for dicomweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 83
diff changeset
271
dc90b87471a8 tests for dicomweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 83
diff changeset
272 t = DoPost(ORTHANC, '/dicom-web/servers/sample/retrieve',
dc90b87471a8 tests for dicomweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 83
diff changeset
273 { 'Resources' : [ { 'Study' : '2.16.840.1.113669.632.20.121711.10000160881' } ] })
dc90b87471a8 tests for dicomweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 83
diff changeset
274 self.assertEqual(3, len(t['Instances']))
dc90b87471a8 tests for dicomweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 83
diff changeset
275
dc90b87471a8 tests for dicomweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 83
diff changeset
276 # Missing "Study" field
dc90b87471a8 tests for dicomweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 83
diff changeset
277 self.assertRaises(Exception, lambda:
dc90b87471a8 tests for dicomweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 83
diff changeset
278 DoPost(ORTHANC, '/dicom-web/servers/sample/retrieve',
dc90b87471a8 tests for dicomweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 83
diff changeset
279 { 'Resources' : [ { 'Series' : '1.3.46.670589.11.17521.5.0.3124.2008081908564160709' } ]}))
dc90b87471a8 tests for dicomweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 83
diff changeset
280
dc90b87471a8 tests for dicomweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 83
diff changeset
281 t = DoPost(ORTHANC, '/dicom-web/servers/sample/retrieve',
dc90b87471a8 tests for dicomweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 83
diff changeset
282 { 'Resources' : [ { 'Study' : '2.16.840.1.113669.632.20.121711.10000160881',
dc90b87471a8 tests for dicomweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 83
diff changeset
283 'Series' : '1.3.46.670589.11.17521.5.0.3124.2008081908564160709' } ] })
dc90b87471a8 tests for dicomweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 83
diff changeset
284 self.assertEqual(2, len(t['Instances']))
dc90b87471a8 tests for dicomweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 83
diff changeset
285
dc90b87471a8 tests for dicomweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 83
diff changeset
286 t = DoPost(ORTHANC, '/dicom-web/servers/sample/retrieve',
dc90b87471a8 tests for dicomweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 83
diff changeset
287 { 'Resources' : [ { 'Study' : '2.16.840.1.113669.632.20.121711.10000160881',
dc90b87471a8 tests for dicomweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 83
diff changeset
288 'Series' : '1.3.46.670589.11.17521.5.0.3124.2008081909090037350' } ] })
dc90b87471a8 tests for dicomweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 83
diff changeset
289 self.assertEqual(1, len(t['Instances']))
dc90b87471a8 tests for dicomweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 83
diff changeset
290
dc90b87471a8 tests for dicomweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 83
diff changeset
291 t = DoPost(ORTHANC, '/dicom-web/servers/sample/retrieve',
dc90b87471a8 tests for dicomweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 83
diff changeset
292 { 'Resources' : [ { 'Study' : '2.16.840.1.113669.632.20.121711.10000160881',
dc90b87471a8 tests for dicomweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 83
diff changeset
293 'Series' : '1.3.46.670589.11.17521.5.0.3124.2008081909090037350' },
dc90b87471a8 tests for dicomweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 83
diff changeset
294 { 'Study' : '2.16.840.1.113669.632.20.121711.10000160881',
dc90b87471a8 tests for dicomweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 83
diff changeset
295 'Series' : '1.3.46.670589.11.17521.5.0.3124.2008081908564160709' } ] })
dc90b87471a8 tests for dicomweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 83
diff changeset
296 self.assertEqual(3, len(t['Instances']))
dc90b87471a8 tests for dicomweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 83
diff changeset
297
dc90b87471a8 tests for dicomweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 83
diff changeset
298 t = DoPost(ORTHANC, '/dicom-web/servers/sample/retrieve',
dc90b87471a8 tests for dicomweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 83
diff changeset
299 { 'Resources' : [ { 'Study' : '2.16.840.1.113669.632.20.121711.10000160881',
dc90b87471a8 tests for dicomweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 83
diff changeset
300 'Series' : '1.3.46.670589.11.17521.5.0.3124.2008081909090037350',
dc90b87471a8 tests for dicomweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 83
diff changeset
301 'Instance' : '1.3.46.670589.11.17521.5.0.3124.2008081909113806560' } ] })
dc90b87471a8 tests for dicomweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 83
diff changeset
302 self.assertEqual(1, len(t['Instances']))
dc90b87471a8 tests for dicomweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 83
diff changeset
303
dc90b87471a8 tests for dicomweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 83
diff changeset
304
114
a6019560272f test_bitbucket_issue_53
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 100
diff changeset
305 def test_bitbucket_issue_53(self):
a6019560272f test_bitbucket_issue_53
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 100
diff changeset
306 # DICOMWeb plugin support for "limit" and "offset" parameters in QIDO-RS
a6019560272f test_bitbucket_issue_53
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 100
diff changeset
307 # https://bitbucket.org/sjodogne/orthanc/issues/53
a6019560272f test_bitbucket_issue_53
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 100
diff changeset
308
a6019560272f test_bitbucket_issue_53
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 100
diff changeset
309 UploadInstance(ORTHANC, 'Brainix/Flair/IM-0001-0001.dcm')
a6019560272f test_bitbucket_issue_53
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 100
diff changeset
310 UploadInstance(ORTHANC, 'Knee/T1/IM-0001-0001.dcm')
a6019560272f test_bitbucket_issue_53
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 100
diff changeset
311
a6019560272f test_bitbucket_issue_53
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 100
diff changeset
312 brainix = '2.16.840.1.113669.632.20.1211.10000357775'
a6019560272f test_bitbucket_issue_53
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 100
diff changeset
313 knee = '2.16.840.1.113669.632.20.121711.10000160881'
a6019560272f test_bitbucket_issue_53
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 100
diff changeset
314
a6019560272f test_bitbucket_issue_53
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 100
diff changeset
315 a = DoGet(ORTHANC, '/dicom-web/studies',
a6019560272f test_bitbucket_issue_53
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 100
diff changeset
316 headers = { 'accept' : 'application/json' })
a6019560272f test_bitbucket_issue_53
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 100
diff changeset
317 self.assertEqual(2, len(a))
a6019560272f test_bitbucket_issue_53
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 100
diff changeset
318
a6019560272f test_bitbucket_issue_53
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 100
diff changeset
319 b = []
a6019560272f test_bitbucket_issue_53
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 100
diff changeset
320 a = DoGet(ORTHANC, '/dicom-web/studies?limit=1',
a6019560272f test_bitbucket_issue_53
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 100
diff changeset
321 headers = { 'accept' : 'application/json' })
a6019560272f test_bitbucket_issue_53
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 100
diff changeset
322 self.assertEqual(1, len(a))
a6019560272f test_bitbucket_issue_53
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 100
diff changeset
323 b.append(a[0]['0020000D']['Value'][0])
a6019560272f test_bitbucket_issue_53
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 100
diff changeset
324
a6019560272f test_bitbucket_issue_53
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 100
diff changeset
325 a = DoGet(ORTHANC, '/dicom-web/studies?limit=1&offset=1',
a6019560272f test_bitbucket_issue_53
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 100
diff changeset
326 headers = { 'accept' : 'application/json' })
a6019560272f test_bitbucket_issue_53
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 100
diff changeset
327 self.assertEqual(1, len(a))
a6019560272f test_bitbucket_issue_53
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 100
diff changeset
328 b.append(a[0]['0020000D']['Value'][0])
a6019560272f test_bitbucket_issue_53
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 100
diff changeset
329
a6019560272f test_bitbucket_issue_53
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 100
diff changeset
330 self.assertTrue(brainix in b)
a6019560272f test_bitbucket_issue_53
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 100
diff changeset
331 self.assertTrue(knee in b)
32
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
332
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
333
184
e244312964d6 test_bitbucket_issue_111
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 131
diff changeset
334 def test_bitbucket_issue_111(self):
223
f5aca0917d60 DICOMweb: test_bitbucket_issue_111
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 222
diff changeset
335 # Wrong serialization of empty values
f5aca0917d60 DICOMweb: test_bitbucket_issue_111
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 222
diff changeset
336 # https://bitbucket.org/sjodogne/orthanc/issues/111
f5aca0917d60 DICOMweb: test_bitbucket_issue_111
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 222
diff changeset
337 # https://bitbucket.org/sjodogne/orthanc-dicomweb/issues/3/
f5aca0917d60 DICOMweb: test_bitbucket_issue_111
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 222
diff changeset
338
184
e244312964d6 test_bitbucket_issue_111
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 131
diff changeset
339 # According to the standard, section F.2.5
e244312964d6 test_bitbucket_issue_111
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 131
diff changeset
340 # (http://dicom.nema.org/medical/dicom/current/output/chtml/part18/sect_F.2.5.html),
e244312964d6 test_bitbucket_issue_111
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 131
diff changeset
341 # null values behave as follows: If an attribute is present in
e244312964d6 test_bitbucket_issue_111
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 131
diff changeset
342 # DICOM but empty (i.e., Value Length is 0), it shall be
e244312964d6 test_bitbucket_issue_111
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 131
diff changeset
343 # preserved in the DICOM JSON attribute object containing no
e244312964d6 test_bitbucket_issue_111
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 131
diff changeset
344 # "Value", "BulkDataURI" or "InlineBinary".
e244312964d6 test_bitbucket_issue_111
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 131
diff changeset
345 # https://bitbucket.org/sjodogne/orthanc/issues/111/qido-rs-wrong-serialization-of-empty
e244312964d6 test_bitbucket_issue_111
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 131
diff changeset
346
223
f5aca0917d60 DICOMweb: test_bitbucket_issue_111
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 222
diff changeset
347 UploadInstance(ORTHANC, 'Issue111.dcm')
184
e244312964d6 test_bitbucket_issue_111
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 131
diff changeset
348
223
f5aca0917d60 DICOMweb: test_bitbucket_issue_111
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 222
diff changeset
349 # Test WADO-RS
f5aca0917d60 DICOMweb: test_bitbucket_issue_111
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 222
diff changeset
350 a = DoGet(ORTHANC, '/dicom-web/studies/1.2.276.0.7230010.3.1.2.8323329.30185.1551199973.371589/metadata')
f5aca0917d60 DICOMweb: test_bitbucket_issue_111
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 222
diff changeset
351 self.assertEqual(1, len(a))
f5aca0917d60 DICOMweb: test_bitbucket_issue_111
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 222
diff changeset
352 self.assertTrue('00080050' in a[0]) # AccessionNumber is null
f5aca0917d60 DICOMweb: test_bitbucket_issue_111
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 222
diff changeset
353 self.assertEqual(1, len(a[0]['00080050'])) # 'vr' is the only field to be present
f5aca0917d60 DICOMweb: test_bitbucket_issue_111
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 222
diff changeset
354 self.assertEqual('SH', a[0]['00080050']['vr'])
184
e244312964d6 test_bitbucket_issue_111
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 131
diff changeset
355
223
f5aca0917d60 DICOMweb: test_bitbucket_issue_111
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 222
diff changeset
356 # Test QIDO-RS
f5aca0917d60 DICOMweb: test_bitbucket_issue_111
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 222
diff changeset
357 a = DoGet(ORTHANC, '/dicom-web/studies')
184
e244312964d6 test_bitbucket_issue_111
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 131
diff changeset
358 self.assertEqual(1, len(a))
e244312964d6 test_bitbucket_issue_111
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 131
diff changeset
359 self.assertTrue('00080050' in a[0]) # AccessionNumber is null
e244312964d6 test_bitbucket_issue_111
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 131
diff changeset
360 self.assertEqual(1, len(a[0]['00080050'])) # 'vr' is the only field to be present
e244312964d6 test_bitbucket_issue_111
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 131
diff changeset
361 self.assertEqual('SH', a[0]['00080050']['vr'])
e244312964d6 test_bitbucket_issue_111
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 131
diff changeset
362
222
0f03ee6ffa80 DICOMweb: test_wado_hierarchy, test_wado_bulk, test_bitbucket_issue_112
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 195
diff changeset
363
0f03ee6ffa80 DICOMweb: test_wado_hierarchy, test_wado_bulk, test_bitbucket_issue_112
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 195
diff changeset
364 def test_wado_hierarchy(self):
0f03ee6ffa80 DICOMweb: test_wado_hierarchy, test_wado_bulk, test_bitbucket_issue_112
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 195
diff changeset
365 def CheckJson(uri, headers = {}):
0f03ee6ffa80 DICOMweb: test_wado_hierarchy, test_wado_bulk, test_bitbucket_issue_112
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 195
diff changeset
366 with open(GetDatabasePath('DummyCT.json'), 'r') as f:
0f03ee6ffa80 DICOMweb: test_wado_hierarchy, test_wado_bulk, test_bitbucket_issue_112
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 195
diff changeset
367 expected = json.loads(f.read())
0f03ee6ffa80 DICOMweb: test_wado_hierarchy, test_wado_bulk, test_bitbucket_issue_112
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 195
diff changeset
368 actual = DoGet(ORTHANC, uri, headers)
0f03ee6ffa80 DICOMweb: test_wado_hierarchy, test_wado_bulk, test_bitbucket_issue_112
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 195
diff changeset
369 self.assertEqual(1, len(actual))
0f03ee6ffa80 DICOMweb: test_wado_hierarchy, test_wado_bulk, test_bitbucket_issue_112
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 195
diff changeset
370 AssertAlmostEqualRecursive(self, expected, actual[0])
0f03ee6ffa80 DICOMweb: test_wado_hierarchy, test_wado_bulk, test_bitbucket_issue_112
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 195
diff changeset
371
0f03ee6ffa80 DICOMweb: test_wado_hierarchy, test_wado_bulk, test_bitbucket_issue_112
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 195
diff changeset
372 UploadInstance(ORTHANC, 'DummyCT.dcm')
0f03ee6ffa80 DICOMweb: test_wado_hierarchy, test_wado_bulk, test_bitbucket_issue_112
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 195
diff changeset
373 study = '1.2.840.113619.2.176.2025.1499492.7391.1171285944.390'
0f03ee6ffa80 DICOMweb: test_wado_hierarchy, test_wado_bulk, test_bitbucket_issue_112
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 195
diff changeset
374 series = '1.2.840.113619.2.176.2025.1499492.7391.1171285944.394'
0f03ee6ffa80 DICOMweb: test_wado_hierarchy, test_wado_bulk, test_bitbucket_issue_112
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 195
diff changeset
375 instance = '1.2.840.113619.2.176.2025.1499492.7040.1171286242.109'
0f03ee6ffa80 DICOMweb: test_wado_hierarchy, test_wado_bulk, test_bitbucket_issue_112
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 195
diff changeset
376
0f03ee6ffa80 DICOMweb: test_wado_hierarchy, test_wado_bulk, test_bitbucket_issue_112
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 195
diff changeset
377 URI = '/dicom-web/studies/%s/series/%s/instances/%s/metadata'
0f03ee6ffa80 DICOMweb: test_wado_hierarchy, test_wado_bulk, test_bitbucket_issue_112
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 195
diff changeset
378 self.assertRaises(Exception, lambda: DoGet(ORTHANC, URI % (study, series, instance),
0f03ee6ffa80 DICOMweb: test_wado_hierarchy, test_wado_bulk, test_bitbucket_issue_112
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 195
diff changeset
379 headers = { 'accept' : 'application/nope' }))
0f03ee6ffa80 DICOMweb: test_wado_hierarchy, test_wado_bulk, test_bitbucket_issue_112
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 195
diff changeset
380
0f03ee6ffa80 DICOMweb: test_wado_hierarchy, test_wado_bulk, test_bitbucket_issue_112
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 195
diff changeset
381 CheckJson(URI % (study, series, instance), headers = { 'accept' : 'application/dicom+json' })
0f03ee6ffa80 DICOMweb: test_wado_hierarchy, test_wado_bulk, test_bitbucket_issue_112
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 195
diff changeset
382 CheckJson('/dicom-web/studies/%s/series/%s/metadata' % (study, series))
0f03ee6ffa80 DICOMweb: test_wado_hierarchy, test_wado_bulk, test_bitbucket_issue_112
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 195
diff changeset
383 CheckJson('/dicom-web/studies/%s/metadata' % study)
0f03ee6ffa80 DICOMweb: test_wado_hierarchy, test_wado_bulk, test_bitbucket_issue_112
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 195
diff changeset
384
0f03ee6ffa80 DICOMweb: test_wado_hierarchy, test_wado_bulk, test_bitbucket_issue_112
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 195
diff changeset
385 self.assertRaises(Exception, lambda: DoGet(ORTHANC, URI % ('nope', series, instance)))
0f03ee6ffa80 DICOMweb: test_wado_hierarchy, test_wado_bulk, test_bitbucket_issue_112
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 195
diff changeset
386 self.assertRaises(Exception, lambda: DoGet(ORTHANC, URI % (study, 'nope', instance)))
0f03ee6ffa80 DICOMweb: test_wado_hierarchy, test_wado_bulk, test_bitbucket_issue_112
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 195
diff changeset
387 self.assertRaises(Exception, lambda: DoGet(ORTHANC, URI % (study, series, 'nope')))
0f03ee6ffa80 DICOMweb: test_wado_hierarchy, test_wado_bulk, test_bitbucket_issue_112
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 195
diff changeset
388 self.assertRaises(Exception, lambda: DoGet(ORTHANC, '/dicom-web/studies/%s/series/%s/metadata' % ('nope', series)))
0f03ee6ffa80 DICOMweb: test_wado_hierarchy, test_wado_bulk, test_bitbucket_issue_112
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 195
diff changeset
389 self.assertRaises(Exception, lambda: DoGet(ORTHANC, '/dicom-web/studies/%s/series/%s/metadata' % (study, 'nope')))
0f03ee6ffa80 DICOMweb: test_wado_hierarchy, test_wado_bulk, test_bitbucket_issue_112
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 195
diff changeset
390 self.assertRaises(Exception, lambda: DoGet(ORTHANC, '/dicom-web/studies/%s/metadata' % 'nope'))
0f03ee6ffa80 DICOMweb: test_wado_hierarchy, test_wado_bulk, test_bitbucket_issue_112
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 195
diff changeset
391
0f03ee6ffa80 DICOMweb: test_wado_hierarchy, test_wado_bulk, test_bitbucket_issue_112
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 195
diff changeset
392
0f03ee6ffa80 DICOMweb: test_wado_hierarchy, test_wado_bulk, test_bitbucket_issue_112
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 195
diff changeset
393 def test_wado_bulk(self):
0f03ee6ffa80 DICOMweb: test_wado_hierarchy, test_wado_bulk, test_bitbucket_issue_112
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 195
diff changeset
394 def CheckBulk(value, bulk):
0f03ee6ffa80 DICOMweb: test_wado_hierarchy, test_wado_bulk, test_bitbucket_issue_112
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 195
diff changeset
395 self.assertEqual(2, len(value))
0f03ee6ffa80 DICOMweb: test_wado_hierarchy, test_wado_bulk, test_bitbucket_issue_112
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 195
diff changeset
396 self.assertTrue('BulkDataURI' in value)
0f03ee6ffa80 DICOMweb: test_wado_hierarchy, test_wado_bulk, test_bitbucket_issue_112
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 195
diff changeset
397 self.assertTrue('vr' in value)
0f03ee6ffa80 DICOMweb: test_wado_hierarchy, test_wado_bulk, test_bitbucket_issue_112
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 195
diff changeset
398 self.assertEqual(value['BulkDataURI'], bulk)
0f03ee6ffa80 DICOMweb: test_wado_hierarchy, test_wado_bulk, test_bitbucket_issue_112
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 195
diff changeset
399
0f03ee6ffa80 DICOMweb: test_wado_hierarchy, test_wado_bulk, test_bitbucket_issue_112
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 195
diff changeset
400 orthanc = UploadInstance(ORTHANC, 'PrivateTags.dcm') ['ID']
0f03ee6ffa80 DICOMweb: test_wado_hierarchy, test_wado_bulk, test_bitbucket_issue_112
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 195
diff changeset
401 study = '1.2.840.113619.2.115.147416.1094281639.0.29'
0f03ee6ffa80 DICOMweb: test_wado_hierarchy, test_wado_bulk, test_bitbucket_issue_112
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 195
diff changeset
402 series = '1.2.840.113619.2.115.147416.1094281639.0.30'
0f03ee6ffa80 DICOMweb: test_wado_hierarchy, test_wado_bulk, test_bitbucket_issue_112
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 195
diff changeset
403 sop = '1.2.840.113619.2.115.147416.1094281639.0.38'
0f03ee6ffa80 DICOMweb: test_wado_hierarchy, test_wado_bulk, test_bitbucket_issue_112
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 195
diff changeset
404
0f03ee6ffa80 DICOMweb: test_wado_hierarchy, test_wado_bulk, test_bitbucket_issue_112
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 195
diff changeset
405 a = DoGet(ORTHANC, '/dicom-web/studies/%s/metadata' % study)
0f03ee6ffa80 DICOMweb: test_wado_hierarchy, test_wado_bulk, test_bitbucket_issue_112
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 195
diff changeset
406 self.assertEqual(1, len(a))
0f03ee6ffa80 DICOMweb: test_wado_hierarchy, test_wado_bulk, test_bitbucket_issue_112
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 195
diff changeset
407
0f03ee6ffa80 DICOMweb: test_wado_hierarchy, test_wado_bulk, test_bitbucket_issue_112
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 195
diff changeset
408 BASE_URI = '/dicom-web/studies/%s/series/%s/instances/%s/bulk' % (study, series, sop)
0f03ee6ffa80 DICOMweb: test_wado_hierarchy, test_wado_bulk, test_bitbucket_issue_112
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 195
diff changeset
409 BASE_URL = 'http://localhost:8042%s' % BASE_URI
0f03ee6ffa80 DICOMweb: test_wado_hierarchy, test_wado_bulk, test_bitbucket_issue_112
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 195
diff changeset
410
0f03ee6ffa80 DICOMweb: test_wado_hierarchy, test_wado_bulk, test_bitbucket_issue_112
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 195
diff changeset
411 self.assertEqual(2, len(a[0]['60031010']['Value']))
0f03ee6ffa80 DICOMweb: test_wado_hierarchy, test_wado_bulk, test_bitbucket_issue_112
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 195
diff changeset
412 CheckBulk(a[0]['60031010']['Value'][0]['60031011'], '%s/60031010/1/60031011' % BASE_URL)
0f03ee6ffa80 DICOMweb: test_wado_hierarchy, test_wado_bulk, test_bitbucket_issue_112
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 195
diff changeset
413 CheckBulk(a[0]['60031010']['Value'][1]['60031011'], '%s/60031010/2/60031011' % BASE_URL)
0f03ee6ffa80 DICOMweb: test_wado_hierarchy, test_wado_bulk, test_bitbucket_issue_112
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 195
diff changeset
414 CheckBulk(a[0]['7FE00010'], '%s/7fe00010' % BASE_URL)
0f03ee6ffa80 DICOMweb: test_wado_hierarchy, test_wado_bulk, test_bitbucket_issue_112
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 195
diff changeset
415
0f03ee6ffa80 DICOMweb: test_wado_hierarchy, test_wado_bulk, test_bitbucket_issue_112
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 195
diff changeset
416 b = DoGetRaw(ORTHANC, '/instances/%s/content/6003-1010/0/6003-1011' % orthanc) [1]
0f03ee6ffa80 DICOMweb: test_wado_hierarchy, test_wado_bulk, test_bitbucket_issue_112
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 195
diff changeset
417 c = DoGetMultipart(ORTHANC, '%s/60031010/1/60031011' % BASE_URI)
0f03ee6ffa80 DICOMweb: test_wado_hierarchy, test_wado_bulk, test_bitbucket_issue_112
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 195
diff changeset
418
0f03ee6ffa80 DICOMweb: test_wado_hierarchy, test_wado_bulk, test_bitbucket_issue_112
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 195
diff changeset
419 self.assertEqual(12288, len(b))
0f03ee6ffa80 DICOMweb: test_wado_hierarchy, test_wado_bulk, test_bitbucket_issue_112
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 195
diff changeset
420 self.assertEqual(1, len(c))
0f03ee6ffa80 DICOMweb: test_wado_hierarchy, test_wado_bulk, test_bitbucket_issue_112
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 195
diff changeset
421 self.assertEqual(b, c[0])
0f03ee6ffa80 DICOMweb: test_wado_hierarchy, test_wado_bulk, test_bitbucket_issue_112
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 195
diff changeset
422
0f03ee6ffa80 DICOMweb: test_wado_hierarchy, test_wado_bulk, test_bitbucket_issue_112
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 195
diff changeset
423
0f03ee6ffa80 DICOMweb: test_wado_hierarchy, test_wado_bulk, test_bitbucket_issue_112
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 195
diff changeset
424 def test_bitbucket_issue_112(self):
223
f5aca0917d60 DICOMweb: test_bitbucket_issue_111
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 222
diff changeset
425 # Wrong serialization of number values
222
0f03ee6ffa80 DICOMweb: test_wado_hierarchy, test_wado_bulk, test_bitbucket_issue_112
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 195
diff changeset
426 # https://bitbucket.org/sjodogne/orthanc/issues/112
0f03ee6ffa80 DICOMweb: test_wado_hierarchy, test_wado_bulk, test_bitbucket_issue_112
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 195
diff changeset
427 # https://bitbucket.org/sjodogne/orthanc-dicomweb/issues/4/
0f03ee6ffa80 DICOMweb: test_wado_hierarchy, test_wado_bulk, test_bitbucket_issue_112
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 195
diff changeset
428
0f03ee6ffa80 DICOMweb: test_wado_hierarchy, test_wado_bulk, test_bitbucket_issue_112
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 195
diff changeset
429 UploadInstance(ORTHANC, 'DummyCT.dcm')
0f03ee6ffa80 DICOMweb: test_wado_hierarchy, test_wado_bulk, test_bitbucket_issue_112
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 195
diff changeset
430 study = '1.2.840.113619.2.176.2025.1499492.7391.1171285944.390'
0f03ee6ffa80 DICOMweb: test_wado_hierarchy, test_wado_bulk, test_bitbucket_issue_112
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 195
diff changeset
431
0f03ee6ffa80 DICOMweb: test_wado_hierarchy, test_wado_bulk, test_bitbucket_issue_112
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 195
diff changeset
432 # This is the WADO-RS testing
0f03ee6ffa80 DICOMweb: test_wado_hierarchy, test_wado_bulk, test_bitbucket_issue_112
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 195
diff changeset
433 a = DoGet(ORTHANC, '/dicom-web/studies/%s/metadata' % study)
0f03ee6ffa80 DICOMweb: test_wado_hierarchy, test_wado_bulk, test_bitbucket_issue_112
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 195
diff changeset
434 self.assertEqual(1, len(a))
0f03ee6ffa80 DICOMweb: test_wado_hierarchy, test_wado_bulk, test_bitbucket_issue_112
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 195
diff changeset
435 self.assertEqual('IS', a[0]['00180091']['vr']) # EchoTrainLength
0f03ee6ffa80 DICOMweb: test_wado_hierarchy, test_wado_bulk, test_bitbucket_issue_112
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 195
diff changeset
436
0f03ee6ffa80 DICOMweb: test_wado_hierarchy, test_wado_bulk, test_bitbucket_issue_112
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 195
diff changeset
437 b = a[0]['00180091']['Value'][0]
0f03ee6ffa80 DICOMweb: test_wado_hierarchy, test_wado_bulk, test_bitbucket_issue_112
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 195
diff changeset
438 self.assertTrue(isinstance(b, (int, long)))
0f03ee6ffa80 DICOMweb: test_wado_hierarchy, test_wado_bulk, test_bitbucket_issue_112
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 195
diff changeset
439 self.assertEqual(10, b)
0f03ee6ffa80 DICOMweb: test_wado_hierarchy, test_wado_bulk, test_bitbucket_issue_112
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 195
diff changeset
440
0f03ee6ffa80 DICOMweb: test_wado_hierarchy, test_wado_bulk, test_bitbucket_issue_112
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 195
diff changeset
441 # This is the QIDO-RS testing
0f03ee6ffa80 DICOMweb: test_wado_hierarchy, test_wado_bulk, test_bitbucket_issue_112
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 195
diff changeset
442 a = DoGet(ORTHANC, '/dicom-web/studies')
0f03ee6ffa80 DICOMweb: test_wado_hierarchy, test_wado_bulk, test_bitbucket_issue_112
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 195
diff changeset
443 self.assertEqual(1, len(a))
0f03ee6ffa80 DICOMweb: test_wado_hierarchy, test_wado_bulk, test_bitbucket_issue_112
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 195
diff changeset
444 self.assertEqual('IS', a[0]['00201208']['vr']) # Number of Study Related Instances
0f03ee6ffa80 DICOMweb: test_wado_hierarchy, test_wado_bulk, test_bitbucket_issue_112
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 195
diff changeset
445
0f03ee6ffa80 DICOMweb: test_wado_hierarchy, test_wado_bulk, test_bitbucket_issue_112
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 195
diff changeset
446 b = a[0]['00201208']['Value'][0]
0f03ee6ffa80 DICOMweb: test_wado_hierarchy, test_wado_bulk, test_bitbucket_issue_112
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 195
diff changeset
447 self.assertTrue(isinstance(b, (int, long)))
0f03ee6ffa80 DICOMweb: test_wado_hierarchy, test_wado_bulk, test_bitbucket_issue_112
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 195
diff changeset
448 self.assertEqual(1, b)
223
f5aca0917d60 DICOMweb: test_bitbucket_issue_111
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 222
diff changeset
449
222
0f03ee6ffa80 DICOMweb: test_wado_hierarchy, test_wado_bulk, test_bitbucket_issue_112
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 195
diff changeset
450
224
f5414254ccaa test_bitbucket_issue_113
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 223
diff changeset
451 def test_bitbucket_issue_113(self):
f5414254ccaa test_bitbucket_issue_113
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 223
diff changeset
452 # Wrong serialization of PN VR
f5414254ccaa test_bitbucket_issue_113
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 223
diff changeset
453 # https://bitbucket.org/sjodogne/orthanc/issues/113
f5414254ccaa test_bitbucket_issue_113
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 223
diff changeset
454 # https://bitbucket.org/sjodogne/orthanc-dicomweb/issues/2/
f5414254ccaa test_bitbucket_issue_113
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 223
diff changeset
455
f5414254ccaa test_bitbucket_issue_113
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 223
diff changeset
456 UploadInstance(ORTHANC, 'Encodings/DavidClunie/SCSX1')
f5414254ccaa test_bitbucket_issue_113
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 223
diff changeset
457 study = '1.3.6.1.4.1.5962.1.2.0.1175775771.5711.0'
f5414254ccaa test_bitbucket_issue_113
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 223
diff changeset
458
f5414254ccaa test_bitbucket_issue_113
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 223
diff changeset
459 # This is the WADO-RS testing
f5414254ccaa test_bitbucket_issue_113
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 223
diff changeset
460 a = DoGet(ORTHANC, '/dicom-web/studies/%s/metadata' % study)
f5414254ccaa test_bitbucket_issue_113
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 223
diff changeset
461 self.assertEqual(1, len(a))
f5414254ccaa test_bitbucket_issue_113
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 223
diff changeset
462
f5414254ccaa test_bitbucket_issue_113
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 223
diff changeset
463 pn = a[0]['00100010'] # Patient name
f5414254ccaa test_bitbucket_issue_113
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 223
diff changeset
464 self.assertEqual('PN', pn['vr'])
f5414254ccaa test_bitbucket_issue_113
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 223
diff changeset
465 self.assertEqual(1, len(pn['Value']))
f5414254ccaa test_bitbucket_issue_113
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 223
diff changeset
466 self.assertEqual('Wang^XiaoDong', pn['Value'][0]['Alphabetic'])
f5414254ccaa test_bitbucket_issue_113
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 223
diff changeset
467 self.assertEqual(u'王^小東', pn['Value'][0]['Ideographic'])
f5414254ccaa test_bitbucket_issue_113
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 223
diff changeset
468
f5414254ccaa test_bitbucket_issue_113
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 223
diff changeset
469 # This is the QIDO-RS testing
f5414254ccaa test_bitbucket_issue_113
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 223
diff changeset
470 a = DoGet(ORTHANC, '/dicom-web/studies')
f5414254ccaa test_bitbucket_issue_113
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 223
diff changeset
471 self.assertEqual(1, len(a))
f5414254ccaa test_bitbucket_issue_113
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 223
diff changeset
472
f5414254ccaa test_bitbucket_issue_113
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 223
diff changeset
473 pn = a[0]['00100010'] # Patient name
f5414254ccaa test_bitbucket_issue_113
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 223
diff changeset
474 self.assertEqual('PN', pn['vr'])
f5414254ccaa test_bitbucket_issue_113
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 223
diff changeset
475 self.assertEqual(1, len(pn['Value']))
f5414254ccaa test_bitbucket_issue_113
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 223
diff changeset
476 self.assertEqual('Wang^XiaoDong', pn['Value'][0]['Alphabetic'])
f5414254ccaa test_bitbucket_issue_113
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 223
diff changeset
477 self.assertEqual(u'王^小東', pn['Value'][0]['Ideographic'])
f5414254ccaa test_bitbucket_issue_113
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 223
diff changeset
478
222
0f03ee6ffa80 DICOMweb: test_wado_hierarchy, test_wado_bulk, test_bitbucket_issue_112
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 195
diff changeset
479
225
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 224
diff changeset
480 def test_bitbucket_issue_96(self):
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 224
diff changeset
481 # WADO-RS RetrieveFrames rejects valid accept headers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 224
diff changeset
482 # https://bitbucket.org/sjodogne/orthanc/issues/96
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 224
diff changeset
483 # https://bitbucket.org/sjodogne/orthanc-dicomweb/issues/5/
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 224
diff changeset
484
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 224
diff changeset
485 UploadInstance(ORTHANC, 'LenaTwiceWithFragments.dcm')
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 224
diff changeset
486
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 224
diff changeset
487 a = DoGet(ORTHANC, '/dicom-web/instances')
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 224
diff changeset
488 self.assertEqual(1, len(a))
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 224
diff changeset
489 url = a[0]['00081190']['Value'][0]
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 224
diff changeset
490
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 224
diff changeset
491 prefix = 'http://localhost:8042'
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 224
diff changeset
492 self.assertTrue(url.startswith(prefix))
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 224
diff changeset
493 uri = url[len(prefix):]
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 224
diff changeset
494
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 224
diff changeset
495 b = DoGetRaw(ORTHANC, '%s/frames/1' % uri, headers = { 'Accept' : 'multipart/related; type=application/octet-stream' })
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 224
diff changeset
496 print b
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 224
diff changeset
497
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 224
diff changeset
498
32
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
499 try:
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
500 print('\nStarting the tests...')
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
501 unittest.main(argv = [ sys.argv[0] ] + args.options)
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
502
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
503 finally:
682c4e2a1162 integration tests for wado
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
504 print('\nDone')