@@ -17,4 +17,79 @@ module Concurrent
17
17
expect ( Concurrent ::physical_processor_count ) . to be >= 1
18
18
end
19
19
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
20
95
end
0 commit comments