# HG changeset patch # User Sebastien Jodogne # Date 1481197564 -3600 # Node ID dbcbffb889da948327d36a6ba83dee83d9bf7859 # Parent ba5619c3941d8dff1185be30d1b1ae5e871dc193 test_findscu_encoding diff -r ba5619c3941d -r dbcbffb889da Database/Encodings/Generate.sh --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Database/Encodings/Generate.sh Thu Dec 08 12:46:04 2016 +0100 @@ -0,0 +1,37 @@ +#!/bin/bash + +# Inspired from Levin Alexander on 2016-11-03 +# https://groups.google.com/d/msg/orthanc-users/kYURTgtgPmI/KeOL8lGFAwAJ + +set -e + +convert -quality 90 -resize 128x128 ../Lena.png /tmp/Lena.jpg + +function Encode { + echo $1 + SOURCE="Test-éüäöòДΘĝדصķћ๛ネİ" + CONVERTED=$(echo "$SOURCE" | iconv -c -t $1) + + img2dcm /tmp/Lena.jpg Lena-$1.dcm \ + -k "(0010,0010)=${CONVERTED}" \ + -k "(0010,0020)=${1}" \ + -k "(0008,0005)=${2}" + + echo -n "${CONVERTED}" | md5sum +} + + +# http://dicom.nema.org/medical/dicom/current/output/html/part03.html#sect_C.12.1.1.2 +Encode 'arabic' 'ISO_IR 127' +Encode 'ascii' 'ISO_IR 6' # More accurately, ISO 646 +Encode 'cyrillic' 'ISO_IR 144' +Encode 'greek' 'ISO_IR 126' +Encode 'hebrew' 'ISO_IR 138' +Encode 'latin1' 'ISO_IR 100' +Encode 'latin2' 'ISO_IR 101' +Encode 'latin3' 'ISO_IR 109' +Encode 'latin4' 'ISO_IR 110' +Encode 'latin5' 'ISO_IR 148' +Encode 'shift-jis' 'ISO_IR 13' # Japanese +Encode 'tis-620' 'ISO_IR 166' # Thai +Encode 'utf8' 'ISO_IR 192' diff -r ba5619c3941d -r dbcbffb889da Database/Encodings/Lena-arabic.dcm Binary file Database/Encodings/Lena-arabic.dcm has changed diff -r ba5619c3941d -r dbcbffb889da Database/Encodings/Lena-ascii.dcm Binary file Database/Encodings/Lena-ascii.dcm has changed diff -r ba5619c3941d -r dbcbffb889da Database/Encodings/Lena-cyrillic.dcm Binary file Database/Encodings/Lena-cyrillic.dcm has changed diff -r ba5619c3941d -r dbcbffb889da Database/Encodings/Lena-greek.dcm Binary file Database/Encodings/Lena-greek.dcm has changed diff -r ba5619c3941d -r dbcbffb889da Database/Encodings/Lena-hebrew.dcm Binary file Database/Encodings/Lena-hebrew.dcm has changed diff -r ba5619c3941d -r dbcbffb889da Database/Encodings/Lena-latin1.dcm Binary file Database/Encodings/Lena-latin1.dcm has changed diff -r ba5619c3941d -r dbcbffb889da Database/Encodings/Lena-latin2.dcm Binary file Database/Encodings/Lena-latin2.dcm has changed diff -r ba5619c3941d -r dbcbffb889da Database/Encodings/Lena-latin3.dcm Binary file Database/Encodings/Lena-latin3.dcm has changed diff -r ba5619c3941d -r dbcbffb889da Database/Encodings/Lena-latin4.dcm Binary file Database/Encodings/Lena-latin4.dcm has changed diff -r ba5619c3941d -r dbcbffb889da Database/Encodings/Lena-latin5.dcm Binary file Database/Encodings/Lena-latin5.dcm has changed diff -r ba5619c3941d -r dbcbffb889da Database/Encodings/Lena-shift-jis.dcm Binary file Database/Encodings/Lena-shift-jis.dcm has changed diff -r ba5619c3941d -r dbcbffb889da Database/Encodings/Lena-tis-620.dcm Binary file Database/Encodings/Lena-tis-620.dcm has changed diff -r ba5619c3941d -r dbcbffb889da Database/Encodings/Lena-utf8.dcm Binary file Database/Encodings/Lena-utf8.dcm has changed diff -r ba5619c3941d -r dbcbffb889da GenerateConfigurationForTests.py --- a/GenerateConfigurationForTests.py Tue Dec 06 13:26:51 2016 +0100 +++ b/GenerateConfigurationForTests.py Thu Dec 08 12:46:04 2016 +0100 @@ -86,9 +86,10 @@ config = json.loads(nocomment) +del config['DefaultEncoding'] + config['AllowFindSopClassesInStudy'] = True config['AuthenticationEnabled'] = True -config['DefaultEncoding'] = 'Windows1251' # For test_issue_32 config['DicomAet'] = 'ORTHANC' config['DicomAssociationCloseDelay'] = 0 config['DicomModalities'] = { 'orthanctest' : [ 'ORTHANCTEST', ip, 5001 ] } diff -r ba5619c3941d -r dbcbffb889da Tests/Tests.py --- a/Tests/Tests.py Tue Dec 06 13:26:51 2016 +0100 +++ b/Tests/Tests.py Thu Dec 08 12:46:04 2016 +0100 @@ -2090,13 +2090,25 @@ def test_googlecode_issue_32(self): + self.assertRaises(Exception, lambda: DoPut(_REMOTE, '/tools/default-encoding', 'nope')) + self.assertEqual('Windows1251', DoPut(_REMOTE, '/tools/default-encoding', 'Windows1251')) + self.assertEqual('Windows1251', DoGet(_REMOTE, '/tools/default-encoding')) + f = UploadInstance(_REMOTE, 'Issue32.dcm')['ID'] tags = DoGet(_REMOTE, '/instances/%s/tags?simplify' % f) self.assertEqual(u'Рентгенография', tags['SeriesDescription']) self.assertEqual(u'Таз', tags['BodyPartExamined']) self.assertEqual(u'Прямая', tags['ViewPosition']) - + # Replay the same test using Latin1 as default encoding: This must fail + self.assertEqual('Latin1', DoPut(_REMOTE, '/tools/default-encoding', 'Latin1')) + + DoDelete(_REMOTE, '/instances/%s' % f) + f = UploadInstance(_REMOTE, 'Issue32.dcm')['ID'] + tags = DoGet(_REMOTE, '/instances/%s/tags?simplify' % f) + self.assertNotEqual(u'Рентгенография', tags['SeriesDescription']) + + def test_encodings(self): # Latin-1 (ISO_IR 100) brainix = UploadInstance(_REMOTE, 'Brainix/Epi/IM-0001-0001.dcm')['ID'] @@ -2989,3 +3001,89 @@ self.assertEqual('1.2.840.113704.1.111.6320.1342451261.21', t['PET-CT Multi Modality Name']) self.assertEqual('p37s0_na_ctac.img', t['Original Image Filename']) + + def test_findscu_encoding(self): + # Check out ../Database/Encodings/Generate.sh + TEST = u'Test-éüäöòДΘĝדصķћ๛ネİ' + ENCODINGS = { + 'Arabic' : [ 'ISO_IR 127' ], + 'Ascii' : [ 'ISO_IR 6' ], # More accurately, ISO 646 + 'Cyrillic' : [ 'ISO_IR 144' ], + 'Greek' : [ 'ISO_IR 126' ], + 'Hebrew' : [ 'ISO_IR 138' ], + 'Japanese' : [ 'ISO_IR 13', 'shift-jis' ], + 'Latin1' : [ 'ISO_IR 100' ], + 'Latin2' : [ 'ISO_IR 101' ], + 'Latin3' : [ 'ISO_IR 109' ], + 'Latin4' : [ 'ISO_IR 110' ], + 'Latin5' : [ 'ISO_IR 148' ], + 'Thai' : [ 'ISO_IR 166', 'tis-620' ], + 'Utf8' : [ 'ISO_IR 192' ], + } + + for name in ENCODINGS.iterkeys(): + if len(ENCODINGS[name]) == 1: + ENCODINGS[name].append(name.lower()) + + UploadInstance(_REMOTE, 'Encodings/Lena-utf8.dcm') + + for name in ENCODINGS.iterkeys(): + self.assertEqual(name, DoPut(_REMOTE, '/tools/default-encoding', name)) + self.assertEqual(name, DoGet(_REMOTE, '/tools/default-encoding')) + + i = CallFindScu([ '-k', '0008,0052=STUDY', + '-k', 'SpecificCharacterSet', + '-k', 'PatientName' ]) + + characterSet = re.findall('\(0008,0005\).*?\[(.*?)\]', i) + self.assertEqual(1, len(characterSet)) + self.assertEqual(ENCODINGS[name][0], characterSet[0].strip()) + + patientName = re.findall('\(0010,0010\).*?\[(.*?)\]', i) + self.assertEqual(1, len(patientName)) + + expected = TEST.encode(ENCODINGS[name][1], 'ignore') + self.assertEqual(expected, patientName[0].strip()) + + + #for master in ENCODINGS: + for master in [ 'Latin1', 'Utf8', 'Cyrillic' ]: # Shortcut to speedup tests + self.assertEqual(master, DoPut(_REMOTE, '/tools/default-encoding', master)) + self.assertEqual(master, DoGet(_REMOTE, '/tools/default-encoding')) + + for name in ENCODINGS: + DropOrthanc(_REMOTE) + UploadInstance(_REMOTE, 'Encodings/Lena-%s.dcm' % ENCODINGS[name][1]) + + i = CallFindScu([ '-k', '0008,0052=STUDY', + '-k', 'PatientID', + '-k', 'SpecificCharacterSet', + '-k', 'PatientName' ]) + i = i.decode(ENCODINGS[master][1]) + + characterSet = re.findall('\(0008,0005\).*?\[(.*?)\]', i) + self.assertEqual(1, len(characterSet)) + self.assertEqual(ENCODINGS[master][0], characterSet[0].strip()) + + patientId = re.findall('\(0010,0020\).*?\[(.*?)\]', i) + self.assertEqual(1, len(patientId)) + self.assertEqual(ENCODINGS[name][1], patientId[0].strip()) + + patientName = re.findall('\(0010,0010\).*?\[(.*?)\]', i) + self.assertEqual(1, len(patientName)) + + tmp = ENCODINGS[name][1] + expected = TEST.encode(tmp, 'ignore').decode(tmp) + tmp = ENCODINGS[master][1] + expected = expected.encode(tmp, 'ignore').decode(tmp) + + self.assertEqual(expected, patientName[0].strip()) + + + a = DoPost(_REMOTE, '/tools/find', { 'Expand' : True, + 'Level' : 'Study', + 'Query' : { }}) + self.assertEqual(1, len(a)) + + tmp = ENCODINGS[name][1] + self.assertEqual(TEST.encode(tmp, 'ignore').decode(tmp), a[0]["PatientMainDicomTags"]["PatientName"])