1
+ import pytest
2
+ import requests
3
+ from utils .test_runner import start_server , stop_server
4
+ import jsonschema
5
+ from utils .logger import log_response
6
+ from utils .assertion import assert_equal
7
+
8
+
9
+ class TestApiGetHardware :
10
+
11
+ @pytest .fixture (autouse = True )
12
+ def setup_and_teardown (self ):
13
+ # Setup
14
+ success = start_server ()
15
+ if not success :
16
+ raise Exception ("Failed to start server" )
17
+
18
+ yield
19
+
20
+ # Teardown
21
+ stop_server ()
22
+
23
+ def test_api_get_hardware_successfully (self ):
24
+ hardware_url = f"http://localhost:3928/v1/hardware"
25
+ hardware_response = requests .get (hardware_url )
26
+ json_data_hardware = hardware_response .json ()
27
+ log_response (json_data_hardware , "test_api_get_hardware_successfully" )
28
+ assert_equal (hardware_response .status_code ,200 )
29
+
30
+ schema = {
31
+ "type" : "object" ,
32
+ "properties" : {
33
+ "cpu" : {
34
+ "type" : "object" ,
35
+ "properties" : {
36
+ "arch" : {
37
+ "type" : "string" ,
38
+ "example" : "amd64" ,
39
+ "description" : "The architecture of the CPU."
40
+ },
41
+ "cores" : {
42
+ "type" : "integer" ,
43
+ "example" : 8 ,
44
+ "description" : "The number of CPU cores available."
45
+ },
46
+ "instructions" : {
47
+ "type" : "array" ,
48
+ "items" : {
49
+ "type" : "string"
50
+ },
51
+ "example" : [
52
+ "fpu" ,
53
+ "mmx" ,
54
+ "sse" ,
55
+ "sse2" ,
56
+ "sse3" ,
57
+ "ssse3" ,
58
+ "sse4_1" ,
59
+ "sse4_2" ,
60
+ "pclmulqdq" ,
61
+ "avx" ,
62
+ "avx2" ,
63
+ "aes" ,
64
+ "f16c"
65
+ ],
66
+ "description" : "A list of supported CPU instruction sets."
67
+ },
68
+ "model" : {
69
+ "type" : "string" ,
70
+ "example" : "AMD Ryzen Threadripper PRO 5955WX 16-Cores" ,
71
+ "description" : "The model name of the CPU."
72
+ }
73
+ },
74
+ "required" : [
75
+ "arch" ,
76
+ "cores" ,
77
+ "instructions" ,
78
+ "model"
79
+ ]
80
+ },
81
+ "gpus" : {
82
+ "type" : "array" ,
83
+ "items" : {
84
+ "type" : "object" ,
85
+ "properties" : {
86
+ "activated" : {
87
+ "type" : "boolean" ,
88
+ "example" : True ,
89
+ "description" : "Indicates if the GPU is currently activated."
90
+ },
91
+ "additional_information" : {
92
+ "type" : "object" ,
93
+ "properties" : {
94
+ "compute_cap" : {
95
+ "type" : "string" ,
96
+ "example" : "8.6" ,
97
+ "description" : "The compute capability of the GPU."
98
+ },
99
+ "driver_version" : {
100
+ "type" : "string" ,
101
+ "example" : "535.183" ,
102
+ "description" : "The version of the installed driver."
103
+ }
104
+ },
105
+ "required" : [
106
+ "compute_cap" ,
107
+ "driver_version"
108
+ ]
109
+ },
110
+ "free_vram" : {
111
+ "type" : "integer" ,
112
+ "example" : 23983 ,
113
+ "description" : "The amount of free VRAM in MB."
114
+ },
115
+ "id" : {
116
+ "type" : "string" ,
117
+ "example" : "0" ,
118
+ "description" : "Unique identifier for the GPU."
119
+ },
120
+ "name" : {
121
+ "type" : "string" ,
122
+ "example" : "NVIDIA GeForce RTX 3090" ,
123
+ "description" : "The name of the GPU model."
124
+ },
125
+ "total_vram" : {
126
+ "type" : "integer" ,
127
+ "example" : 24576 ,
128
+ "description" : "The total VRAM available in MB."
129
+ },
130
+ "uuid" : {
131
+ "type" : "string" ,
132
+ "example" : "GPU-5206045b-2a1c-1e7d-6c60-d7c367d02376" ,
133
+ "description" : "The universally unique identifier for the GPU."
134
+ },
135
+ "version" : {
136
+ "type" : "string" ,
137
+ "example" : "12.2" ,
138
+ "description" : "The version of the GPU."
139
+ }
140
+ },
141
+ "required" : [
142
+ "activated" ,
143
+ "additional_information" ,
144
+ "free_vram" ,
145
+ "id" ,
146
+ "name" ,
147
+ "total_vram" ,
148
+ "uuid" ,
149
+ "version"
150
+ ]
151
+ }
152
+ },
153
+ "os" : {
154
+ "type" : "object" ,
155
+ "properties" : {
156
+ "name" : {
157
+ "type" : "string" ,
158
+ "example" : "Ubuntu 24.04.1 LTS" ,
159
+ "description" : "The name of the operating system."
160
+ },
161
+ "version" : {
162
+ "type" : "string" ,
163
+ "example" : "24.04.1 LTS (Noble Numbat)" ,
164
+ "description" : "The version of the operating system."
165
+ }
166
+ },
167
+ "required" : [
168
+ "name" ,
169
+ "version"
170
+ ]
171
+ },
172
+ "power" : {
173
+ "type" : "object" ,
174
+ "properties" : {
175
+ "battery_life" : {
176
+ "type" : "integer" ,
177
+ "example" : 0 ,
178
+ "description" : "The percentage of battery life remaining."
179
+ },
180
+ "charging_status" : {
181
+ "type" : "string" ,
182
+ "example" : "" ,
183
+ "description" : "The charging status of the device."
184
+ },
185
+ "is_power_saving" : {
186
+ "type" : "boolean" ,
187
+ "example" : False ,
188
+ "description" : "Indicates if the power-saving mode is enabled."
189
+ }
190
+ },
191
+ "required" : [
192
+ "battery_life" ,
193
+ "charging_status" ,
194
+ "is_power_saving"
195
+ ]
196
+ },
197
+ "ram" : {
198
+ "type" : "object" ,
199
+ "properties" : {
200
+ "available" : {
201
+ "type" : "integer" ,
202
+ "example" : 11100 ,
203
+ "description" : "The amount of available RAM in MB."
204
+ },
205
+ "total" : {
206
+ "type" : "integer" ,
207
+ "example" : 15991 ,
208
+ "description" : "The total RAM in MB."
209
+ },
210
+ "type" : {
211
+ "type" : "string" ,
212
+ "example" : "" ,
213
+ "description" : "The type of RAM."
214
+ }
215
+ },
216
+ "required" : [
217
+ "available" ,
218
+ "total" ,
219
+ "type"
220
+ ]
221
+ },
222
+ "storage" : {
223
+ "type" : "object" ,
224
+ "properties" : {
225
+ "available" : {
226
+ "type" : "integer" ,
227
+ "example" : 0 ,
228
+ "description" : "The amount of available storage in MB."
229
+ },
230
+ "total" : {
231
+ "type" : "integer" ,
232
+ "example" : 0 ,
233
+ "description" : "The total storage in MB."
234
+ },
235
+ "type" : {
236
+ "type" : "string" ,
237
+ "example" : "" ,
238
+ "description" : "The type of storage."
239
+ }
240
+ },
241
+ "required" : [
242
+ "available" ,
243
+ "total" ,
244
+ "type"
245
+ ]
246
+ }
247
+ }
248
+ }
249
+
250
+ # Validate response schema
251
+ jsonschema .validate (instance = json_data_hardware , schema = schema )
0 commit comments