@@ -162,7 +162,10 @@ pub(crate) mod blocking {
162
162
use crate :: core:: blocking:: ProcessInfosProvidable ;
163
163
164
164
#[ instrument]
165
- fn get_process_info ( process_id : ProcessId , path : std:: path:: PathBuf ) -> Result < ProcessInfo > {
165
+ pub ( crate ) fn get_process_info (
166
+ process_id : ProcessId ,
167
+ path : std:: path:: PathBuf ,
168
+ ) -> Result < ProcessInfo > {
166
169
let status_path = parse_proc_entry ( process_id, & path) ?;
167
170
let status = match std:: fs:: read_to_string ( & status_path) {
168
171
Ok ( x) => x,
@@ -221,7 +224,7 @@ pub(crate) mod tokio {
221
224
use crate :: core:: tokio:: ProcessInfosProvidable ;
222
225
223
226
#[ instrument]
224
- async fn get_process_info (
227
+ pub ( crate ) async fn get_process_info (
225
228
process_id : ProcessId ,
226
229
path : std:: path:: PathBuf ,
227
230
) -> Result < ProcessInfo > {
@@ -272,3 +275,159 @@ pub(crate) mod tokio {
272
275
}
273
276
}
274
277
}
278
+
279
+ #[ cfg( test) ]
280
+ mod tests {
281
+ use super :: * ;
282
+
283
+ #[ test]
284
+ fn validate_process_id_kernel_process_id ( ) {
285
+ let process_id = 0 ;
286
+ let result = validate_process_id ( process_id) ;
287
+ assert ! ( result. is_err( ) ) ;
288
+ }
289
+
290
+ #[ test]
291
+ fn validate_process_id_init_process_id ( ) {
292
+ let process_id = 1 ;
293
+ let result = validate_process_id ( process_id) ;
294
+ assert ! ( result. is_err( ) ) ;
295
+ }
296
+
297
+ #[ test]
298
+ fn validate_process_id_available_max_process_id ( ) {
299
+ let process_id = AVAILABLE_MAX_PROCESS_ID ;
300
+ validate_process_id ( process_id) . expect ( "Failed to validate process id" ) ;
301
+ }
302
+
303
+ #[ test]
304
+ fn parse_status_kernel_process_id ( ) {
305
+ let process_id = 0 ;
306
+ let status_path = "/proc/0/status" . to_string ( ) ;
307
+ let status = "Name: init\n PPid: 0\n " . to_string ( ) ;
308
+ let process_info =
309
+ parse_status ( process_id, status_path, & status) . expect ( "Failed to parse status" ) ;
310
+ assert_eq ! ( process_info. process_id, process_id) ;
311
+ assert_eq ! ( process_info. parent_process_id, 0 ) ;
312
+ assert_eq ! ( process_info. name, "init" ) ;
313
+ }
314
+
315
+ #[ test]
316
+ fn parse_proc_entry_not_dir ( ) {
317
+ let process_id = 0 ;
318
+ let path = std:: path:: PathBuf :: from ( "/proc/0/status" ) ;
319
+ let result = parse_proc_entry ( process_id, & path) ;
320
+ assert ! ( result. is_err( ) ) ;
321
+ }
322
+
323
+ #[ test]
324
+ fn parse_proc_entry_failed_to_get_file_name ( ) {
325
+ let process_id = 0 ;
326
+ let path = std:: path:: PathBuf :: from ( "/proc/" ) ;
327
+ let result = parse_proc_entry ( process_id, & path) ;
328
+ assert ! ( result. is_err( ) ) ;
329
+ }
330
+
331
+ #[ test]
332
+ fn parse_proc_entry_failed_to_parse_process_id ( ) {
333
+ let process_id = 0 ;
334
+ let path = std:: path:: PathBuf :: from ( "/proc/invalid" ) ;
335
+ let result = parse_proc_entry ( process_id, & path) ;
336
+ assert ! ( result. is_err( ) ) ;
337
+ }
338
+
339
+ #[ test]
340
+ fn parse_proc_entry_status_path_does_not_exist ( ) {
341
+ let process_id = 0 ;
342
+ let path = std:: path:: PathBuf :: from ( "/proc/0" ) ;
343
+ let result = parse_proc_entry ( process_id, & path) ;
344
+ assert ! ( result. is_err( ) ) ;
345
+ }
346
+
347
+ #[ test]
348
+ fn parse_proc_entry_status_path_is_not_file ( ) {
349
+ let process_id = 0 ;
350
+ let path = std:: path:: PathBuf :: from ( "/proc/0" ) ;
351
+ let result = parse_proc_entry ( process_id, & path) ;
352
+ assert ! ( result. is_err( ) ) ;
353
+ }
354
+
355
+ #[ test]
356
+ fn parse_proc_entry_1 ( ) {
357
+ let process_id = 1 ;
358
+ let path = std:: path:: PathBuf :: from ( "/proc/1" ) ;
359
+ let status_path = parse_proc_entry ( process_id, & path) . expect ( "Failed to parse proc entry" ) ;
360
+ assert_eq ! ( status_path, std:: path:: PathBuf :: from( "/proc/1/status" ) ) ;
361
+ }
362
+
363
+ #[ test]
364
+ fn parse_proc_entry_1_and_status ( ) {
365
+ let process_id = 1 ;
366
+ let path = std:: path:: PathBuf :: from ( "/proc/1" ) ;
367
+ let status_path = parse_proc_entry ( process_id, & path) . expect ( "Failed to parse proc entry" ) ;
368
+ let status = match std:: fs:: read_to_string ( & status_path) {
369
+ Ok ( x) => x,
370
+ Err ( e) => {
371
+ panic ! ( "Failed to read status. error: {}" , e) ;
372
+ }
373
+ } ;
374
+ let process_info = parse_status ( process_id, status_path. display ( ) . to_string ( ) , & status)
375
+ . expect ( "Failed to parse status" ) ;
376
+ assert_eq ! ( process_info. process_id, process_id) ;
377
+ assert_eq ! ( process_info. parent_process_id, 0 ) ;
378
+ assert_eq ! ( process_info. name, "systemd" ) ;
379
+ }
380
+
381
+ #[ test]
382
+ fn child_process_id_map_filter_false ( ) {
383
+ let process_info = ProcessInfo {
384
+ process_id : 0 ,
385
+ parent_process_id : 0 ,
386
+ name : "init" . to_string ( ) ,
387
+ } ;
388
+ assert ! ( !child_process_id_map_filter( & process_info) ) ;
389
+ }
390
+
391
+ #[ cfg( feature = "blocking" ) ]
392
+ #[ test]
393
+ fn get_process_info_blocking ( ) {
394
+ let process_id = 1 ;
395
+ let path = std:: path:: PathBuf :: from ( "/proc/1" ) ;
396
+ let process_info =
397
+ blocking:: get_process_info ( process_id, path) . expect ( "Failed to get process info" ) ;
398
+ assert_eq ! ( process_info. process_id, process_id) ;
399
+ assert_eq ! ( process_info. parent_process_id, 0 ) ;
400
+ assert_eq ! ( process_info. name, "systemd" ) ;
401
+ }
402
+
403
+ #[ cfg( feature = "blocking" ) ]
404
+ #[ test]
405
+ fn get_process_infos_blocking ( ) {
406
+ let process_infos = blocking:: get_process_infos ( ) . expect ( "Failed to get process infos" ) ;
407
+ assert ! ( process_infos. len( ) > 1 ) ;
408
+ }
409
+
410
+ #[ cfg( feature = "tokio" ) ]
411
+ #[ test]
412
+ fn get_process_info_tokio ( ) {
413
+ let rt = :: tokio:: runtime:: Runtime :: new ( ) . unwrap ( ) ;
414
+ let process_id = 1 ;
415
+ let path = std:: path:: PathBuf :: from ( "/proc/1" ) ;
416
+ let process_info = rt
417
+ . block_on ( tokio:: get_process_info ( process_id, path) )
418
+ . expect ( "Failed to get process info" ) ;
419
+ assert_eq ! ( process_info. process_id, process_id) ;
420
+ assert_eq ! ( process_info. parent_process_id, 0 ) ;
421
+ assert_eq ! ( process_info. name, "systemd" ) ;
422
+ }
423
+
424
+ #[ cfg( feature = "tokio" ) ]
425
+ #[ test]
426
+ fn get_process_infos_tokio ( ) {
427
+ let rt = :: tokio:: runtime:: Runtime :: new ( ) . unwrap ( ) ;
428
+ let process_infos = rt
429
+ . block_on ( tokio:: get_process_infos ( ) )
430
+ . expect ( "Failed to get process infos" ) ;
431
+ assert ! ( process_infos. len( ) > 1 ) ;
432
+ }
433
+ }
0 commit comments