hitimes 1.0.3-x86-mswin32-60 → 1.2.2-x86-mswin32-60
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.
- data/.travis.yml +10 -0
- data/CONTRIBUTING.md +45 -0
- data/HISTORY.md +97 -0
- data/LICENSE +11 -8
- data/Manifest.txt +45 -0
- data/README.md +163 -0
- data/Rakefile +23 -62
- data/ext/hitimes/c/extconf.rb +24 -0
- data/ext/hitimes/{hitimes_ext.c → c/hitimes.c} +1 -1
- data/ext/hitimes/{hitimes_instant_clock_gettime.c → c/hitimes_instant_clock_gettime.c} +0 -0
- data/ext/hitimes/c/hitimes_instant_osx.c +45 -0
- data/ext/hitimes/{hitimes_instant_windows.c → c/hitimes_instant_windows.c} +0 -0
- data/ext/hitimes/{hitimes_interval.c → c/hitimes_interval.c} +15 -7
- data/ext/hitimes/{hitimes_interval.h → c/hitimes_interval.h} +5 -5
- data/ext/hitimes/{hitimes_stats.c → c/hitimes_stats.c} +0 -0
- data/ext/hitimes/{hitimes_stats.h → c/hitimes_stats.h} +0 -0
- data/ext/hitimes/java/src/hitimes/Hitimes.java +54 -0
- data/ext/hitimes/java/src/hitimes/HitimesInterval.java +181 -0
- data/ext/hitimes/java/src/hitimes/HitimesService.java +16 -0
- data/ext/hitimes/java/src/hitimes/HitimesStats.java +112 -0
- data/lib/hitimes.rb +18 -5
- data/lib/hitimes/1.9/hitimes.so +0 -0
- data/lib/hitimes/2.0/hitimes.so +0 -0
- data/lib/hitimes/2.1/hitimes.so +0 -0
- data/lib/hitimes/metric.rb +6 -0
- data/lib/hitimes/mutexed_stats.rb +5 -1
- data/lib/hitimes/stats.rb +5 -1
- data/lib/hitimes/timed_metric.rb +1 -2
- data/lib/hitimes/timed_value_metric.rb +0 -2
- data/lib/hitimes/value_metric.rb +2 -3
- data/lib/hitimes/version.rb +1 -50
- data/spec/hitimes_spec.rb +14 -0
- data/spec/interval_spec.rb +40 -37
- data/spec/metric_spec.rb +8 -10
- data/spec/mutex_stats_spec.rb +10 -8
- data/spec/paths_spec.rb +3 -5
- data/spec/spec_helper.rb +9 -4
- data/spec/stats_spec.rb +28 -30
- data/spec/timed_metric_spec.rb +44 -44
- data/spec/timed_value_metric_spec.rb +54 -55
- data/spec/value_metric_spec.rb +28 -30
- data/spec/version_spec.rb +4 -30
- data/tasks/default.rake +254 -0
- data/tasks/extension.rake +29 -73
- data/tasks/this.rb +200 -0
- metadata +173 -105
- data/HISTORY +0 -55
- data/README +0 -134
- data/ext/hitimes/extconf.rb +0 -21
- data/ext/hitimes/hitimes_instant_osx.c +0 -16
- data/gemspec.rb +0 -57
- data/lib/hitimes/1.8/hitimes_ext.so +0 -0
- data/lib/hitimes/1.9/hitimes_ext.so +0 -0
- data/tasks/announce.rake +0 -39
- data/tasks/config.rb +0 -108
- data/tasks/distribution.rake +0 -74
- data/tasks/documentation.rake +0 -32
- data/tasks/rspec.rake +0 -31
- data/tasks/rubyforge.rake +0 -55
- data/tasks/utils.rb +0 -80
data/spec/metric_spec.rb
CHANGED
@@ -1,6 +1,4 @@
|
|
1
|
-
require
|
2
|
-
|
3
|
-
require 'hitimes/metric'
|
1
|
+
require "spec_helper"
|
4
2
|
|
5
3
|
describe Hitimes::Metric do
|
6
4
|
before( :each ) do
|
@@ -8,22 +6,22 @@ describe Hitimes::Metric do
|
|
8
6
|
end
|
9
7
|
|
10
8
|
it 'has a name' do
|
11
|
-
@metric.name.
|
9
|
+
@metric.name.must_equal "testing"
|
12
10
|
end
|
13
11
|
|
14
12
|
it "has associated data from initialization" do
|
15
13
|
m = Hitimes::Metric.new( "more-data", 'foo' => 'bar', 'this' => 'that' )
|
16
|
-
m.additional_data['foo'].
|
17
|
-
m.additional_data['this'].
|
14
|
+
m.additional_data['foo'].must_equal 'bar'
|
15
|
+
m.additional_data['this'].must_equal 'that'
|
18
16
|
|
19
17
|
m = Hitimes::Metric.new( "more-data", { 'foo' => 'bar', 'this' => 'that' } )
|
20
|
-
m.additional_data['foo'].
|
21
|
-
m.additional_data['this'].
|
18
|
+
m.additional_data['foo'].must_equal 'bar'
|
19
|
+
m.additional_data['this'].must_equal 'that'
|
22
20
|
end
|
23
21
|
|
24
22
|
it "initially has no sampling times" do
|
25
|
-
@metric.sampling_start_time.
|
26
|
-
@metric.sampling_stop_time.
|
23
|
+
@metric.sampling_start_time.must_be_nil
|
24
|
+
@metric.sampling_stop_time.must_be_nil
|
27
25
|
end
|
28
26
|
end
|
29
27
|
|
data/spec/mutex_stats_spec.rb
CHANGED
@@ -1,7 +1,4 @@
|
|
1
|
-
require
|
2
|
-
|
3
|
-
require 'hitimes/hitimes_ext'
|
4
|
-
require 'hitimes/mutexed_stats'
|
1
|
+
require 'spec_helper'
|
5
2
|
|
6
3
|
describe Hitimes::MutexedStats do
|
7
4
|
before( :each ) do
|
@@ -19,16 +16,21 @@ describe Hitimes::MutexedStats do
|
|
19
16
|
return stats
|
20
17
|
end
|
21
18
|
|
22
|
-
|
23
|
-
|
19
|
+
if (not defined? RUBY_ENGINE) or (RUBY_ENGINE == "ruby") then
|
20
|
+
it "Hitimes::Stats is threadsafe" do
|
21
|
+
stats = run_with_scissors( ::Hitimes::Stats.new, @threads, @iters )
|
22
|
+
stats.count.must_equal @final_value
|
23
|
+
end
|
24
|
+
else
|
25
|
+
it "Hitimes::Stats is not threadsafe" do
|
24
26
|
stats = run_with_scissors( ::Hitimes::Stats.new, @threads, @iters )
|
25
|
-
stats.count.
|
27
|
+
stats.count.wont_equal @final_value
|
26
28
|
end
|
27
29
|
end
|
28
30
|
|
29
31
|
it "has a threadsafe update" do
|
30
32
|
stats = run_with_scissors( ::Hitimes::MutexedStats.new, @threads, @iters )
|
31
|
-
stats.count.
|
33
|
+
stats.count.must_equal @final_value
|
32
34
|
end
|
33
35
|
|
34
36
|
end
|
data/spec/paths_spec.rb
CHANGED
@@ -1,13 +1,11 @@
|
|
1
|
-
require
|
2
|
-
|
3
|
-
require 'hitimes/paths'
|
1
|
+
require 'spec_helper'
|
4
2
|
|
5
3
|
describe Hitimes::Paths do
|
6
4
|
it "can access the root dir of the project" do
|
7
|
-
Hitimes::Paths.root_dir.
|
5
|
+
Hitimes::Paths.root_dir.must_equal File.expand_path( File.join( File.dirname( __FILE__ ), ".." ) ) + ::File::SEPARATOR
|
8
6
|
end
|
9
7
|
|
10
8
|
it "can access the lib path of the project" do
|
11
|
-
Hitimes::Paths.lib_path.
|
9
|
+
Hitimes::Paths.lib_path.must_equal File.expand_path( File.join( File.dirname( __FILE__ ), "..", "lib" ) ) + ::File::SEPARATOR
|
12
10
|
end
|
13
11
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,6 +1,11 @@
|
|
1
|
-
|
2
|
-
require '
|
1
|
+
if RUBY_VERSION >= '1.9.2' then
|
2
|
+
require 'simplecov'
|
3
|
+
puts "Using coverage!"
|
4
|
+
SimpleCov.start if ENV['COVERAGE']
|
5
|
+
end
|
3
6
|
|
4
|
-
|
5
|
-
|
7
|
+
gem 'minitest'
|
8
|
+
require 'hitimes'
|
9
|
+
require 'minitest/autorun'
|
10
|
+
require 'minitest/pride'
|
6
11
|
|
data/spec/stats_spec.rb
CHANGED
@@ -1,6 +1,4 @@
|
|
1
|
-
require
|
2
|
-
|
3
|
-
require 'hitimes/stats'
|
1
|
+
require 'spec_helper'
|
4
2
|
require 'json'
|
5
3
|
|
6
4
|
describe Hitimes::Stats do
|
@@ -12,64 +10,64 @@ describe Hitimes::Stats do
|
|
12
10
|
end
|
13
11
|
|
14
12
|
it "is initialized with 0 values" do
|
15
|
-
@stats.count.
|
16
|
-
@stats.min.
|
17
|
-
@stats.max.
|
18
|
-
@stats.sum.
|
19
|
-
@stats.rate.
|
13
|
+
@stats.count.must_equal 0
|
14
|
+
@stats.min.must_equal 0.0
|
15
|
+
@stats.max.must_equal 0.0
|
16
|
+
@stats.sum.must_equal 0.0
|
17
|
+
@stats.rate.must_equal 0.0
|
20
18
|
end
|
21
19
|
|
22
20
|
it "calculates the mean correctly" do
|
23
|
-
@full_stats.mean.
|
21
|
+
@full_stats.mean.must_equal 2.0
|
24
22
|
end
|
25
23
|
|
26
24
|
it "calculates the rate correctly" do
|
27
|
-
@full_stats.rate.
|
25
|
+
@full_stats.rate.must_equal 0.5
|
28
26
|
end
|
29
27
|
|
30
28
|
it "tracks the maximum value" do
|
31
|
-
@full_stats.max.
|
29
|
+
@full_stats.max.must_equal 3.0
|
32
30
|
end
|
33
31
|
|
34
32
|
it "tracks the minimum value" do
|
35
|
-
@full_stats.min.
|
33
|
+
@full_stats.min.must_equal 1.0
|
36
34
|
end
|
37
35
|
|
38
36
|
it "tracks the count" do
|
39
|
-
@full_stats.count.
|
37
|
+
@full_stats.count.must_equal 3
|
40
38
|
end
|
41
39
|
|
42
40
|
it "tracks the sum" do
|
43
|
-
@full_stats.sum.
|
41
|
+
@full_stats.sum.must_equal 6.0
|
44
42
|
end
|
45
43
|
|
46
44
|
it "calculates the standard deviation" do
|
47
|
-
@full_stats.stddev.
|
45
|
+
@full_stats.stddev.must_equal 1.0
|
48
46
|
end
|
49
47
|
|
50
48
|
it "calculates the sum of squares " do
|
51
|
-
@full_stats.sumsq.
|
49
|
+
@full_stats.sumsq.must_equal 14.0
|
52
50
|
end
|
53
51
|
|
54
52
|
describe "#to_hash " do
|
55
53
|
it "converts to a Hash" do
|
56
54
|
h = @full_stats.to_hash
|
57
|
-
h.size.
|
58
|
-
h.keys.sort.
|
55
|
+
h.size.must_equal ::Hitimes::Stats::STATS.size
|
56
|
+
h.keys.sort.must_equal ::Hitimes::Stats::STATS
|
59
57
|
end
|
60
58
|
|
61
59
|
it "converts to a limited Hash if given arguments" do
|
62
60
|
h = @full_stats.to_hash( "min", "max", "mean" )
|
63
|
-
h.size.
|
64
|
-
h.keys.sort.
|
61
|
+
h.size.must_equal 3
|
62
|
+
h.keys.sort.must_equal %w[ max mean min ]
|
65
63
|
|
66
64
|
h = @full_stats.to_hash( %w[ count rate ] )
|
67
|
-
h.size.
|
68
|
-
h.keys.sort.
|
65
|
+
h.size.must_equal 2
|
66
|
+
h.keys.sort.must_equal %w[ count rate ]
|
69
67
|
end
|
70
68
|
|
71
69
|
it "raises NoMethodError if an invalid stat is used" do
|
72
|
-
lambda { @full_stats.to_hash( "wibble" ) }.
|
70
|
+
lambda { @full_stats.to_hash( "wibble" ) }.must_raise( NoMethodError )
|
73
71
|
end
|
74
72
|
end
|
75
73
|
|
@@ -77,24 +75,24 @@ describe Hitimes::Stats do
|
|
77
75
|
it "converts to a json string" do
|
78
76
|
j = @full_stats.to_json
|
79
77
|
h = JSON.parse( j )
|
80
|
-
h.size.
|
81
|
-
h.keys.sort.
|
78
|
+
h.size.must_equal ::Hitimes::Stats::STATS.size
|
79
|
+
h.keys.sort.must_equal ::Hitimes::Stats::STATS
|
82
80
|
end
|
83
81
|
|
84
82
|
it "converts to a limited Hash if given arguments" do
|
85
83
|
j = @full_stats.to_json( "min", "max", "mean" )
|
86
84
|
h = JSON.parse( j )
|
87
|
-
h.size.
|
88
|
-
h.keys.sort.
|
85
|
+
h.size.must_equal 3
|
86
|
+
h.keys.sort.must_equal %w[ max mean min ]
|
89
87
|
|
90
88
|
j = @full_stats.to_json( %w[ count rate ] )
|
91
89
|
h = JSON.parse( j )
|
92
|
-
h.size.
|
93
|
-
h.keys.sort.
|
90
|
+
h.size.must_equal 2
|
91
|
+
h.keys.sort.must_equal %w[ count rate ]
|
94
92
|
end
|
95
93
|
|
96
94
|
it "raises NoMethodError if an invalid stat is used" do
|
97
|
-
lambda { @full_stats.to_json( "wibble" ) }.
|
95
|
+
lambda { @full_stats.to_json( "wibble" ) }.must_raise( NoMethodError )
|
98
96
|
end
|
99
97
|
end
|
100
98
|
end
|
data/spec/timed_metric_spec.rb
CHANGED
@@ -1,6 +1,4 @@
|
|
1
|
-
require
|
2
|
-
|
3
|
-
require 'hitimes/timed_metric'
|
1
|
+
require 'spec_helper'
|
4
2
|
|
5
3
|
describe Hitimes::TimedMetric do
|
6
4
|
before( :each ) do
|
@@ -8,147 +6,149 @@ describe Hitimes::TimedMetric do
|
|
8
6
|
end
|
9
7
|
|
10
8
|
it "knows if it is running or not" do
|
11
|
-
@tm.
|
9
|
+
@tm.running?.must_equal false
|
12
10
|
@tm.start
|
13
|
-
@tm.
|
11
|
+
@tm.running?.must_equal true
|
14
12
|
@tm.stop
|
15
|
-
@tm.
|
13
|
+
@tm.running?.must_equal false
|
16
14
|
end
|
17
15
|
|
18
16
|
it "#split returns the last duration and the timer is still running" do
|
19
17
|
@tm.start
|
20
18
|
d = @tm.split
|
21
|
-
@tm.
|
22
|
-
d.
|
23
|
-
@tm.count.
|
24
|
-
@tm.duration.
|
19
|
+
@tm.running?.must_equal true
|
20
|
+
d.must_be :>, 0
|
21
|
+
@tm.count.must_equal 1
|
22
|
+
@tm.duration.must_equal d
|
25
23
|
end
|
26
24
|
|
27
25
|
it "#stop returns false if called more than once in a row" do
|
28
26
|
@tm.start
|
29
|
-
@tm.stop.
|
30
|
-
@tm.stop.
|
27
|
+
@tm.stop.must_be :>, 0
|
28
|
+
@tm.stop.must_equal false
|
31
29
|
end
|
32
30
|
|
33
31
|
it "does not count a currently running interval as an interval in calculations" do
|
34
32
|
@tm.start
|
35
|
-
@tm.count.
|
33
|
+
@tm.count.must_equal 0
|
36
34
|
@tm.split
|
37
|
-
@tm.count.
|
35
|
+
@tm.count.must_equal 1
|
38
36
|
end
|
39
37
|
|
40
38
|
it "#split called on a stopped timer does nothing" do
|
41
39
|
@tm.start
|
42
40
|
@tm.stop
|
43
|
-
@tm.split.
|
41
|
+
@tm.split.must_equal false
|
44
42
|
end
|
45
43
|
|
46
44
|
it "calculates the mean of the durations" do
|
47
45
|
2.times { @tm.start ; sleep 0.05 ; @tm.stop }
|
48
|
-
@tm.mean.
|
46
|
+
@tm.mean.must_be_close_to(0.05, 0.002)
|
49
47
|
end
|
50
48
|
|
51
49
|
it "calculates the rate of the counts " do
|
52
50
|
5.times { @tm.start ; sleep 0.05 ; @tm.stop }
|
53
|
-
@tm.rate.
|
51
|
+
@tm.rate.must_be_close_to(20.00, 0.5)
|
54
52
|
end
|
55
53
|
|
56
54
|
|
57
55
|
it "calculates the stddev of the durations" do
|
58
|
-
3.times { |x| @tm.start ; sleep
|
59
|
-
@tm.stddev.
|
56
|
+
3.times { |x| @tm.start ; sleep(0.05 * x) ; @tm.stop }
|
57
|
+
@tm.stddev.must_be_close_to(0.05)
|
60
58
|
end
|
61
59
|
|
62
60
|
it "returns 0.0 for stddev if there is no data" do
|
63
|
-
@tm.stddev.
|
61
|
+
@tm.stddev.must_equal 0.0
|
64
62
|
end
|
65
63
|
|
66
64
|
it "keeps track of the min value" do
|
67
65
|
2.times { @tm.start ; sleep 0.05 ; @tm.stop }
|
68
|
-
@tm.min.
|
66
|
+
@tm.min.must_be_close_to(0.05, 0.01)
|
69
67
|
end
|
70
68
|
|
71
69
|
it "keeps track of the max value" do
|
72
70
|
2.times { @tm.start ; sleep 0.05 ; @tm.stop }
|
73
|
-
@tm.max.
|
71
|
+
@tm.max.must_be_close_to(0.05, 0.01)
|
74
72
|
end
|
75
73
|
|
76
74
|
it "keeps track of the sum value" do
|
77
75
|
2.times { @tm.start ; sleep 0.05 ; @tm.stop }
|
78
|
-
@tm.sum.
|
76
|
+
@tm.sum.must_be_close_to(0.10, 0.01)
|
79
77
|
end
|
80
|
-
|
78
|
+
|
81
79
|
it "keeps track of the sum of squars value" do
|
82
80
|
3.times { @tm.start ; sleep 0.05 ; @tm.stop }
|
83
|
-
@tm.sumsq.
|
81
|
+
@tm.sumsq.must_be_close_to(0.0075)
|
84
82
|
end
|
85
83
|
|
86
84
|
it "keeps track of the minimum start time of all the intervals" do
|
87
|
-
f1 = Time.now.gmtime.to_f *
|
85
|
+
f1 = Time.now.gmtime.to_f * 1_000_000
|
88
86
|
5.times { @tm.start ; sleep 0.05 ; @tm.stop }
|
89
|
-
f2 = Time.now.gmtime.to_f *
|
90
|
-
@tm.sampling_start_time.
|
91
|
-
@tm.sampling_start_time.
|
87
|
+
f2 = Time.now.gmtime.to_f * 1_000_000
|
88
|
+
@tm.sampling_start_time.must_be :>=, f1
|
89
|
+
@tm.sampling_start_time.must_be :<, f2
|
92
90
|
# distance from now to start time should be greater than the distance from
|
93
91
|
# the start to the min start_time
|
94
|
-
(f2 - @tm.sampling_start_time).
|
92
|
+
(f2 - @tm.sampling_start_time).must_be :>, ( @tm.sampling_start_time - f1 )
|
95
93
|
end
|
96
94
|
|
97
95
|
it "keeps track of the last stop time of all the intervals" do
|
98
96
|
f1 = Time.now.gmtime.to_f * 1_000_000
|
97
|
+
sleep 0.01
|
99
98
|
5.times { @tm.start ; sleep 0.05 ; @tm.stop }
|
99
|
+
sleep 0.01
|
100
100
|
f2 = Time.now.gmtime.to_f * 1_000_000
|
101
|
-
@tm.sampling_stop_time.
|
102
|
-
@tm.sampling_stop_time.
|
101
|
+
@tm.sampling_stop_time.must_be :>, f1
|
102
|
+
@tm.sampling_stop_time.must_be :<=, f2
|
103
103
|
# distance from now to max stop time time should be less than the distance
|
104
104
|
# from the start to the max stop time
|
105
|
-
(f2 - @tm.sampling_stop_time).
|
105
|
+
(f2 - @tm.sampling_stop_time).must_be :<, ( @tm.sampling_stop_time - f1 )
|
106
106
|
end
|
107
107
|
|
108
108
|
it "can create an already running timer" do
|
109
109
|
t = Hitimes::TimedMetric.now( 'already-running' )
|
110
|
-
t.
|
110
|
+
t.running?.must_equal true
|
111
111
|
end
|
112
112
|
|
113
113
|
it "can measure a block of code from an instance" do
|
114
114
|
t = Hitimes::TimedMetric.new( 'measure a block' )
|
115
115
|
3.times { t.measure { sleep 0.05 } }
|
116
|
-
t.duration.
|
117
|
-
t.count.
|
116
|
+
t.duration.must_be_close_to(0.15, 0.01)
|
117
|
+
t.count.must_equal 3
|
118
118
|
end
|
119
119
|
|
120
120
|
it "returns the value of the block when measuring" do
|
121
121
|
t = Hitimes::TimedMetric.new( 'measure a block' )
|
122
122
|
x = t.measure { sleep 0.05; 42 }
|
123
|
-
t.duration.
|
124
|
-
x.
|
123
|
+
t.duration.must_be_close_to(0.05, 0.002)
|
124
|
+
x.must_equal 42
|
125
125
|
end
|
126
126
|
|
127
127
|
describe "#to_hash" do
|
128
128
|
|
129
129
|
it "has name value" do
|
130
130
|
h = @tm.to_hash
|
131
|
-
h['name'].
|
131
|
+
h['name'].must_equal "test-timed-metric"
|
132
132
|
end
|
133
133
|
|
134
134
|
it "has an empty hash for additional_data" do
|
135
135
|
h = @tm.to_hash
|
136
|
-
h['additional_data'].
|
137
|
-
h['additional_data'].size.
|
136
|
+
h['additional_data'].must_equal Hash.new
|
137
|
+
h['additional_data'].size.must_equal 0
|
138
138
|
end
|
139
139
|
|
140
140
|
it "has the right sum" do
|
141
141
|
10.times { |x| @tm.measure { sleep 0.01*x } }
|
142
142
|
h = @tm.to_hash
|
143
|
-
h['sum'].
|
143
|
+
h['sum'].must_be_close_to(0.45, 0.01)
|
144
144
|
end
|
145
145
|
|
146
146
|
fields = ::Hitimes::Stats::STATS.dup + %w[ name additional_data sampling_start_time sampling_stop_time ]
|
147
147
|
fields.each do |f|
|
148
|
-
it "
|
148
|
+
it "has a value for #{f}" do
|
149
149
|
@tm.measure { sleep 0.001 }
|
150
150
|
h = @tm.to_hash
|
151
|
-
h[f].
|
151
|
+
h[f].wont_be_nil
|
152
152
|
end
|
153
153
|
end
|
154
154
|
end
|
@@ -1,6 +1,4 @@
|
|
1
|
-
require
|
2
|
-
|
3
|
-
require 'hitimes/timed_value_metric'
|
1
|
+
require 'spec_helper'
|
4
2
|
|
5
3
|
describe Hitimes::TimedValueMetric do
|
6
4
|
before( :each ) do
|
@@ -8,164 +6,165 @@ describe Hitimes::TimedValueMetric do
|
|
8
6
|
end
|
9
7
|
|
10
8
|
it "knows if it is running or not" do
|
11
|
-
@tm.
|
9
|
+
@tm.running?.must_equal false
|
12
10
|
@tm.start
|
13
|
-
@tm.
|
11
|
+
@tm.running?.must_equal true
|
14
12
|
@tm.stop( 1 )
|
15
|
-
@tm.
|
13
|
+
@tm.running?.must_equal false
|
16
14
|
end
|
17
15
|
|
18
16
|
it "#split returns the last duration and the timer is still running" do
|
19
17
|
@tm.start
|
20
18
|
d = @tm.split( 1 )
|
21
|
-
@tm.
|
22
|
-
d.
|
23
|
-
@tm.value_stats.count.
|
24
|
-
@tm.timed_stats.count.
|
25
|
-
@tm.duration.
|
19
|
+
@tm.running?.must_equal true
|
20
|
+
d.must_be :>, 0
|
21
|
+
@tm.value_stats.count.must_equal 1
|
22
|
+
@tm.timed_stats.count.must_equal 1
|
23
|
+
@tm.duration.must_equal d
|
26
24
|
end
|
27
25
|
|
28
26
|
it "#stop returns false if called more than once in a row" do
|
29
27
|
@tm.start
|
30
|
-
@tm.stop( 1 ).
|
31
|
-
@tm.stop( 1 ).
|
28
|
+
@tm.stop( 1 ).must_be :>, 0
|
29
|
+
@tm.stop( 1 ).must_equal false
|
32
30
|
end
|
33
31
|
|
34
32
|
it "does not count a currently running interval as an interval in calculations" do
|
35
33
|
@tm.start
|
36
|
-
@tm.value_stats.count.
|
37
|
-
@tm.timed_stats.count.
|
34
|
+
@tm.value_stats.count.must_equal 0
|
35
|
+
@tm.timed_stats.count.must_equal 0
|
38
36
|
@tm.split( 1 )
|
39
|
-
@tm.value_stats.count.
|
40
|
-
@tm.timed_stats.count.
|
37
|
+
@tm.value_stats.count.must_equal 1
|
38
|
+
@tm.timed_stats.count.must_equal 1
|
41
39
|
end
|
42
40
|
|
43
41
|
it "#split called on a stopped timer does nothing" do
|
44
42
|
@tm.start
|
45
43
|
@tm.stop( 1 )
|
46
|
-
@tm.split( 1 ).
|
44
|
+
@tm.split( 1 ).must_equal false
|
47
45
|
end
|
48
46
|
|
49
47
|
it "calculates the mean of the durations" do
|
50
48
|
3.times { |x| @tm.start ; sleep 0.05 ; @tm.stop(x) }
|
51
|
-
@tm.timed_stats.mean.
|
52
|
-
@tm.value_stats.mean.
|
49
|
+
@tm.timed_stats.mean.must_be_close_to(0.05, 0.01)
|
50
|
+
@tm.value_stats.mean.must_equal 1.00
|
53
51
|
end
|
54
52
|
|
55
53
|
it "calculates the rate of the counts " do
|
56
54
|
5.times { |x| @tm.start ; sleep 0.05 ; @tm.stop( x ) }
|
57
|
-
@tm.rate.
|
55
|
+
@tm.rate.must_be_close_to(40.0, 1.0)
|
58
56
|
end
|
59
57
|
|
60
58
|
|
61
59
|
it "calculates the stddev of the durations" do
|
62
|
-
3.times { |x| @tm.start ; sleep
|
63
|
-
@tm.timed_stats.stddev.
|
64
|
-
@tm.value_stats.stddev.
|
60
|
+
3.times { |x| @tm.start ; sleep(0.05 * x) ; @tm.stop(x) }
|
61
|
+
@tm.timed_stats.stddev.must_be_close_to(0.05, 0.001)
|
62
|
+
@tm.value_stats.stddev.must_equal 1.0
|
65
63
|
end
|
66
64
|
|
67
65
|
it "returns 0.0 for stddev if there is no data" do
|
68
|
-
@tm.timed_stats.stddev.
|
69
|
-
@tm.value_stats.stddev.
|
66
|
+
@tm.timed_stats.stddev.must_equal 0.0
|
67
|
+
@tm.value_stats.stddev.must_equal 0.0
|
70
68
|
end
|
71
69
|
|
72
70
|
it "keeps track of the min value" do
|
73
71
|
3.times { |x| @tm.start ; sleep 0.05 ; @tm.stop( x ) }
|
74
|
-
@tm.timed_stats.min.
|
75
|
-
@tm.value_stats.min.
|
72
|
+
@tm.timed_stats.min.must_be_close_to( 0.05, 0.003 )
|
73
|
+
@tm.value_stats.min.must_equal 0
|
76
74
|
end
|
77
75
|
|
78
76
|
it "keeps track of the max value" do
|
79
77
|
3.times { |x| @tm.start ; sleep 0.05 ; @tm.stop( x ) }
|
80
|
-
@tm.timed_stats.max.
|
81
|
-
@tm.value_stats.max.
|
78
|
+
@tm.timed_stats.max.must_be_close_to( 0.05, 0.003 )
|
79
|
+
@tm.value_stats.max.must_equal 2
|
82
80
|
end
|
83
81
|
|
84
82
|
it "keeps track of the sum value" do
|
85
83
|
3.times { |x| @tm.start ; sleep 0.05 ; @tm.stop( x ) }
|
86
|
-
@tm.timed_stats.sum.
|
87
|
-
@tm.value_stats.sum.
|
84
|
+
@tm.timed_stats.sum.must_be_close_to( 0.15, 0.01 )
|
85
|
+
@tm.value_stats.sum.must_equal 3
|
88
86
|
end
|
89
87
|
|
90
88
|
it "keeps track of the sum of squares value" do
|
91
89
|
3.times { |x| @tm.start ; sleep 0.05 ; @tm.stop( x ) }
|
92
|
-
@tm.timed_stats.sumsq.
|
93
|
-
@tm.value_stats.sumsq.
|
90
|
+
@tm.timed_stats.sumsq.must_be_close_to(0.0075, 0.0005)
|
91
|
+
@tm.value_stats.sumsq.must_equal 5
|
94
92
|
end
|
95
93
|
|
96
94
|
it "keeps track of the minimum start time of all the intervals" do
|
97
95
|
f1 = Time.now.gmtime.to_f * 1000000
|
98
96
|
5.times { @tm.start ; sleep 0.05 ; @tm.stop( 1 ) }
|
99
97
|
f2 = Time.now.gmtime.to_f * 1000000
|
100
|
-
@tm.sampling_start_time.
|
101
|
-
@tm.sampling_start_time.
|
98
|
+
@tm.sampling_start_time.must_be :>=, f1
|
99
|
+
@tm.sampling_start_time.must_be :<, f2
|
102
100
|
# distance from now to start time should be greater than the distance from
|
103
101
|
# the start to the min start_time
|
104
|
-
(f2 - @tm.sampling_start_time).
|
102
|
+
(f2 - @tm.sampling_start_time).must_be :>, ( @tm.sampling_start_time - f1 )
|
105
103
|
end
|
106
104
|
|
107
105
|
it "keeps track of the last stop time of all the intervals" do
|
108
|
-
f1 = Time.now.gmtime.to_f *
|
106
|
+
f1 = Time.now.gmtime.to_f * 1_000_000
|
109
107
|
5.times { @tm.start ; sleep 0.05 ; @tm.stop( 1 ) }
|
110
|
-
|
111
|
-
|
112
|
-
@tm.sampling_stop_time.
|
108
|
+
sleep 0.05
|
109
|
+
f2 = Time.now.gmtime.to_f * 1_000_000
|
110
|
+
@tm.sampling_stop_time.must_be :>, f1
|
111
|
+
@tm.sampling_stop_time.must_be :<=, f2
|
113
112
|
# distance from now to max stop time time should be less than the distance
|
114
113
|
# from the start to the max stop time
|
115
|
-
(f2 - @tm.sampling_stop_time).
|
114
|
+
(f2 - @tm.sampling_stop_time).must_be :<, ( @tm.sampling_stop_time - f1 )
|
116
115
|
end
|
117
116
|
|
118
117
|
it "can create an already running timer" do
|
119
118
|
t = Hitimes::TimedValueMetric.now( 'already-running' )
|
120
|
-
t.
|
119
|
+
t.running?.must_equal true
|
121
120
|
end
|
122
121
|
|
123
122
|
it "can measure a block of code from an instance" do
|
124
123
|
t = Hitimes::TimedValueMetric.new( 'measure a block' )
|
125
124
|
3.times { t.measure( 1 ) { sleep 0.05 } }
|
126
|
-
t.duration.
|
127
|
-
t.timed_stats.count.
|
128
|
-
t.value_stats.count.
|
125
|
+
t.duration.must_be_close_to(0.15, 0.004)
|
126
|
+
t.timed_stats.count.must_equal 3
|
127
|
+
t.value_stats.count.must_equal 3
|
129
128
|
end
|
130
129
|
|
131
130
|
it "returns the value of the block when measuring" do
|
132
131
|
t = Hitimes::TimedValueMetric.new( 'measure a block' )
|
133
132
|
x = t.measure( 42 ) { sleep 0.05; 42 }
|
134
|
-
t.duration.
|
135
|
-
x.
|
133
|
+
t.duration.must_be_close_to(0.05, 0.002)
|
134
|
+
x.must_equal 42
|
136
135
|
end
|
137
136
|
|
138
137
|
describe "#to_hash" do
|
139
138
|
|
140
139
|
it "has name value" do
|
141
140
|
h = @tm.to_hash
|
142
|
-
h['name'].
|
141
|
+
h['name'].must_equal "test-timed-value-metric"
|
143
142
|
end
|
144
143
|
|
145
144
|
it "has an empty has for additional_data" do
|
146
145
|
h = @tm.to_hash
|
147
|
-
h['additional_data'].
|
148
|
-
h['additional_data'].size.
|
146
|
+
h['additional_data'].must_equal Hash.new
|
147
|
+
h['additional_data'].size.must_equal 0
|
149
148
|
end
|
150
149
|
|
151
150
|
it "has a rate" do
|
152
151
|
5.times { |x| @tm.start ; sleep 0.05 ; @tm.stop( x ) }
|
153
152
|
h = @tm.to_hash
|
154
|
-
h['rate'].
|
153
|
+
h['rate'].must_be_close_to(40.0, 1.0)
|
155
154
|
end
|
156
155
|
|
157
156
|
it "has a unit_count" do
|
158
157
|
5.times { |x| @tm.start ; sleep 0.05 ; @tm.stop( x ) }
|
159
158
|
h = @tm.to_hash
|
160
|
-
h['unit_count'].
|
159
|
+
h['unit_count'].must_equal 10
|
161
160
|
end
|
162
161
|
|
163
162
|
fields = %w[ name additional_data sampling_start_time sampling_stop_time value_stats timed_stats rate unit_count ]
|
164
163
|
fields.each do |f|
|
165
|
-
it "
|
164
|
+
it "has a value for #{f}" do
|
166
165
|
3.times { |x| @tm.measure(x) { sleep 0.001 } }
|
167
166
|
h = @tm.to_hash
|
168
|
-
h[f].
|
167
|
+
h[f].wont_be_nil
|
169
168
|
end
|
170
169
|
end
|
171
170
|
end
|