hive-messages 1.0.1
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.
- checksums.yaml +7 -0
- data/.gitignore +24 -0
- data/Gemfile +3 -0
- data/LICENSE.txt +22 -0
- data/README.md +35 -0
- data/Rakefile +11 -0
- data/hive-messages.gemspec +33 -0
- data/lib/hive/messages.rb +46 -0
- data/lib/hive/messages/artifact.rb +17 -0
- data/lib/hive/messages/base.rb +18 -0
- data/lib/hive/messages/configuration.rb +12 -0
- data/lib/hive/messages/execution_variables_base.rb +27 -0
- data/lib/hive/messages/job.rb +100 -0
- data/lib/hive/messages/nil_job.rb +15 -0
- data/lib/hive/paths.rb +12 -0
- data/lib/hive/paths/artifacts.rb +20 -0
- data/lib/hive/paths/jobs.rb +48 -0
- data/lib/hive/paths/queues.rb +21 -0
- data/lib/hive/representers/artifact_representer.rb +13 -0
- data/lib/hive/representers/job_representer.rb +25 -0
- data/lib/roar/transport/net_http/request_patch.rb +19 -0
- data/lib/virtus/attribute/execution_variables.rb +20 -0
- data/spec/fixtures/sample.pem +31 -0
- data/spec/fixtures/upload_sample.log +1 -0
- data/spec/lib/hive/messages/artifact_spec.rb +50 -0
- data/spec/lib/hive/messages/configuration_spec.rb +13 -0
- data/spec/lib/hive/messages/execution_variables_base_spec.rb +12 -0
- data/spec/lib/hive/messages/job_spec.rb +233 -0
- data/spec/lib/hive/messages_spec.rb +30 -0
- data/spec/lib/hive/paths/artifacts_spec.rb +22 -0
- data/spec/lib/hive/paths/jobs_spec.rb +49 -0
- data/spec/lib/hive/paths/queues_spec.rb +35 -0
- data/spec/lib/hive/paths_spec.rb +10 -0
- data/spec/lib/hive/representers/artifact_representer_spec.rb +49 -0
- data/spec/lib/hive/representers/job_representer_spec.rb +96 -0
- data/spec/lib/roar/transport/net_http/request_patch_spec.rb +84 -0
- data/spec/lib/virtus/attribute/execution_variables_spec.rb +60 -0
- data/spec/spec_helper.rb +13 -0
- metadata +266 -0
@@ -0,0 +1,30 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Hive::Messages do
|
4
|
+
|
5
|
+
describe "class methods" do
|
6
|
+
|
7
|
+
describe ".configure" do
|
8
|
+
|
9
|
+
let(:base_path) { "http://localhost:3000" }
|
10
|
+
|
11
|
+
before(:each) do
|
12
|
+
Hive::Messages.configure do |config|
|
13
|
+
config.base_path = base_path
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
it "creates a Configuration instance" do
|
18
|
+
expect(Hive::Messages.configuration).to be_instance_of(Hive::Messages::Configuration)
|
19
|
+
end
|
20
|
+
|
21
|
+
it "set the Hive::Paths.base" do
|
22
|
+
expect(Hive::Paths.base).to eq(base_path)
|
23
|
+
end
|
24
|
+
|
25
|
+
it "set the base_path on the Configuration" do
|
26
|
+
expect(Hive::Messages.configuration.base_path).to eq(base_path)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Hive::Paths::Artifacts do
|
4
|
+
|
5
|
+
describe "class methods" do
|
6
|
+
|
7
|
+
let(:base_path) { "http://hive.bbc" }
|
8
|
+
|
9
|
+
before(:each) do
|
10
|
+
Hive::Paths.base=base_path
|
11
|
+
end
|
12
|
+
|
13
|
+
describe ".create_url" do
|
14
|
+
|
15
|
+
let(:job_id) { 99 }
|
16
|
+
|
17
|
+
it "generates a valid create artifact url" do
|
18
|
+
expect(Hive::Paths::Artifacts.create_url(job_id)).to eq "#{base_path}/api/jobs/#{job_id.to_s}/artifacts"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Hive::Paths::Jobs do
|
4
|
+
|
5
|
+
describe "class methods" do
|
6
|
+
|
7
|
+
let(:base_path) { "http://hive.bbc" }
|
8
|
+
let(:job_id) { 99 }
|
9
|
+
|
10
|
+
before(:each) do
|
11
|
+
Hive::Paths.base = base_path
|
12
|
+
end
|
13
|
+
|
14
|
+
describe ".start_url" do
|
15
|
+
|
16
|
+
it "generates a valid job start url" do
|
17
|
+
expect(Hive::Paths::Jobs.start_url(job_id)).to eq "#{base_path}/api/jobs/#{job_id.to_s}/start"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
describe ".update_results_url" do
|
22
|
+
|
23
|
+
it "generates a valid update counts url" do
|
24
|
+
expect(Hive::Paths::Jobs.update_results_url(job_id)).to eq "#{base_path}/api/jobs/#{job_id.to_s}/update_results"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
describe ".report_artifacts_url" do
|
29
|
+
|
30
|
+
it "generates a valid report artifacts url" do
|
31
|
+
expect(Hive::Paths::Jobs.report_artifacts_url(job_id)).to eq "#{base_path}/api/jobs/#{job_id.to_s}/report_artifacts"
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
describe ".end_url" do
|
36
|
+
|
37
|
+
it "generates a valid job end url" do
|
38
|
+
expect(Hive::Paths::Jobs.end_url(job_id)).to eq "#{base_path}/api/jobs/#{job_id.to_s}/end"
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
describe ".error_url" do
|
43
|
+
|
44
|
+
it "generates a valid job error url" do
|
45
|
+
expect(Hive::Paths::Jobs.error_url(job_id)).to eq "#{base_path}/api/jobs/#{job_id.to_s}/error"
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Hive::Paths::Queues do
|
4
|
+
|
5
|
+
describe "class methods" do
|
6
|
+
|
7
|
+
let(:base_path) { "http://hive.bbc" }
|
8
|
+
|
9
|
+
before(:each) do
|
10
|
+
Hive::Paths.base=base_path
|
11
|
+
end
|
12
|
+
|
13
|
+
describe ".job_reservation_url" do
|
14
|
+
|
15
|
+
let(:queues) { ["queue_one", "queue_two"] }
|
16
|
+
|
17
|
+
let(:job_reservation_url) { Hive::Paths::Queues.job_reservation_url(queues) }
|
18
|
+
|
19
|
+
context "single queue name provided" do
|
20
|
+
|
21
|
+
let(:queues) { "queue_one" }
|
22
|
+
|
23
|
+
it "adds the single queue to the reservation path" do
|
24
|
+
expect(job_reservation_url).to eq "#{base_path}/api/queues/queue_one/jobs/reserve"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
context "multiple queue names provided" do
|
29
|
+
it "adds the provided queues to the reservation path" do
|
30
|
+
expect(job_reservation_url).to eq "#{base_path}/api/queues/queue_one,queue_two/jobs/reserve"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Hive::Representers::ArtifactRepresenter do
|
4
|
+
|
5
|
+
class TestArtifact
|
6
|
+
include Virtus.model
|
7
|
+
|
8
|
+
attribute :artifact_id
|
9
|
+
attribute :job_id
|
10
|
+
attribute :asset_file_name
|
11
|
+
attribute :asset_content_type
|
12
|
+
attribute :asset_file_size
|
13
|
+
end
|
14
|
+
|
15
|
+
let(:upstream_artifact) do
|
16
|
+
artifact = TestArtifact.new(artifact_attributes)
|
17
|
+
artifact.extend(Hive::Representers::ArtifactRepresenter)
|
18
|
+
artifact
|
19
|
+
end
|
20
|
+
|
21
|
+
let(:artifact_attributes) do
|
22
|
+
{
|
23
|
+
artifact_id: 321,
|
24
|
+
job_id: 123,
|
25
|
+
asset_file_name: "screenshot1.png",
|
26
|
+
asset_content_type: "image/png",
|
27
|
+
asset_file_size: 2300
|
28
|
+
}
|
29
|
+
end
|
30
|
+
|
31
|
+
describe "serialization " do
|
32
|
+
|
33
|
+
let(:downstream_artifact) do
|
34
|
+
artifact = TestArtifact.new
|
35
|
+
artifact.extend(Hive::Representers::ArtifactRepresenter)
|
36
|
+
artifact.from_json(upstream_artifact.to_json)
|
37
|
+
artifact
|
38
|
+
end
|
39
|
+
|
40
|
+
|
41
|
+
subject { downstream_artifact }
|
42
|
+
|
43
|
+
its(:artifact_id) { should eq artifact_attributes[:artifact_id] }
|
44
|
+
its(:job_id) { should eq artifact_attributes[:job_id] }
|
45
|
+
its(:asset_file_name) { should eq artifact_attributes[:asset_file_name] }
|
46
|
+
its(:asset_content_type) { should eq artifact_attributes[:asset_content_type] }
|
47
|
+
its(:asset_file_size) { should eq artifact_attributes[:asset_file_size] }
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,96 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Hive::Representers::JobRepresenter do
|
4
|
+
|
5
|
+
class TestJob
|
6
|
+
include Virtus.model
|
7
|
+
|
8
|
+
attribute :command
|
9
|
+
attribute :job_id
|
10
|
+
attribute :repository
|
11
|
+
attribute :execution_directory
|
12
|
+
attribute :target
|
13
|
+
attribute :execution_variables
|
14
|
+
attribute :reservation_details
|
15
|
+
attribute :device_id
|
16
|
+
attribute :running_count
|
17
|
+
attribute :passed_count
|
18
|
+
attribute :failed_count
|
19
|
+
attribute :state
|
20
|
+
attribute :errored_count
|
21
|
+
attribute :result
|
22
|
+
attribute :exit_value
|
23
|
+
attribute :message
|
24
|
+
attribute :result_details
|
25
|
+
|
26
|
+
attribute :extra
|
27
|
+
end
|
28
|
+
|
29
|
+
let(:upstream_job) do
|
30
|
+
job = TestJob.new(job_attributes)
|
31
|
+
job.extend(Hive::Representers::JobRepresenter)
|
32
|
+
job
|
33
|
+
end
|
34
|
+
|
35
|
+
let(:target) { { "build" => "http://hive/download/99" } }
|
36
|
+
let(:execution_variables) { { "tests" => [] } }
|
37
|
+
let(:reservation_details) { { "hive" => "99", "pid" => "1024" } }
|
38
|
+
|
39
|
+
|
40
|
+
let(:job_attributes) do
|
41
|
+
{
|
42
|
+
command: "cmd",
|
43
|
+
job_id: 99,
|
44
|
+
repository: "svn://",
|
45
|
+
execution_directory: ".",
|
46
|
+
target: target,
|
47
|
+
execution_variables: execution_variables,
|
48
|
+
reservation_details: reservation_details,
|
49
|
+
device_id: 23,
|
50
|
+
running_count: 4,
|
51
|
+
passed_count: 3,
|
52
|
+
failed_count: 2,
|
53
|
+
errored_count: 1,
|
54
|
+
state: "running",
|
55
|
+
extra: "thing",
|
56
|
+
result: "test result",
|
57
|
+
exit_value: 0,
|
58
|
+
message: "Hello, mum",
|
59
|
+
result_details: "Blah!"
|
60
|
+
}
|
61
|
+
end
|
62
|
+
|
63
|
+
describe "serialization " do
|
64
|
+
|
65
|
+
let(:downstream_job) do
|
66
|
+
job = TestJob.new
|
67
|
+
job.extend(Hive::Representers::JobRepresenter)
|
68
|
+
job.from_json(upstream_job.to_json)
|
69
|
+
job
|
70
|
+
end
|
71
|
+
|
72
|
+
|
73
|
+
subject { downstream_job }
|
74
|
+
|
75
|
+
its(:command) { should eq job_attributes[:command] }
|
76
|
+
its(:job_id) { should eq job_attributes[:job_id] }
|
77
|
+
its(:repository) { should eq job_attributes[:repository] }
|
78
|
+
its(:execution_directory) { should eq job_attributes[:execution_directory] }
|
79
|
+
its(:target) { should eq job_attributes[:target] }
|
80
|
+
its(:execution_variables) { should eq execution_variables }
|
81
|
+
its(:reservation_details) { should eq reservation_details }
|
82
|
+
its(:device_id) { should eq job_attributes[:device_id] }
|
83
|
+
its(:running_count) { should eq job_attributes[:running_count] }
|
84
|
+
its(:passed_count) { should eq job_attributes[:passed_count] }
|
85
|
+
its(:failed_count) { should eq job_attributes[:failed_count] }
|
86
|
+
its(:errored_count) { should eq job_attributes[:errored_count] }
|
87
|
+
its(:state) { should eq job_attributes[:state] }
|
88
|
+
its(:result) { should eq job_attributes[:result] }
|
89
|
+
its(:exit_value) { should eq job_attributes[:exit_value] }
|
90
|
+
its(:message) { should eq job_attributes[:message] }
|
91
|
+
its(:result_details) { should eq job_attributes[:result_details] }
|
92
|
+
|
93
|
+
# Attribute that should be ignored
|
94
|
+
its(:extra) { should be_nil }
|
95
|
+
end
|
96
|
+
end
|
@@ -0,0 +1,84 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
# Monkey patch == so that our expectations below work correctly
|
4
|
+
class OpenSSL::X509::Certificate
|
5
|
+
def ==(other)
|
6
|
+
self.to_s == other.to_s
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
class OpenSSL::PKey::RSA
|
11
|
+
def ==(other)
|
12
|
+
self.to_s == other.to_s
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
describe Roar::Transport::NetHTTP::Request do
|
17
|
+
|
18
|
+
describe "class methods" do
|
19
|
+
|
20
|
+
describe ".new" do
|
21
|
+
|
22
|
+
let(:options) { { uri: "http://www.bbc.co.uk" } }
|
23
|
+
let(:net_http_double) { double(Net::HTTP, "use_ssl=".to_sym => true, "cert=".to_sym => true, "key=".to_sym => true, "verify_mode=".to_sym => true) }
|
24
|
+
|
25
|
+
before(:each) do
|
26
|
+
Hive::Messages.configure do |config|
|
27
|
+
configuration_options.each do |option_key, option_value|
|
28
|
+
config.send("#{option_key}=", option_value)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
Net::HTTP.stub(new: net_http_double)
|
32
|
+
Roar::Transport::NetHTTP::Request.new(options)
|
33
|
+
end
|
34
|
+
|
35
|
+
context "when Hive::Messages is configured to use a client pem_file" do
|
36
|
+
|
37
|
+
let(:pem_file) { File.expand_path("spec/fixtures/sample.pem", Hive::Messages.root) }
|
38
|
+
|
39
|
+
let(:pem) { File.read(pem_file) }
|
40
|
+
let(:cert) { OpenSSL::X509::Certificate.new(pem) }
|
41
|
+
let(:key) { OpenSSL::PKey::RSA.new(pem) }
|
42
|
+
|
43
|
+
let(:configuration_options) { { pem_file: pem_file, ssl_verify_mode: OpenSSL::SSL::VERIFY_NONE } }
|
44
|
+
|
45
|
+
it "turned ssl on" do
|
46
|
+
expect(net_http_double).to have_received(:use_ssl=).with(true)
|
47
|
+
end
|
48
|
+
|
49
|
+
it "provided a client cert" do
|
50
|
+
expect(net_http_double).to have_received(:cert=).with(cert)
|
51
|
+
end
|
52
|
+
|
53
|
+
it "provided a client key" do
|
54
|
+
expect(net_http_double).to have_received(:key=).with(key)
|
55
|
+
end
|
56
|
+
|
57
|
+
it "set the ssl verify mode" do
|
58
|
+
expect(net_http_double).to have_received(:verify_mode=).with(configuration_options[:ssl_verify_mode])
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
context "when Hive::Messages is NOT configured to use a client pem_file" do
|
63
|
+
|
64
|
+
let(:configuration_options) { {} }
|
65
|
+
|
66
|
+
it "did not turn ssl on" do
|
67
|
+
expect(net_http_double).to_not have_received(:use_ssl=)
|
68
|
+
end
|
69
|
+
|
70
|
+
it "did not provide a cert" do
|
71
|
+
expect(net_http_double).to_not have_received(:cert=)
|
72
|
+
end
|
73
|
+
|
74
|
+
it "did not provide a key" do
|
75
|
+
expect(net_http_double).to_not have_received(:key=)
|
76
|
+
end
|
77
|
+
|
78
|
+
it "did not set an ssl verify mode" do
|
79
|
+
expect(net_http_double).to_not have_received(:verify_mode=)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Virtus::Attribute::ExecutionVariables do
|
4
|
+
|
5
|
+
let(:model_klass) do
|
6
|
+
klass = Class.new do
|
7
|
+
include Virtus.model
|
8
|
+
|
9
|
+
attribute :execution_variables, Virtus::Attribute::ExecutionVariables
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
let(:model) { model_klass.new(execution_variables: values) }
|
14
|
+
let(:execution_variables) { model.execution_variables }
|
15
|
+
|
16
|
+
context "values are empty" do
|
17
|
+
|
18
|
+
let(:values) { {} }
|
19
|
+
|
20
|
+
it "returned nil for the execution_variables" do
|
21
|
+
expect(execution_variables).to be_nil
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
context "values just contain job_ib and version" do
|
26
|
+
|
27
|
+
let(:job_id) { 99 }
|
28
|
+
let(:version) { "one" }
|
29
|
+
let(:values) { { job_id: job_id, version: version } }
|
30
|
+
|
31
|
+
subject { execution_variables }
|
32
|
+
|
33
|
+
it { should be_a(Hive::Messages::ExecutionVariablesBase) }
|
34
|
+
its(:job_id) { should eq job_id }
|
35
|
+
its(:version) { should eq version }
|
36
|
+
end
|
37
|
+
|
38
|
+
context "values contain extra attributes" do
|
39
|
+
|
40
|
+
let(:job_id) { 99 }
|
41
|
+
let(:version) { "one" }
|
42
|
+
let(:foo) { "foo_value" }
|
43
|
+
let(:values) { { job_id: job_id, version: version, foo: foo } }
|
44
|
+
subject { execution_variables }
|
45
|
+
|
46
|
+
it { should be_a(Hive::Messages::ExecutionVariablesBase) }
|
47
|
+
its(:job_id) { should eq job_id }
|
48
|
+
its(:version) { should eq version }
|
49
|
+
|
50
|
+
it "created a new 'foo' attribute on the anonymous class that was not set on the base ExecutionVariables class" do
|
51
|
+
attributes = execution_variables.class.attribute_set.collect(&:name)
|
52
|
+
expect(attributes).to include(:foo)
|
53
|
+
end
|
54
|
+
|
55
|
+
it "set the value of the 'foo' variable" do
|
56
|
+
expect(execution_variables.foo).to eq foo
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
require "rubygems"
|
2
|
+
require "bundler/setup"
|
3
|
+
require "rspec"
|
4
|
+
|
5
|
+
require "hive/messages"
|
6
|
+
|
7
|
+
Dir["./spec/support/**/*.rb"].each {|f| require f}
|
8
|
+
|
9
|
+
RSpec.configure do |config|
|
10
|
+
config.color_enabled = true
|
11
|
+
config.filter_run focus: true
|
12
|
+
config.run_all_when_everything_filtered = true
|
13
|
+
end
|