guile-knots/tests/resource-pool.scm

120 lines
3.2 KiB
Scheme
Raw Normal View History

2024-11-19 18:43:43 +00:00
(use-modules (tests)
(fibers)
(unit-test)
2025-01-31 12:33:50 +01:00
(knots parallelism)
2024-11-19 18:43:43 +00:00
(knots resource-pool))
2025-01-31 12:33:50 +01:00
(define new-number
(let ((val 0))
(lambda ()
(set! val (1+ val))
val)))
2024-11-19 18:43:43 +00:00
(run-fibers-for-tests
(lambda ()
(let ((resource-pool (make-resource-pool
2025-01-31 12:33:50 +01:00
new-number
2024-11-19 18:43:43 +00:00
1)))
2025-01-31 12:33:50 +01:00
(assert-true
(number?
(with-resource-from-pool resource-pool
res
res))))))
2024-11-19 18:43:43 +00:00
(run-fibers-for-tests
(lambda ()
(let ((resource-pool (make-resource-pool
2025-01-31 12:33:50 +01:00
new-number
1
#:add-resources-parallelism 1)))
2025-01-31 12:33:50 +01:00
(assert-true
(number?
(with-resource-from-pool resource-pool
res
res))))))
(let* ((error-constructor
(record-constructor &resource-pool-timeout))
(err
(error-constructor 'foo)))
(assert-equal
(resource-pool-timeout-error-pool err)
'foo))
2025-01-31 12:33:50 +01:00
(run-fibers-for-tests
(lambda ()
(let ((resource-pool (make-resource-pool
new-number
2)))
(fibers-for-each
(lambda _
(with-resource-from-pool resource-pool
res
res))
(iota 20))
(destroy-resource-pool resource-pool))))
(run-fibers-for-tests
(lambda ()
(let ((resource-pool (make-resource-pool
new-number
2
#:destructor
(lambda (res)
#t))))
(fibers-for-each
(lambda _
(with-resource-from-pool resource-pool
res
res))
(iota 20))
(destroy-resource-pool resource-pool))))
(run-fibers-for-tests
(lambda ()
(let ((resource-pool (make-resource-pool
new-number
2
#:idle-seconds 0.5
#:destructor
(lambda (res)
#t))))
(fibers-for-each
(lambda _
(with-resource-from-pool resource-pool
res
res))
(iota 20))
(let loop ((stats (resource-pool-stats resource-pool)))
(unless (= 0 (assq-ref stats 'resources))
(sleep 0.1)
(loop (resource-pool-stats resource-pool)))))))
(run-fibers-for-tests
(lambda ()
(let* ((counter 0)
(resource-pool (make-resource-pool
(lambda ()
(let ((start-val counter))
(sleep 0.05)
(if (= start-val counter)
(set! counter (+ 1 counter))
(error "collision detected")))
(new-number))
1)))
(fibers-for-each
(lambda _
(with-resource-from-pool
resource-pool res
(let ((start-val counter))
(sleep 0.05)
(if (= start-val counter)
(set! counter (+ 1 counter))
(error "collision detected")))))
(iota 50)))))
2024-11-19 18:43:43 +00:00
(display "resource-pool test finished successfully\n")