rbuilder 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +47 -0
- data/bin/rbuilder +65 -0
- data/conf/example.conf +2 -0
- data/rbuilder/build.rb +50 -0
- data/rbuilder/build_command.rb +33 -0
- data/rbuilder/build_configuration.rb +21 -0
- data/rbuilder/build_description.rb +46 -0
- data/rbuilder/build_report.rb +40 -0
- data/rbuilder/build_status.rb +39 -0
- data/rbuilder/builder.rb +45 -0
- data/rbuilder/gui.rb +6 -0
- data/rbuilder/gui/build_details_pane.rb +105 -0
- data/rbuilder/gui/build_list_view_entry.rb +33 -0
- data/rbuilder/gui/builder_list_view.rb +92 -0
- data/rbuilder/gui/builder_monitor_window.rb +112 -0
- data/rbuilder/gui/images.rb +5 -0
- data/rbuilder/gui/images/broken_builder.gif +0 -0
- data/rbuilder/gui/images/building.gif +0 -0
- data/rbuilder/gui/images/failed.gif +0 -0
- data/rbuilder/gui/images/ok.gif +0 -0
- data/rbuilder/gui/images/ok_builder.gif +0 -0
- data/rbuilder/lib/observer.rb +7 -0
- data/rbuilder/libs.rb +4 -0
- data/rbuilder/revision_committed.rb +21 -0
- data/rbuilder/source_control.rb +3 -0
- data/rbuilder/source_control/status.rb +23 -0
- data/rbuilder/source_control/svn.rb +64 -0
- data/rbuilder/source_control/tracker.rb +36 -0
- data/tests/gui/test_build_details_pane.rb +118 -0
- data/tests/gui/test_builder_list_view.rb +202 -0
- data/tests/gui/test_builder_list_view_entry.rb +79 -0
- data/tests/gui/test_builder_monitor_window.rb +81 -0
- data/tests/source_control/test_source_control.rb +52 -0
- data/tests/source_control/test_svn.rb +60 -0
- data/tests/test_build.rb +111 -0
- data/tests/test_build_command.rb +57 -0
- data/tests/test_build_configuration.rb +31 -0
- data/tests/test_build_description.rb +106 -0
- data/tests/test_build_report.rb +56 -0
- data/tests/test_builder.rb +54 -0
- data/tests/test_revision_comitted.rb +30 -0
- metadata +104 -0
data/tests/test_build.rb
ADDED
@@ -0,0 +1,111 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'rubygems'
|
3
|
+
require 'mocha'
|
4
|
+
require File.join(File.dirname(__FILE__), 'builder_test_env')
|
5
|
+
require 'libs'
|
6
|
+
|
7
|
+
|
8
|
+
class TestBuild < Test::Unit::TestCase
|
9
|
+
|
10
|
+
def test_contains_a_summary
|
11
|
+
build = Build.new(nil,nil,nil)
|
12
|
+
assert_equal '', build.summary
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_gets_archive_from_description
|
16
|
+
build = Build.new(nil, nil, nil, 'the_archive_name')
|
17
|
+
assert_equal 'the_archive_name', build.archive
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
class TestRunBuild < Test::Unit::TestCase
|
22
|
+
attr_reader :build, :build_description, :working_dir
|
23
|
+
def setup
|
24
|
+
@working_dir = "working_dir"
|
25
|
+
@build_description = stub(:execute => nil)
|
26
|
+
build_reason = Object
|
27
|
+
@build = Build.new(build_description, working_dir, build_reason)
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_executes_build_command_in_working_dir
|
31
|
+
build_description.expects(:execute).with(working_dir,build.report)
|
32
|
+
build.run
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_updates_observer
|
36
|
+
view = mock
|
37
|
+
view.expects :update # one for status to building
|
38
|
+
view.expects :update # one for status to ok
|
39
|
+
build.add_observer view
|
40
|
+
build.run
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
|
45
|
+
class TestBuildRevision < Test::Unit::TestCase
|
46
|
+
attr_reader :build, :stub_reason
|
47
|
+
def setup
|
48
|
+
@stub_reason = stub
|
49
|
+
@build = Build.new(nil,nil,stub_reason)
|
50
|
+
end
|
51
|
+
|
52
|
+
def test_is_retreived_from_reason
|
53
|
+
stub_reason.stubs(:revision).returns 233
|
54
|
+
assert_equal 233, build.revision
|
55
|
+
stub_reason.stubs(:revision).returns 455
|
56
|
+
assert_equal 455, build.revision
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
60
|
+
|
61
|
+
|
62
|
+
|
63
|
+
class TestBuildStatus < Test::Unit::TestCase
|
64
|
+
attr_reader :build
|
65
|
+
def setup
|
66
|
+
@build = Build.new(nil,nil,nil)
|
67
|
+
|
68
|
+
end
|
69
|
+
|
70
|
+
def test_equals_report_status
|
71
|
+
assert_equal BuildStatus.ok, build.status
|
72
|
+
build.report.green
|
73
|
+
assert_equal BuildStatus.ok, build.status
|
74
|
+
build.report.red
|
75
|
+
assert_equal BuildStatus.failed, build.status
|
76
|
+
end
|
77
|
+
|
78
|
+
def test_green_returns_true_only_when_status_is_green
|
79
|
+
assert build.green?
|
80
|
+
build.report.red
|
81
|
+
assert !build.green?
|
82
|
+
build.report.green
|
83
|
+
assert build.green?
|
84
|
+
end
|
85
|
+
|
86
|
+
def test_equals_building_if_building
|
87
|
+
build.building = true
|
88
|
+
assert_equal BuildStatus.building, build.status
|
89
|
+
end
|
90
|
+
|
91
|
+
end
|
92
|
+
|
93
|
+
class TestBuildSummary < Test::Unit::TestCase
|
94
|
+
attr_reader :build
|
95
|
+
def setup
|
96
|
+
reason = stub(:to_s => 'reason_summary')
|
97
|
+
@build = Build.new(nil,nil,reason)
|
98
|
+
build.report.info "report_summary"
|
99
|
+
end
|
100
|
+
|
101
|
+
def test_summary_is_report_summary_if_status_is_green_or_red
|
102
|
+
assert_equal 'report_summary', build.summary
|
103
|
+
build.report.red
|
104
|
+
assert_equal 'report_summary', build.summary
|
105
|
+
end
|
106
|
+
|
107
|
+
def test_summary_is_reason_if_status_is_building
|
108
|
+
build.building = true
|
109
|
+
assert_equal 'reason_summary', build.summary
|
110
|
+
end
|
111
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'rubygems'
|
3
|
+
require 'mocha'
|
4
|
+
require File.join(File.dirname(__FILE__), 'builder_test_env')
|
5
|
+
require 'libs'
|
6
|
+
|
7
|
+
class TestBuilderExecution < Test::Unit::TestCase
|
8
|
+
attr_reader :working_dir, :build_command, :the_command_line, :build_report
|
9
|
+
def setup
|
10
|
+
@working_dir = "some_dir"
|
11
|
+
@the_command_line = "ls"
|
12
|
+
@build_command = BuildCommand.new(the_command_line)
|
13
|
+
@build_command.stubs(:cd).yields
|
14
|
+
@build_command.stubs(:run_command).returns true
|
15
|
+
@build_report = stub_everything
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_goes_to_working_directory_and_executes_build_command
|
19
|
+
build_command.expects(:cd).with(working_dir).yields
|
20
|
+
build_command.expects(:run_command).returns true
|
21
|
+
build_command.execute(working_dir, build_report)
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_sets_build_result_to_green_if_command_succeeds
|
25
|
+
build_command.expects(:run_command).returns true
|
26
|
+
build_report.expects :green
|
27
|
+
build_command.execute(working_dir, build_report)
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_sets_build_result_to_red_if_command_fails
|
31
|
+
build_command.expects(:run_command).returns false
|
32
|
+
build_report.expects :red
|
33
|
+
build_command.execute(working_dir, build_report)
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
|
38
|
+
class TestBuildCommandWithRealCommand < Test::Unit::TestCase
|
39
|
+
attr_reader :expected_output_lines, :build_command, :build_report
|
40
|
+
def setup
|
41
|
+
@expected_output_lines = ["line_1\n","line_2\n"]
|
42
|
+
@build_command = BuildCommand.new("echo line_1;echo line_2")
|
43
|
+
@build_report = stub_everything
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_output_is_send_to_build_report
|
47
|
+
build_report.expects(:info).with("line_1\n")
|
48
|
+
build_report.expects(:info).with("line_2\n")
|
49
|
+
build_command.execute(".", build_report)
|
50
|
+
end
|
51
|
+
|
52
|
+
def test_real_normal_command_should_be_green
|
53
|
+
build_report.expects :green
|
54
|
+
build_command.execute(".", build_report)
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'rubygems'
|
3
|
+
require 'mocha'
|
4
|
+
require File.join(File.dirname(__FILE__), 'builder_test_env')
|
5
|
+
require 'libs'
|
6
|
+
require 'build'
|
7
|
+
|
8
|
+
class TestBuildConfiguration < Test::Unit::TestCase
|
9
|
+
|
10
|
+
def test_build_creates_build_description_and_ads_it_to_builder
|
11
|
+
builder = Builder.new
|
12
|
+
config = BuildConfiguration.new(builder)
|
13
|
+
assert_equal 0, builder.descriptions.size
|
14
|
+
config.from_text("build '.', 'some_command'")
|
15
|
+
assert_equal 1, builder.descriptions.size
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_build_fails_if_directory_does_not_exist
|
19
|
+
builder = Builder.new
|
20
|
+
config = BuildConfiguration.new(builder)
|
21
|
+
assert_equal 0, builder.descriptions.size
|
22
|
+
assert_raises SourceControl::DirectoryInvalidException do
|
23
|
+
config.from_text("build 'blah', 'some_command'")
|
24
|
+
end
|
25
|
+
assert_equal 0, builder.descriptions.size
|
26
|
+
end
|
27
|
+
|
28
|
+
|
29
|
+
|
30
|
+
end
|
31
|
+
|
@@ -0,0 +1,106 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'rubygems'
|
3
|
+
require 'mocha'
|
4
|
+
require File.join(File.dirname(__FILE__), 'builder_test_env')
|
5
|
+
require 'libs'
|
6
|
+
require 'revision_committed'
|
7
|
+
|
8
|
+
class TestBuildDescriptionIterate < Test::Unit::TestCase
|
9
|
+
def test_lets_source_contol_report_changes_to_self
|
10
|
+
working_dir = "some_dir"
|
11
|
+
source_control = stub(:working_dir => working_dir)
|
12
|
+
build_command = stub
|
13
|
+
build_description = BuildDescription.new(build_command, source_control)
|
14
|
+
source_control.expects(:report_change_to).with(build_description)
|
15
|
+
build_description.iterate
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
class TestBuildDescriptionRunABuild < Test::Unit::TestCase
|
20
|
+
attr_reader :working_dir, :build_command, :build_description, :build
|
21
|
+
def setup
|
22
|
+
@working_dir = "some_dir"
|
23
|
+
source_control = stub(:working_dir => working_dir)
|
24
|
+
@build_command = stub(:execute => nil)
|
25
|
+
@build_description = BuildDescription.new(build_command, source_control)
|
26
|
+
@build = stub(:run => nil)
|
27
|
+
@build_description.stubs(:create_build).returns(build)
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_creates_and_starts_build_with_a_reason
|
31
|
+
reason = Object
|
32
|
+
build_description.expects(:create_build).with(reason).returns build
|
33
|
+
build.expects :run
|
34
|
+
build_description.run_build(reason)
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_updates_observers_with_new_build_when_running_build
|
38
|
+
reason = Object
|
39
|
+
view = mock
|
40
|
+
view.expects(:update).with(:new_build => build)
|
41
|
+
build_description.add_observer view
|
42
|
+
build_description.run_build(reason)
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_collects_ran_builds
|
46
|
+
reason = Object
|
47
|
+
build_description.run_build(reason)
|
48
|
+
assert_equal [build], build_description.builds
|
49
|
+
build_description.stubs(:create_build).returns(build2 = stub(:run => nil))
|
50
|
+
build_description.run_build(reason)
|
51
|
+
assert_equal [build,build2], build_description.builds
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_receiving_a_commit_runs_a_build_with_reason_receiving_a_commit
|
55
|
+
revision = 234
|
56
|
+
committer = 'westgeer'
|
57
|
+
expected_reason = RevisionCommitted.new(revision,committer)
|
58
|
+
build.expects :run
|
59
|
+
build_description.expects(:create_build).with(expected_reason).returns build
|
60
|
+
build_description.new_revision_committed(SourceControl::Status.new(revision,committer))
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
64
|
+
|
65
|
+
|
66
|
+
class TestBuildCreation < Test::Unit::TestCase
|
67
|
+
def test_creates_a_build_with_a_build_descrition_reason_working_dir_and_build_report
|
68
|
+
working_dir = "working_dir"
|
69
|
+
source_control = stub(:working_dir => working_dir, :archive => 'the_archive')
|
70
|
+
|
71
|
+
build_description = Object
|
72
|
+
build_reason = Object
|
73
|
+
build_description = BuildDescription.new(build_description, source_control)
|
74
|
+
build = build_description.create_build(build_reason)
|
75
|
+
|
76
|
+
assert_same build_reason, build.reason
|
77
|
+
assert_equal 'the_archive', build.archive
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
class TestBuildDescriptionStatus < Test::Unit::TestCase
|
82
|
+
attr_reader :build_description, :failed_build, :successful_build
|
83
|
+
def setup
|
84
|
+
@build_description = BuildDescription.new(nil,nil)
|
85
|
+
@failed_build = stub(:green? => false)
|
86
|
+
@successful_build = stub(:green? => true)
|
87
|
+
end
|
88
|
+
|
89
|
+
def test_is_ok_initially
|
90
|
+
assert_equal BuilderState.ok, build_description.status
|
91
|
+
end
|
92
|
+
|
93
|
+
def test_is_set_to_broken_when_last_build_result_is_failed
|
94
|
+
build_description.builds << successful_build
|
95
|
+
assert_equal BuilderState.ok, build_description.status
|
96
|
+
build_description.builds << failed_build
|
97
|
+
assert_equal BuilderState.broken, build_description.status
|
98
|
+
end
|
99
|
+
|
100
|
+
def test_is_set_to_ok_when_last_build_result_is_ok
|
101
|
+
build_description.builds << failed_build
|
102
|
+
assert_equal BuilderState.broken, build_description.status
|
103
|
+
build_description.builds << successful_build
|
104
|
+
assert_equal BuilderState.ok, build_description.status
|
105
|
+
end
|
106
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'rubygems'
|
3
|
+
require 'mocha'
|
4
|
+
require File.join(File.dirname(__FILE__), 'builder_test_env')
|
5
|
+
require 'libs'
|
6
|
+
|
7
|
+
class TestBuildReport < Test::Unit::TestCase
|
8
|
+
attr_reader :build_result
|
9
|
+
def setup
|
10
|
+
@build_result = BuildReport.new
|
11
|
+
end
|
12
|
+
def test_initial_status_is_ok
|
13
|
+
assert_equal BuildStatus.ok, build_result.status
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_green_sets_status_to_ok
|
17
|
+
build_result.green
|
18
|
+
assert_equal BuildStatus.ok, build_result.status
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_red_sets_status_to_fail
|
22
|
+
build_result.red
|
23
|
+
assert_equal BuildStatus.failed, build_result.status
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_info_is_added_to_info_list
|
27
|
+
output_lines = "build_output_line_1\n", "build_output_line_2\n"
|
28
|
+
build_result.info output_lines[0]
|
29
|
+
assert_equal output_lines[0].strip, build_result.log
|
30
|
+
build_result.info output_lines[1]
|
31
|
+
assert_equal output_lines.join("").strip, build_result.log
|
32
|
+
end
|
33
|
+
end
|
34
|
+
class TestBuildReportStatusChanges < Test::Unit::TestCase
|
35
|
+
attr_reader :build_report, :view
|
36
|
+
def setup
|
37
|
+
@view = stub(:update)
|
38
|
+
@build_report = BuildReport.new
|
39
|
+
@build_report.add_observer(view)
|
40
|
+
end
|
41
|
+
def test_observers_are_notified_when_becoming_red
|
42
|
+
view.expects(:update)
|
43
|
+
build_report.red
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_observers_are_notified_when_becoming_green
|
47
|
+
view.expects(:update)
|
48
|
+
build_report.green
|
49
|
+
end
|
50
|
+
|
51
|
+
def test_observers_are_notified_with_log_line_when_info_is_received
|
52
|
+
new_log_line = "some log line \n"
|
53
|
+
view.expects(:update).with(:log_line => new_log_line.strip)
|
54
|
+
build_report.info new_log_line
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'rubygems'
|
3
|
+
require 'mocha'
|
4
|
+
require File.join(File.dirname(__FILE__), 'builder_test_env')
|
5
|
+
require 'libs'
|
6
|
+
|
7
|
+
class TestBuilder < Test::Unit::TestCase
|
8
|
+
attr_reader :builder, :build_description1, :build_description2
|
9
|
+
def setup
|
10
|
+
@build_description1 = stub(:status => BuilderState.ok)
|
11
|
+
@build_description2 = stub(:status => BuilderState.ok)
|
12
|
+
@builder = Builder.new
|
13
|
+
builder.add_description(build_description1)
|
14
|
+
builder.add_description(build_description2)
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_iterate_iterates_each_description
|
18
|
+
build_description1.expects(:iterate)
|
19
|
+
build_description2.expects(:iterate)
|
20
|
+
builder.iterate
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_each_description_calls_block_for_each_description
|
24
|
+
build_description1 = mock
|
25
|
+
build_description2 = mock
|
26
|
+
builder = Builder.new
|
27
|
+
builder.add_description(build_description1)
|
28
|
+
builder.add_description(build_description2)
|
29
|
+
result = []
|
30
|
+
builder.each_description {|description| result << description}
|
31
|
+
assert_equal [build_description1, build_description2], result
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_status_is_ok_if_all_build_descriptions_are_ok
|
35
|
+
assert_equal BuilderState.ok, builder.status
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_status_is_broken_if_any_build_description_is_broken
|
39
|
+
build_description1.stubs(:status).returns BuilderState.broken
|
40
|
+
assert_equal BuilderState.broken, builder.status
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
class TestBuildViewUpdates < Test::Unit::TestCase
|
45
|
+
|
46
|
+
def test_updates_views_afer_each_iteration
|
47
|
+
builder = Builder.new
|
48
|
+
view1 = mock('view1')
|
49
|
+
view1.expects(:update)
|
50
|
+
builder.add_observer(view1)
|
51
|
+
builder.iterate_description(stub_everything)
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'rubygems'
|
3
|
+
require 'mocha'
|
4
|
+
require File.join(File.dirname(__FILE__), 'builder_test_env')
|
5
|
+
require 'revision_committed'
|
6
|
+
|
7
|
+
class TestRevisionCommitted < Test::Unit::TestCase
|
8
|
+
def test_has_revision_and_committer
|
9
|
+
revision = 123
|
10
|
+
committer = 'westgeer'
|
11
|
+
event = RevisionCommitted.new(revision, committer)
|
12
|
+
assert_equal revision, event.revision
|
13
|
+
assert_equal committer, event.committer
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_equals
|
17
|
+
assert_equal RevisionCommitted.new(1,'westgeest'), RevisionCommitted.new(1,'westgeest')
|
18
|
+
assert_equal RevisionCommitted.new(2,'westgeest'), RevisionCommitted.new(2,'westgeest')
|
19
|
+
assert_equal RevisionCommitted.new(1,'blah'), RevisionCommitted.new(1,'blah')
|
20
|
+
|
21
|
+
assert_not_equal RevisionCommitted.new(1,'blah'), RevisionCommitted.new(1,'westgeest')
|
22
|
+
assert_not_equal RevisionCommitted.new(1,'westgeest'), RevisionCommitted.new(1,'blah')
|
23
|
+
assert_not_equal RevisionCommitted.new(2,'westgeest'), RevisionCommitted.new(1,'westgeest')
|
24
|
+
assert_not_equal RevisionCommitted.new(1,'westgeest'), RevisionCommitted.new(2,'westgeest')
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_equals_with_other_type_of_object_returns_false
|
28
|
+
assert_not_equal RevisionCommitted.new(1,'westgeest'), Object.new
|
29
|
+
end
|
30
|
+
end
|