624
|
1 import unittest
|
|
2 import time
|
|
3 import os
|
|
4 import threading
|
|
5 from helpers import OrthancTestCase, Helpers
|
|
6
|
|
7 from orthanc_api_client import OrthancApiClient, ChangeType
|
|
8 from orthanc_api_client.exceptions import HttpError
|
|
9 from orthanc_api_client import helpers as OrthancHelpers
|
|
10
|
|
11 from orthanc_tools import OrthancTestDbPopulator
|
|
12
|
|
13 import pathlib
|
|
14 import subprocess
|
|
15 import glob
|
|
16 here = pathlib.Path(__file__).parent.resolve()
|
|
17
|
|
18
|
|
19 class TestMaxStoragePG(OrthancTestCase):
|
|
20
|
|
21 @classmethod
|
|
22 def terminate(cls):
|
|
23
|
|
24 if Helpers.is_docker():
|
|
25 subprocess.run(["docker", "rm", "-f", "pg-server"])
|
|
26 else:
|
|
27 cls.pg_service_process.terminate()
|
|
28
|
|
29
|
|
30 @classmethod
|
|
31 def prepare(cls):
|
|
32 test_name = "MaxStoragePG"
|
|
33 cls._storage_name = "max-storage-pg"
|
|
34 network_name = "max-storage-pg"
|
|
35
|
|
36 print(f'-------------- preparing {test_name} tests')
|
|
37
|
|
38 cls.clear_storage(storage_name=cls._storage_name)
|
|
39
|
|
40 pg_hostname = "localhost"
|
|
41 if Helpers.is_docker():
|
|
42 pg_hostname = "pg-server"
|
|
43 cls.create_docker_network(network_name)
|
|
44
|
|
45 config = {
|
|
46 "PostgreSQL" : {
|
|
47 "EnableStorage": False,
|
|
48 "EnableIndex": True,
|
|
49 "Host": pg_hostname,
|
|
50 "Port": 5432,
|
|
51 "Database": "postgres",
|
|
52 "Username": "postgres",
|
|
53 "Password": "postgres",
|
|
54 "IndexConnectionsCount": 10,
|
|
55 "MaximumConnectionRetries" : 2000,
|
|
56 "ConnectionRetryInterval" : 5,
|
|
57 "TransactionMode": "ReadCommitted",
|
|
58 #"TransactionMode": "Serializable",
|
|
59 "EnableVerboseLogs": True
|
|
60 },
|
|
61 "AuthenticationEnabled": False,
|
|
62 "OverwriteInstances": True,
|
|
63 "MaximumStorageSize": 1,
|
|
64 "MaximumStorageMode": "Recycle"
|
|
65 # "MaximumPatientCount": 1,
|
|
66 # "MaximumStorageMode": "Reject"
|
|
67 }
|
|
68
|
|
69 config_path = cls.generate_configuration(
|
|
70 config_name=f"{test_name}",
|
|
71 storage_name=cls._storage_name,
|
|
72 config=config,
|
|
73 plugins=Helpers.plugins
|
|
74 )
|
|
75
|
|
76 # launch the docker PG server
|
|
77 print('--------------- launching PostgreSQL server ------------------')
|
|
78
|
|
79 pg_cmd = [
|
|
80 "docker", "run", "--rm",
|
|
81 "-p", "5432:5432",
|
|
82 "--name", "pg-server",
|
|
83 "--env", "POSTGRES_HOST_AUTH_METHOD=trust"
|
|
84 ]
|
|
85
|
|
86 if Helpers.is_docker():
|
|
87 pg_cmd.extend(["--network", network_name])
|
|
88 pg_cmd.append("postgres:15")
|
|
89
|
|
90 cls.pg_service_process = subprocess.Popen(pg_cmd)
|
|
91 time.sleep(5)
|
|
92
|
|
93 if Helpers.break_after_preparation:
|
|
94 print(f"++++ It is now time to start your Orthanc under tests with configuration file '{config_path}' +++++")
|
|
95 input("Press Enter to continue")
|
|
96 else:
|
|
97 cls.launch_orthanc_under_tests(
|
|
98 config_name=f"{test_name}",
|
|
99 storage_name=cls._storage_name,
|
|
100 config=config,
|
|
101 plugins=Helpers.plugins,
|
|
102 docker_network=network_name
|
|
103 )
|
|
104
|
|
105 cls.o = OrthancApiClient(cls.o._root_url)
|
|
106 cls.o.wait_started()
|
|
107 cls.o.delete_all_content()
|
|
108
|
|
109
|
|
110 def test_upload(self):
|
|
111 self.o.delete_all_content()
|
|
112 self.clear_storage(storage_name=self._storage_name)
|
|
113
|
|
114 uploaded_instances_ids = []
|
|
115 counter = 0
|
|
116 # upload 10 images of 500x500, since the MaximumStorageSize is 1MB, only 2 of them should remain in the storage
|
|
117 for i in range(0, 10):
|
|
118 counter += 1
|
|
119 dicom_file = OrthancHelpers.generate_test_dicom_file(width=500, height=500,
|
|
120 tags = {
|
|
121 "PatientID" : f"{i}",
|
|
122 "StudyInstanceUID" : f"{i}",
|
|
123 "SeriesInstanceUID" : f"{i}.{counter%10}"
|
|
124 })
|
|
125 try:
|
|
126 uploaded_instances_ids.extend(self.o.upload(dicom_file))
|
|
127 except HttpError as er:
|
|
128 if er.http_status_code == 507:
|
|
129 pass # ignore
|
|
130
|
|
131 # some instances have been discarded
|
|
132 self.assertLess(len(self.o.instances.get_all_ids()), 10)
|
|
133 self.assertLess(len(self.o.patients.get_all_ids()), 10)
|
|
134 self.assertLess(self.o.get_statistics().total_disk_size, 1*1024*1024)
|