@@ -17,4 +17,79 @@ module Concurrent
1717 expect ( Concurrent ::physical_processor_count ) . to be >= 1
1818 end
1919 end
20+
21+ RSpec . describe '#cpu_quota' do
22+
23+ let ( :counter ) { Concurrent ::Utility ::ProcessorCounter . new }
24+
25+ it 'returns #compute_cpu_quota' do
26+ expect ( Concurrent ::cpu_quota ) . to be == counter . cpu_quota
27+ end
28+
29+ it 'returns nil if no quota is detected' do
30+ if RbConfig ::CONFIG [ "target_os" ] . match ( /linux/i )
31+ expect ( File ) . to receive ( :exist? ) . twice . and_return ( nil ) # Checks for cgroups V1 and V2
32+ end
33+ expect ( counter . cpu_quota ) . to be_nil
34+ end
35+
36+ it 'returns nil if cgroups v2 sets no limit' do
37+ expect ( RbConfig ::CONFIG ) . to receive ( :[] ) . with ( "target_os" ) . and_return ( "linux" )
38+ expect ( File ) . to receive ( :exist? ) . with ( "/sys/fs/cgroup/cpu.max" ) . and_return ( true )
39+ expect ( File ) . to receive ( :read ) . with ( "/sys/fs/cgroup/cpu.max" ) . and_return ( "max 100000\n " )
40+ expect ( counter . cpu_quota ) . to be_nil
41+ end
42+
43+ it 'returns a float if cgroups v2 sets a limit' do
44+ expect ( RbConfig ::CONFIG ) . to receive ( :[] ) . with ( "target_os" ) . and_return ( "linux" )
45+ expect ( File ) . to receive ( :exist? ) . with ( "/sys/fs/cgroup/cpu.max" ) . and_return ( true )
46+ expect ( File ) . to receive ( :read ) . with ( "/sys/fs/cgroup/cpu.max" ) . and_return ( "150000 100000\n " )
47+ expect ( counter . cpu_quota ) . to be == 1.5
48+ end
49+
50+ it 'returns nil if cgroups v1 sets no limit' do
51+ expect ( RbConfig ::CONFIG ) . to receive ( :[] ) . with ( "target_os" ) . and_return ( "linux" )
52+ expect ( File ) . to receive ( :exist? ) . with ( "/sys/fs/cgroup/cpu.max" ) . and_return ( false )
53+ expect ( File ) . to receive ( :exist? ) . with ( "/sys/fs/cgroup/cpu,cpuacct/cpu.cfs_quota_us" ) . and_return ( true )
54+
55+ expect ( File ) . to receive ( :read ) . with ( "/sys/fs/cgroup/cpu,cpuacct/cpu.cfs_quota_us" ) . and_return ( "max\n " )
56+ expect ( counter . cpu_quota ) . to be_nil
57+ end
58+
59+ it 'returns a float if cgroups v1 sets a limit' do
60+ expect ( RbConfig ::CONFIG ) . to receive ( :[] ) . with ( "target_os" ) . and_return ( "linux" )
61+ expect ( File ) . to receive ( :exist? ) . with ( "/sys/fs/cgroup/cpu.max" ) . and_return ( false )
62+ expect ( File ) . to receive ( :exist? ) . with ( "/sys/fs/cgroup/cpu,cpuacct/cpu.cfs_quota_us" ) . and_return ( true )
63+
64+ expect ( File ) . to receive ( :read ) . with ( "/sys/fs/cgroup/cpu,cpuacct/cpu.cfs_quota_us" ) . and_return ( "150000\n " )
65+ expect ( File ) . to receive ( :read ) . with ( "/sys/fs/cgroup/cpu,cpuacct/cpu.cfs_period_us" ) . and_return ( "100000\n " )
66+ expect ( counter . cpu_quota ) . to be == 1.5
67+ end
68+
69+ end
70+
71+ RSpec . describe '#available_processor_count' do
72+
73+ it 'returns #processor_count if #cpu_quota is nil' do
74+ expect ( Concurrent ::processor_counter ) . to receive ( :cpu_quota ) . and_return ( nil )
75+ available_processor_count = Concurrent ::available_processor_count
76+ expect ( available_processor_count ) . to be == Concurrent ::processor_count
77+ expect ( available_processor_count ) . to be_a Float
78+ end
79+
80+ it 'returns #processor_count if #cpu_quota is higher' do
81+ expect ( Concurrent ::processor_counter ) . to receive ( :cpu_quota ) . and_return ( Concurrent ::processor_count . to_f * 2 )
82+ available_processor_count = Concurrent ::available_processor_count
83+ expect ( available_processor_count ) . to be == Concurrent ::processor_count
84+ expect ( available_processor_count ) . to be_a Float
85+ end
86+
87+ it 'returns #cpu_quota if #cpu_quota is lower than #processor_count' do
88+ expect ( Concurrent ::processor_counter ) . to receive ( :cpu_quota ) . and_return ( Concurrent ::processor_count . to_f / 2 )
89+ available_processor_count = Concurrent ::available_processor_count
90+ expect ( available_processor_count ) . to be == Concurrent ::processor_count . to_f / 2
91+ expect ( available_processor_count ) . to be_a Float
92+ end
93+
94+ end
2095end
0 commit comments