rreplay 0.1.2 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5fa09716c0210241ba3b0d38a5e8dd75167753ccdb5b4912ad77ec80d78678d1
4
- data.tar.gz: '05909b0693720f9b62c3494e7d1de4ba71e908fea26f6aed85a5a052087ebce0'
3
+ metadata.gz: 14173bb308c83ce39166a267e8f1477616aa6f51b24fc68e2df4e9f9accfa292
4
+ data.tar.gz: d472b8bbe77689121115f7d40758ff2a9c928a22057771f3237a3b181fc396ef
5
5
  SHA512:
6
- metadata.gz: b23043a99ee9f017ceb21ffcd37e9e16269504bdd5ef8e0ac740d0802f5728f19fd124a6d9b1308b336f51c7768fc5ab51578deca922eea770140f2658464f44
7
- data.tar.gz: 43bcd20ae323b1c9f627daf9fca8d0b365712f5b30ca182252f9a221086e25449ecf7a6322ed6e228f79294657fefd8627fa1dd3ee51ab3068134030637bb87e
6
+ metadata.gz: 4ac669fe52af177b7f7133e9d842315137e361eb5c7875ff673f8e12f83a83b440a5523f61dc82c32e5ddc80ad7427c35511ae9109ce91ba9071bf8a6e5b24a5
7
+ data.tar.gz: e2dcf2b4772208628c4d8b63ffa194b1c93f10424f92bb7c2d3840b13ec0fb646273da8d48f09b486d38c7f3d5d96fd58ecfe58ab8c37aafe99770ab2a1733de
@@ -8,7 +8,15 @@ module Rreplay
8
8
  def out(&block)
9
9
  return unless @debug
10
10
 
11
- @logger.write("#{Time.now.iso8601} - #{block.call}\n")
11
+ msg = block.call.then do |msg|
12
+ case msg
13
+ when Hash
14
+ msg.merge({ time: Time.now.iso8601 }).to_json
15
+ else
16
+ "#{Time.now.iso8601} - #{block.call}"
17
+ end
18
+ end
19
+ @logger.write("#{msg}\n")
12
20
  end
13
21
  end
14
22
  end
@@ -9,47 +9,27 @@ require_relative './format'
9
9
  module Rreplay
10
10
  class ReplayRunner
11
11
  def initialize(endpoint, target, format: :msgpack, debug: false)
12
- @endpoint = endpoint
12
+ @http = Http.new(endpoint)
13
13
  @format = Rreplay::Format.of(format)
14
14
  @target = target
15
15
  @debugger = Debugger.new($stderr, debug)
16
16
  end
17
17
 
18
18
  def run
19
+ output = OutputBuilder.new(style: :json)
20
+
19
21
  file_names.each do |file_name|
20
22
  ::File.open(file_name) do |file|
21
- @debugger.out { "Open file: #{file_name}" }
23
+ @debugger.out { { message: "Open file: #{file_name}" } }
22
24
 
23
25
  file.each_line do |line|
24
26
  next if line.start_with?('#') # LogDevice's header
25
27
  line.chomp!
28
+ record = deserialize(line)
26
29
 
27
- begin
28
- record = @format.deserializer.call(line)
29
- rescue => e
30
- raise "Failed to deserialize. err = #{e.inspect}, line = #{line}", e
31
- end
32
- request = record["request"]
33
- result, response_time = http_call(request)
30
+ result = @http.call(record['request'])
34
31
  @debugger.out {
35
- response_json = {
36
- status: result.code,
37
- headers: record['response']['headers'].reduce({}) do |acc, (key, _)|
38
- acc.merge({key => result[key]})
39
- end,
40
- body: Array(result.body),
41
- }
42
- <<~EOF
43
- #{record['uuid']}:
44
- * request:
45
- #{request}
46
- * response(actual):
47
- #{response_time} sec
48
- #{response_json}
49
- * response(recorded):
50
- #{record['response_time']} sec
51
- #{record['response']}
52
- EOF
32
+ output.call(record, result)
53
33
  }
54
34
  end
55
35
  end
@@ -67,8 +47,83 @@ module Rreplay
67
47
  end
68
48
  end
69
49
 
50
+ def deserialize(line)
51
+ @format.deserializer.call(line)
52
+ rescue => e
53
+ raise "Failed to deserialize. err = #{e.inspect}, line = #{line}", e
54
+ end
55
+
56
+ end
57
+
58
+ private
59
+
60
+ class OutputBuilder
61
+ # @param style [Symbol] :json or :string
62
+ def initialize(style: :json)
63
+ @builder = case style
64
+ when :json
65
+ method(:build_json)
66
+ else
67
+ method(:build_string)
68
+ end
69
+ end
70
+
71
+ # @param record [Hash]
72
+ # @param result [Http::Result]
73
+ def call(record, result)
74
+ response_json = {
75
+ status: result.response.code,
76
+ headers: record['response']['headers'].reduce({}) do |acc, (key, _)|
77
+ acc.merge({key => result.response[key]})
78
+ end,
79
+ body: Array(result.response.body),
80
+ }
81
+
82
+ @builder.call(record, result.response_time, response_json)
83
+ end
84
+
85
+ private
86
+
87
+ def build_json(record, response_time, actual_response)
88
+ {
89
+ uuid: record['uuid'],
90
+ response: {
91
+ actual: {
92
+ response_time: response_time,
93
+ response: actual_response,
94
+ },
95
+ recorded: {
96
+ response_time: record['response_time'],
97
+ record: record['response'],
98
+ }
99
+ }
100
+ }
101
+ end
102
+
103
+ def build_string(record, response_time, actual_response)
104
+
105
+ <<~EOF
106
+ #{record['uuid']}:
107
+ * request:
108
+ #{record['request']}
109
+ * response(actual):
110
+ #{response_time} sec
111
+ #{actual_response}
112
+ * response(recorded):
113
+ #{record['response_time']} sec
114
+ #{record['response']}
115
+ EOF
116
+ end
117
+ end
118
+
119
+ class Http
120
+ Result = Struct.new(:response, :response_time)
70
121
 
71
- def http_call(orig_request)
122
+ def initialize(endpoint)
123
+ @endpoint = endpoint
124
+ end
125
+
126
+ def call(orig_request)
72
127
  uri = URI(::File.join(@endpoint, orig_request['path'], orig_request['query_strings']))
73
128
  body = orig_request['body']
74
129
  headers = orig_request['headers']
@@ -95,13 +150,10 @@ module Rreplay
95
150
 
96
151
  start_time = Time.now
97
152
  response = Net::HTTP.start(uri.hostname, uri.port,
98
- :use_ssl => uri.scheme == 'https') { |http|
153
+ :use_ssl => uri.scheme == 'https') { |http|
99
154
  http.request(request)
100
155
  }
101
- [response, Time.now - start_time]
156
+ Result.new(response, Time.now - start_time)
102
157
  end
103
- end
104
-
105
- private
106
-
158
+ end
107
159
  end
data/rreplay.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |spec|
2
2
  spec.name = "rreplay"
3
- spec.version = "0.1.2"
3
+ spec.version = "0.2.0"
4
4
  spec.authors = ["petitviolet"]
5
5
  spec.email = ["violethero0820@gmail.com"]
6
6
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rreplay
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - petitviolet
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-12-30 00:00:00.000000000 Z
11
+ date: 2019-12-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rack