From 9d7814cb2149e66d732c6513b4402719fb1777b5 Mon Sep 17 00:00:00 2001 From: Julian Ghionoiu Date: Fri, 16 Oct 2015 19:59:43 +0100 Subject: [PATCH] Complete move to Cucumber --- Gemfile | 2 +- Gemfile.lock | 21 ++- Rakefile | 12 +- features/step_definitions.rb | 78 ++++++----- features/test_helper.rb | 1 + tdl-client-ruby.gemspec | 3 +- tdl-client-ruby.iml | 8 ++ test/tdl/client_test.rb | 131 ------------------ test/test_helper.rb | 28 ---- test/utils/jmx/broker/jolokia_session.rb | 41 ------ test/utils/jmx/broker/playground.rb | 55 -------- test/utils/jmx/broker/remote_jmx_broker.rb | 32 ----- test/utils/jmx/broker/remote_jmx_queue.rb | 53 ------- .../broker/testing/active_mq_broker_rule.rb | 21 --- 14 files changed, 76 insertions(+), 410 deletions(-) delete mode 100644 test/tdl/client_test.rb delete mode 100644 test/test_helper.rb delete mode 100644 test/utils/jmx/broker/jolokia_session.rb delete mode 100644 test/utils/jmx/broker/playground.rb delete mode 100644 test/utils/jmx/broker/remote_jmx_broker.rb delete mode 100644 test/utils/jmx/broker/remote_jmx_queue.rb delete mode 100644 test/utils/jmx/broker/testing/active_mq_broker_rule.rb diff --git a/Gemfile b/Gemfile index 34de495..345a84b 100644 --- a/Gemfile +++ b/Gemfile @@ -1,6 +1,6 @@ source 'https://rubygems.org' -ruby '2.2.1' +ruby '2.2.2' # Specify your gem's dependencies in tdl-client-ruby.gemspec gemspec diff --git a/Gemfile.lock b/Gemfile.lock index 54c7bfc..c35b988 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -16,20 +16,26 @@ GEM simplecov (~> 0.10.0) term-ansicolor (~> 1.3) thor (~> 0.19.1) - cucumber (2.1.0) + cucumber (2.0.2) builder (>= 2.1.2) - cucumber-core (~> 1.3.0) + cucumber-core (~> 1.2.0) diff-lcs (>= 1.1.3) - gherkin3 (~> 3.1.0) + gherkin (~> 2.12) multi_json (>= 1.7.5, < 2.0) multi_test (>= 0.1.2) - cucumber-core (1.3.0) - gherkin3 (~> 3.1.0) + cucumber-core (1.2.0) + gherkin (~> 2.12.0) + debase (0.1.4) + debase-ruby_core_source + debase-ruby_core_source (0.8.0) diff-lcs (1.2.5) docile (1.1.5) domain_name (0.5.24) unf (>= 0.0.5, < 1.0.0) - gherkin3 (3.1.2) + gherkin (2.12.2) + multi_json (~> 1.3) + gherkin (2.12.2-java) + multi_json (~> 1.3) http-cookie (1.0.2) domain_name (~> 0.5) json (1.8.3) @@ -76,7 +82,8 @@ PLATFORMS DEPENDENCIES bundler (~> 1.9) coveralls (~> 0.8.2) - cucumber (~> 2.1) + cucumber (~> 2.0.0) + debase (~> 0.1.4) json (~> 1.8.3) minitest (= 5.4.1) minitest-reporters (~> 1.0, >= 1.0.19) diff --git a/Rakefile b/Rakefile index d4ba70f..652cd94 100644 --- a/Rakefile +++ b/Rakefile @@ -12,26 +12,26 @@ end task :default => :test -Coveralls::RakeTask.new -task :test_with_coveralls => [:test, 'coveralls:push'] - require 'cucumber/rake/task' Cucumber::Rake::Task.new(:features) do |t| - t.cucumber_opts = "features --format pretty --tags ~@wip" + t.cucumber_opts = 'features' end +Coveralls::RakeTask.new +task :features_with_coveralls => [:features, 'coveralls:push'] + #~~~~~~~~~ Play desc 'Run the example' task :example do - sh 'jruby -I lib examples/add_numbers.rb' + sh 'ruby -I lib examples/add_numbers.rb' end desc 'Run the test playground' task :playground do - sh 'jruby -I lib ./test/utils/jmx/broker/playground.rb' + sh 'ruby -I lib ./features/utils/jmx/broker/playground.rb' end diff --git a/features/step_definitions.rb b/features/step_definitions.rb index 6e3570d..f83e0db 100644 --- a/features/step_definitions.rb +++ b/features/step_definitions.rb @@ -1,14 +1,8 @@ -require_relative "./test_helper" +require_relative './test_helper' require 'logging' Logging.logger.root.appenders = Logging.appenders.stdout -REQUESTS = [ 'X1, 0, 1', 'X2, 5, 6' ] -EXPECTED_RESPONSES = ['X1, 1', 'X2, 11'] -FIRST_EXPECTED_TEXT = 'id = X1, req = [0, 1], resp = 1' -SECOND_EXPECTED_TEXT = 'id = X2, req = [5, 6], resp = 11' -EXPECTED_DISPLAYED_TEXT = [ FIRST_EXPECTED_TEXT, SECOND_EXPECTED_TEXT ] - CORRECT_SOLUTION = lambda { |params| x = params[0].to_i y = params[1].to_i @@ -27,6 +21,8 @@ STOMP_PORT = 21613 USERNAME = 'test' +# ~~~~~ Setup + Given(/^I start with a clean broker$/) do @request_queue = BROKER.add_queue("#{USERNAME}.req") @request_queue.purge @@ -37,6 +33,10 @@ @client = TDL::Client.new(HOSTNAME, STOMP_PORT, USERNAME) end +Given(/^the broker is not available$/) do + @client_without_broker = TDL::Client.new("#{HOSTNAME}1", STOMP_PORT, 'broker') +end + Given(/^I receive the following requests:$/) do |table| table.raw.each { |request| @request_queue.send_text_message(request) @@ -44,12 +44,42 @@ @request_count = table.raw.count end -When(/^I go live with an implementation that adds two numbers$/) do +# ~~~~~ Implementations + + +IMPLEMENTATION_MAP = { + 'adds two numbers' => lambda { |params| + x = params[0].to_i + y = params[1].to_i + x + y + }, + 'returns null' => lambda { nil }, + 'throws exception' => lambda { raise StandardError }, + 'is valid' => lambda { :value }, +} + +def get_lambda(name) + if IMPLEMENTATION_MAP.has_key?(name) + IMPLEMENTATION_MAP[name] + else + raise "Not a valid implementation reference: \"#{name}\"" + end +end + +When(/^I go live with an implementation that (.*)$/) do |implementation_name| @captured_io = capture_subprocess_io do - @client.go_live_with(&CORRECT_SOLUTION) + @client.go_live_with(&get_lambda(implementation_name)) end end +When(/^I do a trial run with an implementation that (.*)$/) do |implementation_name| + @captured_io = capture_subprocess_io do + @client.trial_run_with(&get_lambda(implementation_name)) + end +end + +# ~~~~~ Assertions + Then(/^the client should consume all requests$/) do assert_equal 0, @request_queue.get_size, 'Requests have not been consumed' end @@ -60,12 +90,14 @@ Then(/^the client should display to console:$/) do |table| table.raw.flatten.each { |row| - assert_includes @captured_io.join(""), row + assert_includes @captured_io.join(''), row } end -When(/^I go live with an implementation that returns null$/) do - @client.go_live_with { nil } +Then(/^the client should not display to console:$/) do |table| + table.raw.flatten.each { |row| + refute_includes @captured_io.join(''), row + } end Then(/^the client should not consume any request$/) do @@ -78,30 +110,8 @@ 'The response queue has different size. Messages have been published' end -When(/^I go live with an implementation that throws exception$/) do - @client.go_live_with { raise StandardError } -end - -Given(/^the broker is not available$/) do - @client_without_broker = TDL::Client.new("#{HOSTNAME}1", STOMP_PORT, 'broker') -end - -When(/^I go live with an implementation that is valid$/) do - @client.go_live_with { :value } -end - Then(/^I should get no exception$/) do #OBS if you get here there were no exceptions end -When(/^I do a trial run with an implementation that adds two numbers$/) do - @captured_io = capture_subprocess_io do - @client.trial_run_with(&CORRECT_SOLUTION) - end -end -Then(/^the client should not display to console:$/) do |table| - table.raw.flatten.each { |row| - refute_includes @captured_io.join(""), row - } -end diff --git a/features/test_helper.rb b/features/test_helper.rb index 6621f40..5ba696d 100644 --- a/features/test_helper.rb +++ b/features/test_helper.rb @@ -9,6 +9,7 @@ ] SimpleCov.start do add_filter '/test/' + add_filter '/features/' end require 'tdl' diff --git a/tdl-client-ruby.gemspec b/tdl-client-ruby.gemspec index 99faf85..60656bf 100644 --- a/tdl-client-ruby.gemspec +++ b/tdl-client-ruby.gemspec @@ -28,5 +28,6 @@ Gem::Specification.new do |spec| spec.add_development_dependency 'simplecov', '~>0.10.0' spec.add_development_dependency 'coveralls', '~>0.8.2' spec.add_development_dependency 'json', '~>1.8.3' - spec.add_development_dependency 'cucumber', '~>2.1' + spec.add_development_dependency 'cucumber', '~>2.0.0' + spec.add_development_dependency 'debase', '~>0.1.4' end diff --git a/tdl-client-ruby.iml b/tdl-client-ruby.iml index 5790279..13b0999 100644 --- a/tdl-client-ruby.iml +++ b/tdl-client-ruby.iml @@ -14,6 +14,7 @@ + @@ -21,8 +22,14 @@ + + + + + + @@ -31,6 +38,7 @@ + diff --git a/test/tdl/client_test.rb b/test/tdl/client_test.rb deleted file mode 100644 index 71d60f7..0000000 --- a/test/tdl/client_test.rb +++ /dev/null @@ -1,131 +0,0 @@ -# noinspection RubyResolve,RubyResolve -require 'test_helper' -require 'logging' - -Logging.logger.root.appenders = Logging.appenders.stdout - -class ClientTest < Minitest::Test - REQUESTS = [ 'X1, 0, 1', 'X2, 5, 6' ] - EXPECTED_RESPONSES = ['X1, 1', 'X2, 11'] - FIRST_EXPECTED_TEXT = 'id = X1, req = [0, 1], resp = 1' - SECOND_EXPECTED_TEXT = 'id = X2, req = [5, 6], resp = 11' - EXPECTED_DISPLAYED_TEXT = [ FIRST_EXPECTED_TEXT, SECOND_EXPECTED_TEXT ] - - CORRECT_SOLUTION = lambda { |params| - x = params[0].to_i - y = params[1].to_i - x + y - } - - # Jolokia JMX definition - HOSTNAME = 'localhost' - JMX_PORT = 28161 - BROKER_NAME = 'TEST.BROKER' - - @@broker = ActiveMQBrokerRule.new(HOSTNAME, JMX_PORT, BROKER_NAME) - @@broker.connect - - # Broker client definition - STOMP_PORT = 21613 - USERNAME = 'test' - - def setup - # Given we have a couple of requests waiting - @request_queue = @@broker.add_queue("#{USERNAME}.req") - @request_queue.purge - REQUESTS.each { |request| @request_queue.send_text_message(request) } - - # And no responses - @response_queue = @@broker.add_queue("#{USERNAME}.resp") - @response_queue.purge - - @client = TDL::Client.new(HOSTNAME, STOMP_PORT, USERNAME) - end - - #~~~~~ Go live - - def test_if_user_goes_live_client_should_process_all_messages - - @client.go_live_with(&CORRECT_SOLUTION) - - assert_equal 0, @request_queue.get_size, 'Requests have not been consumed' - assert_equal EXPECTED_RESPONSES, @response_queue.get_message_contents, 'The responses are not correct' - end - - - def test_a_run_should_show_the_messages_and_the_responses - - out = capture_subprocess_io do - @client.go_live_with(&CORRECT_SOLUTION) - end - - EXPECTED_DISPLAYED_TEXT.each { |expected_line| - assert_list_contains(expected_line, out) - } - end - - def test_returning_null_from_user_method_should_stop_all_processing - - @client.go_live_with { nil } - - assert_queues_are_untouched - end - - def test_throwing_exceptions_from_user_method_should_stop_all_processing - - @client.go_live_with { raise StandardError } - - assert_queues_are_untouched - end - - def test_exit_gracefully_if_broker_not_available - @client = TDL::Client.new("#{HOSTNAME}1", STOMP_PORT, 'broker') - - @client.go_live_with(&CORRECT_SOLUTION) - - # No exception - end - - #~~~~ Trial run - - def test_a_trial_run_should_only_show_the_first_message_and_the_response - - out = capture_subprocess_io do - @client.trial_run_with(&CORRECT_SOLUTION) - end - - assert_list_contains(FIRST_EXPECTED_TEXT, out) - refute_list_contains(SECOND_EXPECTED_TEXT, out) - end - - def test_if_user_does_a_trial_run_should_not_consume_or_publish_any_messages - - @client.trial_run_with(&CORRECT_SOLUTION) - - assert_queues_are_untouched - end - - #~~~~ Utils - - def assert_queues_are_untouched - assert_equal @request_queue.get_size, REQUESTS.count, - 'The request queue has different size. Messages have been consumed' - assert_equal @response_queue.get_size, 0, - 'The response queue has different size. Messages have been published' - - end - - def assert_list_contains(expected_substring, list) - matches = count_occurrences(expected_substring, list) - assert_equal 1, matches, "Expected #{list} to contain: \"#{expected_substring}\"" - end - - def refute_list_contains(expected_substring, list) - matches = count_occurrences(expected_substring, list) - refute_equal 1, matches, "Not expecting #{list} to contain: \"#{expected_substring}\"" - end - - def count_occurrences(expected_substring, list) - matches = list.select { |line| line.include? expected_substring }.count - end -end diff --git a/test/test_helper.rb b/test/test_helper.rb deleted file mode 100644 index 904525b..0000000 --- a/test/test_helper.rb +++ /dev/null @@ -1,28 +0,0 @@ -$LOAD_PATH.unshift File.expand_path('../../lib', __FILE__) - -require 'simplecov' -require 'coveralls' - -SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[ - SimpleCov::Formatter::HTMLFormatter, - Coveralls::SimpleCov::Formatter -] -SimpleCov.start do - add_filter '/test/' -end - -require 'tdl' -require 'json' -require 'net/http' -require 'utils/jmx/broker/jolokia_session' -require 'utils/jmx/broker/remote_jmx_broker' -require 'utils/jmx/broker/remote_jmx_queue' -require 'utils/jmx/broker/testing/active_mq_broker_rule' - -require 'minitest/autorun' -require 'minitest/reporters' -MiniTest::Reporters.use! - -require 'logging' -Logging.logger.root.appenders = Logging.appenders.stdout -Logging.logger.root.level = :debug \ No newline at end of file diff --git a/test/utils/jmx/broker/jolokia_session.rb b/test/utils/jmx/broker/jolokia_session.rb deleted file mode 100644 index cfa4bab..0000000 --- a/test/utils/jmx/broker/jolokia_session.rb +++ /dev/null @@ -1,41 +0,0 @@ - -require 'net/http' -require 'json' - -class JolokiaSession - - def initialize(jolokia_uri) - @uri = jolokia_uri - end - - def self.connect(host, admin_port) - jolokia_url = "http://#{host}:#{admin_port}/api/jolokia" - endpoint = '/version' - jolokia_version = JSON.parse(Net::HTTP.get(URI(jolokia_url + endpoint)))['value']['agent'] - - expected_jolokia_version = '1.2.2' - if jolokia_version != expected_jolokia_version - raise "Failed to retrieve the right Jolokia version. Expected: #{expected_jolokia_version} got #{jolokia_version}" - end - - JolokiaSession.new(URI(jolokia_url)) - end - - - def request(jolokia_payload) - json_payload = jolokia_payload.to_json - # puts "Payload: #{json_payload}" - - http_request = Net::HTTP::Post.new(@uri, initheader = {'Content-Type' => 'application/json'}) - http_request.body = json_payload - http_response = Net::HTTP.new(@uri.hostname, @uri.port).start { |http| http.request(http_request) } - if http_response.code != '200' - raise "Failed Jolokia call: #{http_response.code} #{http_response.message}: #{http_response.body}" - end - - json_response = http_response.body - jolokia_response = JSON.parse(json_response) - jolokia_response['value'] - end - -end \ No newline at end of file diff --git a/test/utils/jmx/broker/playground.rb b/test/utils/jmx/broker/playground.rb deleted file mode 100644 index 5d51ec9..0000000 --- a/test/utils/jmx/broker/playground.rb +++ /dev/null @@ -1,55 +0,0 @@ - -require 'json' -require_relative './jolokia_session' - - -jolokia_session = JolokiaSession.connect('localhost',28161) - -# Add queue -operation = { - type: 'exec', - mbean: 'org.apache.activemq:type=Broker,brokerName=TEST.BROKER', - operation: 'addQueue', - arguments: ['test.req'] -} -jolokia_session.request(operation) - -# Send message -operation = { - type: 'exec', - mbean: 'org.apache.activemq:type=Broker,brokerName=TEST.BROKER,destinationType=Queue,destinationName=test.req', - operation: 'sendTextMessage(java.lang.String)', - arguments: ['test message'] -} -jolokia_session.request(operation) - -# Read queue size -attribute = { - type: 'read', - mbean: 'org.apache.activemq:type=Broker,brokerName=TEST.BROKER,destinationType=Queue,destinationName=test.req', - attribute: 'QueueSize', -} -result = jolokia_session.request(attribute) -puts "Value = #{result}" - -# Browse queues -operation = { - type: 'exec', - mbean: 'org.apache.activemq:type=Broker,brokerName=TEST.BROKER,destinationType=Queue,destinationName=test.req', - operation: 'browse()', -} -result = jolokia_session.request(operation) -puts result.inspect -puts result.map { |composite_data| - - - composite_data['Text'] -} - -# Purge -operation = { - type: 'exec', - mbean: 'org.apache.activemq:type=Broker,brokerName=TEST.BROKER,destinationType=Queue,destinationName=test.req', - operation: 'purge()', -} -jolokia_session.request(operation) diff --git a/test/utils/jmx/broker/remote_jmx_broker.rb b/test/utils/jmx/broker/remote_jmx_broker.rb deleted file mode 100644 index a98dd86..0000000 --- a/test/utils/jmx/broker/remote_jmx_broker.rb +++ /dev/null @@ -1,32 +0,0 @@ - -class RemoteJmxBroker - - def initialize(jolokia_session, broker_name) - @jolokia_session = jolokia_session - @broker_name = broker_name - end - - def self.connect(host, port, broker_name) - begin - jolokia_session = JolokiaSession.connect(host, port) - rescue Exception => e - puts "Broker is busted: #{e}" - end - - RemoteJmxBroker.new(jolokia_session, broker_name) - end - - #~~~~ Queue management - - def add_queue(queue_name) - operation = { - type: 'exec', - mbean: "org.apache.activemq:type=Broker,brokerName=#{@broker_name}", - operation: 'addQueue', - arguments: [queue_name] - } - @jolokia_session.request(operation) - RemoteJmxQueue.new(@jolokia_session, @broker_name, queue_name) - end - -end \ No newline at end of file diff --git a/test/utils/jmx/broker/remote_jmx_queue.rb b/test/utils/jmx/broker/remote_jmx_queue.rb deleted file mode 100644 index e9b95dd..0000000 --- a/test/utils/jmx/broker/remote_jmx_queue.rb +++ /dev/null @@ -1,53 +0,0 @@ - -class RemoteJmxQueue - - def initialize(jolokia_session, broker_name, queue_name) - @jolokia_session = jolokia_session - @queue_bean = "org.apache.activemq:type=Broker,brokerName=#{broker_name},destinationType=Queue,destinationName=#{queue_name}" - end - - def send_text_message(request) - operation = { - type: 'exec', - mbean: @queue_bean, - operation: 'sendTextMessage(java.lang.String)', - arguments: [ request ] - } - @jolokia_session.request(operation) - end - - def get_size - attribute = { - type: 'read', - mbean: @queue_bean, - attribute: 'QueueSize', - } - @jolokia_session.request(attribute) - end - - def get_message_contents - operation = { - type: 'exec', - mbean: @queue_bean, - operation: 'browse()', - } - result = @jolokia_session.request(operation) - result.map { |composite_data| - if composite_data.has_key?('Text') - composite_data['Text'] - else - composite_data['BodyPreview'].to_a.pack('c*') - end - } - end - - def purge - operation = { - type: 'exec', - mbean: @queue_bean, - operation: 'purge()', - } - @jolokia_session.request(operation) - end - -end \ No newline at end of file diff --git a/test/utils/jmx/broker/testing/active_mq_broker_rule.rb b/test/utils/jmx/broker/testing/active_mq_broker_rule.rb deleted file mode 100644 index 4cce874..0000000 --- a/test/utils/jmx/broker/testing/active_mq_broker_rule.rb +++ /dev/null @@ -1,21 +0,0 @@ - - -class ActiveMQBrokerRule - - def initialize(hostname, port, broker_name) - @hostname = hostname - @port = port - @broker_name = broker_name - end - - def connect - @remote_jmx_broker = RemoteJmxBroker.connect(@hostname, @port, @broker_name) - end - - #~~~~ Facade to broker - - def add_queue(queue_name) - @remote_jmx_broker.add_queue(queue_name) - end - -end \ No newline at end of file