lib/deep_test/options.rb in deep_test-1.1.4 vs lib/deep_test/options.rb in deep_test-1.2.0
- old
+ new
@@ -1,35 +1,27 @@
module DeepTest
class Options
- class Option
- attr_reader :name, :default
-
- def initialize(name, conversion, default)
- @name, @conversion, @default = name, conversion, default
- end
-
- def from_command_line(command_line)
- command_line =~ /--#{name} (\S+)(\s|$)/
- $1.send(@conversion) if $1
- end
-
- def to_command_line(value)
- "--#{name} #{value}" if value && value != default
- end
- end
-
unless defined?(VALID_OPTIONS)
VALID_OPTIONS = [
- Option.new(:number_of_workers, :to_i, 2),
- Option.new(:pattern, :to_s, nil),
- Option.new(:timeout_in_seconds, :to_i, 30),
- Option.new(:server_port, :to_i, 6969),
- Option.new(:worker_listener, :to_s, "DeepTest::NullWorkerListener"),
+ Option.new(:distributed_server, Option::String, nil),
+ Option.new(:number_of_workers, Option::Integer, 2),
+ Option.new(:metrics_file, Option::String, nil),
+ Option.new(:pattern, Option::String, nil),
+ Option.new(:server_port, Option::Integer, 6969),
+ Option.new(:sync_options, Option::Hash, {}),
+ Option.new(:timeout_in_seconds, Option::Integer, 30),
+ Option.new(:ui, Option::String, "DeepTest::UI::Console"),
+ Option.new(:worker_listener, Option::String, "DeepTest::NullWorkerListener"),
]
end
attr_accessor *VALID_OPTIONS.map {|o| o.name}
+
+ def ui=(value)
+ @ui = value.to_s
+ end
+
def worker_listener=(value)
@worker_listener = value.to_s
end
def self.from_command_line(command_line)
@@ -39,26 +31,71 @@
end
new(hash)
end
def initialize(hash)
+ @origin_hostname = Socket.gethostname
check_option_keys(hash)
VALID_OPTIONS.each do |option|
send("#{option.name}=", hash[option.name] || option.default)
end
end
- def new_worker_listener
- eval(worker_listener).new
+ def gathering_metrics?
+ !@metrics_file.nil?
end
+ def new_listener_list
+ listeners = worker_listener.split(',').map do |listener|
+ eval(listener).new
+ end
+ ListenerList.new(listeners)
+ end
+
+ def origin_hostname
+ (Socket.gethostname == @origin_hostname) ? 'localhost' : @origin_hostname
+ end
+
+ # Don't store UI instances in the options instance, which will
+ # need to be dumped over DRb. UI instances may not be dumpable
+ # and we don't want to have to start yet another DRb Server
+ #
+ UI_INSTANCES = {} unless defined?(UI_INSTANCES)
+ def ui_instance
+ UI_INSTANCES[self] ||= eval(ui).new(self)
+ end
+
def to_command_line
command_line = []
VALID_OPTIONS.each do |option|
value = send(option.name)
command_line << option.to_command_line(value)
end
command_line.compact.join(' ')
+ end
+
+ def mirror_path(base)
+ raise "No source directory specified in sync_options" unless sync_options[:source]
+ relative_mirror_path = origin_hostname + sync_options[:source].gsub('/','_')
+ "#{base}/#{relative_mirror_path}"
+ end
+
+ def new_workers
+ if distributed_server.nil?
+ LocalWorkers.new self
+ else
+ begin
+ server = Distributed::TestServer.connect(self)
+ Distributed::RemoteWorkerClient.new(self, server, LocalWorkers.new(self))
+ rescue => e
+ ui_instance.distributed_failover_to_local("connect", e)
+ LocalWorkers.new self
+ end
+ end
+ end
+
+ def server
+ Server.remote_reference(origin_hostname, server_port)
end
protected
def check_option_keys(hash)