fiveruns-dash-ruby 0.7.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +68 -0
- data/Rakefile +39 -0
- data/lib/fiveruns/dash.rb +144 -0
- data/lib/fiveruns/dash/configuration.rb +116 -0
- data/lib/fiveruns/dash/exception_recorder.rb +135 -0
- data/lib/fiveruns/dash/host.rb +173 -0
- data/lib/fiveruns/dash/instrument.rb +128 -0
- data/lib/fiveruns/dash/metric.rb +379 -0
- data/lib/fiveruns/dash/recipe.rb +63 -0
- data/lib/fiveruns/dash/reporter.rb +208 -0
- data/lib/fiveruns/dash/scm.rb +126 -0
- data/lib/fiveruns/dash/session.rb +81 -0
- data/lib/fiveruns/dash/store/file.rb +24 -0
- data/lib/fiveruns/dash/store/http.rb +198 -0
- data/lib/fiveruns/dash/threads.rb +24 -0
- data/lib/fiveruns/dash/trace.rb +65 -0
- data/lib/fiveruns/dash/typable.rb +29 -0
- data/lib/fiveruns/dash/update.rb +215 -0
- data/lib/fiveruns/dash/version.rb +86 -0
- data/recipes/jruby.rb +107 -0
- data/recipes/ruby.rb +34 -0
- data/test/collector_communication_test.rb +260 -0
- data/test/configuration_test.rb +97 -0
- data/test/exception_recorder_test.rb +112 -0
- data/test/file_store_test.rb +56 -0
- data/test/fixtures/http_store_test/response.json +6 -0
- data/test/http_store_test.rb +210 -0
- data/test/metric_test.rb +204 -0
- data/test/recipe_test.rb +146 -0
- data/test/reliability_test.rb +60 -0
- data/test/reporter_test.rb +46 -0
- data/test/scm_test.rb +70 -0
- data/test/session_test.rb +49 -0
- data/test/test_helper.rb +96 -0
- data/test/tracing_test.rb +68 -0
- data/test/update_test.rb +42 -0
- data/version.yml +3 -0
- metadata +112 -0
data/test/scm_test.rb
ADDED
@@ -0,0 +1,70 @@
|
|
1
|
+
require File.dirname(__FILE__) << "/test_helper"
|
2
|
+
require 'date'
|
3
|
+
|
4
|
+
#weird problems with flexmock resulted in this
|
5
|
+
module Fiveruns
|
6
|
+
module Dash
|
7
|
+
class SvnSCM
|
8
|
+
private
|
9
|
+
def svn_info
|
10
|
+
<<-EOF
|
11
|
+
Path: .
|
12
|
+
URL: http://me.svnrepository.com/svn/dash/trunk
|
13
|
+
Repository Root: http://me.svnrepository.com/svn/dash/trunk
|
14
|
+
Repository UUID: f206d12c-05cc-4c44-99a1-426015a0eef1
|
15
|
+
Revision: 123
|
16
|
+
Node Kind: directory
|
17
|
+
Schedule: normal
|
18
|
+
Last Changed Author: acf
|
19
|
+
Last Changed Rev: 123
|
20
|
+
Last Changed Date: 2008-07-27 18:44:52 +0100 (Sun, 27 Jul 2008)
|
21
|
+
EOF
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
class ScmTest < Test::Unit::TestCase
|
28
|
+
|
29
|
+
include Fiveruns::Dash
|
30
|
+
|
31
|
+
context "All SCMs" do
|
32
|
+
should "find .git in gems/fiveruns_dash on locate_upwards" do
|
33
|
+
assert_match File.expand_path(File.join(File.dirname(__FILE__), '..')),
|
34
|
+
SCM.send(:locate_upwards, File.dirname(__FILE__), ".git" )
|
35
|
+
end
|
36
|
+
|
37
|
+
should "return nil from locate_upwards when no .git" do
|
38
|
+
assert_nil SCM.send(:locate_upwards, '/tmp', ".git" )
|
39
|
+
end
|
40
|
+
|
41
|
+
should "return nil from locate_upwards when root on posix" do
|
42
|
+
assert_nil SCM.send(:locate_upwards, "/", ".git" )
|
43
|
+
end
|
44
|
+
|
45
|
+
should "select the longest path when two available" do
|
46
|
+
assert_equal( "/Users/acf/foo/bar/baz" , SCM.send(:best_match, ["/Users/acf/foo/bar/baz", "/Users/acf/foo/bar/baz", "/Users/acf"]) )
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
|
51
|
+
|
52
|
+
context "Subversion SCM" do
|
53
|
+
setup do
|
54
|
+
@scm = SvnSCM.new( File.dirname(__FILE__) )
|
55
|
+
end
|
56
|
+
|
57
|
+
should "extract revision properly from svn info" do
|
58
|
+
assert_equal 123, @scm.revision
|
59
|
+
end
|
60
|
+
|
61
|
+
should "extract time properly from svn info" do
|
62
|
+
assert_equal DateTime.parse("2008-07-27 18:44:52 +0100"), @scm.time
|
63
|
+
end
|
64
|
+
|
65
|
+
should "extract URL properly from svn info" do
|
66
|
+
assert_equal "http://me.svnrepository.com/svn/dash/trunk", @scm.url
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require File.dirname(__FILE__) << "/test_helper"
|
2
|
+
|
3
|
+
class SessionTest < Test::Unit::TestCase
|
4
|
+
|
5
|
+
attr_reader :session
|
6
|
+
|
7
|
+
context "Session" do
|
8
|
+
|
9
|
+
setup do
|
10
|
+
mock!
|
11
|
+
@session = Session.new(@configuration)
|
12
|
+
end
|
13
|
+
|
14
|
+
should "start reporter in background by default" do
|
15
|
+
session.start
|
16
|
+
assert session.reporter.started?
|
17
|
+
assert session.reporter.background?
|
18
|
+
end
|
19
|
+
|
20
|
+
should "optionally start reporter in foreground" do
|
21
|
+
session.start(false)
|
22
|
+
assert session.reporter.started?
|
23
|
+
assert session.reporter.foreground?
|
24
|
+
end
|
25
|
+
|
26
|
+
context "data" do
|
27
|
+
should "have right number of metrics" do
|
28
|
+
assert_equal @metrics.size, session.data.size
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
context "info" do
|
33
|
+
should "have metric_infos" do
|
34
|
+
assert_kind_of Array, session.info[:metric_infos]
|
35
|
+
assert_equal @metrics.size, session.info[:metric_infos].size
|
36
|
+
end
|
37
|
+
should "have recipes" do
|
38
|
+
assert_kind_of Array, session.info[:recipes]
|
39
|
+
session.info[:recipes].each do |recipe|
|
40
|
+
assert_kind_of String, recipe[:name]
|
41
|
+
assert_kind_of String, recipe[:url]
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,96 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'rubygems'
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'shoulda'
|
6
|
+
require 'flexmock/test_unit'
|
7
|
+
require 'fake_web'
|
8
|
+
rescue
|
9
|
+
puts "Please install the Shoulda, FakeWeb and flexmock gems to run the Dash plugin tests."
|
10
|
+
end
|
11
|
+
|
12
|
+
$:.unshift(File.dirname(__FILE__) << '/../lib')
|
13
|
+
# Require library files
|
14
|
+
require 'fiveruns/dash'
|
15
|
+
|
16
|
+
class Test::Unit::TestCase
|
17
|
+
|
18
|
+
include Fiveruns::Dash
|
19
|
+
|
20
|
+
def mock!
|
21
|
+
no_recipe_loading!
|
22
|
+
mock_configuration!
|
23
|
+
create_session!
|
24
|
+
mock_reporter!
|
25
|
+
end
|
26
|
+
|
27
|
+
def create_session!
|
28
|
+
@session = Session.new(@configuration)
|
29
|
+
end
|
30
|
+
|
31
|
+
def mock_configuration!
|
32
|
+
# Mock Configuration
|
33
|
+
@metrics = []
|
34
|
+
@metric_class = Class.new(Metric) do
|
35
|
+
def self.metric_type
|
36
|
+
:test
|
37
|
+
end
|
38
|
+
def info_id
|
39
|
+
1
|
40
|
+
end
|
41
|
+
end
|
42
|
+
3.times do |i|
|
43
|
+
@metrics << @metric_class.new("Metric#{i}") { 1 }
|
44
|
+
end
|
45
|
+
@recipes = []
|
46
|
+
@recipes << Fiveruns::Dash::Recipe.new(:foo, :url => 'http://foo.com')
|
47
|
+
@recipes << Fiveruns::Dash::Recipe.new(:foo2, :url => 'http://foo2.com')
|
48
|
+
@metrics << @metric_class.new("NonCustomMetric") { 2 }
|
49
|
+
@configuration = flexmock(:configuration) do |mock|
|
50
|
+
mock.should_receive(:metrics).and_return(@metrics)
|
51
|
+
mock.should_receive(:recipes).and_return(@recipes)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def mock_reporter!
|
56
|
+
@restarted = false
|
57
|
+
flexmock(Reporter).new_instances do |mock|
|
58
|
+
mock.should_receive(:run).and_return do |restarted|
|
59
|
+
@restarted = restarted
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def mock_streams!
|
65
|
+
@original_stdout = $stdout
|
66
|
+
$stdout = StringIO.new
|
67
|
+
@original_stderr = $stderr
|
68
|
+
$stderr = StringIO.new
|
69
|
+
@original_logdev = Fiveruns::Dash.logger.instance_eval { @logdev }
|
70
|
+
@logdev = Fiveruns::Dash.logger.instance_eval { @logdev = StringIO.new }
|
71
|
+
end
|
72
|
+
|
73
|
+
def no_recipe_loading!
|
74
|
+
# For now, we just stub it out so we don't muddy the list of recipes
|
75
|
+
# due to environmental factors
|
76
|
+
flexmock(Fiveruns::Dash).should_receive(:load_recipes)
|
77
|
+
end
|
78
|
+
|
79
|
+
def assert_wrote(*args)
|
80
|
+
stream = args.last.is_a?(StringIO) ? args.pop : @logdev
|
81
|
+
stream.rewind
|
82
|
+
content = stream.read.to_s.downcase
|
83
|
+
args.each do |word|
|
84
|
+
assert content.include?(word.downcase)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
def restore_streams!
|
89
|
+
if @original_stdout && @original_stderr
|
90
|
+
$stdout = @original_stdout
|
91
|
+
$stderr = @original_stderr
|
92
|
+
Fiveruns::Dash.logger.instance_eval { @logdev = @original_logdev }
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
require File.dirname(__FILE__) << "/test_helper"
|
2
|
+
|
3
|
+
class TracingTest < Test::Unit::TestCase
|
4
|
+
|
5
|
+
attr_reader :metric
|
6
|
+
|
7
|
+
def self.time_me(depth = 0)
|
8
|
+
time_me(depth + 1) if depth < 5
|
9
|
+
end
|
10
|
+
|
11
|
+
context "Tracing" do
|
12
|
+
|
13
|
+
setup do
|
14
|
+
Thread.current[:trace] = Fiveruns::Dash::Trace.new([:subject, 'Test'])
|
15
|
+
end
|
16
|
+
|
17
|
+
teardown do
|
18
|
+
# Hacked 'uninstrument' until it's built-in
|
19
|
+
::Fiveruns::Dash::Instrument.handlers.each do |handler|
|
20
|
+
if TracingTest.methods.include?(%r!:time_me_with_instrument_#{handler.hash}!)
|
21
|
+
(class << TracingTest; self; end).class_eval <<-EOCE
|
22
|
+
remove_method :time_me_with_instrument_#{handler.hash}
|
23
|
+
alias_method :time_me, :time_me_without_instrument_#{handler.hash}
|
24
|
+
remove_method :time_me_without_instrument_#{handler.hash}
|
25
|
+
EOCE
|
26
|
+
end
|
27
|
+
end
|
28
|
+
::Fiveruns::Dash::Instrument.handlers.clear
|
29
|
+
end
|
30
|
+
|
31
|
+
context "metrics" do
|
32
|
+
setup do
|
33
|
+
@metric = TimeMetric.new(:time_mes, :method => time_method)
|
34
|
+
flexmock(@metric).should_receive(:info_id).and_return(1)
|
35
|
+
end
|
36
|
+
should "create a call graph" do
|
37
|
+
invoke
|
38
|
+
assert_correct_graph trace.data
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
|
44
|
+
private
|
45
|
+
|
46
|
+
def assert_correct_graph(node, depth = 0)
|
47
|
+
assert_equal 1, node.children.size
|
48
|
+
assert_equal 1, node.metrics.size
|
49
|
+
if depth < 4
|
50
|
+
node.children.each do |child|
|
51
|
+
assert_correct_graph(child, depth + 1)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def trace
|
57
|
+
Thread.current[:trace]
|
58
|
+
end
|
59
|
+
|
60
|
+
def time_method
|
61
|
+
'TracingTest.time_me'
|
62
|
+
end
|
63
|
+
|
64
|
+
def invoke(number = 1)
|
65
|
+
number.times { TracingTest.time_me }
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
data/test/update_test.rb
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
require File.dirname(__FILE__) << "/test_helper"
|
2
|
+
|
3
|
+
class UpdateTest < Test::Unit::TestCase
|
4
|
+
|
5
|
+
context "Update" do
|
6
|
+
|
7
|
+
setup do
|
8
|
+
@update = Update.new(DataPayload.new({}))
|
9
|
+
end
|
10
|
+
|
11
|
+
context "an instance" do
|
12
|
+
|
13
|
+
context "GUID" do
|
14
|
+
setup do
|
15
|
+
@mock_pid = 'THE-PID'
|
16
|
+
flexmock(Process).should_receive(:pid).and_return(@mock_pid)
|
17
|
+
end
|
18
|
+
should "include PID" do
|
19
|
+
@update.guid.include?(@mock_pid)
|
20
|
+
end
|
21
|
+
should "start with a a timestamp" do
|
22
|
+
@update.guid[/^\d{10,}/]
|
23
|
+
end
|
24
|
+
should "be cached per instance" do
|
25
|
+
assert_equal @update.guid, @update.guid
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
context "storing data" do
|
30
|
+
setup do
|
31
|
+
@urls = %w(file:///tmp http://yahoo.com https://secure.thing.com)
|
32
|
+
end
|
33
|
+
should "find correct method" do
|
34
|
+
assert_equal [:file, :http, :http], @urls.map { |url| @update.send(:storage_method_for, URI.parse(url).scheme) }
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
data/version.yml
ADDED
metadata
ADDED
@@ -0,0 +1,112 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: fiveruns-dash-ruby
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.7.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- FiveRuns Development Team
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-01-28 00:00:00 -08:00
|
13
|
+
default_executable:
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: json
|
17
|
+
version_requirement:
|
18
|
+
version_requirements: !ruby/object:Gem::Requirement
|
19
|
+
requirements:
|
20
|
+
- - ">="
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: "0"
|
23
|
+
version:
|
24
|
+
- !ruby/object:Gem::Dependency
|
25
|
+
name: shoulda
|
26
|
+
version_requirement:
|
27
|
+
version_requirements: !ruby/object:Gem::Requirement
|
28
|
+
requirements:
|
29
|
+
- - ">="
|
30
|
+
- !ruby/object:Gem::Version
|
31
|
+
version: "0"
|
32
|
+
version:
|
33
|
+
description: Provides an API to send metrics to the FiveRuns Dash service
|
34
|
+
email: dev@fiveruns.com
|
35
|
+
executables: []
|
36
|
+
|
37
|
+
extensions: []
|
38
|
+
|
39
|
+
extra_rdoc_files: []
|
40
|
+
|
41
|
+
files:
|
42
|
+
- README.rdoc
|
43
|
+
- Rakefile
|
44
|
+
- version.yml
|
45
|
+
- lib/fiveruns
|
46
|
+
- lib/fiveruns/dash
|
47
|
+
- lib/fiveruns/dash/configuration.rb
|
48
|
+
- lib/fiveruns/dash/exception_recorder.rb
|
49
|
+
- lib/fiveruns/dash/host.rb
|
50
|
+
- lib/fiveruns/dash/instrument.rb
|
51
|
+
- lib/fiveruns/dash/metric.rb
|
52
|
+
- lib/fiveruns/dash/recipe.rb
|
53
|
+
- lib/fiveruns/dash/reporter.rb
|
54
|
+
- lib/fiveruns/dash/scm.rb
|
55
|
+
- lib/fiveruns/dash/session.rb
|
56
|
+
- lib/fiveruns/dash/store
|
57
|
+
- lib/fiveruns/dash/store/file.rb
|
58
|
+
- lib/fiveruns/dash/store/http.rb
|
59
|
+
- lib/fiveruns/dash/threads.rb
|
60
|
+
- lib/fiveruns/dash/trace.rb
|
61
|
+
- lib/fiveruns/dash/typable.rb
|
62
|
+
- lib/fiveruns/dash/update.rb
|
63
|
+
- lib/fiveruns/dash/version.rb
|
64
|
+
- lib/fiveruns/dash.rb
|
65
|
+
- test/collector_communication_test.rb
|
66
|
+
- test/configuration_test.rb
|
67
|
+
- test/exception_recorder_test.rb
|
68
|
+
- test/file_store_test.rb
|
69
|
+
- test/fixtures
|
70
|
+
- test/fixtures/http_store_test
|
71
|
+
- test/fixtures/http_store_test/response.json
|
72
|
+
- test/http_store_test.rb
|
73
|
+
- test/metric_test.rb
|
74
|
+
- test/recipe_test.rb
|
75
|
+
- test/reliability_test.rb
|
76
|
+
- test/reporter_test.rb
|
77
|
+
- test/scm_test.rb
|
78
|
+
- test/session_test.rb
|
79
|
+
- test/test_helper.rb
|
80
|
+
- test/tracing_test.rb
|
81
|
+
- test/update_test.rb
|
82
|
+
- recipes/jruby.rb
|
83
|
+
- recipes/ruby.rb
|
84
|
+
has_rdoc: true
|
85
|
+
homepage: http://github.com/fiveruns/dash-ruby
|
86
|
+
post_install_message:
|
87
|
+
rdoc_options:
|
88
|
+
- --inline-source
|
89
|
+
- --charset=UTF-8
|
90
|
+
require_paths:
|
91
|
+
- lib
|
92
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: "0"
|
97
|
+
version:
|
98
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
99
|
+
requirements:
|
100
|
+
- - ">="
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: "0"
|
103
|
+
version:
|
104
|
+
requirements: []
|
105
|
+
|
106
|
+
rubyforge_project: fiveruns
|
107
|
+
rubygems_version: 1.2.0
|
108
|
+
signing_key:
|
109
|
+
specification_version: 2
|
110
|
+
summary: FiveRuns Dash core library for Ruby
|
111
|
+
test_files: []
|
112
|
+
|