dns_mock 0.2.0 → 1.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.codeclimate.yml +1 -1
- data/.reek.yml +12 -0
- data/.rubocop.yml +27 -0
- data/CHANGELOG.md +130 -0
- data/Gemfile.lock +23 -23
- data/README.md +79 -12
- data/dns_mock.gemspec +6 -6
- data/lib/dns_mock.rb +2 -2
- data/lib/dns_mock/record/builder/mx.rb +12 -1
- data/lib/dns_mock/response/answer.rb +5 -4
- data/lib/dns_mock/response/message.rb +8 -2
- data/lib/dns_mock/server.rb +5 -3
- data/lib/dns_mock/server/records_dictionary_builder.rb +6 -2
- data/lib/dns_mock/test_framework/rspec.rb +12 -0
- data/lib/dns_mock/test_framework/rspec/helper.rb +15 -0
- data/lib/dns_mock/test_framework/rspec/interface.rb +35 -0
- data/lib/dns_mock/version.rb +1 -1
- metadata +19 -28
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 064a09d83281b9b85beb9c30435f5db5bd68b5658389ff9ac8776aa23a148bff
|
4
|
+
data.tar.gz: d9bb631674d58c3588c76deb8adedd38fd5dcef17cc15e38ad7185e9b1af11cb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dfa19e12835b63f6637f41daa3a7c4fe2c0cecf5b32a6a5e0348398b4201e8e0ad7d2468a068e3c735e438a6e429b82878dc9b9c56c04cdea075cfa0c99b9c3f
|
7
|
+
data.tar.gz: ed40dcd5e44181d3df023628cbcaef4478dfa152ed2f3e2434561ef85f628a34157274dfe811a27be78b63f80db2719106438ccd8325d436e412dd95c19e8c49
|
data/.codeclimate.yml
CHANGED
data/.reek.yml
CHANGED
@@ -21,6 +21,8 @@ detectors:
|
|
21
21
|
- DnsMock::ServerHelper#start_random_server
|
22
22
|
- DnsMock::ServerHelper#stop_all_running_servers
|
23
23
|
- DnsMock::Server::RecordsDictionaryBuilder#rdns_lookup_prefix
|
24
|
+
- DnsMock::ContextGeneratorHelper#random_port_number
|
25
|
+
- DnsMock::TestFramework::RSpec::Helper#dns_mock_server
|
24
26
|
|
25
27
|
ControlParameter:
|
26
28
|
exclude:
|
@@ -45,3 +47,13 @@ detectors:
|
|
45
47
|
LongParameterList:
|
46
48
|
exclude:
|
47
49
|
- DnsMock::Server#initialize
|
50
|
+
- DnsMock#start_server
|
51
|
+
|
52
|
+
BooleanParameter:
|
53
|
+
exclude:
|
54
|
+
- DnsMock::Server#initialize
|
55
|
+
- DnsMock#start_server
|
56
|
+
|
57
|
+
NilCheck:
|
58
|
+
exclude:
|
59
|
+
- DnsMock::Record::Builder::Mx#build
|
data/.rubocop.yml
CHANGED
@@ -118,6 +118,12 @@ Style/EndlessMethod:
|
|
118
118
|
Style/HashExcept:
|
119
119
|
Enabled: true
|
120
120
|
|
121
|
+
Style/IfWithBooleanLiteralBranches:
|
122
|
+
Enabled: true
|
123
|
+
|
124
|
+
Style/HashConversion:
|
125
|
+
Enabled: true
|
126
|
+
|
121
127
|
Layout/LineLength:
|
122
128
|
Max: 150
|
123
129
|
|
@@ -203,6 +209,21 @@ Lint/RedundantDirGlobSort:
|
|
203
209
|
Lint/UnmodifiedReduceAccumulator:
|
204
210
|
Enabled: true
|
205
211
|
|
212
|
+
Lint/NumberedParameterAssignment:
|
213
|
+
Enabled: true
|
214
|
+
|
215
|
+
Lint/OrAssignmentToConstant:
|
216
|
+
Enabled: true
|
217
|
+
|
218
|
+
Lint/SymbolConversion:
|
219
|
+
Enabled: true
|
220
|
+
|
221
|
+
Lint/TripleQuotes:
|
222
|
+
Enabled: true
|
223
|
+
|
224
|
+
Gemspec/DateAssignment:
|
225
|
+
Enabled: true
|
226
|
+
|
206
227
|
Performance/AncestorsInclude:
|
207
228
|
Enabled: true
|
208
229
|
|
@@ -242,6 +263,12 @@ Performance/MethodObjectAsBlock:
|
|
242
263
|
Performance/Sum:
|
243
264
|
Enabled: true
|
244
265
|
|
266
|
+
Performance/RedundantEqualityComparisonBlock:
|
267
|
+
Enabled: true
|
268
|
+
|
269
|
+
Performance/RedundantSplitRegexpArgument:
|
270
|
+
Enabled: true
|
271
|
+
|
245
272
|
RSpec/ExampleLength:
|
246
273
|
Enabled: false
|
247
274
|
|
data/CHANGELOG.md
CHANGED
@@ -2,6 +2,136 @@
|
|
2
2
|
|
3
3
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
4
4
|
|
5
|
+
## [1.2.1] - 2021-03-23
|
6
|
+
|
7
|
+
### Changed
|
8
|
+
|
9
|
+
- Updated gem development dependencies
|
10
|
+
- Updated rubocop/codeclimate config
|
11
|
+
- Updated gem documentation
|
12
|
+
- Updated tests
|
13
|
+
|
14
|
+
## [1.2.0] - 2021-02-04
|
15
|
+
|
16
|
+
### Ability to specify MX record priority
|
17
|
+
|
18
|
+
Added ability to specify custom priority of MX record if it needed. Now it impossible to define null or backup MX records. Please note, if you haven't specified a priority of MX record, it will be assigned automatically. MX records builder is assigning priority with step 10 from first item of defined MX records array.
|
19
|
+
|
20
|
+
```ruby
|
21
|
+
records = {
|
22
|
+
'example.com' => {
|
23
|
+
mx: %w[.:0 mx1.domain.com:10 mx2.domain.com:10 mx3.domain.com] # .:0 - null MX record
|
24
|
+
}
|
25
|
+
}
|
26
|
+
|
27
|
+
DnsMock.start_server(records: records)
|
28
|
+
```
|
29
|
+
|
30
|
+
```bash
|
31
|
+
dig @localhost -p 5300 MX example.com
|
32
|
+
```
|
33
|
+
|
34
|
+
```
|
35
|
+
; <<>> DiG 9.10.6 <<>> @localhost -p 5300 MX example.com
|
36
|
+
|
37
|
+
;; ANSWER SECTION:
|
38
|
+
example.com. 1 IN MX 0 .
|
39
|
+
example.com. 1 IN MX 10 mx1.domain.com.
|
40
|
+
example.com. 1 IN MX 10 mx2.domain.com.
|
41
|
+
example.com. 1 IN MX 40 mx3.domain.com.
|
42
|
+
|
43
|
+
;; Query time: 0 msec
|
44
|
+
;; SERVER: 127.0.0.1#5300(127.0.0.1)
|
45
|
+
;; WHEN: Wed Feb 03 20:19:51 EET 2021
|
46
|
+
;; MSG SIZE rcvd: 102
|
47
|
+
```
|
48
|
+
|
49
|
+
## [1.1.0] - 2021-02-01
|
50
|
+
|
51
|
+
### RSpec native support
|
52
|
+
|
53
|
+
Added DnsMock helper which can simplify integration with RSpec.
|
54
|
+
|
55
|
+
```ruby
|
56
|
+
# spec/support/config/dns_mock.rb
|
57
|
+
require 'dns_mock/test_framework/rspec'
|
58
|
+
|
59
|
+
RSpec.configure do |config|
|
60
|
+
config.include DnsMock::TestFramework::RSpec::Helper
|
61
|
+
end
|
62
|
+
|
63
|
+
# your awesome first_a_record_spec.rb
|
64
|
+
RSpec.describe FirstARecord do
|
65
|
+
subject(:service) do
|
66
|
+
described_class.call(
|
67
|
+
hostname,
|
68
|
+
dns_gateway_host: 'localhost',
|
69
|
+
dns_gateway_port: dns_mock_server.port
|
70
|
+
)
|
71
|
+
end
|
72
|
+
|
73
|
+
let(:hostname) { 'example.com' }
|
74
|
+
let(:first_a_record) { '1.2.3.4' }
|
75
|
+
let(:records) { { hostname => { a: [first_a_record] } } }
|
76
|
+
|
77
|
+
before { dns_mock_server.assign_mocks(records) }
|
78
|
+
|
79
|
+
it { is_expected.to eq(first_a_record) }
|
80
|
+
end
|
81
|
+
```
|
82
|
+
|
83
|
+
## [1.0.0] - 2021-01-29
|
84
|
+
|
85
|
+
### Configurable record not found behaviour
|
86
|
+
|
87
|
+
Added configurable strategy for record not found case. By default it won't raise an exception when DNS record not found in mocked records dictionary:
|
88
|
+
|
89
|
+
```ruby
|
90
|
+
DnsMock.start_server(port: 5300)
|
91
|
+
```
|
92
|
+
|
93
|
+
```bash
|
94
|
+
dig @localhost -p 5300 A example.com
|
95
|
+
```
|
96
|
+
|
97
|
+
```
|
98
|
+
; <<>> DiG 9.10.6 <<>> @localhost -p 5300 A example.com
|
99
|
+
;; Got answer:
|
100
|
+
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 38632
|
101
|
+
;; flags: rd; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1
|
102
|
+
;; WARNING: recursion requested but not available
|
103
|
+
|
104
|
+
;; OPT PSEUDOSECTION:
|
105
|
+
; EDNS: version: 0, flags:; udp: 4096
|
106
|
+
;; QUESTION SECTION:
|
107
|
+
;example.com. IN A
|
108
|
+
|
109
|
+
;; Query time: 0 msec
|
110
|
+
;; SERVER: 127.0.0.1#5300(127.0.0.1)
|
111
|
+
;; WHEN: Fri Jan 29 08:21:30 EET 2021
|
112
|
+
;; MSG SIZE rcvd: 40
|
113
|
+
```
|
114
|
+
|
115
|
+
If you want raise an exception when record not found, just start `DnsMock` with `exception_if_not_found: true` option:
|
116
|
+
|
117
|
+
```ruby
|
118
|
+
DnsMock.start_server(exception_if_not_found: true)
|
119
|
+
```
|
120
|
+
|
121
|
+
### Changed
|
122
|
+
|
123
|
+
- Updated `DnsMock.start_server`
|
124
|
+
- Updated `DnsMock::Server`
|
125
|
+
- Updated `DnsMock::Response::Message`
|
126
|
+
- Updated `DnsMock::Response::Answer`
|
127
|
+
- Updated gem version, readme
|
128
|
+
|
129
|
+
## [0.2.1] - 2021-01-27
|
130
|
+
|
131
|
+
### Fixed RDNS lookup representation
|
132
|
+
|
133
|
+
Fixed RDNS lookup representatin for IP address in PTR record feature.
|
134
|
+
|
5
135
|
## [0.2.0] - 2021-01-26
|
6
136
|
|
7
137
|
### PTR record support
|
data/Gemfile.lock
CHANGED
@@ -1,30 +1,30 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
dns_mock (
|
4
|
+
dns_mock (1.2.1)
|
5
5
|
|
6
6
|
GEM
|
7
7
|
remote: https://rubygems.org/
|
8
8
|
specs:
|
9
|
-
ast (2.4.
|
10
|
-
bundler-audit (0.
|
9
|
+
ast (2.4.2)
|
10
|
+
bundler-audit (0.8.0)
|
11
11
|
bundler (>= 1.2.0, < 3)
|
12
|
-
thor (
|
12
|
+
thor (~> 1.0)
|
13
13
|
byebug (11.1.3)
|
14
14
|
childprocess (4.0.0)
|
15
15
|
coderay (1.1.3)
|
16
16
|
colorize (0.8.1)
|
17
|
-
concurrent-ruby (1.1.
|
17
|
+
concurrent-ruby (1.1.8)
|
18
18
|
diff-lcs (1.4.4)
|
19
19
|
dnsruby (1.61.5)
|
20
20
|
simpleidn (~> 0.1)
|
21
21
|
docile (1.3.5)
|
22
|
-
faker (2.
|
22
|
+
faker (2.17.0)
|
23
23
|
i18n (>= 1.6, < 2)
|
24
|
-
fasterer (0.
|
24
|
+
fasterer (0.9.0)
|
25
25
|
colorize (~> 0.7)
|
26
26
|
ruby_parser (>= 3.14.1)
|
27
|
-
i18n (1.8.
|
27
|
+
i18n (1.8.9)
|
28
28
|
concurrent-ruby (~> 1.0)
|
29
29
|
iniparse (1.5.0)
|
30
30
|
json (2.5.1)
|
@@ -42,7 +42,7 @@ GEM
|
|
42
42
|
pry-byebug (3.9.0)
|
43
43
|
byebug (~> 11.0)
|
44
44
|
pry (~> 0.13.0)
|
45
|
-
psych (3.3.
|
45
|
+
psych (3.3.1)
|
46
46
|
rainbow (3.0.0)
|
47
47
|
rake (13.0.3)
|
48
48
|
reek (6.0.3)
|
@@ -50,7 +50,7 @@ GEM
|
|
50
50
|
parser (~> 3.0.0)
|
51
51
|
psych (~> 3.1)
|
52
52
|
rainbow (>= 2.0, < 4.0)
|
53
|
-
regexp_parser (2.
|
53
|
+
regexp_parser (2.1.1)
|
54
54
|
rexml (3.2.4)
|
55
55
|
rspec (3.10.0)
|
56
56
|
rspec-core (~> 3.10.0)
|
@@ -65,11 +65,11 @@ GEM
|
|
65
65
|
rspec-expectations (3.10.1)
|
66
66
|
diff-lcs (>= 1.2.0, < 2.0)
|
67
67
|
rspec-support (~> 3.10.0)
|
68
|
-
rspec-mocks (3.10.
|
68
|
+
rspec-mocks (3.10.2)
|
69
69
|
diff-lcs (>= 1.2.0, < 2.0)
|
70
70
|
rspec-support (~> 3.10.0)
|
71
|
-
rspec-support (3.10.
|
72
|
-
rubocop (1.
|
71
|
+
rspec-support (3.10.2)
|
72
|
+
rubocop (1.11.0)
|
73
73
|
parallel (~> 1.10)
|
74
74
|
parser (>= 3.0.0.0)
|
75
75
|
rainbow (>= 2.2.2, < 4.0)
|
@@ -78,12 +78,12 @@ GEM
|
|
78
78
|
rubocop-ast (>= 1.2.0, < 2.0)
|
79
79
|
ruby-progressbar (~> 1.7)
|
80
80
|
unicode-display_width (>= 1.4.0, < 3.0)
|
81
|
-
rubocop-ast (1.4.
|
81
|
+
rubocop-ast (1.4.1)
|
82
82
|
parser (>= 2.7.1.5)
|
83
|
-
rubocop-performance (1.
|
83
|
+
rubocop-performance (1.10.2)
|
84
84
|
rubocop (>= 0.90.0, < 2.0)
|
85
85
|
rubocop-ast (>= 0.4.0)
|
86
|
-
rubocop-rspec (2.
|
86
|
+
rubocop-rspec (2.2.0)
|
87
87
|
rubocop (~> 1.0)
|
88
88
|
rubocop-ast (>= 1.1.0)
|
89
89
|
ruby-progressbar (1.11.0)
|
@@ -97,7 +97,7 @@ GEM
|
|
97
97
|
simplecov-html (0.10.2)
|
98
98
|
simpleidn (0.2.1)
|
99
99
|
unf (~> 0.1.4)
|
100
|
-
thor (1.0
|
100
|
+
thor (1.1.0)
|
101
101
|
unf (0.1.4)
|
102
102
|
unf_ext
|
103
103
|
unf_ext (0.0.7.7)
|
@@ -108,19 +108,19 @@ PLATFORMS
|
|
108
108
|
|
109
109
|
DEPENDENCIES
|
110
110
|
bundler (~> 1.16)
|
111
|
-
bundler-audit (~> 0.
|
111
|
+
bundler-audit (~> 0.8.0)
|
112
112
|
dns_mock!
|
113
|
-
faker (~> 2.
|
114
|
-
fasterer (~> 0.
|
113
|
+
faker (~> 2.17)
|
114
|
+
fasterer (~> 0.9.0)
|
115
115
|
overcommit (~> 0.57.0)
|
116
116
|
pry-byebug (~> 3.9)
|
117
117
|
rake (~> 13.0, >= 13.0.3)
|
118
118
|
reek (~> 6.0, >= 6.0.3)
|
119
119
|
rspec (~> 3.10)
|
120
120
|
rspec-dns (~> 0.1.8)
|
121
|
-
rubocop (~> 1.
|
122
|
-
rubocop-performance (~> 1.
|
123
|
-
rubocop-rspec (~> 2.
|
121
|
+
rubocop (~> 1.11)
|
122
|
+
rubocop-performance (~> 1.10, >= 1.10.2)
|
123
|
+
rubocop-rspec (~> 2.2)
|
124
124
|
simplecov (~> 0.17.1)
|
125
125
|
|
126
126
|
BUNDLED WITH
|
data/README.md
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
[](https://codeclimate.com/github/mocktools/ruby-dns-mock/maintainability)
|
4
4
|
[](https://codeclimate.com/github/mocktools/ruby-dns-mock/test_coverage)
|
5
|
-
[](https://circleci.com/gh/mocktools/ruby-dns-mock/tree/master)
|
6
6
|
[](https://badge.fury.io/rb/dns_mock)
|
7
7
|
[](https://rubygems.org/gems/dns_mock)
|
8
8
|
[](LICENSE.txt)
|
@@ -16,6 +16,9 @@
|
|
16
16
|
- [Requirements](#requirements)
|
17
17
|
- [Installation](#installation)
|
18
18
|
- [Usage](#usage)
|
19
|
+
- [RSpec](#rspec)
|
20
|
+
- [DnsMock RSpec helper](#dnsmock-rspec-helper)
|
21
|
+
- [DnsMock RSpec interface](#dnsmock-rspec-interface)
|
19
22
|
- [Contributing](#contributing)
|
20
23
|
- [License](#license)
|
21
24
|
- [Code of Conduct](#code-of-conduct)
|
@@ -23,10 +26,6 @@
|
|
23
26
|
- [Versioning](#versioning)
|
24
27
|
- [Changelog](CHANGELOG.md)
|
25
28
|
|
26
|
-
## Requirements
|
27
|
-
|
28
|
-
Ruby MRI 2.5.0+
|
29
|
-
|
30
29
|
## Features
|
31
30
|
|
32
31
|
- Ability to mimic any DNS records (`A`, `AAAA`, `CNAME`, `MX`, `NS`, `PTR`, `SOA` and `TXT`)
|
@@ -35,6 +34,10 @@ Ruby MRI 2.5.0+
|
|
35
34
|
- Test framework agnostic (it's PORO, so you can use it outside of `RSpec`, `Test::Unit` or `MiniTest`)
|
36
35
|
- Simple and intuitive DSL
|
37
36
|
|
37
|
+
## Requirements
|
38
|
+
|
39
|
+
Ruby MRI 2.5.0+
|
40
|
+
|
38
41
|
## Installation
|
39
42
|
|
40
43
|
Add this line to your application's `Gemfile`:
|
@@ -56,13 +59,13 @@ Or install it yourself as:
|
|
56
59
|
## Usage
|
57
60
|
|
58
61
|
```ruby
|
59
|
-
# Example of mocked DNS records structure
|
62
|
+
# Example of mocked DNS records, please follow this data structure
|
60
63
|
records = {
|
61
64
|
'example.com' => {
|
62
65
|
a: %w[1.1.1.1 2.2.2.2],
|
63
66
|
aaaa: %w[2a00:1450:4001:81e::200e],
|
64
67
|
ns: %w[ns1.domain.com ns2.domain.com],
|
65
|
-
mx: %w[mx1.domain.com mx2.domain.com],
|
68
|
+
mx: %w[mx1.domain.com mx2.domain.com:50], # you can specify host(s) or host(s) with priority, use '.:0' for definition null MX record
|
66
69
|
txt: %w[txt_record_1 txt_record_2],
|
67
70
|
cname: 'some.domain.com',
|
68
71
|
soa: [
|
@@ -77,15 +80,17 @@ records = {
|
|
77
80
|
}
|
78
81
|
]
|
79
82
|
},
|
80
|
-
'1.
|
83
|
+
'1.2.3.4' => {
|
81
84
|
ptr: %w[domain_1.com domain_2.com]
|
82
85
|
}
|
83
86
|
}
|
84
87
|
|
85
|
-
# Main DnsMock interface
|
86
|
-
#
|
87
|
-
#
|
88
|
-
#
|
88
|
+
# Main DnsMock interface
|
89
|
+
# records:Hash, port:Integer, exception_if_not_found:Boolean
|
90
|
+
# are optional params. By default creates dns mock server with
|
91
|
+
# empty records. A free port for server will be randomly assigned
|
92
|
+
# in the range from 49152 to 65535, if record not found exception
|
93
|
+
# won't raises. Returns current dns mock server
|
89
94
|
dns_mock_server = DnsMock.start_server(records: records) # => DnsMock::Server instance
|
90
95
|
|
91
96
|
# returns current dns mock server port
|
@@ -108,6 +113,68 @@ DnsMock.running_servers # => [DnsMock::Server instance]
|
|
108
113
|
DnsMock.stop_running_servers! # => true
|
109
114
|
```
|
110
115
|
|
116
|
+
### RSpec
|
117
|
+
|
118
|
+
Require this either in your Gemfile or in RSpec's support scripts. So either:
|
119
|
+
|
120
|
+
```ruby
|
121
|
+
# Gemfile
|
122
|
+
group :test do
|
123
|
+
gem 'rspec'
|
124
|
+
gem 'dns_mock', require: 'dns_mock/test_framework/rspec'
|
125
|
+
end
|
126
|
+
```
|
127
|
+
|
128
|
+
or
|
129
|
+
|
130
|
+
```ruby
|
131
|
+
# spec/support/config/dns_mock.rb
|
132
|
+
require 'dns_mock/test_framework/rspec'
|
133
|
+
```
|
134
|
+
|
135
|
+
#### DnsMock RSpec helper
|
136
|
+
|
137
|
+
Just add `DnsMock::TestFramework::RSpec::Helper` if you wanna use shortcut `dns_mock_server` for DnsMock server instance into your `RSpec.describe` blocks:
|
138
|
+
|
139
|
+
```ruby
|
140
|
+
# spec/support/config/dns_mock.rb
|
141
|
+
RSpec.configure do |config|
|
142
|
+
config.include DnsMock::TestFramework::RSpec::Helper
|
143
|
+
end
|
144
|
+
```
|
145
|
+
|
146
|
+
```ruby
|
147
|
+
# your awesome first_a_record_spec.rb
|
148
|
+
RSpec.describe FirstARecord do
|
149
|
+
subject(:service) do
|
150
|
+
described_class.call(
|
151
|
+
hostname,
|
152
|
+
dns_gateway_host: 'localhost',
|
153
|
+
dns_gateway_port: dns_mock_server.port
|
154
|
+
)
|
155
|
+
end
|
156
|
+
|
157
|
+
let(:hostname) { 'example.com' }
|
158
|
+
let(:first_a_record) { '1.2.3.4' }
|
159
|
+
let(:records) { { hostname => { a: [first_a_record] } } }
|
160
|
+
|
161
|
+
before { dns_mock_server.assign_mocks(records) }
|
162
|
+
|
163
|
+
it { is_expected.to eq(first_a_record) }
|
164
|
+
end
|
165
|
+
```
|
166
|
+
|
167
|
+
#### DnsMock RSpec interface
|
168
|
+
|
169
|
+
If you won't use `DnsMock::TestFramework::RSpec::Helper` you can use `DnsMock::TestFramework::RSpec::Interface` directly instead:
|
170
|
+
|
171
|
+
```ruby
|
172
|
+
DnsMock::TestFramework::RSpec::Interface.start_server # creates and runs DnsMock server instance
|
173
|
+
DnsMock::TestFramework::RSpec::Interface.stop_server! # stops current DnsMock server instance
|
174
|
+
DnsMock::TestFramework::RSpec::Interface.reset_mocks! # resets mocks in current DnsMock server instance
|
175
|
+
DnsMock::TestFramework::RSpec::Interface.clear_server! # stops and clears current DnsMock server instance
|
176
|
+
```
|
177
|
+
|
111
178
|
## Contributing
|
112
179
|
|
113
180
|
Bug reports and pull requests are welcome on GitHub at https://github.com/mocktools/ruby-dns-mock. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct. Please check the [open tikets](https://github.com/mocktools/ruby-dns-mock/issues). Be shure to follow Contributor Code of Conduct below and our [Contributing Guidelines](CONTRIBUTING.md).
|
data/dns_mock.gemspec
CHANGED
@@ -32,17 +32,17 @@ Gem::Specification.new do |spec|
|
|
32
32
|
spec.require_paths = ['lib']
|
33
33
|
|
34
34
|
spec.add_development_dependency 'bundler', '~> 1.16'
|
35
|
-
spec.add_development_dependency 'bundler-audit', '~> 0.
|
36
|
-
spec.add_development_dependency 'faker', '~> 2.
|
37
|
-
spec.add_development_dependency 'fasterer', '~> 0.
|
35
|
+
spec.add_development_dependency 'bundler-audit', '~> 0.8.0'
|
36
|
+
spec.add_development_dependency 'faker', '~> 2.17'
|
37
|
+
spec.add_development_dependency 'fasterer', '~> 0.9.0'
|
38
38
|
spec.add_development_dependency 'overcommit', '~> 0.57.0'
|
39
39
|
spec.add_development_dependency 'pry-byebug', '~> 3.9'
|
40
40
|
spec.add_development_dependency 'rake', '~> 13.0', '>= 13.0.3'
|
41
41
|
spec.add_development_dependency 'reek', '~> 6.0', '>= 6.0.3'
|
42
42
|
spec.add_development_dependency 'rspec', '~> 3.10'
|
43
43
|
spec.add_development_dependency 'rspec-dns', '~> 0.1.8'
|
44
|
-
spec.add_development_dependency 'rubocop', '~> 1.
|
45
|
-
spec.add_development_dependency 'rubocop-performance', '~> 1.
|
46
|
-
spec.add_development_dependency 'rubocop-rspec', '~> 2.
|
44
|
+
spec.add_development_dependency 'rubocop', '~> 1.11'
|
45
|
+
spec.add_development_dependency 'rubocop-performance', '~> 1.10', '>= 1.10.2'
|
46
|
+
spec.add_development_dependency 'rubocop-rspec', '~> 2.2'
|
47
47
|
spec.add_development_dependency 'simplecov', '~> 0.17.1'
|
48
48
|
end
|
data/lib/dns_mock.rb
CHANGED
@@ -4,8 +4,8 @@ require_relative 'dns_mock/core'
|
|
4
4
|
|
5
5
|
module DnsMock
|
6
6
|
class << self
|
7
|
-
def start_server(server = DnsMock::Server, records: {}, port: nil)
|
8
|
-
server.new(records: records, port: port)
|
7
|
+
def start_server(server = DnsMock::Server, records: {}, port: nil, exception_if_not_found: false)
|
8
|
+
server.new(records: records, port: port, exception_if_not_found: exception_if_not_found)
|
9
9
|
end
|
10
10
|
|
11
11
|
def running_servers
|
@@ -4,18 +4,29 @@ module DnsMock
|
|
4
4
|
module Record
|
5
5
|
module Builder
|
6
6
|
class Mx < DnsMock::Record::Builder::Base
|
7
|
+
include DnsMock::Error::Helper
|
8
|
+
|
9
|
+
MX_RECORD_REGEX_PATTERN = /\A(.+):(\d+)|(.+)\z/.freeze
|
7
10
|
RECORD_PREFERENCE_STEP = 10
|
8
11
|
|
9
12
|
def build
|
10
13
|
records_data.map.with_index(1) do |record_data, record_preference|
|
14
|
+
record_data, custom_record_preference = parse_mx_record_data(record_data)
|
11
15
|
target_factory.new(
|
12
16
|
record_data: [
|
13
|
-
record_preference * DnsMock::Record::Builder::Mx::RECORD_PREFERENCE_STEP,
|
17
|
+
custom_record_preference&.to_i || record_preference * DnsMock::Record::Builder::Mx::RECORD_PREFERENCE_STEP,
|
14
18
|
record_data
|
15
19
|
]
|
16
20
|
).create
|
17
21
|
end
|
18
22
|
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def parse_mx_record_data(record_data)
|
27
|
+
raise_record_context_type_error(:mx, record_data, ::String)
|
28
|
+
record_data.scan(DnsMock::Record::Builder::Mx::MX_RECORD_REGEX_PATTERN).flatten.compact
|
29
|
+
end
|
19
30
|
end
|
20
31
|
end
|
21
32
|
end
|
@@ -8,8 +8,9 @@ module DnsMock
|
|
8
8
|
hash[::Resolv::DNS::Resource::IN.const_get(record_type.upcase)] = record_type
|
9
9
|
end.freeze
|
10
10
|
|
11
|
-
def initialize(records)
|
11
|
+
def initialize(records, exception_if_not_found)
|
12
12
|
@records = records
|
13
|
+
@exception_if_not_found = exception_if_not_found
|
13
14
|
end
|
14
15
|
|
15
16
|
def build(hostname, record_class)
|
@@ -19,13 +20,13 @@ module DnsMock
|
|
19
20
|
|
20
21
|
private
|
21
22
|
|
22
|
-
attr_reader :records, :hostname
|
23
|
+
attr_reader :records, :exception_if_not_found, :hostname
|
23
24
|
|
24
25
|
def record_by_type(record_class)
|
25
26
|
record_type = DnsMock::Response::Answer::REVERSE_TYPE_MAPPER[record_class]
|
26
27
|
found_records = records.dig(hostname.to_s, record_type)
|
27
|
-
raise DnsMock::Error::RecordNotFound.new(record_type, hostname) unless found_records
|
28
|
-
found_records
|
28
|
+
raise DnsMock::Error::RecordNotFound.new(record_type, hostname) unless found_records || !exception_if_not_found
|
29
|
+
Array(found_records)
|
29
30
|
end
|
30
31
|
end
|
31
32
|
end
|
@@ -3,8 +3,14 @@
|
|
3
3
|
module DnsMock
|
4
4
|
module Response
|
5
5
|
class Message
|
6
|
-
def initialize(
|
7
|
-
|
6
|
+
def initialize(
|
7
|
+
packet,
|
8
|
+
records,
|
9
|
+
exception_if_not_found,
|
10
|
+
dns_answer = DnsMock::Response::Answer,
|
11
|
+
dns_message = ::Resolv::DNS::Message
|
12
|
+
)
|
13
|
+
@dns_answer = dns_answer.new(records, exception_if_not_found)
|
8
14
|
@dns_message = dns_message.decode(packet)
|
9
15
|
end
|
10
16
|
|
data/lib/dns_mock/server.rb
CHANGED
@@ -15,13 +15,15 @@ module DnsMock
|
|
15
15
|
random_available_port = DnsMock::Server::RandomAvailablePort,
|
16
16
|
thread_class = ::Thread,
|
17
17
|
records: nil,
|
18
|
-
port: nil
|
18
|
+
port: nil,
|
19
|
+
exception_if_not_found: false
|
19
20
|
)
|
20
21
|
@socket = socket
|
21
22
|
@records_dictionary_builder = records_dictionary_builder
|
22
23
|
@thread_class = thread_class
|
23
24
|
@records = records_dictionary_builder.call(records || {})
|
24
25
|
@port = port || random_available_port.call
|
26
|
+
@exception_if_not_found = exception_if_not_found
|
25
27
|
prepare_server_thread
|
26
28
|
end
|
27
29
|
|
@@ -34,7 +36,7 @@ module DnsMock
|
|
34
36
|
break if packet.size.zero?
|
35
37
|
|
36
38
|
address, port = addr.values_at(3, 1)
|
37
|
-
socket.send(DnsMock::Response::Message.new(packet, records).as_binary_string, 0, address, port)
|
39
|
+
socket.send(DnsMock::Response::Message.new(packet, records, exception_if_not_found).as_binary_string, 0, address, port)
|
38
40
|
end
|
39
41
|
ensure
|
40
42
|
socket.close
|
@@ -63,7 +65,7 @@ module DnsMock
|
|
63
65
|
|
64
66
|
private
|
65
67
|
|
66
|
-
attr_reader :socket, :records_dictionary_builder, :thread_class
|
68
|
+
attr_reader :socket, :records_dictionary_builder, :thread_class, :exception_if_not_found
|
67
69
|
attr_accessor :records, :thread
|
68
70
|
|
69
71
|
def prepare_socket_for_session
|
@@ -6,7 +6,8 @@ module DnsMock
|
|
6
6
|
include DnsMock::Error::Helper
|
7
7
|
|
8
8
|
IP_ADDRESS_PATTERN = /\A((1\d|[1-9]|2[0-4])?\d|25[0-5])(\.\g<1>){3}\z/.freeze
|
9
|
-
|
9
|
+
IP_OCTET_GROUPS = /(\d+).(\d+).(\d+).(\d+)/.freeze
|
10
|
+
RDNS_LOOKUP_REPRESENTATION = '\4.\3.\2.\1.in-addr.arpa'
|
10
11
|
TYPE_MAPPER = DnsMock::AVAILABLE_DNS_RECORD_TYPES.zip(
|
11
12
|
[
|
12
13
|
[DnsMock::Record::Builder::A, DnsMock::Record::Factory::A, ::Array],
|
@@ -47,7 +48,10 @@ module DnsMock
|
|
47
48
|
def rdns_lookup_prefix(hostname)
|
48
49
|
return hostname unless hostname[DnsMock::Server::RecordsDictionaryBuilder::IP_ADDRESS_PATTERN]
|
49
50
|
|
50
|
-
|
51
|
+
hostname.gsub(
|
52
|
+
DnsMock::Server::RecordsDictionaryBuilder::IP_OCTET_GROUPS,
|
53
|
+
DnsMock::Server::RecordsDictionaryBuilder::RDNS_LOOKUP_REPRESENTATION
|
54
|
+
)
|
51
55
|
end
|
52
56
|
|
53
57
|
def build_records_instances_by_type(record_type, records_to_build)
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'rspec/core'
|
4
|
+
require_relative '../../dns_mock'
|
5
|
+
require_relative './rspec/interface'
|
6
|
+
require_relative './rspec/helper'
|
7
|
+
|
8
|
+
RSpec.configure do |config|
|
9
|
+
config.before(:suite) { DnsMock::TestFramework::RSpec::Interface.start_server }
|
10
|
+
config.after(:suite) { DnsMock::TestFramework::RSpec::Interface.stop_server! }
|
11
|
+
config.after { DnsMock::TestFramework::RSpec::Interface.reset_mocks! }
|
12
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative './interface'
|
4
|
+
|
5
|
+
module DnsMock
|
6
|
+
module TestFramework
|
7
|
+
module RSpec
|
8
|
+
module Helper
|
9
|
+
def dns_mock_server(**options)
|
10
|
+
DnsMock::TestFramework::RSpec::Interface.start_server(**options)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module DnsMock
|
4
|
+
module TestFramework
|
5
|
+
module RSpec
|
6
|
+
module Interface
|
7
|
+
class << self
|
8
|
+
def start_server(**options)
|
9
|
+
@dns_mock_server ||= DnsMock.start_server(**options) # rubocop:disable Naming/MemoizedInstanceVariableName
|
10
|
+
end
|
11
|
+
|
12
|
+
def stop_server!
|
13
|
+
return unless dns_mock_server
|
14
|
+
|
15
|
+
dns_mock_server.stop!
|
16
|
+
end
|
17
|
+
|
18
|
+
def reset_mocks!
|
19
|
+
return unless dns_mock_server
|
20
|
+
|
21
|
+
dns_mock_server.reset_mocks!
|
22
|
+
end
|
23
|
+
|
24
|
+
def clear_server!
|
25
|
+
@dns_mock_server = nil
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
attr_reader :dns_mock_server
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
data/lib/dns_mock/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dns_mock
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 1.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Vladislav Trotsenko
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-03-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -30,48 +30,42 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 0.
|
33
|
+
version: 0.8.0
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: 0.
|
40
|
+
version: 0.8.0
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: faker
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '2.
|
48
|
-
- - ">="
|
49
|
-
- !ruby/object:Gem::Version
|
50
|
-
version: 2.15.1
|
47
|
+
version: '2.17'
|
51
48
|
type: :development
|
52
49
|
prerelease: false
|
53
50
|
version_requirements: !ruby/object:Gem::Requirement
|
54
51
|
requirements:
|
55
52
|
- - "~>"
|
56
53
|
- !ruby/object:Gem::Version
|
57
|
-
version: '2.
|
58
|
-
- - ">="
|
59
|
-
- !ruby/object:Gem::Version
|
60
|
-
version: 2.15.1
|
54
|
+
version: '2.17'
|
61
55
|
- !ruby/object:Gem::Dependency
|
62
56
|
name: fasterer
|
63
57
|
requirement: !ruby/object:Gem::Requirement
|
64
58
|
requirements:
|
65
59
|
- - "~>"
|
66
60
|
- !ruby/object:Gem::Version
|
67
|
-
version: 0.
|
61
|
+
version: 0.9.0
|
68
62
|
type: :development
|
69
63
|
prerelease: false
|
70
64
|
version_requirements: !ruby/object:Gem::Requirement
|
71
65
|
requirements:
|
72
66
|
- - "~>"
|
73
67
|
- !ruby/object:Gem::Version
|
74
|
-
version: 0.
|
68
|
+
version: 0.9.0
|
75
69
|
- !ruby/object:Gem::Dependency
|
76
70
|
name: overcommit
|
77
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -174,54 +168,48 @@ dependencies:
|
|
174
168
|
requirements:
|
175
169
|
- - "~>"
|
176
170
|
- !ruby/object:Gem::Version
|
177
|
-
version: '1.
|
178
|
-
- - ">="
|
179
|
-
- !ruby/object:Gem::Version
|
180
|
-
version: 1.8.1
|
171
|
+
version: '1.11'
|
181
172
|
type: :development
|
182
173
|
prerelease: false
|
183
174
|
version_requirements: !ruby/object:Gem::Requirement
|
184
175
|
requirements:
|
185
176
|
- - "~>"
|
186
177
|
- !ruby/object:Gem::Version
|
187
|
-
version: '1.
|
188
|
-
- - ">="
|
189
|
-
- !ruby/object:Gem::Version
|
190
|
-
version: 1.8.1
|
178
|
+
version: '1.11'
|
191
179
|
- !ruby/object:Gem::Dependency
|
192
180
|
name: rubocop-performance
|
193
181
|
requirement: !ruby/object:Gem::Requirement
|
194
182
|
requirements:
|
195
183
|
- - "~>"
|
196
184
|
- !ruby/object:Gem::Version
|
197
|
-
version: '1.
|
185
|
+
version: '1.10'
|
198
186
|
- - ">="
|
199
187
|
- !ruby/object:Gem::Version
|
200
|
-
version: 1.
|
188
|
+
version: 1.10.2
|
201
189
|
type: :development
|
202
190
|
prerelease: false
|
203
191
|
version_requirements: !ruby/object:Gem::Requirement
|
204
192
|
requirements:
|
205
193
|
- - "~>"
|
206
194
|
- !ruby/object:Gem::Version
|
207
|
-
version: '1.
|
195
|
+
version: '1.10'
|
208
196
|
- - ">="
|
209
197
|
- !ruby/object:Gem::Version
|
210
|
-
version: 1.
|
198
|
+
version: 1.10.2
|
211
199
|
- !ruby/object:Gem::Dependency
|
212
200
|
name: rubocop-rspec
|
213
201
|
requirement: !ruby/object:Gem::Requirement
|
214
202
|
requirements:
|
215
203
|
- - "~>"
|
216
204
|
- !ruby/object:Gem::Version
|
217
|
-
version: '2.
|
205
|
+
version: '2.2'
|
218
206
|
type: :development
|
219
207
|
prerelease: false
|
220
208
|
version_requirements: !ruby/object:Gem::Requirement
|
221
209
|
requirements:
|
222
210
|
- - "~>"
|
223
211
|
- !ruby/object:Gem::Version
|
224
|
-
version: '2.
|
212
|
+
version: '2.2'
|
225
213
|
- !ruby/object:Gem::Dependency
|
226
214
|
name: simplecov
|
227
215
|
requirement: !ruby/object:Gem::Requirement
|
@@ -304,6 +292,9 @@ files:
|
|
304
292
|
- lib/dns_mock/server.rb
|
305
293
|
- lib/dns_mock/server/random_available_port.rb
|
306
294
|
- lib/dns_mock/server/records_dictionary_builder.rb
|
295
|
+
- lib/dns_mock/test_framework/rspec.rb
|
296
|
+
- lib/dns_mock/test_framework/rspec/helper.rb
|
297
|
+
- lib/dns_mock/test_framework/rspec/interface.rb
|
307
298
|
- lib/dns_mock/version.rb
|
308
299
|
homepage: https://github.com/mocktools/ruby-dns-mock
|
309
300
|
licenses:
|