jtl 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: dd974352f7bbf4079cc561228f9c96cf4f4f807a
4
+ data.tar.gz: c68c4d052a055c16375c1d7f79e16acb84c2d024
5
+ SHA512:
6
+ metadata.gz: 0cc634cbea1c9afdcd2aee945ffc5369c1c41559fde2c8bbdf9ad7610ab57ec5c3f66dfd05fcad244a5a4a3ff6dc258ea6c389ad26f795b865dfa0d52d39b044
7
+ data.tar.gz: b1290bc9dbed290529a8ed201716c7c70725b197154d61e3054554f11eea359a8099a45213641777db7b0dc304efc2d5b92c47bb76431bc8db2e082ac91ac1a2
@@ -0,0 +1,21 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ test.rb
19
+ jmeter.jmx
20
+ jmeter.jtl
21
+ jmeter.log
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --require spec_helper
2
+ --colour
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in jtl.gemspec
4
+ gemspec
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 Genki Sugawara
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,42 @@
1
+ # jtl
2
+
3
+ Parse a default jtl file of [Apache JMeter](http://jmeter.apache.org/).
4
+
5
+ [![Gem Version](https://badge.fury.io/rb/jtl.png)](http://badge.fury.io/rb/jtl)
6
+ [![Build Status](https://drone.io/bitbucket.org/winebarrel/jtl/status.png)](https://drone.io/bitbucket.org/winebarrel/jtl/latest)
7
+
8
+ ## Installation
9
+
10
+ Add this line to your application's Gemfile:
11
+
12
+ gem 'jtl'
13
+
14
+ And then execute:
15
+
16
+ $ bundle
17
+
18
+ Or install it yourself as:
19
+
20
+ $ gem install jtl
21
+
22
+ ## Usage
23
+
24
+ ```ruby
25
+ require 'jtl'
26
+ require 'gruff'
27
+
28
+ jtl = Jtl.new('jmeter.jtl', 10_000)
29
+ # ~~~~~~~ interval: 10s (default: 1s)
30
+
31
+ g = Gruff::Line.new
32
+
33
+ g.title = 'elapsed (avg)'
34
+ marks = jtl.scale_marks.map {|i| i.strftime('%M:%S') }
35
+ g.labels = Hash[*(0...marks.length).zip(marks).flatten]
36
+
37
+ g.data :all, jtl.elapseds {|i| i.mean }
38
+ g.data :my_label1, jtl.elapseds.my_label1 {|i| i.mean }
39
+ g.data :my_label2, jtl.elapseds.my_label2 {|i| i.mean }
40
+
41
+ g.write('elapsed.png')
42
+ ```
@@ -0,0 +1,5 @@
1
+ require "bundler/gem_tasks"
2
+ require 'rspec/core/rake_task'
3
+
4
+ RSpec::Core::RakeTask.new('spec')
5
+ task :default => :spec
@@ -0,0 +1,26 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'jtl/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'jtl'
8
+ spec.version = Jtl::VERSION
9
+ spec.authors = ['Genki Sugawara']
10
+ spec.email = ['sgwr_dts@yahoo.co.jp']
11
+ spec.description = %q{Parse a default jtl file of Apache JMeter.}
12
+ spec.summary = %q{Parse a default jtl file of Apache JMeter.}
13
+ spec.homepage = 'https://bitbucket.org/winebarrel/jtl'
14
+ spec.license = 'MIT'
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ['lib']
20
+
21
+ spec.add_dependency 'simple_stats'
22
+ spec.add_dependency 'orderedhash'
23
+ spec.add_development_dependency 'bundler', '~> 1.3'
24
+ spec.add_development_dependency 'rake'
25
+ spec.add_development_dependency 'rspec', '~> 2.0'
26
+ end
@@ -0,0 +1,8 @@
1
+ require 'csv'
2
+ require 'forwardable'
3
+ require 'orderedhash'
4
+ require 'simple_stats'
5
+ require 'jtl/version'
6
+ require 'jtl/jtl'
7
+ require 'jtl/data_set'
8
+ require 'jtl/labeled_value'
@@ -0,0 +1,68 @@
1
+ class Jtl::DataSet
2
+ include Enumerable
3
+ extend Forwardable
4
+
5
+ def_delegators :@jtl, :scale_marks, :labels
6
+
7
+ def self.create(data_set, jtl)
8
+ obj = self.new(data_set, jtl)
9
+
10
+ if block_given?
11
+ obj.to_a.map {|i| yield(i) }
12
+ else
13
+ obj
14
+ end
15
+ end
16
+
17
+ def initialize(data_set, jtl)
18
+ @data_set = data_set
19
+ @jtl = jtl
20
+ end
21
+
22
+ def to_hash
23
+ hash = {}
24
+
25
+ @data_set.each do |mark, values|
26
+ values.each do |lv|
27
+ hash[lv.label] ||= {}
28
+ hash[lv.label][mark] ||= []
29
+ hash[lv.label][mark] << lv.value
30
+ end
31
+ end
32
+
33
+ return hash
34
+ end
35
+ alias inspect to_hash
36
+
37
+ def [](label, &block)
38
+ new_data_set = OrderedHash.new
39
+
40
+ @data_set.each do |mark, values|
41
+ new_data_set[mark] = values.select do |lv|
42
+ if label.kind_of?(Regexp)
43
+ lv.label =~ label
44
+ else
45
+ lv.label == label.to_s
46
+ end
47
+ end
48
+ end
49
+
50
+ self.class.create(new_data_set, @jtl, &block)
51
+ end
52
+
53
+ def each
54
+ @data_set.each do |mark, values|
55
+ yield(values.map {|lv| lv.value})
56
+ end
57
+ end
58
+
59
+ def method_missing(name, *args, &block)
60
+ if (ary = self.to_a).respond_to?(name)
61
+ ary.send(name, *args, &block)
62
+ elsif args.empty?
63
+ self[name.to_s, &block]
64
+ else
65
+ super
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,119 @@
1
+ class Jtl
2
+ attr_accessor :interval
3
+
4
+ COLUMNS = [
5
+ :time_stamp,
6
+ :elapsed,
7
+ :label,
8
+ :response_code,
9
+ :response_message,
10
+ :thread_name,
11
+ :data_type,
12
+ :success,
13
+ :bytes,
14
+ :latency,
15
+ ]
16
+
17
+ def initialize(path, interval = 1000)
18
+ path = path.path if path.kind_of?(File)
19
+ @jtl = CSV.read(path)
20
+ @interval = interval
21
+ end
22
+
23
+ def labels
24
+ @jtl.inject({}) {|r, i| r[label(i)] = true; r }.keys
25
+ end
26
+
27
+ def scale_marks
28
+ aggregate_rows.keys
29
+ end
30
+
31
+ def time_stamps(&block)
32
+ data_set = aggregate_by(:time_stamp) {|v| v.to_i }
33
+ DataSet.create(data_set, self, &block)
34
+ end
35
+
36
+ def elapseds(&block)
37
+ data_set = aggregate_by(:elapsed) {|v| v.to_i }
38
+ DataSet.create(data_set, self, &block)
39
+ end
40
+
41
+ def response_codes(&block)
42
+ data_set = aggregate_by(:response_code) {|v| v.to_i }
43
+ DataSet.create(data_set, self, &block)
44
+ end
45
+
46
+ def thread_names(&block)
47
+ data_set = aggregate_by(:thread_name)
48
+ DataSet.create(data_set, self, &block)
49
+ end
50
+
51
+ def response_messages(&block)
52
+ data_set = aggregate_by(:response_message)
53
+ DataSet.create(data_set, self, &block)
54
+ end
55
+
56
+ def data_types(&block)
57
+ data_set = aggregate_by(:data_type)
58
+ DataSet.create(data_set, self, &block)
59
+ end
60
+
61
+ def successes(&block)
62
+ data_set = aggregate_by(:success) {|v| v == 'true' }
63
+ DataSet.create(data_set, self, &block)
64
+ end
65
+
66
+ def bytes(&block)
67
+ data_set = aggregate_by(:bytes) {|v| v.to_i }
68
+ DataSet.create(data_set, self, &block)
69
+ end
70
+
71
+ def latencies(&block)
72
+ data_set = aggregate_by(:latency) {|v| v.to_i }
73
+ DataSet.create(data_set, self, &block)
74
+ end
75
+
76
+ private
77
+
78
+ def aggregate_by(column)
79
+ idx = COLUMNS.index(column)
80
+ aggregated = OrderedHash.new
81
+
82
+ aggregate_rows.each do |mark, rows|
83
+ aggregated[mark] = rows.map do |row|
84
+ value = row[idx]
85
+ value = yield(value) if block_given?
86
+ LabeledValue.new(label(row), value)
87
+ end
88
+ end
89
+
90
+ return aggregated
91
+ end
92
+
93
+ def aggregate_rows
94
+ aggregated = OrderedHash.new
95
+
96
+ @jtl.each do |row|
97
+ ts = row[0].to_i
98
+ ts = ts - (ts % @interval)
99
+ ts = parse_time_stamp(ts)
100
+
101
+ aggregated[ts] ||= []
102
+ aggregated[ts] << row
103
+ end
104
+
105
+ return aggregated
106
+ end
107
+
108
+ def parse_time_stamp(ts)
109
+ ts = ts.to_i
110
+ msec = (ts % 1000)
111
+ ts = ((ts - msec) / 1000).to_i
112
+ Time.at(ts, msec * 1000)
113
+ end
114
+
115
+ def label(row)
116
+ @label_index = COLUMNS.index(:label) unless @label_index
117
+ row[@label_index]
118
+ end
119
+ end
@@ -0,0 +1,9 @@
1
+ class Jtl::LabeledValue
2
+ attr_reader :label
3
+ attr_reader :value
4
+
5
+ def initialize(label, value)
6
+ @label = label
7
+ @value = value
8
+ end
9
+ end
@@ -0,0 +1,3 @@
1
+ class Jtl
2
+ VERSION = '0.1.0'
3
+ end
@@ -0,0 +1,120 @@
1
+ describe Jtl do
2
+ let(:jtl_path) do
3
+ File.expand_path('../test.jtl', __FILE__)
4
+ end
5
+
6
+ let(:jtl_range) do
7
+ 1390719751491..1390719811195
8
+ end
9
+
10
+ let(:jtl_elapseds) do
11
+ [[458, 324, 177], [164, 165, 156, 158, 163, 332, 158, 158, 163, 151, 159, 166, 172, 169, 329, 168, 169], [159, 155, 158, 158, 159, 160, 160, 161, 177, 156, 159, 157, 326, 158, 165, 164, 166, 158, 156, 156, 156, 159, 159, 155, 156, 155, 158, 169, 335], [169, 155, 164, 165, 169, 229, 162, 160, 159, 159, 165, 167, 162, 165, 154, 166, 161, 352, 160, 172, 170, 166, 159, 160, 173, 158, 160, 160, 162, 159, 162, 167, 192, 164, 166, 166, 159, 178, 275, 163, 170], [164, 164, 164, 165, 165, 161, 169, 167, 169, 170, 170, 170, 164, 156, 178, 177, 159, 160, 160, 161, 177, 310, 177, 164, 163, 172, 171, 172, 172, 161, 160, 165, 167, 170, 167, 169, 169, 169, 168, 169, 178, 170, 169, 166, 168, 169, 169, 168, 313, 178, 202, 176, 177], [170, 168, 168, 170, 159, 160, 156, 172, 170, 171, 157, 157, 158, 162, 171, 169, 170, 184, 163, 166, 166, 162, 168, 169, 175, 173, 171, 177, 174, 183, 163, 163, 163, 163, 174, 175, 176, 167, 172, 171, 168, 175, 175, 175, 177, 177, 176, 177, 172, 171, 169, 167, 167, 169, 165, 166, 170], [161, 163, 166, 167, 183, 183, 184, 197, 197, 196, 161, 171, 161, 174, 161, 161, 161, 180, 184, 185, 160, 159, 182, 181, 160, 160, 160, 162, 164, 164, 166, 167, 159, 161, 162, 164, 166, 172, 172, 181, 181, 164, 158, 166, 166, 167, 165, 170, 180, 172, 178, 177, 168, 164, 169, 170, 188], [157, 161, 163, 169, 170, 171, 183, 179, 159, 181, 173, 162, 164, 168, 167, 180, 162, 163, 164, 163, 157, 157, 160, 160, 172, 157, 162, 158, 157, 159, 160, 175, 178, 158, 161, 169, 169, 167, 169, 167, 164, 163, 173, 177, 178, 169, 169, 170, 169, 170, 163, 158, 161, 162, 189, 189, 191, 187, 189, 190, 172], [174, 178, 177, 191, 190, 192, 196, 196, 196, 167, 164, 168, 178, 173, 172, 172, 167, 168, 168, 171, 189, 158, 167, 172, 171, 172, 184, 185, 189, 170, 183, 174, 161, 174, 173, 173, 164, 166, 175, 162, 160, 160, 158, 178, 178, 179, 176, 176, 182, 158, 171, 170, 165, 168, 167, 181, 180, 162, 180], [155, 167, 166, 168, 180, 180, 177, 177, 179, 161, 196, 169, 168, 170, 165, 165, 166, 166, 185, 171, 188, 156, 157, 169, 166, 169, 159, 173, 175, 190, 162, 178, 194, 195, 163, 162, 160, 161, 180, 180, 182, 182, 197, 205, 163, 162, 174, 163, 165, 171, 175, 173, 157, 159, 159, 159, 159, 166], [156, 173, 172, 172, 172, 162, 159, 160, 155, 162, 164, 163, 163, 163, 175, 175, 170, 165, 173, 156, 176, 167, 166, 177, 165, 168, 163, 163, 165, 165, 158, 160, 162, 158, 166, 166, 155, 163, 164, 160, 160, 166, 161, 166, 168, 166, 165, 157, 163, 165, 160, 169, 168, 170, 163, 168, 169, 169, 160, 160], [163, 160, 161, 163, 170, 174, 159, 159, 158, 160, 165, 165, 164, 162, 165, 165, 158, 162, 161, 164, 161, 163, 163, 162, 167, 168, 176, 176, 176, 177, 168, 158, 159, 158, 170, 170, 159, 160, 159, 163, 164, 159, 159, 159, 176, 176, 161, 162, 163, 162, 160, 176, 176, 175, 178, 180, 179, 177, 178, 181], [166, 163, 163, 164, 162, 154, 158, 158, 169, 158, 184, 158, 167, 168, 168, 186, 188, 185, 189, 185, 167, 173, 166, 165, 170, 161, 159, 164, 161, 164, 162, 162, 157, 158, 160, 160, 160, 164, 164, 167, 158, 159, 167, 169, 175, 159, 167, 168, 164, 163, 166, 164, 167, 172, 170, 176, 173, 176, 176, 180], [169, 168, 164, 175, 162, 158, 157, 170, 163, 165, 160, 160, 162, 155, 154, 151, 154, 155, 157, 158, 163, 164, 164, 171, 160, 155, 157, 166, 166, 171, 174, 177, 177, 155, 157, 156, 153, 171, 172, 168, 171, 179, 180, 182, 158, 169, 167, 169, 170, 164, 163, 155, 155, 158, 159, 154, 156, 162, 169, 169], [158, 154, 159, 160, 161, 155, 160, 162, 169, 165, 168, 161, 169, 171, 167, 177, 178, 180, 179, 182, 168, 175, 180, 183, 159, 173, 173, 167, 167, 170, 158, 164, 183, 168, 186, 163, 162, 171, 168, 165, 169, 157, 175, 179, 180, 160, 165, 168, 173, 195, 163, 162, 198, 206, 215, 215, 219, 164, 163], [161, 159, 160, 169, 163, 174, 164, 173, 166, 163, 158, 162, 163, 181, 177, 181, 160, 184, 180, 162, 159, 156, 157, 162, 166, 167, 167, 171, 171, 172, 166, 183, 183, 176, 176, 186, 183, 189, 187, 186, 180, 161, 163, 155, 157, 155, 157, 169, 168, 163, 173, 163, 161, 195, 192, 186, 176, 175, 195, 180, 187], [165, 177, 172, 166, 171, 183, 184, 176, 186, 189, 206, 201, 160, 169, 170, 176, 182, 187, 185, 182, 170, 178, 165, 169, 169, 166, 152, 157, 158, 154, 154, 157, 159, 171, 182, 180, 179, 179, 167, 162, 164, 164, 161, 174, 178, 180, 182, 179, 172, 184, 172, 175, 159], [168, 159, 158, 161, 160, 161, 161, 163, 163, 168, 168, 164, 164, 174, 175, 174, 173, 174, 171, 161, 155, 158, 158, 153, 166, 163, 165, 168, 167, 163, 159, 160, 161, 157, 156, 158, 158, 161, 163, 166, 162, 169, 165, 169, 164, 160, 160, 167, 178, 164, 169, 162, 170, 164, 173, 163, 166, 163, 174, 165], [157, 158, 162, 165, 163, 167, 168, 175, 172, 162, 155, 161, 156, 169, 170, 173, 173, 162, 178, 167, 158, 162, 154, 162, 166, 160, 160, 162, 168, 171, 170, 189, 188, 165, 166, 167, 170, 171, 167, 165, 162, 163, 184, 179, 178, 175, 183, 175, 172, 172, 163, 174, 156, 160, 187, 189, 192, 192, 168, 160, 147], [160, 154, 158, 164, 162, 160, 165, 165, 157, 168, 173, 186, 194, 169, 180, 179, 171, 162, 160, 178, 172, 163, 159, 158, 171, 172, 175, 182, 171, 162, 160, 161, 164, 156, 178, 167, 179, 169, 161, 168, 159, 157, 156, 156, 156, 157, 163, 173, 172, 168, 161, 169, 161, 170, 154, 164, 168, 171, 187, 157], [172, 174, 175, 174, 158, 166, 165, 167, 175, 170, 167, 169, 192, 186, 173, 155, 159, 166, 170, 172, 188, 191, 229, 230, 229, 230, 208, 199, 166, 173, 161, 167, 167, 168, 166, 169, 173, 190, 192, 188, 161, 168, 163, 176, 182, 186, 174, 174, 175, 178, 216, 206, 166, 162, 168, 162, 163], [156, 162, 163, 172, 179, 164, 161, 165, 186, 186, 173, 194, 179, 184, 185, 168, 156, 180, 206, 207, 212, 225, 220, 209, 205, 207, 210, 165, 160, 155, 166, 164, 168, 155, 162, 168, 168, 179, 158, 157, 172, 176, 172, 158, 166, 157, 163, 163, 164, 167, 172, 180, 189, 173, 173, 180], [174, 175, 165, 165, 168, 181, 170, 161, 164, 156, 154, 158, 159, 167, 167, 168, 169, 170, 166, 167, 164, 176, 178, 179, 167, 168, 167, 157, 170, 160, 167, 160, 156, 158, 160, 160, 162, 162, 161, 173, 162, 168, 178, 177, 169, 171, 172, 166, 167, 160, 162, 165, 163, 167, 161, 168, 166, 172, 172, 171, 173], [159, 160, 165, 168, 161, 172, 178, 181, 175, 185, 174, 173, 170, 159, 171, 160, 158, 159, 159, 159, 165, 155, 154, 162, 169, 170, 180, 180, 183, 169, 171, 174, 173, 164, 162, 163, 158, 161, 163, 160, 160, 156, 162, 173, 165, 168, 153, 166, 163, 163, 171, 160, 158, 170, 165, 168, 166], [165, 166, 167, 167, 167, 168, 165, 159, 160, 164, 166, 166, 173, 177, 180, 180, 157, 161, 162, 173, 159, 162, 165, 165, 165, 165, 161, 164, 167, 157, 158, 157, 159, 157, 155, 155, 166, 164, 166, 157, 156, 157, 162, 164, 167, 170, 156, 170, 169, 166, 168, 170, 157, 165, 159, 159, 166, 181, 180, 157, 166, 166], [158, 154, 157, 159, 168, 160, 161, 165, 154, 155, 168, 168, 168, 167, 161, 170, 170, 174, 178, 176, 161, 161, 162, 165, 164, 169, 170, 171, 163, 165, 151, 165, 158, 159, 163, 168, 168, 190, 190, 192, 190, 191, 199, 201, 159, 164, 171, 171, 178, 177, 190, 197, 198, 199, 189, 161, 161], [159, 157, 157, 166, 162, 159, 160, 161, 165, 160, 160, 164, 175, 157, 157, 159, 158, 161, 173, 178, 163, 154, 161, 163, 165, 155, 154, 155, 179, 181, 154, 157, 155, 156, 154, 156, 158, 166, 162, 162, 168, 177, 157, 158, 173, 159, 170, 166, 183, 185, 154, 162, 160, 158, 166, 170, 158, 162, 168, 164, 157, 161, 169, 165], [157, 159, 163, 156, 164, 164, 153, 156, 160, 173, 160, 164, 167, 169, 167, 169, 167, 159, 162, 155, 159, 158, 161, 169, 163, 167, 169, 163, 159, 158, 153, 158, 230, 222, 162, 148, 163, 163, 164, 163, 165, 167, 168, 168, 160, 174, 179, 181, 168, 163, 176, 172, 169, 172, 164, 169, 165, 163, 160, 163, 171, 173], [173, 184, 158, 166, 160, 168, 161, 170, 162, 165, 160, 164, 169, 166, 164, 166, 166, 164, 157, 164, 169, 169, 169, 163, 164, 161, 162, 164, 163, 164, 168, 164, 174, 157, 157, 157, 168, 168, 160, 163, 158, 156, 154, 161, 163, 164, 157, 163, 166, 169, 156, 165, 163, 165, 166, 162, 160, 193, 163, 163], [168, 170, 158, 159, 157, 164, 172, 168, 173, 175, 163, 163, 175, 182, 181, 167, 171, 172, 169, 171, 167, 169, 165, 163, 162, 166, 156, 161, 176, 173, 158, 158, 156, 157, 157, 155, 158, 160, 162, 162, 158, 159, 157, 157, 156, 163, 165, 158, 174, 176, 171, 171, 159, 159, 170, 162, 162, 191, 170, 172], [162, 164, 148, 161, 155, 156, 158, 165, 161, 161, 168, 170, 168, 150, 168, 172, 168, 166, 163, 170, 159, 160, 161, 162, 161, 160, 163, 170, 159, 156, 174, 178, 176, 177, 169, 172, 170, 159, 165, 164, 163, 164, 164, 165, 165, 172, 170, 168, 154, 157, 173, 173, 173, 177, 160, 159, 164, 166, 166, 169], [162, 162, 161, 163, 160, 158, 190, 166, 161, 164, 161, 164, 163, 167, 157, 158, 156, 164, 161, 162, 157, 166, 165, 165, 170, 163, 157, 156, 156, 158, 169, 157, 158, 160, 163, 164, 161, 165, 164, 175, 156, 154, 158, 163, 164, 163, 161, 184, 180, 184, 186, 189, 174, 173, 175, 194, 171, 154, 154, 157], [166, 167, 169, 166, 168, 153, 170, 161, 159, 163, 158, 162, 159, 161, 159, 163, 178, 157, 163, 163, 179, 181, 180, 180, 178, 182, 162, 169, 168, 173, 163, 162, 167, 167, 168, 185, 159, 192, 161, 163, 161, 161, 167, 164, 166, 166, 169, 169, 165, 168, 158, 167, 163, 163, 165, 151, 168, 169, 172, 175], [158, 159, 158, 162, 166, 165, 177, 184, 184, 169, 159, 165, 169, 160, 161, 167, 154, 178, 194, 197, 168, 216, 220, 222, 220, 205, 291, 417, 429, 429, 381, 318, 315, 313, 312, 195, 314, 160, 165, 167, 181, 205, 207, 197, 203, 202, 204], [158, 177, 171, 159, 166, 173, 165, 171, 178, 178, 162, 159, 160, 171, 167, 167, 166, 169, 176, 174, 169, 164, 165, 165, 165, 166, 166, 167, 158, 159, 170, 165, 167, 165, 161, 164, 168, 170, 180, 181, 176, 161, 163, 157, 156, 158, 155, 160, 166, 166, 160, 167, 162, 169, 153, 164, 169, 166, 158, 161], [162, 157, 158, 161, 159, 180, 187, 190, 173, 173, 183, 166, 169, 174, 161, 163, 172, 176, 174, 176, 176, 159, 158, 163, 155, 159, 161, 161, 160, 164, 180, 172, 176, 167, 175, 158, 156, 158, 161, 160, 159, 159, 160, 160, 160, 168, 156, 160, 160, 165, 178, 175, 178, 175, 178, 165, 157, 162, 163, 179], [167, 176, 175, 179, 179, 158, 156, 160, 153, 161, 155, 161, 164, 165, 163, 154, 165, 166, 160, 165, 161, 171, 169, 172, 173, 177, 162, 161, 160, 158, 169, 164, 172, 172, 177, 177, 186, 198, 199, 173, 160, 181, 175, 175, 176, 177, 210, 197, 195, 200, 169, 198, 197, 204, 208, 209], [174, 184, 187, 187, 153, 172, 164, 167, 169, 184, 155, 159, 161, 159, 162, 161, 162, 163, 160, 166, 162, 158, 165, 168, 159, 156, 158, 157, 160, 175, 164, 156, 167, 174, 156, 165, 165, 164, 159, 166, 165, 177, 158, 184, 220, 150, 166, 166, 164, 167, 161, 164, 155, 161, 177, 168, 153, 155, 157, 156], [163, 173, 173, 167, 160, 157, 158, 167, 173, 173, 158, 169, 172, 165, 205, 235, 214, 218, 224, 224, 218, 199, 199, 180, 171, 162, 167, 164, 168, 176, 190, 184, 190, 178, 162, 165, 163, 165, 169, 164, 159, 160, 177, 181, 162, 173, 174, 173, 173, 160, 155, 157, 173, 184, 175], [173, 177, 177, 197, 203, 205, 206, 180, 171, 178, 159, 164, 161, 164, 171, 170, 167, 169, 167, 162, 167, 167, 167, 166, 168, 168, 168, 169, 172, 171, 160, 158, 165, 166, 167, 161, 171, 164, 165, 159, 164, 174, 174, 165, 165, 159, 159, 165, 166, 167, 158, 155, 171, 165, 165, 170, 177, 179, 182, 171], [162, 163, 178, 165, 164, 168, 168, 163, 166, 161, 167, 156, 159, 154, 154, 166, 156, 162, 165, 163, 159, 170, 164, 158, 160, 160, 156, 167, 167, 174, 185, 187, 161, 162, 161, 152, 177, 176, 183, 157, 169, 169, 156, 158, 156, 163, 169, 163, 162, 167, 161, 161, 154, 161, 160, 154, 175, 171, 160, 172], [173, 174, 180, 180, 181, 180, 164, 164, 166, 176, 159, 161, 159, 160, 162, 167, 160, 171, 169, 173, 159, 160, 161, 163, 164, 157, 168, 171, 189, 187, 161, 168, 166, 165, 166, 170, 163, 161, 176, 175, 155, 159, 168, 168, 169, 167, 157, 169, 163, 173, 174, 161, 162, 162, 163, 171, 168, 166], [155, 154, 157, 160, 156, 167, 164, 159, 195, 167, 160, 164, 167, 178, 199, 199, 201, 202, 170, 162, 179, 163, 159, 162, 164, 160, 160, 167, 161, 163, 155, 157, 161, 160, 169, 167, 169, 192, 177, 164, 166, 168, 187, 172, 162, 168, 166, 163, 165, 179, 177, 176, 168, 160, 170, 170, 166, 158, 180, 168, 171], [162, 168, 169, 178, 178, 177, 165, 167, 161, 161, 162, 166, 157, 157, 160, 165, 163, 174, 155, 155, 167, 168, 168, 165, 168, 165, 165, 171, 167, 182, 165, 174, 170, 162, 161, 162, 167, 158, 159, 176, 184, 186, 185, 166, 173, 167, 156, 172, 176, 162, 183, 179, 222, 218, 177, 176, 173, 164, 161], [162, 171, 169, 171, 170, 173, 174, 177, 159, 160, 159, 169, 155, 156, 164, 164, 163, 170, 159, 164, 161, 178, 159, 161, 158, 159, 233, 185, 227, 191, 175, 154, 158, 156, 164, 161, 165, 169, 169, 180, 182, 148, 160, 154, 158, 155, 164, 154, 154, 157, 163, 161, 161, 165, 169, 165, 157, 166, 168, 167, 165], [155, 158, 163, 171, 172, 159, 158, 164, 158, 169, 157, 156, 158, 173, 171, 162, 156, 167, 166, 170, 156, 156, 173, 174, 178, 157, 154, 157, 157, 185, 185, 183, 169, 168, 170, 157, 164, 160, 162, 165, 167, 170, 165, 168, 164, 167, 160, 160, 163, 164, 166, 166, 157, 168, 168, 163, 158, 161, 160], [164, 166, 170, 161, 173, 175, 168, 168, 169, 171, 160, 160, 159, 153, 163, 166, 153, 159, 161, 169, 160, 159, 162, 164, 169, 169, 167, 161, 157, 157, 156, 156, 156, 164, 164, 160, 163, 159, 160, 161, 159, 162, 159, 157, 165, 168, 168, 169, 160, 163, 162, 165, 159, 159, 159, 160, 161, 163, 158, 157, 165, 166, 168, 166], [160, 166, 166, 167, 155, 154, 161, 163, 164, 162, 169, 168, 168, 159, 168, 173, 159, 159, 159, 162, 165, 164, 164, 165, 166, 180, 160, 160, 160, 162, 156, 165, 171, 174, 175, 162, 167, 169, 169, 167, 173, 162, 155, 155, 159, 153, 161, 160, 163, 166, 154, 159, 158, 160, 159, 160, 165, 164, 169, 170], [158, 155, 157, 161, 159, 161, 157, 157, 156, 158, 159, 165, 159, 156, 155, 157, 159, 161, 162, 163, 159, 159, 158, 169, 170, 171, 157, 157, 156, 157, 165, 164, 165, 162, 171, 175, 161, 161, 161, 159, 169, 168, 170, 159, 165, 170, 171, 171, 170, 161, 169, 168, 169, 168, 169, 176, 157, 169, 169, 171], [172, 172, 171, 174, 161, 171, 159, 165, 166, 170, 157, 159, 162, 164, 156, 175, 179, 163, 163, 182, 157, 155, 172, 177, 176, 156, 156, 167, 160, 181, 164, 165, 156, 153, 155, 165, 164, 168, 180, 159, 167, 168, 162, 163, 164, 170, 179, 167, 158, 178, 172, 174, 167, 168, 173, 162, 167, 163, 197, 169], [169, 176, 175, 175, 175, 162, 168, 166, 164, 165, 179, 171, 178, 181, 184, 157, 158, 159, 167, 158, 165, 166, 181, 164, 164, 183, 162, 190, 194, 185, 170, 169, 164, 166, 166, 165, 167, 163, 165, 167, 181, 184, 169, 178, 178, 180, 190, 191, 172, 193, 168, 163, 168, 172, 173, 173, 162, 165], [181, 162, 170, 171, 176, 163, 183, 182, 187, 186, 199, 200, 158, 170, 176, 178, 174, 173, 174, 174, 185, 185, 172, 192, 164, 166, 159, 161, 159, 163, 160, 181, 181, 178, 162, 161, 159, 161, 157, 163, 182, 192, 194, 176, 177, 178, 162, 166, 169, 172, 164, 160, 160, 164, 162, 169, 173, 174, 167, 186], [176, 159, 160, 160, 162, 165, 165, 182, 197, 168, 157, 156, 158, 172, 162, 181, 184, 169, 173, 175, 160, 161, 163, 169, 178, 157, 158, 188, 178, 184, 165, 166, 156, 171, 185, 175, 183, 171, 179, 179, 158, 166, 165, 174, 172, 173, 155, 180, 161, 186, 177, 174, 174, 159, 159, 172, 159, 165], [157, 175, 184, 178, 181, 160, 174, 161, 158, 166, 169, 186, 159, 163, 163, 160, 163, 168, 166, 160, 195, 199, 160, 161, 161, 172, 169, 170, 171, 160, 182, 190, 193, 193, 163, 194, 160, 160, 160, 158, 171, 180, 181, 184, 182, 198, 198, 183, 183, 179, 198, 167, 165, 174, 161, 161, 176, 174, 176, 182], [174, 160, 180, 166, 237, 221, 241, 221, 224, 219, 182, 189, 173, 180, 185, 188, 189, 190, 190, 189, 164, 178, 174, 168, 185, 187, 187, 189, 189, 189, 170, 161, 159, 161, 163, 165, 179, 191, 190, 191, 195, 160, 162, 161, 171, 181, 164, 164, 169, 171, 187, 176, 178, 181], [163, 160, 160, 158, 166, 164, 173, 170, 173, 171, 172, 180, 213, 216, 205, 207, 183, 170, 174, 181, 180, 182, 169, 157, 161, 161, 167, 170, 173, 160, 187, 199, 169, 165, 164, 167, 171, 170, 167, 169, 165, 162, 170, 175, 176, 173, 160, 165, 169, 169, 175, 168, 163, 160, 163, 165], [166, 164, 173, 176, 164, 163, 163, 164, 176, 165, 164, 168, 155, 164, 157, 157, 161, 153, 162, 159, 165, 161, 161, 175, 187, 186, 169, 166, 187, 166, 165, 170, 160, 304, 155, 168, 167, 182, 179, 174, 181, 177, 163, 165, 170, 173, 165, 176, 175, 166, 179, 176, 255, 161, 185], [172, 173, 167, 166, 168, 158, 171, 172, 166, 163, 163, 156, 168, 169, 174, 174, 173, 173, 162, 164, 165, 166, 162, 164, 162, 161, 168, 169, 161, 161, 170, 170, 165, 167, 166, 166, 157, 161, 183, 172, 177, 194, 176, 181, 182, 183, 182, 180, 168, 163, 160, 162, 162, 162, 161, 161, 160, 160, 175], [163, 156, 165, 161, 160, 166, 167, 166, 168, 170, 166, 164, 165, 161, 170, 183, 180, 182, 184, 166, 185, 190, 187, 192, 181, 163, 166, 168, 167, 166, 164, 163, 162, 162, 160, 160, 157, 164, 163, 172, 168, 171, 169, 175, 170, 190, 178, 172, 182, 170, 159, 156, 158, 157, 161, 153, 153, 158, 180], [159, 170, 171, 176, 184, 189, 190, 195, 191, 159, 163, 158, 157, 170, 161, 159, 158, 156, 166, 166, 170, 155, 159, 162, 163, 165, 164, 160, 163, 167, 158, 168, 153, 170, 170, 173, 187, 197, 199, 208, 170, 171, 168, 160, 160, 155, 165, 154, 160, 172, 169, 179, 177, 164, 166, 159, 170, 173, 156, 194], [159, 170, 160, 160, 162, 160, 191, 189, 183, 167, 163, 171, 173, 160, 161, 165]]
12
+ end
13
+
14
+ let(:jtl_root_elapseds) do
15
+ [[458, 324], [165, 156, 332, 158, 158, 166, 172, 169, 329], [158, 158, 159, 160, 159, 157, 326, 158, 165, 156, 159, 159, 155, 156, 335], [164, 165, 169, 162, 160, 167, 154, 166, 161, 352, 172, 170, 158, 160, 159, 162, 167, 192, 164, 166], [164, 165, 165, 161, 169, 167, 169, 170, 159, 160, 177, 310, 177, 164, 163, 171, 172, 167, 169, 168, 169, 178, 170, 169, 166, 169, 313], [168, 170, 159, 156, 172, 170, 171, 157, 158, 169, 166, 162, 175, 171, 177, 174, 183, 163, 163, 174, 168, 175, 177, 176, 177, 172, 171, 167, 167, 170], [167, 183, 197, 197, 161, 171, 174, 161, 161, 180, 159, 160, 162, 164, 164, 159, 161, 164, 166, 181, 164, 166, 170, 180, 172, 168, 164, 169, 188], [169, 170, 179, 173, 162, 164, 167, 162, 163, 163, 160, 162, 157, 160, 175, 178, 161, 169, 167, 167, 173, 169, 170, 163, 158, 162, 189, 191, 189, 190], [178, 192, 196, 167, 164, 178, 173, 172, 167, 168, 158, 171, 184, 170, 183, 161, 174, 173, 164, 175, 160, 178, 176, 158, 171, 165, 167, 181, 180, 162], [168, 180, 179, 161, 169, 170, 165, 166, 166, 171, 157, 166, 175, 190, 162, 195, 162, 160, 161, 182, 205, 174, 165, 171, 175, 157, 159, 159, 166], [172, 162, 155, 164, 163, 163, 175, 170, 173, 156, 166, 168, 163, 158, 160, 158, 166, 155, 164, 160, 166, 166, 157, 160, 169, 168, 163, 169, 160, 160], [163, 170, 159, 165, 165, 164, 165, 158, 161, 164, 162, 168, 176, 168, 158, 159, 170, 159, 159, 163, 159, 176, 161, 160, 176, 176, 178, 177, 178, 181], [164, 158, 169, 184, 158, 168, 168, 188, 189, 185, 166, 161, 164, 162, 162, 158, 160, 160, 160, 164, 158, 167, 163, 164, 167, 172, 170, 176, 173, 176], [169, 157, 165, 160, 162, 155, 154, 151, 155, 157, 164, 157, 171, 174, 177, 155, 157, 156, 171, 172, 179, 167, 164, 163, 155, 158, 159, 154, 169, 169], [159, 155, 169, 168, 161, 171, 167, 178, 180, 182, 180, 173, 167, 158, 164, 183, 168, 162, 171, 165, 179, 165, 173, 163, 162, 206, 215, 219, 164], [161, 163, 174, 163, 162, 163, 177, 160, 184, 180, 159, 162, 167, 172, 183, 183, 186, 183, 189, 187, 180, 155, 157, 168, 163, 161, 186, 176, 175, 195, 180], [172, 183, 186, 189, 201, 170, 176, 182, 187, 178, 165, 169, 158, 154, 157, 182, 180, 179, 179, 162, 161, 174, 179, 172, 172], [159, 158, 161, 161, 163, 168, 168, 174, 174, 171, 158, 158, 153, 163, 168, 163, 159, 156, 158, 163, 169, 165, 169, 160, 167, 164, 169, 164, 166, 174], [158, 162, 167, 168, 175, 162, 155, 169, 170, 178, 162, 154, 160, 160, 162, 171, 170, 165, 166, 167, 163, 184, 178, 175, 175, 172, 163, 160, 189, 168], [160, 158, 164, 160, 165, 157, 168, 186, 180, 162, 172, 159, 158, 172, 182, 171, 162, 161, 179, 169, 159, 156, 156, 156, 163, 173, 168, 161, 164, 187], [172, 175, 174, 158, 165, 167, 170, 169, 155, 170, 191, 229, 230, 229, 208, 199, 166, 161, 166, 188, 168, 163, 176, 186, 174, 174, 178, 216, 162], [163, 172, 164, 165, 186, 186, 194, 179, 185, 156, 220, 209, 207, 165, 160, 155, 166, 164, 168, 179, 172, 158, 166, 163, 164, 167, 172, 189, 180], [174, 170, 161, 164, 154, 158, 159, 167, 168, 167, 179, 167, 170, 160, 167, 160, 158, 160, 162, 173, 168, 171, 166, 167, 162, 163, 167, 161, 166, 173], [159, 161, 178, 181, 175, 173, 170, 159, 160, 159, 165, 169, 180, 180, 183, 169, 173, 164, 163, 160, 162, 168, 153, 166, 163, 171, 160, 170, 168], [167, 167, 160, 164, 166, 166, 173, 177, 157, 161, 165, 165, 164, 157, 158, 157, 159, 157, 166, 164, 167, 170, 169, 166, 168, 170, 157, 165, 166, 181], [154, 157, 161, 165, 154, 155, 168, 167, 161, 170, 161, 162, 169, 171, 163, 165, 151, 165, 163, 168, 199, 201, 164, 171, 178, 177, 190, 197, 189, 161], [159, 160, 165, 160, 164, 175, 157, 157, 158, 173, 155, 154, 181, 154, 157, 155, 156, 154, 166, 162, 159, 170, 185, 154, 162, 160, 158, 170, 162, 168], [159, 163, 164, 153, 156, 160, 173, 164, 167, 169, 155, 169, 163, 167, 163, 159, 153, 158, 230, 163, 163, 168, 160, 174, 179, 168, 163, 172, 169, 163, 171], [173, 158, 166, 160, 168, 161, 165, 169, 164, 164, 169, 169, 163, 164, 161, 162, 164, 174, 168, 163, 158, 156, 161, 163, 164, 157, 169, 160, 193, 163], [168, 170, 158, 159, 157, 172, 173, 167, 171, 171, 167, 169, 165, 163, 166, 161, 176, 157, 158, 162, 158, 159, 157, 156, 165, 158, 176, 159, 162, 172], [162, 164, 148, 155, 156, 165, 161, 150, 168, 170, 159, 161, 162, 161, 160, 170, 159, 177, 170, 164, 163, 164, 165, 165, 172, 168, 157, 173, 159, 169], [162, 161, 163, 160, 158, 166, 164, 164, 156, 162, 157, 166, 165, 165, 163, 156, 156, 163, 161, 164, 156, 154, 158, 164, 163, 184, 180, 174, 171, 154], [166, 169, 166, 168, 170, 161, 159, 159, 159, 157, 179, 181, 180, 178, 162, 168, 173, 163, 185, 159, 161, 167, 164, 166, 169, 165, 168, 167, 151, 172], [158, 158, 162, 166, 177, 184, 169, 169, 167, 178, 168, 216, 220, 220, 291, 429, 429, 312, 314, 160, 165, 167, 181, 203, 204], [166, 173, 178, 178, 162, 159, 160, 171, 167, 166, 165, 166, 158, 159, 170, 165, 167, 165, 161, 170, 156, 160, 166, 166, 160, 167, 162, 169, 164, 169], [159, 180, 173, 173, 183, 166, 169, 174, 172, 176, 155, 159, 160, 164, 180, 172, 176, 175, 156, 158, 160, 168, 160, 165, 178, 178, 175, 178, 157, 162], [167, 158, 153, 161, 161, 164, 165, 163, 165, 166, 161, 169, 160, 158, 164, 172, 172, 177, 186, 199, 160, 176, 195, 200, 198, 197, 204, 209], [174, 187, 153, 164, 161, 159, 161, 163, 160, 166, 162, 158, 159, 156, 167, 174, 165, 164, 159, 166, 165, 177, 220, 150, 155, 161, 153, 155, 157, 156], [163, 173, 160, 157, 172, 165, 214, 218, 224, 224, 218, 199, 171, 167, 190, 178, 165, 165, 169, 164, 159, 160, 162, 174, 173, 184], [173, 177, 197, 203, 205, 206, 178, 164, 169, 167, 167, 167, 166, 168, 168, 168, 171, 165, 164, 165, 164, 174, 165, 165, 159, 159, 167, 171, 179, 182], [162, 163, 165, 164, 168, 168, 161, 159, 162, 165, 159, 170, 158, 160, 160, 156, 174, 162, 176, 183, 169, 169, 158, 156, 163, 169, 167, 161, 171, 172], [173, 174, 180, 181, 180, 164, 164, 160, 169, 173, 159, 160, 161, 163, 157, 168, 189, 166, 161, 175, 155, 159, 168, 169, 167, 157, 174, 162, 166], [155, 154, 157, 156, 164, 159, 195, 178, 201, 162, 179, 163, 159, 164, 160, 167, 161, 160, 169, 164, 166, 168, 187, 162, 168, 163, 165, 160, 166, 168, 171], [162, 168, 178, 178, 165, 167, 157, 165, 155, 155, 167, 168, 165, 168, 165, 171, 170, 162, 159, 176, 184, 186, 166, 173, 156, 172, 218, 176, 161], [162, 171, 171, 170, 173, 177, 159, 156, 163, 159, 161, 178, 159, 158, 233, 227, 191, 164, 161, 169, 182, 148, 160, 158, 164, 154, 163, 165, 165, 166, 167], [155, 158, 171, 159, 158, 169, 158, 171, 167, 166, 156, 156, 174, 157, 154, 185, 169, 170, 160, 162, 165, 167, 168, 167, 160, 166, 157, 168, 161, 160], [166, 170, 175, 168, 168, 160, 153, 166, 161, 169, 160, 159, 169, 167, 161, 156, 164, 163, 160, 161, 159, 162, 165, 168, 169, 159, 159, 160, 158, 157, 166, 168], [160, 166, 167, 163, 162, 159, 168, 173, 159, 162, 165, 164, 164, 160, 162, 165, 171, 162, 167, 169, 173, 155, 159, 161, 166, 159, 158, 159, 164, 169], [158, 161, 159, 157, 158, 159, 159, 157, 159, 162, 159, 169, 170, 157, 157, 165, 164, 175, 161, 161, 168, 159, 165, 171, 161, 168, 169, 176, 157, 169], [171, 174, 161, 166, 170, 157, 159, 175, 179, 163, 172, 177, 176, 160, 181, 164, 165, 165, 164, 180, 162, 163, 164, 167, 178, 172, 174, 162, 167, 197], [175, 175, 175, 162, 165, 179, 171, 158, 159, 167, 181, 164, 183, 190, 185, 170, 169, 164, 165, 165, 169, 178, 190, 191, 172, 168, 163, 173, 173], [162, 176, 163, 182, 186, 200, 158, 170, 174, 174, 185, 164, 166, 159, 159, 160, 181, 178, 159, 157, 194, 176, 177, 162, 166, 164, 160, 164, 167, 186], [160, 160, 162, 165, 165, 157, 156, 169, 173, 175, 163, 169, 178, 157, 158, 165, 166, 171, 179, 179, 165, 174, 172, 173, 180, 177, 174, 159], [157, 175, 178, 160, 174, 161, 166, 159, 163, 163, 160, 199, 161, 172, 169, 171, 182, 190, 193, 160, 158, 184, 182, 198, 198, 183, 198, 167, 165, 176, 174], [166, 237, 241, 221, 219, 182, 189, 180, 185, 189, 174, 185, 187, 189, 189, 170, 161, 159, 165, 191, 161, 181, 164, 169, 171, 187, 176, 181], [163, 158, 170, 172, 213, 205, 207, 183, 170, 181, 180, 161, 167, 187, 169, 165, 167, 170, 167, 169, 170, 176, 169, 175, 168, 160, 165], [166, 164, 176, 163, 164, 155, 157, 161, 162, 159, 165, 161, 175, 187, 165, 304, 155, 167, 182, 179, 174, 181, 163, 170, 176, 161], [172, 173, 167, 166, 158, 171, 172, 156, 168, 162, 164, 165, 162, 162, 161, 168, 169, 170, 165, 183, 172, 194, 176, 182, 183, 182, 180, 160, 162, 175], [163, 156, 161, 166, 167, 166, 168, 165, 170, 166, 185, 190, 187, 163, 166, 168, 167, 162, 160, 172, 168, 175, 170, 190, 178, 172, 182, 156, 158], [159, 170, 171, 189, 190, 195, 191, 159, 170, 161, 170, 155, 159, 165, 164, 160, 163, 167, 170, 170, 170, 171, 168, 155, 165, 154, 160, 172, 164, 166], [159, 170, 160, 160, 191, 189, 183, 167, 160, 161]]
16
+ end
17
+
18
+ let(:jtl_latencies) do
19
+ [[458, 324, 177], [164, 165, 155, 158, 160, 332, 158, 158, 163, 151, 159, 165, 171, 169, 328, 168, 169], [159, 154, 158, 158, 159, 160, 160, 159, 177, 156, 159, 156, 326, 158, 165, 162, 163, 158, 156, 156, 155, 159, 159, 155, 156, 155, 157, 169, 335], [169, 155, 163, 165, 167, 229, 162, 158, 159, 158, 165, 167, 162, 161, 154, 166, 161, 350, 159, 161, 170, 166, 159, 159, 173, 158, 160, 160, 161, 159, 162, 166, 191, 162, 166, 163, 159, 178, 275, 163, 167], [163, 162, 163, 165, 165, 160, 168, 167, 168, 170, 170, 169, 164, 156, 176, 176, 158, 159, 160, 161, 177, 309, 175, 164, 162, 170, 169, 170, 172, 161, 160, 163, 167, 170, 167, 167, 168, 167, 167, 167, 178, 170, 168, 165, 168, 168, 169, 167, 313, 178, 202, 176, 177], [170, 168, 166, 170, 157, 160, 156, 172, 170, 170, 157, 157, 158, 158, 171, 168, 168, 184, 161, 166, 166, 162, 167, 168, 174, 173, 170, 177, 174, 181, 162, 162, 163, 162, 174, 173, 174, 166, 170, 171, 168, 174, 174, 174, 177, 177, 176, 162, 172, 171, 168, 167, 167, 169, 165, 166, 165], [161, 161, 163, 167, 183, 183, 182, 197, 197, 196, 161, 170, 159, 174, 159, 161, 160, 179, 184, 185, 160, 158, 182, 181, 160, 160, 160, 161, 164, 162, 163, 167, 159, 159, 162, 164, 163, 171, 172, 170, 181, 164, 156, 165, 166, 164, 165, 170, 180, 172, 169, 177, 168, 163, 168, 170, 188], [154, 161, 160, 169, 170, 169, 168, 179, 159, 181, 170, 160, 163, 166, 167, 167, 162, 161, 163, 163, 157, 157, 158, 160, 159, 157, 162, 155, 157, 159, 160, 174, 175, 157, 161, 169, 169, 167, 169, 167, 164, 163, 161, 177, 178, 167, 167, 167, 169, 168, 163, 158, 161, 162, 189, 189, 191, 187, 189, 190, 172], [174, 178, 177, 176, 190, 192, 196, 196, 196, 167, 163, 168, 166, 173, 172, 172, 167, 168, 168, 171, 189, 158, 167, 170, 171, 172, 184, 185, 189, 170, 169, 172, 153, 172, 173, 171, 164, 163, 175, 162, 160, 158, 156, 178, 178, 178, 176, 174, 182, 158, 171, 170, 165, 168, 167, 181, 180, 158, 177], [155, 166, 164, 165, 180, 180, 177, 177, 179, 161, 195, 169, 168, 167, 165, 165, 166, 166, 185, 171, 188, 156, 156, 156, 164, 166, 159, 173, 175, 190, 162, 178, 193, 195, 163, 162, 160, 161, 180, 179, 182, 182, 195, 205, 162, 162, 174, 163, 165, 162, 175, 173, 156, 158, 159, 159, 159, 166], [155, 173, 172, 172, 172, 162, 159, 160, 155, 162, 163, 163, 162, 163, 175, 175, 170, 164, 171, 156, 176, 167, 166, 177, 165, 168, 163, 163, 164, 165, 158, 160, 162, 157, 166, 164, 155, 162, 164, 160, 160, 166, 160, 166, 167, 166, 165, 157, 163, 165, 160, 169, 168, 170, 163, 165, 168, 169, 160, 160], [162, 159, 159, 159, 170, 174, 159, 158, 158, 159, 165, 164, 163, 162, 165, 165, 158, 162, 161, 164, 161, 163, 163, 162, 166, 168, 176, 176, 176, 177, 168, 156, 159, 157, 168, 169, 159, 160, 159, 163, 164, 159, 157, 159, 175, 176, 160, 160, 163, 162, 159, 176, 176, 174, 178, 180, 179, 176, 178, 179], [166, 162, 163, 164, 160, 154, 158, 158, 168, 158, 184, 158, 167, 168, 166, 186, 188, 185, 189, 184, 167, 173, 165, 165, 170, 161, 159, 164, 161, 164, 162, 162, 157, 156, 160, 160, 160, 163, 164, 167, 156, 157, 165, 167, 175, 159, 164, 168, 164, 163, 166, 164, 165, 172, 170, 176, 173, 176, 176, 180], [169, 168, 160, 174, 162, 157, 157, 170, 163, 162, 160, 160, 162, 155, 154, 151, 154, 155, 157, 158, 162, 162, 164, 171, 160, 155, 156, 165, 165, 170, 174, 177, 177, 154, 156, 156, 152, 171, 171, 168, 171, 179, 180, 182, 158, 168, 167, 169, 170, 164, 162, 154, 155, 158, 158, 154, 156, 161, 167, 168], [158, 154, 159, 160, 159, 155, 159, 162, 167, 163, 167, 161, 169, 171, 167, 175, 176, 180, 178, 182, 168, 175, 180, 183, 159, 173, 172, 167, 166, 170, 158, 163, 183, 167, 186, 162, 162, 171, 168, 165, 169, 153, 175, 179, 180, 159, 165, 168, 173, 195, 162, 162, 198, 206, 215, 215, 219, 164, 163], [157, 157, 159, 168, 161, 174, 162, 172, 166, 163, 157, 162, 163, 181, 177, 180, 160, 184, 180, 161, 158, 155, 156, 162, 162, 163, 161, 171, 171, 172, 166, 183, 183, 173, 175, 185, 183, 189, 187, 184, 180, 161, 162, 155, 157, 154, 157, 169, 168, 163, 173, 163, 160, 195, 192, 186, 176, 175, 195, 180, 187], [165, 177, 171, 166, 171, 183, 184, 176, 186, 189, 206, 201, 160, 168, 170, 176, 182, 187, 184, 182, 170, 178, 165, 169, 169, 163, 152, 156, 158, 153, 154, 156, 159, 171, 182, 180, 179, 179, 167, 162, 164, 164, 160, 174, 178, 180, 182, 178, 172, 183, 171, 174, 159], [168, 159, 158, 161, 159, 161, 159, 161, 162, 168, 166, 164, 164, 174, 175, 174, 173, 174, 171, 161, 155, 158, 158, 153, 165, 163, 165, 168, 164, 163, 159, 159, 161, 157, 156, 157, 157, 161, 162, 164, 162, 168, 165, 169, 163, 159, 160, 167, 178, 164, 169, 162, 170, 164, 173, 162, 166, 162, 174, 165], [157, 158, 162, 165, 162, 167, 168, 175, 169, 162, 155, 161, 156, 167, 169, 171, 171, 162, 178, 166, 158, 161, 153, 162, 164, 160, 158, 160, 168, 171, 170, 179, 188, 165, 166, 166, 167, 168, 165, 165, 161, 163, 184, 179, 178, 175, 180, 175, 172, 170, 163, 174, 155, 160, 186, 188, 192, 191, 167, 160, 147], [160, 152, 158, 164, 162, 158, 165, 165, 157, 167, 173, 186, 194, 169, 168, 178, 171, 162, 160, 178, 172, 163, 159, 158, 169, 170, 175, 182, 171, 162, 160, 161, 164, 156, 176, 166, 179, 169, 161, 168, 159, 157, 156, 156, 156, 156, 161, 173, 172, 168, 161, 169, 160, 169, 153, 162, 167, 170, 186, 157], [170, 174, 175, 173, 157, 166, 165, 166, 173, 168, 166, 169, 192, 186, 173, 155, 159, 166, 170, 171, 188, 191, 224, 227, 229, 230, 208, 199, 166, 173, 160, 167, 167, 167, 166, 169, 172, 190, 192, 185, 161, 168, 163, 176, 182, 184, 174, 174, 175, 178, 216, 206, 166, 162, 168, 162, 163], [156, 162, 163, 171, 177, 164, 161, 165, 186, 186, 173, 194, 179, 184, 185, 166, 156, 178, 203, 207, 212, 224, 220, 208, 205, 207, 210, 165, 158, 155, 166, 164, 163, 152, 162, 159, 167, 179, 158, 157, 170, 174, 170, 158, 166, 157, 162, 163, 162, 167, 168, 180, 188, 173, 173, 180], [174, 175, 165, 165, 168, 181, 170, 161, 164, 156, 154, 158, 157, 167, 167, 167, 169, 160, 166, 167, 164, 174, 177, 179, 167, 167, 166, 156, 170, 160, 164, 160, 156, 158, 160, 159, 161, 160, 161, 162, 161, 168, 176, 176, 169, 170, 172, 166, 166, 160, 161, 165, 163, 167, 160, 168, 166, 172, 172, 170, 173], [159, 160, 164, 168, 159, 168, 176, 181, 175, 184, 173, 171, 169, 159, 171, 159, 158, 159, 159, 157, 165, 154, 153, 160, 169, 170, 179, 180, 183, 168, 171, 173, 173, 162, 162, 162, 158, 159, 162, 158, 160, 155, 162, 173, 164, 167, 153, 154, 162, 161, 171, 160, 158, 170, 164, 168, 166], [164, 165, 167, 166, 167, 168, 165, 159, 160, 163, 166, 166, 173, 175, 179, 180, 155, 161, 162, 173, 158, 161, 165, 164, 164, 165, 157, 164, 167, 155, 156, 157, 159, 156, 155, 154, 166, 164, 165, 156, 155, 156, 161, 164, 167, 170, 156, 168, 169, 165, 167, 169, 157, 165, 159, 159, 165, 179, 180, 157, 166, 166], [157, 154, 156, 158, 168, 160, 160, 164, 153, 154, 168, 167, 168, 165, 160, 170, 170, 174, 167, 176, 160, 159, 158, 162, 164, 169, 169, 170, 163, 162, 150, 163, 158, 156, 163, 168, 168, 190, 190, 189, 190, 190, 199, 201, 157, 162, 170, 171, 178, 177, 190, 197, 198, 196, 189, 158, 161], [159, 157, 157, 164, 162, 159, 160, 159, 165, 160, 160, 164, 173, 157, 156, 158, 157, 161, 172, 178, 163, 154, 161, 163, 163, 155, 154, 154, 179, 178, 154, 157, 154, 156, 154, 155, 155, 166, 161, 161, 168, 177, 157, 156, 172, 156, 167, 165, 180, 185, 154, 162, 160, 158, 166, 168, 156, 154, 166, 164, 157, 161, 169, 162], [157, 159, 163, 156, 163, 164, 152, 156, 160, 173, 160, 164, 155, 169, 166, 169, 166, 159, 162, 154, 156, 155, 161, 169, 163, 166, 166, 163, 159, 156, 152, 157, 230, 222, 162, 146, 162, 160, 164, 163, 165, 167, 166, 165, 160, 174, 179, 181, 168, 162, 175, 172, 169, 169, 164, 165, 165, 161, 159, 162, 162, 173], [172, 179, 155, 166, 158, 167, 160, 167, 162, 165, 160, 163, 168, 166, 164, 166, 166, 164, 155, 164, 169, 169, 169, 161, 163, 161, 161, 163, 163, 164, 168, 163, 174, 157, 156, 156, 167, 166, 159, 163, 158, 156, 154, 160, 161, 164, 157, 162, 166, 169, 156, 165, 162, 165, 163, 160, 160, 193, 163, 163], [168, 170, 157, 159, 156, 164, 172, 168, 173, 175, 163, 162, 175, 174, 181, 167, 171, 172, 167, 168, 165, 167, 165, 162, 162, 163, 156, 160, 176, 173, 157, 157, 154, 157, 157, 154, 158, 160, 161, 162, 158, 159, 157, 156, 156, 162, 165, 155, 174, 175, 171, 171, 159, 159, 168, 160, 162, 190, 170, 172], [162, 161, 148, 159, 155, 153, 158, 165, 161, 160, 168, 170, 168, 150, 167, 172, 168, 166, 163, 169, 158, 158, 158, 162, 160, 159, 163, 169, 158, 156, 173, 178, 176, 177, 169, 169, 170, 158, 165, 161, 163, 164, 164, 164, 165, 169, 169, 168, 153, 157, 172, 171, 172, 177, 159, 158, 163, 166, 164, 166], [161, 162, 161, 161, 160, 157, 190, 163, 159, 163, 159, 161, 163, 166, 156, 157, 154, 164, 157, 162, 156, 166, 164, 164, 170, 163, 156, 156, 155, 156, 169, 157, 158, 158, 162, 163, 161, 165, 164, 172, 155, 153, 156, 163, 164, 161, 161, 184, 180, 184, 186, 189, 172, 172, 174, 193, 170, 154, 153, 156], [166, 164, 169, 166, 165, 153, 168, 161, 159, 163, 157, 162, 159, 161, 159, 161, 178, 156, 159, 162, 179, 181, 180, 180, 178, 182, 160, 167, 166, 171, 163, 162, 167, 167, 168, 184, 158, 192, 160, 162, 161, 161, 167, 164, 166, 165, 166, 169, 165, 167, 158, 167, 163, 163, 165, 150, 168, 168, 170, 175], [158, 155, 158, 160, 166, 165, 177, 184, 181, 169, 159, 165, 169, 160, 160, 167, 154, 177, 194, 197, 167, 213, 220, 222, 220, 205, 290, 416, 429, 429, 381, 313, 314, 312, 312, 195, 314, 159, 165, 166, 181, 204, 206, 196, 203, 201, 204], [157, 175, 169, 158, 165, 172, 164, 171, 178, 175, 158, 159, 158, 171, 165, 167, 164, 169, 166, 174, 166, 163, 163, 163, 165, 166, 164, 167, 158, 157, 168, 164, 167, 163, 161, 162, 166, 170, 179, 181, 176, 161, 161, 157, 155, 156, 155, 160, 166, 164, 160, 167, 162, 169, 153, 164, 169, 164, 157, 158], [162, 156, 158, 158, 156, 180, 186, 188, 173, 171, 183, 166, 169, 174, 161, 162, 172, 175, 173, 176, 176, 159, 156, 163, 155, 158, 160, 161, 160, 164, 180, 172, 175, 167, 175, 158, 156, 155, 160, 157, 157, 159, 160, 158, 159, 168, 156, 158, 160, 161, 178, 175, 178, 175, 176, 164, 155, 158, 156, 177], [167, 176, 175, 179, 179, 157, 155, 159, 152, 161, 155, 161, 163, 164, 163, 152, 165, 164, 160, 164, 159, 170, 169, 172, 173, 176, 160, 159, 160, 157, 169, 162, 171, 172, 176, 177, 186, 198, 199, 173, 158, 179, 175, 175, 176, 177, 210, 197, 195, 200, 161, 198, 197, 204, 208, 209], [172, 183, 187, 186, 152, 171, 163, 166, 169, 184, 153, 159, 161, 159, 161, 160, 162, 162, 160, 165, 159, 155, 164, 167, 155, 154, 157, 157, 159, 174, 160, 154, 162, 174, 153, 163, 165, 164, 159, 163, 161, 177, 155, 184, 220, 149, 166, 166, 160, 167, 159, 160, 153, 160, 176, 165, 153, 154, 157, 154], [163, 173, 173, 166, 158, 157, 155, 164, 173, 173, 154, 165, 171, 165, 204, 227, 212, 218, 224, 224, 218, 199, 198, 180, 171, 161, 164, 158, 167, 176, 190, 184, 190, 178, 160, 165, 163, 165, 168, 162, 157, 158, 176, 178, 162, 173, 162, 162, 172, 160, 155, 154, 172, 182, 173], [163, 176, 172, 196, 203, 205, 204, 175, 169, 173, 158, 162, 158, 164, 170, 169, 167, 169, 164, 159, 167, 167, 163, 165, 167, 159, 168, 169, 172, 171, 160, 158, 163, 166, 167, 161, 171, 164, 164, 159, 164, 172, 171, 165, 163, 159, 159, 165, 162, 167, 158, 154, 170, 165, 164, 169, 176, 179, 182, 167], [160, 162, 177, 165, 162, 168, 165, 162, 163, 161, 167, 154, 156, 154, 153, 159, 156, 160, 165, 163, 159, 167, 164, 158, 158, 160, 156, 167, 165, 174, 185, 187, 160, 160, 159, 152, 171, 176, 182, 157, 169, 169, 155, 156, 156, 161, 169, 163, 162, 167, 159, 161, 154, 161, 158, 154, 175, 171, 160, 172], [173, 172, 180, 180, 181, 180, 164, 164, 166, 174, 159, 160, 158, 160, 159, 166, 160, 168, 169, 171, 159, 157, 161, 163, 164, 156, 168, 171, 189, 185, 161, 168, 165, 164, 166, 167, 163, 161, 170, 175, 155, 159, 166, 166, 169, 163, 157, 167, 162, 163, 174, 161, 160, 161, 161, 171, 168, 166], [155, 154, 154, 159, 156, 157, 164, 159, 195, 160, 158, 161, 166, 178, 199, 196, 198, 202, 169, 162, 179, 163, 157, 162, 161, 160, 160, 167, 161, 163, 155, 157, 158, 160, 169, 167, 168, 189, 177, 162, 165, 164, 186, 172, 162, 168, 166, 163, 162, 179, 176, 175, 168, 158, 170, 169, 166, 156, 176, 166, 169], [161, 167, 169, 178, 178, 177, 162, 166, 159, 159, 161, 160, 157, 157, 159, 164, 162, 174, 155, 152, 167, 159, 168, 165, 167, 164, 165, 171, 165, 179, 165, 173, 168, 159, 160, 162, 166, 157, 157, 174, 183, 185, 183, 165, 171, 167, 155, 171, 171, 155, 183, 177, 222, 218, 177, 176, 173, 164, 159], [159, 171, 165, 170, 170, 173, 174, 174, 156, 160, 159, 169, 155, 156, 164, 164, 163, 170, 159, 162, 159, 177, 159, 159, 156, 159, 233, 181, 227, 191, 173, 154, 155, 156, 162, 157, 165, 168, 167, 180, 182, 148, 158, 154, 155, 155, 161, 154, 152, 157, 163, 161, 161, 165, 169, 163, 155, 164, 168, 165, 165], [155, 158, 163, 171, 172, 159, 158, 164, 156, 167, 156, 154, 158, 173, 169, 162, 156, 167, 164, 168, 156, 156, 173, 172, 175, 157, 154, 155, 157, 185, 171, 183, 169, 167, 167, 157, 164, 160, 160, 162, 167, 167, 164, 164, 160, 164, 157, 157, 160, 164, 166, 164, 157, 166, 166, 161, 156, 161, 157], [164, 166, 170, 159, 173, 175, 168, 166, 169, 170, 160, 159, 159, 153, 163, 164, 153, 159, 161, 169, 160, 158, 162, 164, 169, 166, 167, 161, 157, 157, 155, 153, 156, 164, 162, 157, 163, 157, 159, 159, 159, 159, 159, 157, 165, 167, 168, 169, 160, 159, 158, 165, 156, 159, 159, 159, 161, 163, 158, 155, 165, 164, 166, 164], [158, 156, 166, 167, 155, 154, 161, 163, 163, 162, 169, 168, 168, 159, 168, 171, 159, 158, 158, 160, 165, 164, 164, 164, 164, 180, 160, 159, 159, 162, 156, 165, 170, 174, 175, 162, 167, 169, 169, 166, 170, 162, 155, 155, 155, 153, 161, 158, 161, 162, 154, 158, 156, 158, 155, 160, 164, 164, 167, 166], [155, 155, 155, 160, 157, 159, 156, 157, 155, 156, 159, 163, 159, 154, 154, 157, 157, 159, 160, 163, 159, 159, 157, 169, 168, 166, 156, 155, 155, 157, 164, 164, 163, 161, 171, 170, 161, 161, 161, 159, 169, 168, 169, 159, 165, 169, 171, 171, 170, 161, 169, 168, 167, 168, 169, 176, 157, 169, 169, 171], [172, 172, 171, 171, 161, 169, 156, 164, 163, 168, 157, 156, 162, 164, 154, 175, 177, 163, 163, 178, 157, 153, 172, 177, 176, 153, 154, 164, 159, 181, 162, 165, 155, 153, 154, 165, 164, 168, 180, 159, 166, 168, 162, 163, 164, 170, 177, 167, 157, 175, 171, 172, 166, 167, 172, 161, 165, 161, 197, 167], [169, 176, 175, 175, 175, 162, 168, 166, 164, 165, 175, 170, 178, 181, 184, 156, 157, 158, 166, 158, 160, 164, 181, 164, 164, 182, 162, 187, 194, 185, 169, 166, 162, 166, 166, 165, 167, 163, 164, 165, 181, 179, 169, 178, 178, 180, 190, 191, 171, 193, 166, 162, 168, 157, 172, 173, 162, 162], [181, 160, 170, 171, 173, 162, 183, 180, 186, 186, 199, 197, 158, 170, 174, 176, 173, 172, 172, 173, 184, 185, 172, 192, 164, 164, 158, 161, 159, 159, 160, 181, 181, 178, 162, 160, 159, 161, 157, 161, 180, 190, 194, 176, 177, 178, 162, 166, 169, 172, 164, 158, 159, 164, 161, 167, 173, 174, 165, 171], [176, 157, 158, 157, 161, 162, 165, 182, 195, 166, 157, 156, 156, 170, 162, 179, 184, 166, 166, 175, 159, 159, 163, 169, 166, 157, 158, 188, 177, 182, 164, 163, 154, 160, 185, 175, 182, 170, 178, 178, 158, 166, 164, 174, 172, 172, 154, 180, 160, 177, 177, 174, 174, 158, 159, 158, 157, 162], [157, 173, 184, 178, 181, 159, 173, 160, 155, 166, 169, 186, 159, 163, 163, 159, 163, 168, 166, 160, 195, 199, 160, 159, 161, 172, 168, 170, 169, 160, 166, 188, 191, 191, 163, 194, 160, 159, 159, 157, 171, 180, 181, 182, 169, 197, 198, 183, 183, 179, 198, 167, 165, 174, 161, 161, 176, 174, 176, 182], [172, 160, 159, 166, 237, 221, 241, 221, 224, 219, 182, 189, 172, 179, 185, 186, 186, 188, 189, 187, 162, 178, 173, 168, 185, 187, 187, 188, 189, 187, 169, 161, 159, 160, 163, 162, 179, 179, 188, 188, 195, 159, 162, 161, 162, 180, 164, 164, 169, 169, 187, 175, 178, 180], [163, 159, 158, 157, 166, 164, 170, 169, 172, 170, 172, 178, 207, 216, 205, 206, 182, 169, 174, 181, 170, 181, 169, 157, 160, 160, 167, 170, 172, 160, 185, 188, 169, 165, 164, 167, 171, 170, 167, 169, 159, 162, 169, 175, 176, 172, 160, 163, 168, 168, 172, 168, 162, 160, 163, 165], [165, 164, 165, 175, 164, 162, 163, 164, 168, 165, 164, 168, 155, 164, 157, 155, 161, 153, 160, 159, 165, 160, 160, 175, 185, 184, 168, 166, 185, 166, 163, 169, 160, 304, 154, 168, 167, 171, 179, 174, 181, 175, 161, 165, 166, 172, 165, 176, 175, 166, 179, 176, 254, 161, 185], [172, 173, 167, 166, 168, 157, 171, 172, 166, 163, 163, 156, 167, 168, 174, 174, 173, 173, 162, 164, 164, 166, 162, 164, 162, 161, 168, 169, 161, 161, 170, 170, 165, 165, 166, 165, 156, 161, 183, 162, 176, 194, 176, 180, 180, 181, 182, 180, 168, 163, 158, 162, 158, 161, 160, 161, 158, 159, 175], [163, 155, 164, 161, 157, 165, 165, 165, 168, 170, 166, 162, 165, 160, 168, 172, 180, 181, 182, 165, 183, 190, 187, 190, 181, 163, 164, 166, 166, 163, 163, 163, 162, 162, 159, 160, 155, 164, 161, 172, 168, 171, 169, 175, 170, 189, 177, 171, 182, 169, 159, 155, 155, 156, 161, 153, 152, 155, 180], [158, 170, 169, 175, 183, 189, 188, 195, 189, 158, 162, 157, 156, 170, 161, 159, 156, 156, 165, 165, 170, 154, 159, 161, 162, 165, 162, 159, 163, 167, 158, 168, 152, 170, 168, 173, 183, 194, 195, 207, 168, 169, 167, 160, 158, 152, 165, 154, 160, 172, 169, 178, 177, 164, 165, 158, 169, 171, 156, 194], [158, 170, 160, 160, 162, 160, 191, 189, 183, 167, 162, 170, 173, 160, 161, 164]]
20
+ end
21
+
22
+ let(:jtl_root_latencies) do
23
+ [[458, 324], [165, 155, 332, 158, 158, 165, 171, 169, 328], [158, 158, 159, 160, 159, 156, 326, 158, 165, 155, 159, 159, 155, 156, 335], [163, 165, 167, 162, 158, 167, 154, 166, 161, 350, 161, 170, 158, 160, 159, 162, 166, 191, 162, 163], [162, 165, 165, 160, 168, 167, 168, 169, 158, 160, 177, 309, 175, 164, 162, 169, 170, 167, 168, 167, 167, 178, 170, 168, 165, 168, 313], [166, 170, 157, 156, 172, 170, 170, 157, 158, 168, 166, 162, 174, 170, 177, 174, 181, 163, 162, 174, 168, 174, 177, 176, 162, 172, 171, 167, 167, 165], [167, 183, 197, 197, 161, 170, 174, 159, 160, 179, 158, 160, 161, 164, 162, 159, 159, 164, 163, 181, 164, 165, 170, 180, 172, 168, 163, 168, 188], [169, 170, 179, 170, 160, 163, 167, 162, 161, 163, 160, 162, 157, 160, 174, 175, 161, 169, 167, 167, 161, 167, 168, 163, 158, 162, 189, 191, 189, 190], [178, 192, 196, 167, 163, 166, 173, 172, 167, 168, 158, 171, 184, 170, 169, 153, 172, 171, 164, 175, 158, 178, 174, 158, 171, 165, 167, 181, 180, 158], [165, 180, 179, 161, 169, 167, 165, 166, 166, 171, 156, 164, 175, 190, 162, 195, 162, 160, 161, 182, 205, 174, 165, 162, 175, 156, 159, 159, 166], [172, 162, 155, 163, 163, 162, 175, 170, 171, 156, 166, 168, 163, 158, 160, 157, 166, 155, 164, 160, 166, 166, 157, 160, 169, 168, 163, 168, 160, 160], [159, 170, 159, 165, 164, 163, 165, 158, 161, 164, 162, 168, 176, 168, 156, 159, 168, 159, 159, 163, 159, 175, 160, 159, 176, 176, 178, 176, 178, 179], [164, 158, 168, 184, 158, 168, 166, 188, 189, 184, 165, 161, 164, 162, 162, 156, 160, 160, 160, 164, 156, 164, 163, 164, 165, 172, 170, 176, 173, 176], [169, 157, 162, 160, 162, 155, 154, 151, 155, 157, 162, 156, 170, 174, 177, 154, 156, 156, 171, 171, 179, 167, 164, 162, 155, 158, 158, 154, 167, 168], [159, 155, 167, 167, 161, 171, 167, 176, 180, 182, 180, 173, 166, 158, 163, 183, 167, 162, 171, 165, 179, 165, 173, 162, 162, 206, 215, 219, 164], [157, 161, 174, 163, 162, 163, 177, 160, 184, 180, 158, 162, 161, 172, 183, 183, 185, 183, 189, 187, 180, 155, 157, 168, 163, 160, 186, 176, 175, 195, 180], [171, 183, 186, 189, 201, 170, 176, 182, 187, 178, 165, 169, 158, 153, 156, 182, 180, 179, 179, 162, 160, 174, 178, 172, 171], [159, 158, 161, 159, 161, 168, 166, 174, 174, 171, 158, 158, 153, 163, 168, 163, 159, 156, 157, 162, 168, 165, 169, 160, 167, 164, 169, 164, 166, 174], [158, 162, 167, 168, 175, 162, 155, 167, 169, 178, 161, 153, 160, 158, 160, 171, 170, 165, 166, 165, 163, 184, 178, 175, 175, 170, 163, 160, 188, 167], [160, 158, 164, 158, 165, 157, 167, 186, 168, 162, 172, 159, 158, 170, 182, 171, 162, 161, 179, 169, 159, 156, 156, 156, 161, 173, 168, 161, 162, 186], [170, 175, 173, 157, 165, 166, 168, 169, 155, 170, 191, 224, 227, 229, 208, 199, 166, 160, 166, 185, 168, 163, 176, 184, 174, 174, 178, 216, 162], [163, 171, 164, 165, 186, 186, 194, 179, 185, 156, 220, 208, 207, 165, 158, 155, 166, 164, 159, 179, 170, 158, 166, 162, 162, 167, 168, 188, 180], [174, 170, 161, 164, 154, 158, 157, 167, 167, 167, 179, 166, 170, 160, 164, 160, 158, 160, 161, 162, 168, 170, 166, 166, 161, 163, 167, 160, 166, 173], [159, 159, 176, 181, 175, 171, 169, 159, 159, 157, 165, 169, 179, 180, 183, 168, 173, 162, 162, 160, 162, 167, 153, 154, 162, 171, 160, 170, 168], [167, 167, 160, 163, 166, 166, 173, 175, 155, 161, 164, 165, 164, 155, 156, 157, 159, 156, 166, 164, 167, 170, 169, 165, 167, 169, 157, 165, 165, 179], [154, 156, 160, 164, 153, 154, 168, 165, 160, 170, 159, 158, 169, 170, 163, 162, 150, 163, 163, 168, 199, 201, 162, 171, 178, 177, 190, 197, 189, 161], [159, 160, 165, 160, 164, 173, 157, 156, 157, 172, 155, 154, 178, 154, 157, 154, 156, 154, 166, 161, 156, 167, 185, 154, 162, 160, 158, 168, 154, 166], [159, 163, 163, 152, 156, 160, 173, 164, 155, 169, 154, 169, 163, 166, 163, 159, 152, 157, 230, 160, 163, 165, 160, 174, 179, 168, 162, 172, 169, 161, 162], [172, 155, 166, 158, 167, 160, 165, 168, 164, 164, 169, 169, 161, 163, 161, 161, 164, 174, 166, 163, 158, 156, 160, 161, 164, 157, 169, 160, 193, 163], [168, 170, 157, 159, 156, 172, 173, 167, 171, 168, 165, 167, 165, 162, 163, 160, 176, 157, 158, 162, 158, 159, 157, 156, 165, 155, 175, 159, 162, 172], [162, 161, 148, 155, 153, 165, 161, 150, 168, 169, 158, 158, 162, 160, 159, 169, 158, 177, 170, 161, 163, 164, 164, 165, 169, 168, 157, 171, 158, 166], [161, 161, 161, 160, 157, 163, 163, 161, 154, 162, 156, 166, 164, 164, 163, 156, 155, 162, 161, 164, 155, 153, 156, 164, 161, 184, 180, 172, 170, 153], [166, 169, 166, 165, 168, 161, 159, 159, 159, 156, 179, 181, 180, 178, 160, 166, 171, 163, 184, 158, 161, 167, 164, 166, 166, 165, 167, 167, 150, 170], [158, 158, 160, 166, 177, 184, 169, 169, 167, 177, 167, 213, 220, 220, 290, 429, 429, 312, 314, 159, 165, 166, 181, 203, 204], [165, 172, 178, 175, 158, 159, 158, 171, 167, 164, 165, 166, 158, 157, 168, 164, 167, 163, 161, 170, 155, 160, 166, 164, 160, 167, 162, 169, 164, 169], [156, 180, 173, 171, 183, 166, 169, 174, 172, 175, 155, 158, 160, 164, 180, 172, 175, 175, 156, 155, 158, 168, 160, 161, 178, 178, 175, 176, 155, 158], [167, 157, 152, 161, 161, 163, 164, 163, 165, 164, 159, 169, 160, 157, 162, 171, 172, 176, 186, 199, 158, 176, 195, 200, 198, 197, 204, 209], [172, 187, 152, 163, 161, 159, 160, 162, 160, 165, 159, 155, 155, 154, 162, 174, 165, 164, 159, 163, 161, 177, 220, 149, 153, 160, 153, 154, 157, 154], [163, 173, 158, 157, 171, 165, 212, 218, 224, 224, 218, 199, 171, 164, 190, 178, 165, 165, 168, 162, 157, 158, 162, 162, 172, 182], [163, 172, 196, 203, 205, 204, 173, 162, 169, 164, 167, 163, 165, 167, 159, 168, 171, 163, 164, 164, 164, 172, 165, 163, 159, 159, 167, 170, 179, 182], [160, 162, 165, 162, 168, 165, 161, 156, 160, 165, 159, 167, 158, 158, 160, 156, 174, 160, 176, 182, 169, 169, 156, 156, 161, 169, 167, 161, 171, 172], [173, 172, 180, 181, 180, 164, 164, 160, 169, 171, 159, 157, 161, 163, 156, 168, 189, 165, 161, 175, 155, 159, 166, 169, 163, 157, 174, 160, 166], [155, 154, 154, 156, 164, 159, 195, 178, 198, 162, 179, 163, 157, 161, 160, 167, 161, 160, 168, 162, 165, 164, 186, 162, 168, 163, 162, 158, 166, 166, 169], [161, 167, 178, 178, 162, 166, 157, 164, 155, 152, 167, 168, 165, 167, 165, 171, 168, 162, 157, 174, 183, 185, 165, 171, 155, 171, 218, 176, 159], [159, 171, 170, 170, 173, 174, 156, 156, 163, 159, 159, 177, 159, 156, 233, 227, 191, 162, 157, 167, 182, 148, 158, 155, 161, 154, 163, 165, 163, 164, 165], [155, 158, 171, 159, 158, 167, 158, 169, 167, 164, 156, 156, 172, 157, 154, 185, 169, 167, 160, 160, 162, 167, 164, 164, 157, 164, 157, 166, 161, 157], [166, 170, 175, 168, 166, 159, 153, 164, 161, 169, 160, 158, 169, 167, 161, 156, 164, 163, 159, 159, 159, 159, 165, 168, 169, 156, 159, 159, 158, 155, 164, 166], [158, 156, 167, 163, 162, 159, 168, 171, 158, 160, 165, 164, 164, 160, 162, 165, 170, 162, 167, 169, 170, 155, 155, 161, 162, 158, 156, 155, 164, 167], [155, 160, 157, 156, 156, 159, 159, 157, 157, 160, 159, 169, 168, 155, 157, 164, 164, 170, 161, 161, 168, 159, 165, 171, 161, 168, 167, 176, 157, 169], [171, 171, 161, 163, 168, 157, 156, 175, 177, 163, 172, 177, 176, 159, 181, 162, 165, 165, 164, 180, 162, 163, 164, 167, 175, 171, 172, 161, 165, 197], [175, 175, 175, 162, 165, 175, 170, 157, 158, 166, 181, 164, 182, 187, 185, 169, 166, 162, 165, 164, 169, 178, 190, 191, 171, 166, 162, 172, 173], [160, 173, 162, 180, 186, 197, 158, 170, 173, 173, 184, 164, 164, 158, 159, 160, 181, 178, 159, 157, 194, 176, 177, 162, 166, 164, 158, 164, 165, 171], [158, 157, 161, 162, 165, 157, 156, 166, 166, 175, 163, 169, 166, 157, 158, 164, 163, 170, 178, 178, 164, 174, 172, 172, 180, 177, 174, 157], [157, 173, 178, 159, 173, 160, 166, 159, 163, 163, 160, 199, 159, 172, 168, 169, 166, 188, 191, 159, 157, 182, 169, 197, 198, 183, 198, 167, 165, 176, 174], [166, 237, 241, 221, 219, 182, 189, 179, 185, 186, 173, 185, 187, 188, 187, 169, 161, 159, 162, 179, 161, 180, 164, 169, 169, 187, 175, 180], [163, 157, 169, 172, 207, 205, 206, 182, 169, 181, 170, 160, 167, 185, 169, 165, 167, 170, 167, 169, 169, 176, 168, 172, 168, 160, 165], [165, 164, 175, 163, 164, 155, 157, 161, 160, 159, 165, 160, 175, 185, 163, 304, 154, 167, 171, 179, 174, 181, 161, 166, 176, 161], [172, 173, 167, 166, 157, 171, 172, 156, 167, 162, 164, 164, 162, 162, 161, 168, 169, 170, 165, 183, 162, 194, 176, 180, 181, 182, 180, 158, 161, 175], [163, 155, 161, 165, 165, 165, 168, 165, 168, 165, 183, 190, 187, 163, 164, 166, 166, 162, 159, 172, 168, 175, 170, 189, 177, 171, 182, 155, 155], [158, 170, 169, 189, 188, 195, 189, 158, 170, 161, 170, 154, 159, 165, 162, 159, 163, 167, 170, 168, 168, 169, 167, 152, 165, 154, 160, 172, 164, 165], [158, 170, 160, 160, 191, 189, 183, 167, 160, 161]]
24
+ end
25
+
26
+ it 'scale_marks (defaut)' do
27
+ jtl = Jtl.new(jtl_path)
28
+ marks = jtl_range.map {|i| Time.at((i - i % 1000) / 1000) }.uniq.sort
29
+ expect(jtl.scale_marks).to eq(marks)
30
+ expect(jtl.elapseds.scale_marks).to eq(marks)
31
+ end
32
+
33
+ it 'scale_marks (10s)' do
34
+ jtl = Jtl.new(jtl_path, 10000)
35
+ marks = jtl_range.map {|i| Time.at((i - i % 10000) / 1000) }.uniq.sort
36
+ expect(jtl.scale_marks).to eq(marks)
37
+ expect(jtl.elapseds.scale_marks).to eq(marks)
38
+ end
39
+
40
+ it 'labels' do
41
+ jtl = Jtl.new(jtl_path)
42
+ expect(jtl.labels.sort).to eq(['not_exists', 'root'])
43
+ expect(jtl.elapseds.labels.sort).to eq(['not_exists', 'root'])
44
+ expect(jtl.elapseds.root.labels.sort).to eq(['not_exists', 'root'])
45
+ end
46
+
47
+ it 'time_stamp' do
48
+ jtl = Jtl.new(jtl_path)
49
+ expect(jtl.time_stamps.flatten.all? {|i| jtl_range.include?(i) }).to be_true
50
+ end
51
+
52
+ it 'elapsed' do
53
+ jtl = Jtl.new(jtl_path)
54
+ expect(jtl.elapseds.to_a).to eq(jtl_elapseds)
55
+ expect(jtl.elapseds {|i| i.mean.to_i }).to eq(jtl_elapseds.map {|i| i.mean.to_i })
56
+ end
57
+
58
+ it 'elapsed (root)' do
59
+ jtl = Jtl.new(jtl_path)
60
+ expect(jtl.elapseds.root.to_a).to eq(jtl_root_elapseds)
61
+ expect(jtl.elapseds.root {|i| i.mean.to_i }).to eq(jtl_root_elapseds.map {|i| i.mean.to_i })
62
+ end
63
+
64
+ it 'response_code' do
65
+ jtl = Jtl.new(jtl_path)
66
+ expect(jtl.response_codes.flatten.uniq.sort).to eq([200, 404])
67
+ expect(jtl.response_codes.root.flatten.uniq.sort).to eq([200])
68
+ expect(jtl.response_codes.not_exists.flatten.uniq.sort).to eq([404])
69
+ end
70
+
71
+ it 'response_message' do
72
+ jtl = Jtl.new(jtl_path)
73
+ expect(jtl.response_messages.flatten.uniq.sort).to eq(['Not Found', 'OK'])
74
+ expect(jtl.response_messages.root.flatten.uniq.sort).to eq(['OK'])
75
+ expect(jtl.response_messages.not_exists.flatten.uniq.sort).to eq(['Not Found'])
76
+ end
77
+
78
+ it 'data_type' do
79
+ jtl = Jtl.new(jtl_path)
80
+ expect(jtl.data_types.flatten.uniq.sort).to eq(['text'])
81
+ expect(jtl.data_types.root.flatten.uniq.sort).to eq(['text'])
82
+ expect(jtl.data_types.not_exists.flatten.uniq.sort).to eq(['text'])
83
+ end
84
+
85
+ it 'thread_name' do
86
+ jtl = Jtl.new(jtl_path)
87
+ expect(jtl.thread_names.flatten.all? {|i| i =~ /ThreadGroup/ }).to be_true
88
+ end
89
+
90
+ it 'success' do
91
+ jtl = Jtl.new(jtl_path)
92
+ rs = jtl.successes.flatten.uniq
93
+ expect(rs.length).to eq(2)
94
+ expect(rs.include?(true)).to be_true
95
+ expect(rs.include?(false)).to be_true
96
+ expect(jtl.successes.root.flatten.uniq).to eq([true])
97
+ expect(jtl.successes.not_exists.flatten.uniq).to eq([false])
98
+ end
99
+
100
+ it 'bytes' do
101
+ jtl = Jtl.new(jtl_path)
102
+ expect(jtl.bytes.flatten.uniq.sort).to eq([1615, 1622, 1626])
103
+ expect(jtl.bytes.root.flatten.uniq.sort).to eq([1615])
104
+ expect(jtl.bytes.not_exists.flatten.uniq.sort).to eq([1622, 1626])
105
+ end
106
+
107
+ it 'latencies' do
108
+ jtl = Jtl.new(jtl_path)
109
+ expect(jtl.latencies.to_a).to eq(jtl_latencies)
110
+ expect(jtl.latencies.to_a).to_not eq(jtl_elapseds)
111
+ expect(jtl.latencies {|i| i.mean.to_i }).to eq(jtl_latencies.map {|i| i.mean.to_i })
112
+ end
113
+
114
+ it 'latencies (root)' do
115
+ jtl = Jtl.new(jtl_path)
116
+ expect(jtl.latencies.root.to_a).to eq(jtl_root_latencies)
117
+ expect(jtl.latencies.root.to_a).to_not eq(jtl_root_elapseds)
118
+ expect(jtl.latencies.root {|i| i.mean.to_i }).to eq(jtl_root_latencies.map {|i| i.mean.to_i })
119
+ end
120
+ end