Skip to content

Commit 334a276

Browse files
Merge pull request #2118 from IrimieBogdan/FACT-2824-tests
(FACT-2824) Add unit tests for VirtualDetector
2 parents f1913e9 + 7bb4362 commit 334a276

2 files changed

Lines changed: 309 additions & 0 deletions

File tree

.rubocop_todo.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ RSpec/FilePath:
3030
- 'spec/custom_facts/util/resolution_spec.rb'
3131
- 'spec/facter/facts_utils/uptime_parser_spec.rb'
3232
- 'spec/facter/facts_utils/windows_release_finder_spec.rb'
33+
- 'spec/facter/facts_utils/virtual_detector_spec.rb'
3334
- 'spec/facter/model/fact_collection_spec.rb'
3435
- 'spec/facter/model/resolved_fact_spec.rb'
3536
- 'spec/facter/resolvers/aix/architecture_resolver_spec.rb'
Lines changed: 308 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,308 @@
1+
# frozen_string_literal: true
2+
3+
describe Facter::VirtualDetector do
4+
subject(:detector) { Facter::VirtualDetector.new }
5+
6+
describe '#platform' do
7+
let(:logger_mock) { instance_spy(Facter::Log) }
8+
9+
before do
10+
allow(Facter::Log).to receive(:new).and_return(logger_mock)
11+
end
12+
13+
context 'when in docker' do
14+
let(:vm) { 'docker' }
15+
16+
before do
17+
allow(Facter::Resolvers::Containers).to receive(:resolve).with(:vm).and_return(vm)
18+
end
19+
20+
it 'calls Facter::Resolvers::Containers' do
21+
detector.platform
22+
expect(Facter::Resolvers::Containers).to have_received(:resolve).with(:vm)
23+
end
24+
25+
it 'returns container type' do
26+
expect(detector.platform).to eq(vm)
27+
end
28+
end
29+
30+
context 'when detecting with dmidecore' do
31+
before do
32+
allow(Facter::Resolvers::Containers).to receive(:resolve).with(:vm).and_return(nil)
33+
end
34+
35+
context 'when on Amazon' do
36+
let(:platform) { 'Amazon' }
37+
38+
before do
39+
allow(Facter::Resolvers::DmiDecode).to receive(:resolve).with(:vendor).and_return(platform)
40+
end
41+
42+
it 'calls Facter::Resolvers::DmiDecode' do
43+
detector.platform
44+
45+
expect(Facter::Resolvers::DmiDecode).to have_received(:resolve).with(:vendor)
46+
end
47+
48+
it 'returns vendor' do
49+
expect(detector.platform).to eq('aws')
50+
end
51+
end
52+
53+
context 'when on XEN' do
54+
let(:platform) { 'Xen' }
55+
56+
before do
57+
allow(Facter::Resolvers::DmiDecode).to receive(:resolve).with(:vendor).and_return(platform)
58+
end
59+
60+
it 'calls Facter::Resolvers::DmiDecode' do
61+
detector.platform
62+
63+
expect(Facter::Resolvers::DmiDecode).to have_received(:resolve).with(:vendor)
64+
end
65+
66+
it 'returns vendor' do
67+
expect(detector.platform).to eq('xen')
68+
end
69+
end
70+
end
71+
72+
context 'when is gce' do
73+
let(:value) { 'gce' }
74+
75+
before do
76+
allow(Facter::Resolvers::Containers).to receive(:resolve).with(:vm).and_return(nil)
77+
allow(Facter::Resolvers::DmiDecode).to receive(:resolve).with(:vendor).and_return(nil)
78+
allow(Facter::Resolvers::Linux::DmiBios).to receive(:resolve).with(:bios_vendor).and_return('Google Engine')
79+
end
80+
81+
it 'calls Facter::Resolvers::Linux::DmiBios' do
82+
detector.platform
83+
84+
expect(Facter::Resolvers::Linux::DmiBios).to have_received(:resolve).with(:bios_vendor)
85+
end
86+
87+
it 'returns gce' do
88+
expect(detector.platform).to eq(value)
89+
end
90+
end
91+
92+
context 'when is xen-hvm' do
93+
let(:value) { 'xenhvm' }
94+
95+
before do
96+
allow(Facter::Resolvers::Containers).to receive(:resolve).with(:vm).and_return(nil)
97+
allow(Facter::Resolvers::DmiDecode).to receive(:resolve).with(:vendor).and_return(nil)
98+
allow(Facter::Resolvers::Linux::DmiBios).to receive(:resolve).with(:bios_vendor).and_return(nil)
99+
allow(Facter::Resolvers::VirtWhat).to receive(:resolve).with(:vm).and_return(value)
100+
end
101+
102+
it 'calls Facter::Resolvers::VirtWhat' do
103+
detector.platform
104+
105+
expect(Facter::Resolvers::VirtWhat). to have_received(:resolve).with(:vm)
106+
end
107+
108+
it 'returns xen' do
109+
expect(detector.platform).to eq(value)
110+
end
111+
end
112+
113+
context 'when is vmware' do
114+
let(:value) { 'vmware_fusion' }
115+
116+
before do
117+
allow(Facter::Resolvers::Containers).to receive(:resolve).with(:vm).and_return(nil)
118+
allow(Facter::Resolvers::DmiDecode).to receive(:resolve).with(:vendor).and_return(nil)
119+
allow(Facter::Resolvers::Linux::DmiBios).to receive(:resolve).with(:bios_vendor).and_return(nil)
120+
allow(Facter::Resolvers::VirtWhat).to receive(:resolve).with(:vm).and_return(nil)
121+
allow(Facter::Resolvers::Vmware).to receive(:resolve).with(:vm).and_return(value)
122+
end
123+
124+
it 'calls Facter::Resolvers::Vmware' do
125+
detector.platform
126+
127+
expect(Facter::Resolvers::Vmware).to have_received(:resolve).with(:vm)
128+
end
129+
130+
it 'returns vmware' do
131+
expect(detector.platform).to eq(value)
132+
end
133+
end
134+
135+
context 'when is openVz' do
136+
let(:value) { 'openvzve' }
137+
138+
before do
139+
allow(Facter::Resolvers::Containers).to receive(:resolve).with(:vm).and_return(nil)
140+
allow(Facter::Resolvers::DmiDecode).to receive(:resolve).with(:vendor).and_return(nil)
141+
allow(Facter::Resolvers::Linux::DmiBios).to receive(:resolve).with(:bios_vendor).and_return(nil)
142+
allow(Facter::Resolvers::VirtWhat).to receive(:resolve).with(:vm).and_return(nil)
143+
allow(Facter::Resolvers::Vmware).to receive(:resolve).with(:vm).and_return(nil)
144+
allow(Facter::Resolvers::OpenVz).to receive(:resolve).with(:vm).and_return(value)
145+
end
146+
147+
it 'calls Facter::Resolvers::OpenVz' do
148+
detector.platform
149+
150+
expect(Facter::Resolvers::OpenVz).to have_received(:resolve).with(:vm)
151+
end
152+
153+
it 'returns openvz' do
154+
expect(detector.platform).to eq(value)
155+
end
156+
end
157+
158+
context 'when is vserver' do
159+
let(:value) { 'vserver_host' }
160+
161+
before do
162+
allow(Facter::Resolvers::Containers).to receive(:resolve).with(:vm).and_return(nil)
163+
allow(Facter::Resolvers::DmiDecode).to receive(:resolve).with(:vendor).and_return(nil)
164+
allow(Facter::Resolvers::Linux::DmiBios).to receive(:resolve).with(:bios_vendor).and_return(nil)
165+
allow(Facter::Resolvers::VirtWhat).to receive(:resolve).with(:vm).and_return(nil)
166+
allow(Facter::Resolvers::Vmware).to receive(:resolve).with(:vm).and_return(nil)
167+
allow(Facter::Resolvers::OpenVz).to receive(:resolve).with(:vm).and_return(nil)
168+
allow(Facter::Resolvers::VirtWhat).to receive(:resolve).with(:vserver).and_return(value)
169+
end
170+
171+
it 'calls Facter::Resolvers::VirtWhat' do
172+
detector.platform
173+
174+
expect(Facter::Resolvers::VirtWhat).to have_received(:resolve).with(:vserver)
175+
end
176+
177+
it 'returns vserver' do
178+
expect(detector.platform).to eq(value)
179+
end
180+
end
181+
182+
context 'when is xen priviledged' do
183+
let(:value) { 'xen0' }
184+
185+
before do
186+
allow(Facter::Resolvers::Containers).to receive(:resolve).with(:vm).and_return(nil)
187+
allow(Facter::Resolvers::DmiDecode).to receive(:resolve).with(:vendor).and_return(nil)
188+
allow(Facter::Resolvers::Linux::DmiBios).to receive(:resolve).with(:bios_vendor).and_return(nil)
189+
allow(Facter::Resolvers::VirtWhat).to receive(:resolve).with(:vm).and_return(nil)
190+
allow(Facter::Resolvers::Vmware).to receive(:resolve).with(:vm).and_return(nil)
191+
allow(Facter::Resolvers::OpenVz).to receive(:resolve).with(:vm).and_return(nil)
192+
allow(Facter::Resolvers::VirtWhat).to receive(:resolve).with(:vserver).and_return(nil)
193+
allow(Facter::Resolvers::Xen).to receive(:resolve).with(:vm).and_return(value)
194+
end
195+
196+
it 'calls Facter::Resolvers::Xen' do
197+
detector.platform
198+
199+
expect(Facter::Resolvers::Xen).to have_received(:resolve).with(:vm)
200+
end
201+
202+
it 'returns xen' do
203+
expect(detector.platform).to eq(value)
204+
end
205+
end
206+
207+
context 'when is bochs discovered with dmi product_name' do
208+
let(:value) { 'bochs' }
209+
210+
before do
211+
allow(Facter::Resolvers::Containers).to receive(:resolve).with(:vm).and_return(nil)
212+
allow(Facter::Resolvers::DmiDecode).to receive(:resolve).with(:vendor).and_return(nil)
213+
allow(Facter::Resolvers::VirtWhat).to receive(:resolve).with(:vm).and_return(nil)
214+
allow(Facter::Resolvers::Vmware).to receive(:resolve).with(:vm).and_return(nil)
215+
allow(Facter::Resolvers::OpenVz).to receive(:resolve).with(:vm).and_return(nil)
216+
allow(Facter::Resolvers::VirtWhat).to receive(:resolve).with(:vserver).and_return(nil)
217+
allow(Facter::Resolvers::Xen).to receive(:resolve).with(:vm).and_return(nil)
218+
allow(Facter::Resolvers::Linux::DmiBios).to receive(:resolve).with(:bios_vendor).and_return(nil)
219+
allow(Facter::Resolvers::Linux::DmiBios).to receive(:resolve).with(:product_name).and_return('Bochs Machine')
220+
end
221+
222+
it 'calls Facter::Resolvers::Linux::DmiBios with bios_vendor' do
223+
detector.platform
224+
225+
expect(Facter::Resolvers::Linux::DmiBios).to have_received(:resolve).with(:bios_vendor).twice
226+
end
227+
228+
it 'calls Facter::Resolvers::Linux::DmiBios with product_name' do
229+
detector.platform
230+
231+
expect(Facter::Resolvers::Linux::DmiBios).to have_received(:resolve).with(:product_name)
232+
end
233+
234+
it 'returns bosch' do
235+
expect(detector.platform).to eq(value)
236+
end
237+
end
238+
239+
context 'when is hyper-v discovered with lspci' do
240+
let(:value) { 'hyperv' }
241+
242+
before do
243+
allow(Facter::Resolvers::Containers).to receive(:resolve).with(:vm).and_return(nil)
244+
allow(Facter::Resolvers::DmiDecode).to receive(:resolve).with(:vendor).and_return(nil)
245+
allow(Facter::Resolvers::VirtWhat).to receive(:resolve).with(:vm).and_return(nil)
246+
allow(Facter::Resolvers::Vmware).to receive(:resolve).with(:vm).and_return(nil)
247+
allow(Facter::Resolvers::OpenVz).to receive(:resolve).with(:vm).and_return(nil)
248+
allow(Facter::Resolvers::VirtWhat).to receive(:resolve).with(:vserver).and_return(nil)
249+
allow(Facter::Resolvers::Xen).to receive(:resolve).with(:vm).and_return(nil)
250+
allow(Facter::Resolvers::Linux::DmiBios).to receive(:resolve).with(:bios_vendor).and_return(nil)
251+
allow(Facter::Resolvers::Linux::DmiBios).to receive(:resolve).with(:product_name).and_return(nil)
252+
allow(Facter::Resolvers::Lspci).to receive(:resolve).with(:vm).and_return(value)
253+
end
254+
255+
it 'calls Facter::Resolvers::Lspci' do
256+
detector.platform
257+
258+
expect(Facter::Resolvers::Lspci).to have_received(:resolve).with(:vm)
259+
end
260+
261+
it 'returns hyper-v' do
262+
expect(detector.platform).to eq(value)
263+
end
264+
end
265+
266+
context 'when all resolvers return nil ' do
267+
let(:vm) { 'physical' }
268+
269+
before do
270+
allow(Facter::Resolvers::Containers).to receive(:resolve).with(:vm).and_return(nil)
271+
allow(Facter::Resolvers::DmiDecode).to receive(:resolve).with(:vendor).and_return(nil)
272+
allow(Facter::Resolvers::VirtWhat).to receive(:resolve).with(:vm).and_return(nil)
273+
allow(Facter::Resolvers::Vmware).to receive(:resolve).with(:vm).and_return(nil)
274+
allow(Facter::Resolvers::OpenVz).to receive(:resolve).with(:vm).and_return(nil)
275+
allow(Facter::Resolvers::VirtWhat).to receive(:resolve).with(:vserver).and_return(nil)
276+
allow(Facter::Resolvers::Xen).to receive(:resolve).with(:vm).and_return(nil)
277+
allow(Facter::Resolvers::Linux::DmiBios).to receive(:resolve).with(:bios_vendor).and_return(nil)
278+
allow(Facter::Resolvers::Linux::DmiBios).to receive(:resolve).with(:product_name).and_return(nil)
279+
allow(Facter::Resolvers::Lspci).to receive(:resolve).with(:vm).and_return(nil)
280+
end
281+
282+
it 'returns physiscal' do
283+
expect(detector.platform).to eq(vm)
284+
end
285+
end
286+
287+
context 'when product name is not found in the HYPERVISORS_HASH' do
288+
let(:vm) { 'physical' }
289+
290+
before do
291+
allow(Facter::Resolvers::Containers).to receive(:resolve).with(:vm).and_return(nil)
292+
allow(Facter::Resolvers::DmiDecode).to receive(:resolve).with(:vendor).and_return(nil)
293+
allow(Facter::Resolvers::VirtWhat).to receive(:resolve).with(:vm).and_return(nil)
294+
allow(Facter::Resolvers::Vmware).to receive(:resolve).with(:vm).and_return(nil)
295+
allow(Facter::Resolvers::OpenVz).to receive(:resolve).with(:vm).and_return(nil)
296+
allow(Facter::Resolvers::VirtWhat).to receive(:resolve).with(:vserver).and_return(nil)
297+
allow(Facter::Resolvers::Xen).to receive(:resolve).with(:vm).and_return(nil)
298+
allow(Facter::Resolvers::Lspci).to receive(:resolve).with(:vm).and_return(nil)
299+
allow(Facter::Resolvers::Linux::DmiBios).to receive(:resolve).with(:bios_vendor).and_return('unknown')
300+
allow(Facter::Resolvers::Linux::DmiBios).to receive(:resolve).with(:product_name).and_return('unknown')
301+
end
302+
303+
it 'returns virtual fact as physical' do
304+
expect(detector.platform).to eq(vm)
305+
end
306+
end
307+
end
308+
end

0 commit comments

Comments
 (0)