diff --git a/.gitignore b/.gitignore index 5b83409..2c2a6fd 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,4 @@ build.xml catalog.xml Gemfile.lock src/test/resources/db/delayed.db +target diff --git a/Gemfile b/Gemfile index 4104904..c3f33a8 100644 --- a/Gemfile +++ b/Gemfile @@ -1,12 +1,15 @@ source "https://rubygems.org" +gem 'ruby-maven' gem 'jruby-rack' -group :test do +group :development do gem 'rake' - gem 'test-unit', '~> 2.5.3' - gem 'test-unit-context' - gem 'mocha' +end + +group :test do + gem 'test-unit' + gem 'mocha', require: 'mocha/test_unit' end group :delayed_job do @@ -24,8 +27,7 @@ group :delayed_job do end end else - gem 'delayed_job' - gem 'delayed_job_active_record', :require => nil + gem 'delayed_job_active_record' gem 'delayed_cron_job', :require => nil end if ENV['activerecord'] @@ -33,7 +35,7 @@ group :delayed_job do else gem 'activerecord', :require => nil # for tests end - gem 'activerecord-jdbcsqlite3-adapter', '~> 1.3.20', :require => nil, :platform => :jruby + gem 'activerecord-jdbcsqlite3-adapter', '~> 61.3' end group :resque do diff --git a/README.md b/README.md index e0865e4..642d3d8 100644 --- a/README.md +++ b/README.md @@ -265,20 +265,26 @@ end ## Build -[JRuby](http://jruby.org) 1.6.8+ is required to build the project. +[JRuby](http://jruby.org) 9.4.8.0+ is required to build the project. -The build is performed by [rake](http://rake.rubyforge.org) which should be part -of your JRuby installation, if you're experiencing conflicts with another Ruby and -it's `rake` executable use `jruby -S rake` instead. -Besides you will need [ant](http://ant.apache.org/) installed for the Java part. +Install gems : + + bundle install Build the *jruby-rack-worker_[VERSION].jar* using : - rake jar + bundle exec rake jar Build the gem (includes the .jar packaged) : - rake gem + bundle exec rake gem + + +## Testing + +Run tests with: + + bundle exec rake ## Copyright diff --git a/Rakefile b/Rakefile index 5a993d8..40bd86c 100644 --- a/Rakefile +++ b/Rakefile @@ -1,3 +1,8 @@ +unless defined?(JRUBY_VERSION) + raise "Hey, we're not running within JRuby my dear !" +end + +require 'ruby-maven' PROJECT_NAME = 'jruby-rack-worker' @@ -15,10 +20,6 @@ TEST_RESULTS_DIR = File.join(OUT_DIR, 'test-results') LIB_BASE_DIR = 'lib' -unless defined?(JRUBY_VERSION) - raise "Hey, we're not running within JRuby my dear !" -end - load File.join(RUBY_SRC_DIR, "#{PROJECT_NAME.gsub('-', '/')}", 'version.rb') def project_version @@ -29,86 +30,17 @@ def out_jar_path "#{OUT_DIR}/#{PROJECT_NAME}_#{project_version}.jar" end -require 'ant' -ant.property :name => "ivy.lib.dir", :value => LIB_BASE_DIR - -namespace :ivy do - - ivy_version = '2.2.0' - ivy_jar_dir = File.join(LIB_BASE_DIR, 'build') - ivy_jar_file = File.join(ivy_jar_dir, 'ivy.jar') - - task :download do - mkdir_p ivy_jar_dir - ant.get :src => "http://repo1.maven.org/maven2/org/apache/ivy/ivy/#{ivy_version}/ivy-#{ivy_version}.jar", - :dest => ivy_jar_file, - :usetimestamp => true - end - - task :install do - Rake::Task["ivy:download"].invoke unless File.exist?(ivy_jar_file) - - ant.path :id => 'ivy.lib.path' do - fileset :dir => ivy_jar_dir, :includes => '*.jar' - end - ant.taskdef :resource => "org/apache/ivy/ant/antlib.xml", :classpathref => "ivy.lib.path" - end - - task :clean do - rm_rf LIB_BASE_DIR - end - -end - -task :retrieve => :"ivy:install" do - ant.retrieve :pattern => "${ivy.lib.dir}/[conf]/[artifact].[type]" -end - -ant.path :id => "main.class.path" do - fileset :dir => LIB_BASE_DIR do - include :name => 'runtime/*.jar' - end -end -ant.path :id => "test.class.path" do - fileset :dir => LIB_BASE_DIR do - include :name => 'test/*.jar' - end -end +desc "build jar" +task :jar do + RubyMaven.exec('package', '-DskipTests=true') -task :compile => :retrieve do mkdir_p MAIN_BUILD_DIR - ant.javac :destdir => MAIN_BUILD_DIR, :source => '1.5' do - src :path => MAIN_SRC_DIR - classpath :refid => "main.class.path" - end -end - -task :copy_resources do - mkdir_p ruby_dest_dir = File.join(MAIN_BUILD_DIR, '') # 'META-INF/jruby_rack_worker' - ant.copy :todir => ruby_dest_dir do - fileset :dir => RUBY_SRC_DIR do - exclude :name => 'jruby_rack_worker.rb' # exclude :name => 'jruby/**' - end - end -end - -desc "build jar" -task :jar => [ :compile, :copy_resources ] do - ant.jar :destfile => out_jar_path, :basedir => MAIN_BUILD_DIR do - manifest do - attribute :name => "Built-By", :value => "${user.name}" - attribute :name => "Implementation-Title", :value => PROJECT_NAME - attribute :name => "Implementation-Version", :value => project_version - attribute :name => "Implementation-Vendor", :value => "Karol Bucek" - attribute :name => "Implementation-Vendor-Id", :value => "org.kares" - end - end + cp Dir["target/*.jar"].first, out_jar_path end desc "build gem" task :gem => [ :jar ] do warn "building using JRuby: #{JRUBY_VERSION}" if JRUBY_VERSION > '9.0' - raise "building on Java > 7" if ENV_JAVA['java.specification.version'] > '1.7' mkdir_p gem_out = File.join(OUT_DIR, 'gem') mkdir_p gem_out_lib = File.join(gem_out, 'lib') @@ -120,10 +52,9 @@ task :gem => [ :jar ] do abort "too many jars! #{jars.map{ |j| File.basename(j) }.inspect}\nrake clean first" end - ant.copy :todir => gem_out_lib do - fileset :dir => RUBY_SRC_DIR do - include :name => '*.rb' - include :name => 'jruby/**/*.rb' + %w[*.rb jruby/**/*.rb].each do |glob| + Dir[File.join(RUBY_SRC_DIR, glob)].each do |file| + cp file, gem_out_lib end end @@ -159,16 +90,6 @@ task :gem => [ :jar ] do end end -task :'test:compile' => :compile do - mkdir_p TEST_BUILD_DIR - ant.javac :destdir => TEST_BUILD_DIR, :source => '1.5' do - src :path => TEST_SRC_DIR - classpath :refid => "main.class.path" - classpath :refid => "test.class.path" - classpath { pathelement :path => MAIN_BUILD_DIR } - end -end - task :'bundler:setup' do begin require 'bundler/setup' @@ -179,57 +100,39 @@ end namespace :test do - desc "run ruby tests" - task :ruby do # => :'bundler:setup' + task 'dependencies' do Rake::Task['jar'].invoke unless File.exists?(out_jar_path) + RubyMaven.exec('dependency:copy-dependencies', '-DincludeScope=provided', '-P!jruby-dependencies') + end + + desc "run ruby tests" + task :ruby do + Rake::Task['test:dependencies'].invoke _ruby_test('src/test/ruby/**/*_test.rb') end desc "run DJ (ruby) tests only" - task 'ruby:delayed' do # => :'bundler:setup' - Rake::Task['jar'].invoke unless File.exists?(out_jar_path) + task 'ruby:delayed' do + Rake::Task['test:dependencies'].invoke _ruby_test('src/test/ruby/delayed/**/*_test.rb') end desc "run Resque (ruby) tests only" - task 'ruby:resque' do # => :'bundler:setup' - Rake::Task['jar'].invoke unless File.exists?(out_jar_path) + task 'ruby:resque' do + Rake::Task['test:dependencies'].invoke _ruby_test('src/test/ruby/resque/**/*_test.rb') end def _ruby_test(test_files) test_files = ENV['TEST'] || File.join(test_files) - #test_opts = (ENV['TESTOPTS'] || '').split(' ') test_files = FileList[test_files].map { |path| path.sub('src/test/ruby/', '') } - ruby "-Isrc/main/ruby:src/test/ruby", "-e #{test_files.inspect}.each { |test| require test }" + ruby "-I", "src/main/ruby:src/test/ruby", "-e", "#{test_files.inspect}.each { |test| require test }" end desc "run java tests" - task :java => :'test:compile' do - mkdir_p TEST_RESULTS_DIR - ant.junit :fork => true, - :haltonfailure => false, - :haltonerror => true, - :showoutput => true, - :printsummary => true do - - classpath :refid => "main.class.path" - classpath :refid => "test.class.path" - classpath do - pathelement :path => MAIN_BUILD_DIR - pathelement :path => TEST_BUILD_DIR - end - - formatter :type => "xml" - - batchtest :fork => "yes", :todir => TEST_RESULTS_DIR do - fileset :dir => TEST_SRC_DIR do - include :name => "**/*Test.java" - end - end - end + task :java do + RubyMaven.exec('verify', '-Pjruby-dependencies') end - end desc "run all tests" @@ -240,4 +143,5 @@ task :default => :test desc "clean up" task :clean do rm_rf OUT_DIR + RubyMaven.exec('clean') end diff --git a/pom.rb b/pom.rb new file mode 100644 index 0000000..1692ff5 --- /dev/null +++ b/pom.rb @@ -0,0 +1,84 @@ +# frozen_string_literal: true + +load File.join(basedir, 'src/main/ruby/jruby/rack/worker/version.rb') + +project do + model_version '4.0.0' + + group_id 'org.kares.jruby.rack' + artifact_id 'jruby-rack-worker' + version JRuby::Rack::Worker::VERSION + packaging 'jar' + + properties( + 'project.build.sourceEncoding' => 'UTF-8', + 'project.reporting.outputEncoding' => 'UTF-8', + # 'polyglot.dump.pom' => 'pom.xml', + # 'polyglot.dump.readonly' => true + ) + + profiles do + profile 'jruby-dependencies' do + activation do + active_by_default true + end + dependencies do + dependency do + group_id 'org.jruby' + artifact_id 'jruby' + version '9.4.8.0' + scope 'provided' + end + end + end + end + + dependencies do + dependency do + group_id 'javax.servlet' + artifact_id 'servlet-api' + version '2.4' + scope 'provided' + end + + dependency do + group_id 'org.jruby.rack' + artifact_id 'jruby-rack' + version '1.1.12' + scope 'provided' + exclusion 'org.jruby', 'jruby-complete' + end + + dependency do + group_id 'junit' + artifact_id 'junit' + version '4.11' + scope 'test' + end + + dependency do + group_id 'org.mockito' + artifact_id 'mockito-all' + version '1.9.5' + scope 'test' + end + end + + build do + plugins do + plugin('org.apache.maven.plugins:maven-jar-plugin') do + configuration( + archive: { + manifest_entries: { + 'Built-By' => '${user.name}', + 'Implementation-Title' => '${project.name}', + 'Implementation-Version' => '${project.version}', + 'Implementation-Vendor' => 'Karol Bucek', + 'Implementation-Vendor-Id' => 'org.kares' + } + } + ) + end + end + end +end diff --git a/src/test/ruby/delayed/jruby_worker_test.rb b/src/test/ruby/delayed/jruby_worker_test.rb index b1d35f0..dadc842 100644 --- a/src/test/ruby/delayed/jruby_worker_test.rb +++ b/src/test/ruby/delayed/jruby_worker_test.rb @@ -1,9 +1,8 @@ require File.expand_path('test_helper', File.dirname(__FILE__) + '/..') +Bundler.require(:delayed_job) +require 'socket' # delayed_job gem gives hostname when socket is required require 'delayed/jruby_worker' -gem_spec = Gem.loaded_specs['delayed_job'] if defined? Gem -puts "loaded gem 'delayed_job' '#{gem_spec.version.to_s}'" if gem_spec - module Delayed class JRubyWorkerTest < Test::Unit::TestCase @@ -175,65 +174,58 @@ def worker.call_at_exit assert_equal 5, Delayed::Worker.sleep_delay assert_equal nil, Delayed::Worker.exit_on_complete if exit_on_cmplt end - - begin - - context "with backend" do - - def self.startup - require 'active_record' - require 'active_record/connection_adapters/jdbcsqlite3_adapter' - load 'delayed/active_record_schema.rb' - #class Delayed::Job < ActiveRecord::Base; end - begin - require 'delayed_job_active_record' # DJ 3.0+ - Delayed::Job.reset_column_information - rescue LoadError - Delayed::Worker.backend = :active_record - end - end - - setup do - Delayed::Worker.logger = Logger.new(STDOUT) - Delayed::Worker.logger.level = Logger::DEBUG - ActiveRecord::Base.logger = Delayed::Worker.logger if $VERBOSE - #ActiveRecord::Base.class_eval do - # def self.silence; yield; end # disable silence - #end + class WithBackendTests < Test::Unit::TestCase + def self.startup + require 'active_record' + require 'active_record/connection_adapters/jdbcsqlite3_adapter' + load 'delayed/active_record_schema.rb' + #class Delayed::Job < ActiveRecord::Base; end + begin + require 'delayed_job_active_record' # DJ 3.0+ + Delayed::Job.reset_column_information + rescue LoadError + Delayed::Worker.backend = :active_record end + end - class TestJob + setup do + Delayed::Worker.logger = Logger.new(STDOUT) + Delayed::Worker.logger.level = Logger::DEBUG + ActiveRecord::Base.logger = Delayed::Worker.logger if $VERBOSE + #ActiveRecord::Base.class_eval do + # def self.silence; yield; end # disable silence + #end + end - def initialize(param) - @param = param - end + class TestJob - @@performed = nil + def initialize(param) + @param = param + end - def perform - puts "#{self}#perform param = #{@param}" - raise "already performed" if @@performed - @@performed = @param - end + @@performed = nil + def perform + puts "#{self}#perform param = #{@param}" + raise "already performed" if @@performed + @@performed = @param end - test "works (integration)" do - worker = Delayed::JRubyWorker.new({ :sleep_delay => 0.10 }) - Delayed::Job.enqueue job = TestJob.new(:huu) - Thread.new { worker.start } - sleep(0.20) - assert ! worker.stop? + end - assert_equal :huu, TestJob.send(:class_variable_get, :'@@performed') + test "works (integration)" do + worker = Delayed::JRubyWorker.new({ :sleep_delay => 0.10 }) + Delayed::Job.enqueue job = TestJob.new(:huu) + Thread.new { worker.start } + sleep(0.20) + assert ! worker.stop? - worker.stop - sleep(0.15) - assert worker.stop? - end + assert_equal :huu, TestJob.send(:class_variable_get, :'@@performed') + worker.stop + sleep(0.15) + assert worker.stop? end - end private @@ -259,4 +251,4 @@ def stub_Delayed_Job(mock = false) end end -end \ No newline at end of file +end diff --git a/src/test/ruby/delayed/plugin_test.rb b/src/test/ruby/delayed/plugin_test.rb index 6100306..1f15dde 100644 --- a/src/test/ruby/delayed/plugin_test.rb +++ b/src/test/ruby/delayed/plugin_test.rb @@ -63,7 +63,7 @@ def self.load_plugin_like! end end if Worker.is_a?(SyncLifecycle) - context "with backend" do + class WithBackendTests < Test::Unit::TestCase @@plugin = nil diff --git a/src/test/ruby/jruby/rack/worker_test.rb b/src/test/ruby/jruby/rack/worker_test.rb index d48b5a1..f357168 100644 --- a/src/test/ruby/jruby/rack/worker_test.rb +++ b/src/test/ruby/jruby/rack/worker_test.rb @@ -20,7 +20,7 @@ def self.startup assert_equal File.expand_path(jar_path), JRuby::Rack::Worker::JAR_PATH end - context :ENV do + class ENVTests < Test::Unit::TestCase test "resolves key when set" do assert ! JRuby::Rack::Worker::ENV.key?(:foo) diff --git a/src/test/ruby/resque/jruby_worker_test.rb b/src/test/ruby/resque/jruby_worker_test.rb index b27a709..8f06e15 100644 --- a/src/test/ruby/resque/jruby_worker_test.rb +++ b/src/test/ruby/resque/jruby_worker_test.rb @@ -1,4 +1,5 @@ require File.expand_path('test_helper', File.dirname(__FILE__) + '/..') +Bundler.require(:resque) require 'resque/jruby_worker' gem_spec = Gem.loaded_specs['resque'] if defined? Gem @@ -338,7 +339,7 @@ def worker.call_at_exit redis.connect end - context "with redis" do + class WithRedisTests < Test::Unit::TestCase test "worker exists after it's started" do worker = Resque::JRubyWorker.new('foo') diff --git a/src/test/ruby/test_helper.rb b/src/test/ruby/test_helper.rb index f6822f4..2d1a0a3 100644 --- a/src/test/ruby/test_helper.rb +++ b/src/test/ruby/test_helper.rb @@ -1,46 +1,7 @@ -begin - require 'bundler' -rescue LoadError => e - require('rubygems') && retry - raise e +Dir['target/dependency/*.jar'].each { |jar| next if jar =~ /jruby/; $CLASSPATH << jar } +Bundler.require(:default, :test) +module JRuby::Rack::Worker + JAR_PATH = Dir.glob("out/jruby-rack-worker_*.jar").last end -Bundler.setup # require(:default, :test) - -gem 'test-unit' # uninitialized constant Test::Unit::TestResult::TestResultFailureSupport -require 'test/unit' -require 'test/unit/context' -begin; require 'mocha/setup'; rescue LoadError; require 'mocha'; end require 'jruby/rack/worker' - -module JRuby - module Rack - module Worker - - @@load_jar = nil - - # NOTE: we're not packed in a .gem thus override .jar loading : - def self.load_jar - unless @@load_jar - @@load_jar = true - require 'java' - runtime_jars.each { |jar| load jar } - require Dir.glob("#{base_dir}/out/jruby-rack-worker_*.jar").last - end - end - - private - - def self.runtime_jars # ivy runtime jars - Dir.glob("#{base_dir}/lib/runtime/*.jar").reject do |jar| - jar =~ /jruby-complete/ || jar =~ /geronimo/ - end - end - - def self.base_dir - File.expand_path('../../..', File.dirname(__FILE__)) - end - - end - end -end \ No newline at end of file