comparison Tests/Tests.py @ 11:c660a64ce2dd

cont
author Sebastien Jodogne <s.jodogne@gmail.com>
date Thu, 18 Jun 2015 14:18:49 +0200
parents 5f73008bb873
children 15c166240dfb
comparison
equal deleted inserted replaced
10:5f73008bb873 11:c660a64ce2dd
16 # along with this program. If not, see <http://www.gnu.org/licenses/>. 16 # along with this program. If not, see <http://www.gnu.org/licenses/>.
17 17
18 18
19 import unittest 19 import unittest
20 20
21 from PIL import ImageChops
21 from Toolbox import * 22 from Toolbox import *
22 23
23 _LOCAL = None 24 _LOCAL = None
24 _REMOTE = None 25 _REMOTE = None
25 26
533 self.assertEqual(s, DoGet(_REMOTE, '/instances/%s' % i)['ParentSeries']) 534 self.assertEqual(s, DoGet(_REMOTE, '/instances/%s' % i)['ParentSeries'])
534 self.assertEqual(ss, DoGet(_REMOTE, '/instances/%s' % j)['ParentSeries']) 535 self.assertEqual(ss, DoGet(_REMOTE, '/instances/%s' % j)['ParentSeries'])
535 536
536 self.assertEqual('Jodogne', DoGet(_REMOTE, '/instances/%s/content/0010-0010' % i).strip()) 537 self.assertEqual('Jodogne', DoGet(_REMOTE, '/instances/%s/content/0010-0010' % i).strip())
537 self.assertNotEqual('Jodogne', DoGet(_REMOTE, '/instances/%s/content/0010-0010' % j).strip()) 538 self.assertNotEqual('Jodogne', DoGet(_REMOTE, '/instances/%s/content/0010-0010' % j).strip())
539
540
541
542 def test_storescu(self):
543 # Check emptiness
544 e = DoGet(_REMOTE, '/exports')
545 self.assertEqual(0, len(e['Exports']))
546 self.assertEqual(0, e['Last'])
547 self.assertTrue(e['Done'])
548 e = DoGet(_REMOTE, '/exports?last')
549 self.assertEqual(0, len(e['Exports']))
550 self.assertEqual(0, e['Last'])
551 self.assertTrue(e['Done'])
552
553 # Add 1 instance
554 i = UploadInstance(_REMOTE, 'DummyCT.dcm')['ID']
555 self.assertEqual(0, len(DoGet(_LOCAL, '/patients')))
556
557 # Export the instance
558 j = DoPost(_REMOTE, '/modalities/orthanctest/store', str(i), 'text/plain') # instance
559 self.assertEqual(1, len(DoGet(_LOCAL, '/patients')))
560 self.assertEqual(1, len(DoGet(_LOCAL, '/studies')))
561 self.assertEqual(1, len(DoGet(_LOCAL, '/series')))
562 self.assertEqual(1, len(DoGet(_LOCAL, '/instances')))
563
564 e = DoGet(_REMOTE, '/exports')
565 self.assertEqual(1, len(e['Exports']))
566 self.assertTrue(e['Done'])
567 self.assertEqual(e['Exports'][-1]['Seq'], e['Last'])
568 e = DoGet(_REMOTE, '/exports?limit=1')
569 self.assertEqual(1, len(e['Exports']))
570 self.assertTrue(e['Done'])
571 self.assertEqual(e['Exports'][-1]['Seq'], e['Last'])
572 e = DoGet(_REMOTE, '/exports?last')
573 self.assertEqual(1, len(e['Exports']))
574 self.assertTrue(e['Done'])
575 self.assertEqual(e['Exports'][-1]['Seq'], e['Last'])
576 seqInstance = e['Last']
577
578 # Export the series
579 j = DoPost(_REMOTE, '/modalities/orthanctest/store', 'f2635388-f01d497a-15f7c06b-ad7dba06-c4c599fe', 'text/plain')
580
581 e = DoGet(_REMOTE, '/exports')
582 self.assertEqual(2, len(e['Exports']))
583 self.assertTrue(e['Done'])
584 self.assertEqual(e['Exports'][-1]['Seq'], e['Last'])
585 seqSeries = e['Last']
586 self.assertNotEqual(seqInstance, seqSeries)
587 e = DoGet(_REMOTE, '/exports?limit=1&since=0')
588 self.assertEqual(1, len(e['Exports']))
589 self.assertFalse(e['Done'])
590 self.assertEqual(e['Exports'][-1]['Seq'], seqInstance)
591 e = DoGet(_REMOTE, '/exports?limit=1&since=' + str(seqInstance))
592 self.assertEqual(1, len(e['Exports']))
593 self.assertTrue(e['Done'])
594 self.assertEqual(e['Exports'][-1]['Seq'], seqSeries)
595 e = DoGet(_REMOTE, '/exports?last')
596 self.assertEqual(1, len(e['Exports']))
597 self.assertTrue(e['Done'])
598 self.assertEqual(e['Exports'][-1]['Seq'], seqSeries)
599
600 # Export the study
601 j = DoPost(_REMOTE, '/modalities/orthanctest/store', 'b9c08539-26f93bde-c81ab0d7-bffaf2cb-a4d0bdd0', 'text/plain')
602 seqStudy = DoGet(_REMOTE, '/exports')['Last']
603
604 # Export the patient
605 j = DoPost(_REMOTE, '/modalities/orthanctest/store', '6816cb19-844d5aee-85245eba-28e841e6-2414fae2', 'text/plain')
606 self.assertEqual(1, len(DoGet(_LOCAL, '/patients')))
607 self.assertEqual(1, len(DoGet(_LOCAL, '/studies')))
608 self.assertEqual(1, len(DoGet(_LOCAL, '/series')))
609 self.assertEqual(1, len(DoGet(_LOCAL, '/instances')))
610
611 e = DoGet(_REMOTE, '/exports')
612 self.assertEqual(4, len(e['Exports']))
613 self.assertTrue(e['Done'])
614 self.assertEqual(e['Exports'][-1]['Seq'], e['Last'])
615 seqPatient = e['Last']
616 self.assertNotEqual(seqInstance, seqSeries)
617 self.assertNotEqual(seqSeries, seqStudy)
618 self.assertNotEqual(seqStudy, seqPatient)
619 self.assertTrue(seqInstance < seqSeries)
620 self.assertTrue(seqSeries < seqStudy)
621 self.assertTrue(seqStudy < seqPatient)
622 e = DoGet(_REMOTE, '/exports?limit=1&since=0')
623 self.assertEqual(1, len(e['Exports']))
624 self.assertFalse(e['Done'])
625 self.assertEqual(e['Exports'][-1]['Seq'], seqInstance)
626 e = DoGet(_REMOTE, '/exports?limit=1&since=' + str(seqInstance))
627 self.assertEqual(1, len(e['Exports']))
628 self.assertFalse(e['Done'])
629 self.assertEqual(e['Exports'][-1]['Seq'], seqSeries)
630 e = DoGet(_REMOTE, '/exports?limit=1&since=' + str(seqSeries))
631 self.assertEqual(1, len(e['Exports']))
632 self.assertFalse(e['Done'])
633 self.assertEqual(e['Exports'][-1]['Seq'], seqStudy)
634 e = DoGet(_REMOTE, '/exports?limit=1&since=' + str(seqStudy))
635 self.assertEqual(1, len(e['Exports']))
636 self.assertTrue(e['Done'])
637 self.assertEqual(e['Exports'][-1]['Seq'], seqPatient)
638 e = DoGet(_REMOTE, '/exports?last')
639 self.assertEqual(1, len(e['Exports']))
640 self.assertTrue(e['Done'])
641 self.assertEqual(e['Exports'][-1]['Seq'], seqPatient)
642
643
644 # Check the content of the logged information
645 e = DoGet(_REMOTE, '/exports')['Exports']
646
647 if 'PatientID' in e[0]:
648 # Since Orthanc 0.8.6
649 patient = 'PatientID'
650 study = 'StudyInstanceUID'
651 series = 'SeriesInstanceUID'
652 instance = 'SOPInstanceUID'
653 else:
654 # Up to Orthanc 0.8.5
655 patient = 'PatientId'
656 study = 'StudyInstanceUid'
657 series = 'SeriesInstanceUid'
658 instance = 'SopInstanceUid'
659
660 for k in range(4):
661 self.assertTrue('Date' in e[k])
662 self.assertTrue('Seq' in e[k])
663 self.assertEqual('orthanctest', e[k]['RemoteModality'])
664
665 self.assertEqual(10, len(e[0]))
666 self.assertEqual('Instance', e[0]['ResourceType'])
667 self.assertEqual('66a662ce-7430e543-bad44d47-0dc5a943-ec7a538d', e[0]['ID'])
668 self.assertEqual('/instances/66a662ce-7430e543-bad44d47-0dc5a943-ec7a538d', e[0]['Path'])
669 self.assertEqual('1.2.840.113619.2.176.2025.1499492.7040.1171286242.109', e[0][instance])
670 self.assertEqual('1.2.840.113619.2.176.2025.1499492.7391.1171285944.394', e[0][series])
671 self.assertEqual('1.2.840.113619.2.176.2025.1499492.7391.1171285944.390', e[0][study])
672 self.assertEqual('ozp00SjY2xG', e[0][patient])
673
674 self.assertEqual(9, len(e[1]))
675 self.assertEqual('Series', e[1]['ResourceType'])
676 self.assertEqual('f2635388-f01d497a-15f7c06b-ad7dba06-c4c599fe', e[1]['ID'])
677 self.assertEqual('/series/f2635388-f01d497a-15f7c06b-ad7dba06-c4c599fe', e[1]['Path'])
678 self.assertEqual('1.2.840.113619.2.176.2025.1499492.7391.1171285944.394', e[1][series])
679 self.assertEqual('1.2.840.113619.2.176.2025.1499492.7391.1171285944.390', e[1][study])
680 self.assertEqual('ozp00SjY2xG', e[1][patient])
681
682 self.assertEqual(8, len(e[2]))
683 self.assertEqual('Study', e[2]['ResourceType'])
684 self.assertEqual('b9c08539-26f93bde-c81ab0d7-bffaf2cb-a4d0bdd0', e[2]['ID'])
685 self.assertEqual('/studies/b9c08539-26f93bde-c81ab0d7-bffaf2cb-a4d0bdd0', e[2]['Path'])
686 self.assertEqual('1.2.840.113619.2.176.2025.1499492.7391.1171285944.390', e[2][study])
687 self.assertEqual('ozp00SjY2xG', e[2][patient])
688
689 self.assertEqual(7, len(e[3]))
690 self.assertEqual('Patient', e[3]['ResourceType'])
691 self.assertEqual('6816cb19-844d5aee-85245eba-28e841e6-2414fae2', e[3]['ID'])
692 self.assertEqual('/patients/6816cb19-844d5aee-85245eba-28e841e6-2414fae2', e[3]['Path'])
693 self.assertEqual('ozp00SjY2xG', e[3][patient])
694
695 DropOrthanc(_REMOTE)
696 self.assertEqual(0, len(DoGet(_REMOTE, '/exports')['Exports']))
697
698
699 def test_store_peer(self):
700 self.assertEqual(0, len(DoGet(_LOCAL, '/exports')['Exports']))
701 self.assertEqual(0, len(DoGet(_REMOTE, '/exports')['Exports']))
702
703 i = UploadInstance(_REMOTE, 'DummyCT.dcm')['ID']
704 self.assertEqual(0, len(DoGet(_LOCAL, '/patients')))
705 self.assertEqual(1, len(DoGet(_REMOTE, '/patients')))
706
707 j = DoPost(_REMOTE, '/peers/peer/store', str(i), 'text/plain')
708 self.assertEqual(1, len(DoGet(_LOCAL, '/patients')))
709 self.assertEqual(1, len(DoGet(_REMOTE, '/patients')))
710
711 self.assertEqual(1, len(DoGet(_REMOTE, '/exports')['Exports']))
712
713 DropOrthanc(_REMOTE)
714 self.assertEqual(0, len(DoGet(_REMOTE, '/exports')['Exports']))
715
716
717 def test_bulk_storescu(self):
718 self.assertEqual(0, len(DoGet(_LOCAL, '/patients')))
719
720 a = UploadInstance(_REMOTE, 'Knee/T1/IM-0001-0001.dcm')
721 b = UploadInstance(_REMOTE, 'Knee/T2/IM-0001-0001.dcm')
722
723 j = DoPost(_REMOTE, '/modalities/orthanctest/store', [ a['ID'], b['ID'] ], 'application/json')
724 self.assertEqual(2, len(DoGet(_LOCAL, '/instances')))
725
726 DropOrthanc(_LOCAL)
727
728 # Send using patient's UUID
729 self.assertEqual(0, len(DoGet(_LOCAL, '/instances')))
730 j = DoPost(_REMOTE, '/modalities/orthanctest/store',
731 [ 'ca29faea-b6a0e17f-067743a1-8b778011-a48b2a17' ], 'application/json')
732 self.assertEqual(2, len(DoGet(_LOCAL, '/instances')))
733
734
735 def test_color(self):
736 i = UploadInstance(_REMOTE, 'ColorTestMalaterre.dcm')['ID']
737 im = GetImage(_REMOTE, '/instances/%s/preview' % i)
738 self.assertEqual("RGB", im.mode)
739 self.assertEqual(41, im.size[0])
740 self.assertEqual(41, im.size[1])
741
742 # http://effbot.org/zone/pil-comparing-images.htm
743 truth = Image.open(os.path.join(os.path.dirname(__file__), '..', 'Database', 'ColorTestMalaterre.png'))
744 self.assertTrue(ImageChops.difference(im, truth).getbbox() is None)
745
746