pact-mock_service 0.2.3 → 0.2.4
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/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
|