pact-mock_service 0.2.3 → 0.2.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +8 -0
- data/lib/pact/consumer/app_manager.rb +23 -35
- data/lib/pact/consumer/mock_service/app.rb +11 -75
- data/lib/pact/consumer/mock_service/error_handler.rb +28 -0
- data/lib/pact/consumer/mock_service/index_get.rb +22 -0
- data/lib/pact/consumer/mock_service/interaction_delete.rb +3 -3
- data/lib/pact/consumer/mock_service/interaction_post.rb +2 -2
- data/lib/pact/consumer/mock_service/log_get.rb +2 -2
- data/lib/pact/consumer/mock_service/missing_interactions_get.rb +2 -3
- data/lib/pact/consumer/mock_service/mock_service_administration_endpoint.rb +11 -13
- data/lib/pact/consumer/mock_service/pact_post.rb +2 -2
- data/lib/pact/consumer/mock_service/request_handlers.rb +41 -0
- data/lib/pact/consumer/mock_service/verification_get.rb +2 -2
- data/lib/pact/consumer/mock_service.rb +41 -0
- data/lib/pact/consumer/server.rb +28 -7
- data/lib/pact/mock_service/cli/pidfile.rb +97 -0
- data/lib/pact/mock_service/cli.rb +109 -59
- data/lib/pact/mock_service/control_server/app.rb +42 -0
- data/lib/pact/mock_service/control_server/delegator.rb +55 -0
- data/lib/pact/mock_service/control_server/index.rb +25 -0
- data/lib/pact/mock_service/control_server/mock_service_creator.rb +34 -0
- data/lib/pact/mock_service/control_server/mock_services.rb +26 -0
- data/lib/pact/mock_service/control_server/require_pacticipant_headers.rb +20 -0
- data/lib/pact/mock_service/control_server/run.rb +68 -0
- data/lib/pact/mock_service/run.rb +81 -0
- data/lib/pact/mock_service/server/restart.rb +20 -0
- data/lib/pact/mock_service/server/spawn.rb +37 -0
- data/lib/pact/mock_service/server/wait_for_server_up.rb +35 -0
- data/lib/pact/mock_service/spawn.rb +68 -0
- data/lib/pact/mock_service/version.rb +1 -1
- metadata +18 -3
- data/lib/pact/consumer/mock_service/web_request_administration.rb +0 -27
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ebcb0082a273a588dcca76818918e469ad66fad1
|
4
|
+
data.tar.gz: 0555f3c7bc6f652577e3efb3f96967fd203437f5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ca2923d11a5d07fec5906ef98eb2300048d23247fff17efcbc99ea4c1706aec9f9116c346debaf8fdcbb19725ce36f5ce7719a4181764b71402d4d7298cb1155
|
7
|
+
data.tar.gz: 368e8f6e568cbf212f5c6e64009b9cd0caa7832979025091ccd7676853aa4e413b1631a8ec92805b58cf59d0881a9c0a9f844ac368771d0449ebbd76073880e7
|
data/CHANGELOG.md
CHANGED
@@ -2,6 +2,14 @@ Do this to generate your change history
|
|
2
2
|
|
3
3
|
git log --pretty=format:' * %h - %s (%an, %ad)'
|
4
4
|
|
5
|
+
### 0.2.4 (24 Jan 2015)
|
6
|
+
|
7
|
+
* b14050e - Add --ssl option for control server (Beth, Sat Jan 24 22:14:14 2015 +1100)
|
8
|
+
* a9821fd - Add --cors option to control command (Beth, Sat Jan 24 21:51:40 2015 +1100)
|
9
|
+
* 16d62c8 - Added endpoint to check if server is up and running without causing an error (Beth, Thu Jan 8 14:33:26 2015 +1100)
|
10
|
+
* f93ff1f - Added restart for control and mock service (Beth, Thu Jan 8 14:02:19 2015 +1100)
|
11
|
+
* 54b2cb8 - Added control server to allow mock servers to be dynamically set up (Beth, Wed Jan 7 08:24:19 2015 +1100)
|
12
|
+
|
5
13
|
### 0.2.3 (21 Jan 2015)
|
6
14
|
|
7
15
|
* 560671e - Add support for using Pact::Terms in the path (Beth, Wed Jan 21 07:42:10 2015 +1100)
|
@@ -6,7 +6,8 @@ require 'find_a_port'
|
|
6
6
|
require 'pact/logging'
|
7
7
|
require 'pact/consumer/server'
|
8
8
|
require 'singleton'
|
9
|
-
require 'pact/consumer/mock_service
|
9
|
+
require 'pact/consumer/mock_service'
|
10
|
+
require 'find_a_port'
|
10
11
|
|
11
12
|
module Pact
|
12
13
|
module Consumer
|
@@ -37,15 +38,6 @@ module Pact
|
|
37
38
|
port
|
38
39
|
end
|
39
40
|
|
40
|
-
def existing_app_on_port port
|
41
|
-
app_registration = @app_registrations.find { |app_registration| app_registration.port == port }
|
42
|
-
app_registration ? app_registration.app : nil
|
43
|
-
end
|
44
|
-
|
45
|
-
def app_registered_on?(port)
|
46
|
-
app_registrations.any? { |app_registration| app_registration.port == port }
|
47
|
-
end
|
48
|
-
|
49
41
|
def ports_of_mock_services
|
50
42
|
app_registrations.find_all(&:is_a_mock_service?).collect(&:port)
|
51
43
|
end
|
@@ -65,8 +57,21 @@ module Pact
|
|
65
57
|
@apps_spawned = true
|
66
58
|
end
|
67
59
|
|
60
|
+
def app_registered_on?(port)
|
61
|
+
app_registrations.any? { |app_registration| app_registration.port == port }
|
62
|
+
end
|
63
|
+
|
68
64
|
private
|
69
65
|
|
66
|
+
def existing_app_on_port port
|
67
|
+
app_registration = registration_on_port port
|
68
|
+
app_registration ? app_registration.app : nil
|
69
|
+
end
|
70
|
+
|
71
|
+
def registration_on_port port
|
72
|
+
@app_registrations.find { |app_registration| app_registration.port == port }
|
73
|
+
end
|
74
|
+
|
70
75
|
def pact_dir
|
71
76
|
Pact.configuration.pact_dir
|
72
77
|
end
|
@@ -106,22 +111,17 @@ module Pact
|
|
106
111
|
include Pact::Logging
|
107
112
|
attr_accessor :port
|
108
113
|
attr_accessor :app
|
109
|
-
attr_accessor :pid
|
110
114
|
|
111
115
|
def initialize opts
|
112
116
|
@max_wait = 10
|
113
117
|
@port = opts[:port]
|
114
|
-
@pid = opts[:pid]
|
115
118
|
@app = opts[:app]
|
119
|
+
@spawned = false
|
116
120
|
end
|
117
121
|
|
118
122
|
def kill
|
119
|
-
|
120
|
-
|
121
|
-
# Process.kill(9, pid)
|
122
|
-
# Process.wait(pid)
|
123
|
-
# self.pid = nil
|
124
|
-
self.pid = nil
|
123
|
+
logger.debug "Supposed to be stopping"
|
124
|
+
@spawned = false
|
125
125
|
end
|
126
126
|
|
127
127
|
def not_spawned?
|
@@ -129,7 +129,7 @@ module Pact
|
|
129
129
|
end
|
130
130
|
|
131
131
|
def spawned?
|
132
|
-
|
132
|
+
@spawned
|
133
133
|
end
|
134
134
|
|
135
135
|
def is_a_mock_service?
|
@@ -137,27 +137,15 @@ module Pact
|
|
137
137
|
end
|
138
138
|
|
139
139
|
def to_s
|
140
|
-
"#{app} on port #{port}"
|
140
|
+
"#{app} on port #{port}"
|
141
141
|
end
|
142
142
|
|
143
143
|
def spawn
|
144
144
|
logger.info "Starting app #{self}..."
|
145
|
-
Pact::Server.new(app, port).boot
|
146
|
-
|
147
|
-
logger.info "Started
|
148
|
-
end
|
149
|
-
|
150
|
-
def wait_until
|
151
|
-
waited = 0
|
152
|
-
wait_time = 0.1
|
153
|
-
while waited < @max_wait do
|
154
|
-
break if yield
|
155
|
-
sleep wait_time
|
156
|
-
waited += wait_time
|
157
|
-
raise "Waited longer than #{@max_wait} seconds" if waited >= @max_wait
|
158
|
-
end
|
145
|
+
@server = Pact::Server.new(app, port).boot
|
146
|
+
@spawned = true
|
147
|
+
logger.info "Started on port #{port}"
|
159
148
|
end
|
160
|
-
|
161
149
|
end
|
162
150
|
end
|
163
151
|
end
|
@@ -2,46 +2,17 @@ require 'rack'
|
|
2
2
|
require 'uri'
|
3
3
|
require 'json'
|
4
4
|
require 'logger'
|
5
|
-
require 'pact/consumer/request'
|
6
|
-
require 'pact/consumer/mock_service/expected_interactions'
|
7
|
-
require 'pact/consumer/mock_service/actual_interactions'
|
8
|
-
require 'pact/consumer/mock_service/verified_interactions'
|
9
|
-
require 'pact/consumer/mock_service/interaction_delete'
|
10
|
-
require 'pact/consumer/mock_service/interaction_post'
|
11
|
-
require 'pact/consumer/mock_service/interaction_replay'
|
12
|
-
require 'pact/consumer/mock_service/missing_interactions_get'
|
13
|
-
require 'pact/consumer/mock_service/verification_get'
|
14
|
-
require 'pact/consumer/mock_service/log_get'
|
15
|
-
require 'pact/consumer/mock_service/pact_post'
|
16
|
-
require 'pact/consumer/mock_service/options'
|
17
5
|
require 'pact/consumer/mock_service/cors_origin_header_middleware'
|
18
|
-
require 'pact/
|
6
|
+
require 'pact/consumer/mock_service/request_handlers'
|
19
7
|
|
20
8
|
module Pact
|
21
9
|
module Consumer
|
22
|
-
|
23
10
|
class MockService
|
24
|
-
|
25
|
-
def initialize options = {}
|
26
|
-
inner_app = InnerApp.new(options)
|
27
|
-
@app = CorsOriginHeaderMiddleware.new(inner_app, options[:cors_enabled])
|
28
|
-
end
|
29
|
-
|
30
|
-
def call env
|
31
|
-
@app.call env
|
32
|
-
end
|
33
|
-
|
34
|
-
def shutdown
|
35
|
-
@app.shutdown
|
36
|
-
end
|
37
|
-
|
38
|
-
class InnerApp
|
11
|
+
class App
|
39
12
|
|
40
13
|
def initialize options = {}
|
41
|
-
log_description = configure_logger options
|
42
|
-
|
43
14
|
@name = options.fetch(:name, "MockService")
|
44
|
-
|
15
|
+
@logger = options.fetch(:logger)
|
45
16
|
expected_interactions = ExpectedInteractions.new
|
46
17
|
actual_interactions = ActualInteractions.new
|
47
18
|
verified_interactions = VerifiedInteractions.new
|
@@ -52,33 +23,11 @@ module Pact
|
|
52
23
|
interactions: verified_interactions
|
53
24
|
}
|
54
25
|
|
55
|
-
@
|
56
|
-
Options.new(@name, @logger, options[:cors_enabled]),
|
57
|
-
MissingInteractionsGet.new(@name, @logger, expected_interactions, actual_interactions),
|
58
|
-
VerificationGet.new(@name, @logger, expected_interactions, actual_interactions, log_description),
|
59
|
-
InteractionPost.new(@name, @logger, expected_interactions, verified_interactions),
|
60
|
-
InteractionDelete.new(@name, @logger, expected_interactions, actual_interactions),
|
61
|
-
LogGet.new(@name, @logger),
|
62
|
-
PactPost.new(@name, @logger, verified_interactions, pact_dir, options[:consumer_contract_details]),
|
63
|
-
InteractionReplay.new(@name, @logger, expected_interactions, actual_interactions, verified_interactions, options[:cors_enabled])
|
64
|
-
]
|
26
|
+
@request_handlers = Pact::Consumer::MockService::RequestHandlers.new(@name, @logger, expected_interactions, actual_interactions, verified_interactions, options)
|
65
27
|
end
|
66
28
|
|
67
29
|
def call env
|
68
|
-
|
69
|
-
begin
|
70
|
-
relevant_handler = @handlers.detect { |handler| handler.match? env }
|
71
|
-
response = relevant_handler.respond(env)
|
72
|
-
rescue StandardError => e
|
73
|
-
@logger.error "Error ocurred in mock service: #{e.class} - #{e.message}"
|
74
|
-
@logger.error e.backtrace.join("\n")
|
75
|
-
response = [500, {'Content-Type' => 'application/json'}, [{message: e.message, backtrace: e.backtrace}.to_json]]
|
76
|
-
rescue Exception => e
|
77
|
-
@logger.error "Exception ocurred in mock service: #{e.class} - #{e.message}"
|
78
|
-
@logger.error e.backtrace.join("\n")
|
79
|
-
raise e
|
80
|
-
end
|
81
|
-
response
|
30
|
+
@request_handlers.call(env)
|
82
31
|
end
|
83
32
|
|
84
33
|
def shutdown
|
@@ -92,30 +41,17 @@ module Pact
|
|
92
41
|
consumer_contract_writer.write if consumer_contract_writer.can_write?
|
93
42
|
end
|
94
43
|
|
95
|
-
def configure_logger options
|
96
|
-
options = {log_file: $stdout}.merge options
|
97
|
-
log_stream = options[:log_file]
|
98
|
-
@logger = Logger.new log_stream
|
99
|
-
@logger.formatter = options[:log_formatter] if options[:log_formatter]
|
100
|
-
@logger.level = Pact.configuration.logger.level
|
101
|
-
|
102
|
-
if log_stream.is_a? File
|
103
|
-
File.absolute_path(log_stream).gsub(Dir.pwd + "/", '')
|
104
|
-
else
|
105
|
-
"standard out/err"
|
106
|
-
end
|
107
|
-
end
|
108
|
-
|
109
44
|
def to_s
|
110
45
|
"#{@name} #{super.to_s}"
|
111
46
|
end
|
112
47
|
|
113
|
-
|
114
|
-
def info message
|
115
|
-
$stdout.puts "\n#{message}"
|
116
|
-
end
|
117
|
-
end
|
48
|
+
end
|
118
49
|
|
50
|
+
# Can't write to a file in a TRAP, might deadlock
|
51
|
+
class StdoutLogger
|
52
|
+
def info message
|
53
|
+
$stdout.puts "\n#{message}"
|
54
|
+
end
|
119
55
|
end
|
120
56
|
end
|
121
57
|
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Pact
|
2
|
+
module Consumer
|
3
|
+
class MockService
|
4
|
+
class ErrorHandler
|
5
|
+
|
6
|
+
def initialize app, logger
|
7
|
+
@app = app
|
8
|
+
@logger = logger
|
9
|
+
end
|
10
|
+
|
11
|
+
def call env
|
12
|
+
begin
|
13
|
+
@app.call(env)
|
14
|
+
rescue StandardError => e
|
15
|
+
message = "Error ocurred in mock service: #{e.class} - #{e.message}"
|
16
|
+
@logger.error message
|
17
|
+
@logger.error e.backtrace.join("\n")
|
18
|
+
[500, {'Content-Type' => 'application/json'}, [{message: message, backtrace: e.backtrace}.to_json]]
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def shutdown
|
23
|
+
@app.shutdown
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'pact/consumer/mock_service/rack_request_helper'
|
2
|
+
require 'pact/consumer/mock_service/mock_service_administration_endpoint'
|
3
|
+
|
4
|
+
module Pact
|
5
|
+
module Consumer
|
6
|
+
|
7
|
+
class IndexGet < MockServiceAdministrationEndpoint
|
8
|
+
|
9
|
+
def request_path
|
10
|
+
''
|
11
|
+
end
|
12
|
+
|
13
|
+
def request_method
|
14
|
+
'GET'
|
15
|
+
end
|
16
|
+
|
17
|
+
def respond env
|
18
|
+
[200, {'Content-Type' => 'text/plain'}, ['Mock service running']]
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -1,10 +1,10 @@
|
|
1
1
|
require 'pact/consumer/mock_service/rack_request_helper'
|
2
|
-
require 'pact/consumer/mock_service/
|
2
|
+
require 'pact/consumer/mock_service/mock_service_administration_endpoint'
|
3
3
|
|
4
4
|
module Pact
|
5
5
|
module Consumer
|
6
6
|
|
7
|
-
class InteractionDelete <
|
7
|
+
class InteractionDelete < MockServiceAdministrationEndpoint
|
8
8
|
|
9
9
|
include RackRequestHelper
|
10
10
|
|
@@ -36,4 +36,4 @@ module Pact
|
|
36
36
|
end
|
37
37
|
end
|
38
38
|
end
|
39
|
-
end
|
39
|
+
end
|
@@ -1,10 +1,10 @@
|
|
1
|
-
require 'pact/consumer/mock_service/
|
1
|
+
require 'pact/consumer/mock_service/mock_service_administration_endpoint'
|
2
2
|
require 'pact/mock_service/interaction_decorator'
|
3
3
|
require 'pact/shared/json_differ'
|
4
4
|
|
5
5
|
module Pact
|
6
6
|
module Consumer
|
7
|
-
class InteractionPost <
|
7
|
+
class InteractionPost < MockServiceAdministrationEndpoint
|
8
8
|
|
9
9
|
def initialize name, logger, expected_interactions, verified_interactions
|
10
10
|
super name, logger
|
@@ -1,8 +1,8 @@
|
|
1
|
-
require 'pact/consumer/mock_service/
|
1
|
+
require 'pact/consumer/mock_service/mock_service_administration_endpoint'
|
2
2
|
|
3
3
|
module Pact
|
4
4
|
module Consumer
|
5
|
-
class LogGet <
|
5
|
+
class LogGet < MockServiceAdministrationEndpoint
|
6
6
|
|
7
7
|
include RackRequestHelper
|
8
8
|
|
@@ -1,10 +1,10 @@
|
|
1
|
-
require 'pact/consumer/mock_service/
|
1
|
+
require 'pact/consumer/mock_service/mock_service_administration_endpoint'
|
2
2
|
require 'pact/consumer/mock_service/verification'
|
3
3
|
|
4
4
|
module Pact
|
5
5
|
module Consumer
|
6
6
|
|
7
|
-
class MissingInteractionsGet <
|
7
|
+
class MissingInteractionsGet < MockServiceAdministrationEndpoint
|
8
8
|
include RackRequestHelper
|
9
9
|
|
10
10
|
def initialize name, logger, expected_interactions, actual_interactions
|
@@ -27,7 +27,6 @@ module Pact
|
|
27
27
|
logger.info "Number of missing interactions for mock \"#{name}\" = #{number_of_missing_interactions}"
|
28
28
|
[200, {}, [{size: number_of_missing_interactions}.to_json]]
|
29
29
|
end
|
30
|
-
|
31
30
|
end
|
32
31
|
end
|
33
32
|
end
|
@@ -13,29 +13,27 @@ module Pact
|
|
13
13
|
end
|
14
14
|
|
15
15
|
def match? env
|
16
|
-
(
|
16
|
+
has_mock_service_header?(env) && path_matches?(env) && method_matches?(env)
|
17
17
|
end
|
18
18
|
|
19
|
-
def
|
20
|
-
|
19
|
+
def has_mock_service_header? env
|
20
|
+
env['HTTP_X_PACT_MOCK_SERVICE']
|
21
21
|
end
|
22
22
|
|
23
|
-
def
|
24
|
-
|
23
|
+
def path_matches? env
|
24
|
+
env['PATH_INFO'].chomp("/") == request_path
|
25
25
|
end
|
26
26
|
|
27
|
-
|
28
|
-
|
29
|
-
def request_header_match? env
|
30
|
-
raise NotImplementedError
|
27
|
+
def method_matches? env
|
28
|
+
env['REQUEST_METHOD'] == request_method
|
31
29
|
end
|
32
30
|
|
33
|
-
def
|
34
|
-
|
31
|
+
def request_path
|
32
|
+
raise NotImplementedError
|
35
33
|
end
|
36
34
|
|
37
|
-
def
|
38
|
-
|
35
|
+
def request_method
|
36
|
+
raise NotImplementedError
|
39
37
|
end
|
40
38
|
end
|
41
39
|
end
|
@@ -1,9 +1,9 @@
|
|
1
|
+
require 'pact/consumer/mock_service/mock_service_administration_endpoint'
|
1
2
|
require 'pact/consumer_contract/consumer_contract_writer'
|
2
|
-
require 'pact/consumer/mock_service/web_request_administration'
|
3
3
|
|
4
4
|
module Pact
|
5
5
|
module Consumer
|
6
|
-
class PactPost <
|
6
|
+
class PactPost < MockServiceAdministrationEndpoint
|
7
7
|
|
8
8
|
attr_accessor :consumer_contract, :verified_interactions, :default_options
|
9
9
|
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'pact/consumer/mock_service/expected_interactions'
|
2
|
+
require 'pact/consumer/mock_service/actual_interactions'
|
3
|
+
require 'pact/consumer/mock_service/verified_interactions'
|
4
|
+
require 'pact/consumer/mock_service/interaction_delete'
|
5
|
+
require 'pact/consumer/mock_service/interaction_post'
|
6
|
+
require 'pact/consumer/mock_service/interaction_replay'
|
7
|
+
require 'pact/consumer/mock_service/missing_interactions_get'
|
8
|
+
require 'pact/consumer/mock_service/verification_get'
|
9
|
+
require 'pact/consumer/mock_service/log_get'
|
10
|
+
require 'pact/consumer/mock_service/pact_post'
|
11
|
+
require 'pact/consumer/mock_service/index_get'
|
12
|
+
require 'pact/consumer/mock_service/options'
|
13
|
+
require 'pact/consumer/request'
|
14
|
+
require 'pact/support'
|
15
|
+
|
16
|
+
module Pact
|
17
|
+
module Consumer
|
18
|
+
class MockService
|
19
|
+
class RequestHandlers
|
20
|
+
def initialize name, logger, expected_interactions, actual_interactions, verified_interactions, options
|
21
|
+
@handlers = [
|
22
|
+
Options.new(name, logger, options[:cors_enabled]),
|
23
|
+
MissingInteractionsGet.new(name, logger, expected_interactions, actual_interactions),
|
24
|
+
VerificationGet.new(name, logger, expected_interactions, actual_interactions, options[:log_description]),
|
25
|
+
InteractionPost.new(name, logger, expected_interactions, verified_interactions),
|
26
|
+
InteractionDelete.new(name, logger, expected_interactions, actual_interactions),
|
27
|
+
LogGet.new(name, logger),
|
28
|
+
PactPost.new(name, logger, verified_interactions, options[:pact_dir], options[:consumer_contract_details]),
|
29
|
+
IndexGet.new(name, logger),
|
30
|
+
InteractionReplay.new(name, logger, expected_interactions, actual_interactions, verified_interactions, options[:cors_enabled])
|
31
|
+
]
|
32
|
+
end
|
33
|
+
|
34
|
+
def call env
|
35
|
+
relevant_handler = @handlers.detect { |handler| handler.match? env }
|
36
|
+
response = relevant_handler.respond(env)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -1,8 +1,8 @@
|
|
1
|
-
require 'pact/consumer/mock_service/
|
1
|
+
require 'pact/consumer/mock_service/mock_service_administration_endpoint'
|
2
2
|
|
3
3
|
module Pact
|
4
4
|
module Consumer
|
5
|
-
class VerificationGet <
|
5
|
+
class VerificationGet < MockServiceAdministrationEndpoint
|
6
6
|
|
7
7
|
include RackRequestHelper
|
8
8
|
|
@@ -1,2 +1,43 @@
|
|
1
1
|
require 'pact/consumer/mock_service/app'
|
2
|
+
require 'pact/consumer/mock_service/error_handler'
|
2
3
|
|
4
|
+
module Pact
|
5
|
+
module Consumer
|
6
|
+
|
7
|
+
class MockService
|
8
|
+
|
9
|
+
def initialize options = {}
|
10
|
+
logger, log_description = configure_logger(options)
|
11
|
+
app_options = options.merge(logger: logger, log_description: log_description)
|
12
|
+
@app = Rack::Builder.app do
|
13
|
+
use ErrorHandler, logger
|
14
|
+
use CorsOriginHeaderMiddleware, options[:cors_enabled]
|
15
|
+
run App.new(app_options)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def call env
|
20
|
+
@app.call env
|
21
|
+
end
|
22
|
+
|
23
|
+
def shutdown
|
24
|
+
@app.shutdown
|
25
|
+
end
|
26
|
+
|
27
|
+
def configure_logger options
|
28
|
+
options = {log_file: $stdout}.merge options
|
29
|
+
log_stream = options[:log_file]
|
30
|
+
logger = Logger.new log_stream
|
31
|
+
logger.formatter = options[:log_formatter] if options[:log_formatter]
|
32
|
+
logger.level = Pact.configuration.logger.level
|
33
|
+
|
34
|
+
log_description = if log_stream.is_a? File
|
35
|
+
File.absolute_path(log_stream).gsub(Dir.pwd + "/", '')
|
36
|
+
else
|
37
|
+
"standard out/err"
|
38
|
+
end
|
39
|
+
return logger, log_description
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
data/lib/pact/consumer/server.rb
CHANGED
@@ -32,13 +32,14 @@ module Pact
|
|
32
32
|
end
|
33
33
|
end
|
34
34
|
|
35
|
-
attr_reader :app, :port
|
35
|
+
attr_reader :app, :port, :options
|
36
36
|
|
37
|
-
def initialize(app, port)
|
37
|
+
def initialize(app, port, options = {})
|
38
38
|
@app = app
|
39
39
|
@middleware = Middleware.new(@app)
|
40
|
-
@server_thread = nil
|
40
|
+
@server_thread = nil
|
41
41
|
@port = port
|
42
|
+
@options = options
|
42
43
|
end
|
43
44
|
|
44
45
|
def reset_error!
|
@@ -55,9 +56,7 @@ module Pact
|
|
55
56
|
|
56
57
|
def responsive?
|
57
58
|
return false if @server_thread && @server_thread.join(0)
|
58
|
-
|
59
|
-
res = Net::HTTP.start(host, @port) { |http| http.get('/__identify__') }
|
60
|
-
|
59
|
+
res = get_identity
|
61
60
|
if res.is_a?(Net::HTTPSuccess) or res.is_a?(Net::HTTPRedirection)
|
62
61
|
return res.body == @app.object_id.to_s
|
63
62
|
end
|
@@ -69,7 +68,29 @@ module Pact
|
|
69
68
|
|
70
69
|
def run_default_server(app, port)
|
71
70
|
require 'rack/handler/webrick'
|
72
|
-
Rack::Handler::WEBrick.run(app,
|
71
|
+
Rack::Handler::WEBrick.run(app, webrick_opts)
|
72
|
+
end
|
73
|
+
|
74
|
+
def get_identity
|
75
|
+
http = Net::HTTP.new host, @port
|
76
|
+
if options[:ssl]
|
77
|
+
http.use_ssl = true
|
78
|
+
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
79
|
+
end
|
80
|
+
http.get('/__identify__')
|
81
|
+
end
|
82
|
+
|
83
|
+
def webrick_opts
|
84
|
+
opts = {:Port => port, :AccessLog => [], :Logger => WEBrick::Log::new(nil, 0)}
|
85
|
+
opts.merge!(ssl_opts) if options[:ssl]
|
86
|
+
opts
|
87
|
+
end
|
88
|
+
|
89
|
+
def ssl_opts
|
90
|
+
{
|
91
|
+
:SSLEnable => true,
|
92
|
+
:SSLCertName => [ %w[CN localhost] ]
|
93
|
+
}
|
73
94
|
end
|
74
95
|
|
75
96
|
def boot
|