metasploit_data_models 0.18.1-java → 0.19.0-java
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/models/mdm/host.rb +7 -0
- data/app/models/mdm/service.rb +30 -1
- data/app/models/mdm/tag.rb +10 -0
- data/app/models/metasploit_data_models/ip_address/v4/cidr.rb +14 -0
- data/app/models/metasploit_data_models/ip_address/v4/nmap.rb +14 -0
- data/app/models/metasploit_data_models/ip_address/v4/range.rb +12 -0
- data/app/models/metasploit_data_models/ip_address/v4/segment/nmap/list.rb +126 -0
- data/app/models/metasploit_data_models/ip_address/v4/segment/nmap/range.rb +12 -0
- data/app/models/metasploit_data_models/ip_address/v4/segment/single.rb +123 -0
- data/app/models/metasploit_data_models/ip_address/v4/segmented.rb +200 -0
- data/app/models/metasploit_data_models/ip_address/v4/single.rb +53 -0
- data/app/models/metasploit_data_models/search/operation/ip_address.rb +60 -0
- data/app/models/metasploit_data_models/search/operator/ip_address.rb +33 -0
- data/app/models/metasploit_data_models/search/visitor/attribute.rb +1 -0
- data/app/models/metasploit_data_models/search/visitor/includes.rb +1 -0
- data/app/models/metasploit_data_models/search/visitor/joins.rb +1 -0
- data/app/models/metasploit_data_models/search/visitor/where.rb +51 -0
- data/config/locales/en.yml +35 -4
- data/lib/metasploit_data_models/ip_address.rb +5 -0
- data/lib/metasploit_data_models/ip_address/cidr.rb +174 -0
- data/lib/metasploit_data_models/ip_address/range.rb +181 -0
- data/lib/metasploit_data_models/match/child.rb +48 -0
- data/lib/metasploit_data_models/match/parent.rb +103 -0
- data/lib/metasploit_data_models/version.rb +4 -4
- data/metasploit_data_models.gemspec +2 -1
- data/spec/app/models/mdm/cred_spec.rb +164 -31
- data/spec/app/models/mdm/service_spec.rb +33 -44
- data/spec/app/models/metasploit_data_models/ip_address/v4/cidr_spec.rb +121 -0
- data/spec/app/models/metasploit_data_models/ip_address/v4/nmap_spec.rb +151 -0
- data/spec/app/models/metasploit_data_models/ip_address/v4/range_spec.rb +300 -0
- data/spec/app/models/metasploit_data_models/ip_address/v4/segment/nmap/list_spec.rb +278 -0
- data/spec/app/models/metasploit_data_models/ip_address/v4/segment/nmap/range_spec.rb +304 -0
- data/spec/app/models/metasploit_data_models/ip_address/v4/segment/segmented_spec.rb +29 -0
- data/spec/app/models/metasploit_data_models/ip_address/v4/segment/single_spec.rb +315 -0
- data/spec/app/models/metasploit_data_models/ip_address/v4/single_spec.rb +183 -0
- data/spec/app/models/metasploit_data_models/search/operation/ip_address_spec.rb +182 -0
- data/spec/app/models/metasploit_data_models/search/operator/ip_address_spec.rb +19 -0
- data/spec/app/models/metasploit_data_models/search/visitor/relation_spec.rb +229 -36
- data/spec/dummy/config/application.rb +1 -1
- data/spec/dummy/db/structure.sql +3011 -0
- data/spec/factories/mdm/services.rb +3 -1
- data/spec/lib/metasploit_data_models/ip_address/cidr_spec.rb +350 -0
- data/spec/lib/metasploit_data_models/ip_address/range_spec.rb +77 -0
- data/spec/lib/metasploit_data_models/match/child_spec.rb +61 -0
- data/spec/lib/metasploit_data_models/match/parent_spec.rb +155 -0
- data/spec/support/matchers/match_regex_exactly.rb +28 -0
- data/spec/support/shared/contexts/rex/text.rb +15 -0
- data/spec/support/shared/examples/metasploit_data_models/search/operation/ipaddress/match.rb +109 -0
- metadata +58 -9
- data/spec/dummy/db/schema.rb +0 -609
@@ -0,0 +1,278 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe MetasploitDataModels::IPAddress::V4::Segment::Nmap::List do
|
4
|
+
subject(:nmap) {
|
5
|
+
described_class.new(
|
6
|
+
value: formatted_value
|
7
|
+
)
|
8
|
+
}
|
9
|
+
|
10
|
+
context 'CONSTANTS' do
|
11
|
+
context 'MATCH_REGEXP' do
|
12
|
+
subject(:match_regexp) {
|
13
|
+
described_class::MATCH_REGEXP
|
14
|
+
}
|
15
|
+
|
16
|
+
it 'matches comma separated list of segment numbers and range' do
|
17
|
+
expect(match_regexp).to match('1,2-3,4-5,6,7-8,9')
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'does not match an Nmap IP address' do
|
21
|
+
segment = '1,2-3,4-5,6,7-8,9'
|
22
|
+
expect(match_regexp).not_to match(([segment]*4).join('.'))
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
context 'RANGE_OR_NUMBER_REGEXP' do
|
27
|
+
subject(:range_or_number_regexp) {
|
28
|
+
described_class::RANGE_OR_NUMBER_REGEXP
|
29
|
+
}
|
30
|
+
|
31
|
+
it 'matches a number' do
|
32
|
+
expect(range_or_number_regexp).to match_string_exactly('0')
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'matches a range' do
|
36
|
+
expect(range_or_number_regexp).to match_string_exactly('0-255')
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
context 'REGEXP' do
|
41
|
+
subject(:regexp) {
|
42
|
+
described_class::REGEXP
|
43
|
+
}
|
44
|
+
|
45
|
+
it 'matches a number' do
|
46
|
+
expect(regexp).to match_string_exactly('0')
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'matches a range' do
|
50
|
+
expect(regexp).to match_string_exactly('0-255')
|
51
|
+
end
|
52
|
+
|
53
|
+
it 'matches comma separated list of numbers' do
|
54
|
+
expect(regexp).to match_string_exactly('0,1,2')
|
55
|
+
end
|
56
|
+
|
57
|
+
it 'matches comma separated list of ranges' do
|
58
|
+
expect(regexp).to match_string_exactly('1-2,3-4,5-6')
|
59
|
+
end
|
60
|
+
|
61
|
+
it 'matches commad separated list of numbers and ranges' do
|
62
|
+
expect(regexp).to match_string_exactly('1,2-3,4-5,6,7-8,9')
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
context 'SEPARATOR' do
|
67
|
+
subject(:separator) {
|
68
|
+
described_class::SEPARATOR
|
69
|
+
}
|
70
|
+
|
71
|
+
it { should == ',' }
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
context 'validation' do
|
76
|
+
before(:each) do
|
77
|
+
nmap.valid?
|
78
|
+
end
|
79
|
+
|
80
|
+
context 'errors on #value' do
|
81
|
+
subject(:value_errors) {
|
82
|
+
nmap.errors[:value]
|
83
|
+
}
|
84
|
+
|
85
|
+
context 'with nil' do
|
86
|
+
let(:blank_error) {
|
87
|
+
I18n.translate!('errors.messages.blank')
|
88
|
+
}
|
89
|
+
|
90
|
+
let(:formatted_value) {
|
91
|
+
nil
|
92
|
+
}
|
93
|
+
|
94
|
+
it { should include blank_error }
|
95
|
+
end
|
96
|
+
|
97
|
+
context 'with matching String' do
|
98
|
+
context 'with valid elements' do
|
99
|
+
let(:formatted_value) {
|
100
|
+
'1,2-3'
|
101
|
+
}
|
102
|
+
|
103
|
+
it { should be_empty }
|
104
|
+
end
|
105
|
+
|
106
|
+
context 'with invalid MetasploitDataModels::IPAddress::V4::Nmap::Range' do
|
107
|
+
let(:error) {
|
108
|
+
I18n.translate!(
|
109
|
+
'metasploit.model.errors.models.metasploit_data_models/ip_address/v4/segment/nmap/list.attributes.value.element',
|
110
|
+
element: '255-0',
|
111
|
+
index: 1
|
112
|
+
)
|
113
|
+
}
|
114
|
+
|
115
|
+
let(:formatted_value) {
|
116
|
+
'1,255-0'
|
117
|
+
}
|
118
|
+
|
119
|
+
it 'says index of element that as invalid with the value' do
|
120
|
+
expect(value_errors).to include(error)
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
context 'without matching String' do
|
126
|
+
let(:array_error) {
|
127
|
+
I18n.translate!('metasploit.model.errors.models.metasploit_data_models/ip_address/v4/segment/nmap/list.attributes.value.array')
|
128
|
+
}
|
129
|
+
|
130
|
+
let(:formatted_value) {
|
131
|
+
'non_matching_string'
|
132
|
+
}
|
133
|
+
|
134
|
+
it { should include array_error }
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
context '#to_s' do
|
140
|
+
subject(:to_s) do
|
141
|
+
nmap.to_s
|
142
|
+
end
|
143
|
+
|
144
|
+
context 'with matching formatted value' do
|
145
|
+
let(:formatted_value) {
|
146
|
+
'1,2-3'
|
147
|
+
}
|
148
|
+
|
149
|
+
it 'returns a string equal to the original formatted value' do
|
150
|
+
expect(to_s).to eq(formatted_value)
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
context 'without matching formatted value' do
|
155
|
+
let(:formatted_value) {
|
156
|
+
Set.new([1,2])
|
157
|
+
}
|
158
|
+
|
159
|
+
it 'returned the formatted value as a string' do
|
160
|
+
expect(to_s).to eq(formatted_value.to_s)
|
161
|
+
end
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
context '#value' do
|
166
|
+
subject(:value) {
|
167
|
+
nmap.value
|
168
|
+
}
|
169
|
+
|
170
|
+
context 'with segment number' do
|
171
|
+
let(:formatted_value) {
|
172
|
+
number.to_s
|
173
|
+
}
|
174
|
+
|
175
|
+
let(:number) {
|
176
|
+
255
|
177
|
+
}
|
178
|
+
|
179
|
+
it 'has correct number of elements' do
|
180
|
+
expect(value.length).to eq(1)
|
181
|
+
end
|
182
|
+
|
183
|
+
context 'only element' do
|
184
|
+
subject(:element) {
|
185
|
+
value.first
|
186
|
+
}
|
187
|
+
|
188
|
+
it { should be_a MetasploitDataModels::IPAddress::V4::Segment::Single }
|
189
|
+
|
190
|
+
context 'MetasploitDataModels::IPAddress::V4::Segment::Single#value' do
|
191
|
+
it 'is value from formatted_value' do
|
192
|
+
expect(element.value).to eq(number)
|
193
|
+
end
|
194
|
+
end
|
195
|
+
end
|
196
|
+
end
|
197
|
+
|
198
|
+
context 'with segment range' do
|
199
|
+
let(:begin_number) {
|
200
|
+
0
|
201
|
+
}
|
202
|
+
|
203
|
+
let(:end_number) {
|
204
|
+
255
|
205
|
+
}
|
206
|
+
|
207
|
+
let(:formatted_value) {
|
208
|
+
"#{begin_number}-#{end_number}"
|
209
|
+
}
|
210
|
+
|
211
|
+
it 'has correct number of elements' do
|
212
|
+
expect(value.length).to eq(1)
|
213
|
+
end
|
214
|
+
|
215
|
+
context 'only element' do
|
216
|
+
subject(:element) {
|
217
|
+
value.first
|
218
|
+
}
|
219
|
+
|
220
|
+
it { should be_a MetasploitDataModels::IPAddress::V4::Segment::Nmap::Range }
|
221
|
+
|
222
|
+
context 'MetasploitDataModels::IPAddress::V4::Segment::Nmap::Range#value' do
|
223
|
+
subject(:element_value) {
|
224
|
+
element.value
|
225
|
+
}
|
226
|
+
|
227
|
+
context 'MetasploitDataModels::IPAddress::V4::Segment::Nmap::Range#begin' do
|
228
|
+
subject(:range_begin) {
|
229
|
+
element_value.begin
|
230
|
+
}
|
231
|
+
|
232
|
+
it { should be_a MetasploitDataModels::IPAddress::V4::Segment::Single }
|
233
|
+
|
234
|
+
context 'MetasploitDataModels::IPAddress::V4::Segment::Single#value' do
|
235
|
+
it 'is beginning of formatted value' do
|
236
|
+
expect(range_begin.value).to eq(begin_number)
|
237
|
+
end
|
238
|
+
end
|
239
|
+
end
|
240
|
+
|
241
|
+
context 'MetasploitDataModels::IPAddress::V4::Segment::Nmap::Range#end' do
|
242
|
+
subject(:range_end) {
|
243
|
+
element_value.end
|
244
|
+
}
|
245
|
+
|
246
|
+
it { should be_a MetasploitDataModels::IPAddress::V4::Segment::Single }
|
247
|
+
|
248
|
+
context 'MetasploitDataModels::IPAddress::V4::Segment::Single#value' do
|
249
|
+
it 'is beginning of formatted value' do
|
250
|
+
expect(range_end.value).to eq(end_number)
|
251
|
+
end
|
252
|
+
end
|
253
|
+
end
|
254
|
+
end
|
255
|
+
end
|
256
|
+
end
|
257
|
+
|
258
|
+
context 'with comma separated list of segment numbers and ranges' do
|
259
|
+
let(:formatted_value) {
|
260
|
+
'1,2-3,4-5,6,7'
|
261
|
+
}
|
262
|
+
|
263
|
+
it 'has correct number elements' do
|
264
|
+
expect(value.length).to eq(5)
|
265
|
+
end
|
266
|
+
end
|
267
|
+
|
268
|
+
context 'with additional data' do
|
269
|
+
let(:formatted_value) {
|
270
|
+
'additional_data1,2-3'
|
271
|
+
}
|
272
|
+
|
273
|
+
it 'is original formatted value' do
|
274
|
+
expect(value).to eq(formatted_value)
|
275
|
+
end
|
276
|
+
end
|
277
|
+
end
|
278
|
+
end
|
@@ -0,0 +1,304 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe MetasploitDataModels::IPAddress::V4::Segment::Nmap::Range do
|
4
|
+
subject(:range) {
|
5
|
+
described_class.new(
|
6
|
+
value: formatted_value
|
7
|
+
)
|
8
|
+
}
|
9
|
+
|
10
|
+
#
|
11
|
+
# lets
|
12
|
+
#
|
13
|
+
|
14
|
+
let(:formatted_value) {
|
15
|
+
nil
|
16
|
+
}
|
17
|
+
|
18
|
+
context 'validations' do
|
19
|
+
#
|
20
|
+
# lets
|
21
|
+
#
|
22
|
+
|
23
|
+
let(:presence_error) {
|
24
|
+
I18n.translate!('errors.messages.blank')
|
25
|
+
}
|
26
|
+
|
27
|
+
let(:invalid_error) {
|
28
|
+
I18n.translate!('errors.messages.invalid')
|
29
|
+
}
|
30
|
+
|
31
|
+
#
|
32
|
+
# Callbacks
|
33
|
+
#
|
34
|
+
|
35
|
+
before(:each) do
|
36
|
+
range.valid?
|
37
|
+
end
|
38
|
+
|
39
|
+
context 'errors on #begin' do
|
40
|
+
subject(:begin_errors) {
|
41
|
+
range.errors[:begin]
|
42
|
+
}
|
43
|
+
|
44
|
+
context '#begin' do
|
45
|
+
context 'with nil' do
|
46
|
+
let(:formatted_value) {
|
47
|
+
nil
|
48
|
+
}
|
49
|
+
|
50
|
+
it { should include presence_error }
|
51
|
+
end
|
52
|
+
|
53
|
+
context 'with MetasploitDataModels::IPAddress::V4::Segment' do
|
54
|
+
context 'with valid' do
|
55
|
+
let(:formatted_value) {
|
56
|
+
'1-256'
|
57
|
+
}
|
58
|
+
|
59
|
+
it { should_not include invalid_error }
|
60
|
+
end
|
61
|
+
|
62
|
+
context 'without valid' do
|
63
|
+
let(:formatted_value) {
|
64
|
+
'256-257'
|
65
|
+
}
|
66
|
+
|
67
|
+
it { should include invalid_error }
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
context 'errors on #end' do
|
74
|
+
subject(:end_errors) {
|
75
|
+
range.errors[:end]
|
76
|
+
}
|
77
|
+
|
78
|
+
context '#end' do
|
79
|
+
context 'with nil' do
|
80
|
+
let(:formatted_value) {
|
81
|
+
nil
|
82
|
+
}
|
83
|
+
|
84
|
+
it { should include presence_error }
|
85
|
+
end
|
86
|
+
|
87
|
+
context 'with MetasploitDataModels::IPAddress::V4::Segment' do
|
88
|
+
context 'with valid' do
|
89
|
+
let(:formatted_value) {
|
90
|
+
'256-1'
|
91
|
+
}
|
92
|
+
|
93
|
+
it { should_not include invalid_error }
|
94
|
+
end
|
95
|
+
|
96
|
+
context 'without valid' do
|
97
|
+
let(:formatted_value) {
|
98
|
+
'257-256'
|
99
|
+
}
|
100
|
+
|
101
|
+
it { should include invalid_error }
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
context 'errors on #value' do
|
108
|
+
subject(:value_errors) {
|
109
|
+
range.errors[:value]
|
110
|
+
}
|
111
|
+
|
112
|
+
let(:error) {
|
113
|
+
I18n.translate!(
|
114
|
+
'metasploit.model.errors.models.metasploit_data_models/ip_address/v4/segment/nmap/range.attributes.value.order',
|
115
|
+
begin: range.begin,
|
116
|
+
end: range.end
|
117
|
+
)
|
118
|
+
}
|
119
|
+
|
120
|
+
context 'with nil' do
|
121
|
+
let(:formatted_value) {
|
122
|
+
nil
|
123
|
+
}
|
124
|
+
|
125
|
+
it { should_not include error }
|
126
|
+
end
|
127
|
+
|
128
|
+
context 'with incomparables' do
|
129
|
+
let(:formatted_value) {
|
130
|
+
'a-1'
|
131
|
+
}
|
132
|
+
|
133
|
+
it { should_not include error }
|
134
|
+
end
|
135
|
+
|
136
|
+
context 'with numbers' do
|
137
|
+
context 'in order' do
|
138
|
+
let(:formatted_value) {
|
139
|
+
'1-2'
|
140
|
+
}
|
141
|
+
|
142
|
+
it { should_not include error }
|
143
|
+
end
|
144
|
+
|
145
|
+
context 'out of order' do
|
146
|
+
let(:formatted_value) {
|
147
|
+
'2-1'
|
148
|
+
}
|
149
|
+
|
150
|
+
it { should include error }
|
151
|
+
end
|
152
|
+
end
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
156
|
+
context 'match_regexp' do
|
157
|
+
subject(:match_regexp) do
|
158
|
+
described_class::match_regexp
|
159
|
+
end
|
160
|
+
|
161
|
+
it 'matches range exactly' do
|
162
|
+
expect(match_regexp).to match_string_exactly('0-255')
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
context 'regexp' do
|
167
|
+
subject(:regexp) {
|
168
|
+
described_class::regexp
|
169
|
+
}
|
170
|
+
|
171
|
+
it 'does not match a single segment number' do
|
172
|
+
expect(regexp).not_to match('255')
|
173
|
+
end
|
174
|
+
|
175
|
+
it 'does not match separator by itself' do
|
176
|
+
expect(regexp).not_to match('-')
|
177
|
+
end
|
178
|
+
|
179
|
+
it 'does not match range with only one extreme' do
|
180
|
+
expect(regexp).not_to match('0-')
|
181
|
+
expect(regexp).not_to match('-255')
|
182
|
+
end
|
183
|
+
|
184
|
+
it 'matches range' do
|
185
|
+
expect(regexp).to match_string_exactly('0-255')
|
186
|
+
end
|
187
|
+
end
|
188
|
+
|
189
|
+
context '#to_s' do
|
190
|
+
subject(:to_s) {
|
191
|
+
range.to_s
|
192
|
+
}
|
193
|
+
|
194
|
+
context 'with Range' do
|
195
|
+
let(:formatted_value) {
|
196
|
+
'1-2'
|
197
|
+
}
|
198
|
+
|
199
|
+
it 'equals the original formatted value' do
|
200
|
+
expect(to_s).to eq(formatted_value)
|
201
|
+
end
|
202
|
+
end
|
203
|
+
|
204
|
+
context 'without Range' do
|
205
|
+
let(:formatted_value) {
|
206
|
+
'1..2'
|
207
|
+
}
|
208
|
+
|
209
|
+
it { should == '-' }
|
210
|
+
end
|
211
|
+
end
|
212
|
+
|
213
|
+
context '#value' do
|
214
|
+
subject(:value) {
|
215
|
+
range.value
|
216
|
+
}
|
217
|
+
|
218
|
+
context 'with -' do
|
219
|
+
context 'with extremes' do
|
220
|
+
let(:formatted_value) {
|
221
|
+
'1-2'
|
222
|
+
}
|
223
|
+
|
224
|
+
it { should be_a Range }
|
225
|
+
|
226
|
+
context 'Range#begin' do
|
227
|
+
subject(:range_begin) {
|
228
|
+
value.begin
|
229
|
+
}
|
230
|
+
|
231
|
+
it { should be_a MetasploitDataModels::IPAddress::V4::Segment::Single }
|
232
|
+
|
233
|
+
context 'MetasploitDataModels::IPAddress::V4::Segment::Single#value' do
|
234
|
+
it "is value before '-'" do
|
235
|
+
expect(range_begin.value).to eq(1)
|
236
|
+
end
|
237
|
+
end
|
238
|
+
end
|
239
|
+
|
240
|
+
context 'Range#end' do
|
241
|
+
subject(:range_end) {
|
242
|
+
value.end
|
243
|
+
}
|
244
|
+
|
245
|
+
it { should be_a MetasploitDataModels::IPAddress::V4::Segment::Single }
|
246
|
+
|
247
|
+
context 'MetasploitDataModels::IPAddress::V4::Segment::Single#value' do
|
248
|
+
it "is value after '-'" do
|
249
|
+
expect(range_end.value).to eq(2)
|
250
|
+
end
|
251
|
+
end
|
252
|
+
end
|
253
|
+
end
|
254
|
+
|
255
|
+
context 'without extremes' do
|
256
|
+
let(:formatted_value) {
|
257
|
+
'-'
|
258
|
+
}
|
259
|
+
|
260
|
+
it { should be_a Range }
|
261
|
+
|
262
|
+
context 'Range#begin' do
|
263
|
+
subject(:range_begin) {
|
264
|
+
value.begin
|
265
|
+
}
|
266
|
+
|
267
|
+
it { should be_a MetasploitDataModels::IPAddress::V4::Segment::Single }
|
268
|
+
|
269
|
+
context 'MetasploitDataModels::IPAddress::V4::Segment::Single#value' do
|
270
|
+
subject(:begin_value) {
|
271
|
+
range_begin.value
|
272
|
+
}
|
273
|
+
|
274
|
+
it { should == '' }
|
275
|
+
end
|
276
|
+
end
|
277
|
+
|
278
|
+
context 'Range#end' do
|
279
|
+
subject(:range_end) {
|
280
|
+
value.end
|
281
|
+
}
|
282
|
+
|
283
|
+
it { should be_a MetasploitDataModels::IPAddress::V4::Segment::Single }
|
284
|
+
|
285
|
+
context 'MetasploitDataModels::IPAddress::V4::Segment::Single#value' do
|
286
|
+
subject(:end_value) {
|
287
|
+
range_end.value
|
288
|
+
}
|
289
|
+
|
290
|
+
it { should == '' }
|
291
|
+
end
|
292
|
+
end
|
293
|
+
end
|
294
|
+
end
|
295
|
+
|
296
|
+
context 'without -' do
|
297
|
+
let(:formatted_value) do
|
298
|
+
'1'
|
299
|
+
end
|
300
|
+
|
301
|
+
it { should_not be_a Range }
|
302
|
+
end
|
303
|
+
end
|
304
|
+
end
|