summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorelijah <elijah@riseup.net>2014-12-14 16:17:14 -0800
committerelijah <elijah@riseup.net>2014-12-14 16:17:14 -0800
commit92db2c6e6210a860a4de4baf8033428fbe72b7cc (patch)
tree19cb97b35ed094d1a5f844cc4cebdf56dfed91e2
parent0eedbfa5ce7a8ed4799408b591e655070336f0cc (diff)
added TapiceroProcess, to handle starting and stopping tapicero during tests.
-rw-r--r--Readme.md9
-rwxr-xr-xbin/tapicero19
-rw-r--r--lib/tapicero.rb1
-rw-r--r--test/badconfig.yaml20
-rw-r--r--test/config.yaml2
-rw-r--r--test/integration/actions_test.rb2
-rw-r--r--test/integration/failure_test.rb24
-rw-r--r--test/support/integration_test.rb30
-rw-r--r--test/support/tapicero_process.rb126
-rw-r--r--test/test_helper.rb11
10 files changed, 202 insertions, 42 deletions
diff --git a/Readme.md b/Readme.md
index 2df2818..9338fce 100644
--- a/Readme.md
+++ b/Readme.md
@@ -54,10 +54,13 @@ Run once and then exit:
Running tests
---------------------
-To run the tests, tapicero must be running:
+To run the tests:
- bin/tapicero run -- test/config.yaml
- rake test
+ rake
+
+You can run with `rake DEBUG=1` if you want more verbose output. To run a particular test:
+
+ DEBUG=1 ruby test/integration/failure_test.rb
Flags
---------------------
diff --git a/bin/tapicero b/bin/tapicero
index d3a9bf8..ef063e5 100755
--- a/bin/tapicero
+++ b/bin/tapicero
@@ -7,6 +7,13 @@
require 'pathname'
BASE_DIR = Pathname.new(__FILE__).realpath + '../..'
+def error(msg)
+ if Tapicero.respond_to?(:logger) && Tapicero.logger
+ Tapicero.logger.error(msg)
+ end
+ puts(msg)
+end
+
begin
#
# try without rubygems (might be already loaded or not present)
@@ -27,9 +34,8 @@ end
# Graceful Ctrl-C
Signal.trap("SIGINT") do
- Tapicero.logger.warn "Received SIGINT - stopping tapicero"
- puts "\nQuit - leaving tapicero"
- exit
+ error "Received SIGINT - stopping tapicero"
+ exit(0)
end
# this changes later, so save the initial current directory
@@ -69,7 +75,8 @@ end
begin
Daemons.run("#{BASE_DIR}/lib/tapicero_daemon.rb", options)
rescue SystemExit
-rescue Exception => exc
- puts exc.class.name + exc.to_s
- puts exc.backtrace.join("\n")
+ error "Bye"
+rescue StandardError => exc
+ error exc.class.name + " " + exc.to_s
+ error exc.backtrace.join("\n")
end
diff --git a/lib/tapicero.rb b/lib/tapicero.rb
index a098287..1dc3d9e 100644
--- a/lib/tapicero.rb
+++ b/lib/tapicero.rb
@@ -25,7 +25,6 @@ module Tapicero
# hand flags over to CouchRest::Changes
if defined? FLAGS
config.flags = FLAGS
- puts "flags: #{FLAGS}" if FLAGS.any?
end
end
diff --git a/test/badconfig.yaml b/test/badconfig.yaml
new file mode 100644
index 0000000..4941806
--- /dev/null
+++ b/test/badconfig.yaml
@@ -0,0 +1,20 @@
+#
+# A bad config, used to test errors
+#
+
+# couch connection configurationq
+connection:
+ protocol: "http"
+ host: "localhost"
+ port: 59840
+ ## ^^ wrong port :)
+ username: ~
+ password: ~
+ prefix: "tapicero_test"
+ suffix: ""
+
+# file to store the last processed user record in so we can resume after
+# a restart:
+seq_file: "/tmp/tapicero_test.seq"
+log_file: "/tmp/tapicero_test.log"
+log_level: debug
diff --git a/test/config.yaml b/test/config.yaml
index c1502db..601c104 100644
--- a/test/config.yaml
+++ b/test/config.yaml
@@ -1,5 +1,5 @@
#
-# Default configuration options for Tapicero
+# Default configuration options for Tapicero tests
#
# couch connection configuration
diff --git a/test/integration/actions_test.rb b/test/integration/actions_test.rb
index 52c1083..f3d3faa 100644
--- a/test/integration/actions_test.rb
+++ b/test/integration/actions_test.rb
@@ -3,7 +3,7 @@ require_relative '../test_helper.rb'
class ActionsTest < Tapicero::IntegrationTest
def setup
- assert_tapicero_running
+ TapiceroProcess.run_with_config("test/config.yaml")
create_user
end
diff --git a/test/integration/failure_test.rb b/test/integration/failure_test.rb
new file mode 100644
index 0000000..ac84d05
--- /dev/null
+++ b/test/integration/failure_test.rb
@@ -0,0 +1,24 @@
+require_relative '../test_helper.rb'
+
+class FailureTest < Tapicero::IntegrationTest
+
+ def setup
+ end
+
+ def teardown
+ end
+
+ def test_couchdb_not_running_and_then_running_again
+ TapiceroProcess.run_with_config('test/badconfig.yaml')
+ create_user
+ assert_raises RestClient::ResourceNotFound do
+ user_database.info
+ end
+ TapiceroProcess.run_with_config('test/config.yaml')
+ # it would be nice if we could signal tapicero to ask if it is idle.
+ # instead, we wait.
+ sleep 0.5
+ assert_database_exists user_database
+ end
+
+end
diff --git a/test/support/integration_test.rb b/test/support/integration_test.rb
index 117fc3f..552b0a1 100644
--- a/test/support/integration_test.rb
+++ b/test/support/integration_test.rb
@@ -48,35 +48,5 @@ module Tapicero
assert false, "Database #{db} should exist."
end
- def assert_tapicero_running
- return if $tapicero_running
- pid_file = '/tmp/tapicero.pid'
- unless File.exists?(pid_file)
- puts 'Tapicero must be running. Run `bin/tapicero run -- test/config.yaml`'
- exit(1)
- end
- pid = File.read(pid_file).strip
- if pid !~ /^\d+/
- puts "Bad #{pid_file}: Remove the file and try again.";
- exit(1)
- else
- pid = pid.to_i
- end
- begin
- Process.kill(0, pid)
- puts "OK, tapicero is running with process id #{pid}."
- $tapicero_running = true
- rescue Errno::EPERM
- puts "Failed to test tapicero pid: No permission to query #{pid}!"
- exit(1)
- rescue Errno::ESRCH
- puts "Bad #{pid_file}: #{pid} is NOT running. Remove the file and try again.";
- exit(1)
- rescue
- puts "Unable to determine status for tapicero process #{pid} : #{$!}"
- exit(1)
- end
- end
-
end
end
diff --git a/test/support/tapicero_process.rb b/test/support/tapicero_process.rb
new file mode 100644
index 0000000..fdfb37d
--- /dev/null
+++ b/test/support/tapicero_process.rb
@@ -0,0 +1,126 @@
+##
+## TAPICERO PROCESS MANIPULATION
+##
+
+module TapiceroProcess
+
+ public
+
+ def self.run_with_config(config_path)
+ if running?
+ if config_path != config_of_running_tapicero()
+ kill
+ start(config_path)
+ end
+ else
+ start(config_path)
+ end
+ end
+
+ def self.start(config_path)
+ Dir.chdir(base_dir) do
+ other_process = fork do
+ if DEBUG
+ puts "bin/tapicero run -- '#{config_path}'"
+ exec "bin/tapicero run -- '#{config_path}'"
+ else
+ exec "bin/tapicero run -- '#{config_path}' > /dev/null 2>&1"
+ end
+ end
+ Process.detach(other_process)
+ 10.times do
+ sleep 0.1
+ break if get_pid
+ end
+ if !running?
+ puts 'Tapicero should be running'
+ exit 1
+ end
+ end
+ end
+
+ # kill everything, not just the ones we started
+ def self.kill!
+ kill # first try the pid file method
+ pids = `pgrep -f 'bin/tapicero'`.strip
+ if !pids.empty?
+ pids.gsub!("\n", " ")
+ puts "Killing all bin/tapicero #{pids}" if DEBUG
+ `pkill -f 'bin/tapicero'`
+ end
+ end
+
+ def self.kill
+ pid = get_pid
+ if pid
+ puts "Killing bin/tapicero #{pid}" if DEBUG
+ Process.kill("TERM", pid)
+ 10.times do
+ sleep 0.1
+ break if get_pid.nil?
+ end
+ if running?
+ puts 'Tapicero could not be killed'
+ exit 1
+ end
+ end
+ end
+
+ private
+
+ def self.base_dir
+ File.expand_path('../../..', __FILE__)
+ end
+
+ def self.pid_file
+ '/tmp/tapicero.pid'
+ end
+
+ def self.get_pid
+ if File.exists?(pid_file)
+ pid = File.read(pid_file).strip
+ if pid !~ /^\d+/
+ puts "Bad #{pid_file}: Remove the file and try again.";
+ exit(1)
+ else
+ return pid.to_i
+ end
+ else
+ return nil
+ end
+ end
+
+ def self.running?
+ return false if !File.exists?(pid_file)
+ pid = get_pid()
+ begin
+ Process.kill(0, pid)
+ return pid
+ rescue Errno::EPERM
+ puts "Failed to test tapicero pid: No permission to query #{_id}!"
+ exit(1)
+ rescue Errno::ESRCH
+ puts "Bad #{pid_file}: #{pid} is NOT running. Remove the file and try again.";
+ exit(1)
+ rescue
+ puts "Unable to determine status for tapicero process #{pid} : #{$!}"
+ exit(1)
+ end
+ end
+
+ #
+ # returns the path of the currently running tapicero.
+ #
+ def self.config_of_running_tapicero
+ config = `ps -o cmd= --pid #{get_pid}`.split('--')[1]
+ if config.nil?
+ puts "Could not determine config file of currently running tapicero. Please kill it and rerun the tests."
+ else
+ return config.strip.gsub("'", '')
+ end
+ rescue StandardError => ex
+ puts "Could not parse running tapicero options: #{ex}"
+ exit 1
+ end
+
+end
diff --git a/test/test_helper.rb b/test/test_helper.rb
index 4fe81df..ec42f41 100644
--- a/test/test_helper.rb
+++ b/test/test_helper.rb
@@ -12,6 +12,10 @@ begin
rescue LoadError
end
+unless defined? DEBUG
+ DEBUG = ENV["DEBUG"]
+end
+
$:.unshift BASE_DIR + 'lib'
require 'mocha/setup'
@@ -22,3 +26,10 @@ Tapicero::RERAISE = true
require 'tapicero'
require_relative 'support/integration_test'
+
+require_relative 'support/tapicero_process'
+TapiceroProcess.kill!
+MiniTest.after_run {
+ TapiceroProcess.kill!
+}
+