Sha256: bad656d2f466111d0193be21885ee1f6dd7380a9182f46c5f4d819f4cc1ee4ca

Contents?: true

Size: 1.59 KB

Versions: 3

Compression:

Stored size: 1.59 KB

Contents

# vim:fileencoding=utf-8

require 'fileutils'
require 'logger'

class FakeSMTPd::Runner
  attr_reader :port, :dir, :pidfile, :http_port
  attr_reader :startup_sleep, :server_pid, :options, :logfile

  def initialize(options = {})
    @dir = options.fetch(:dir)
    @port = Integer(options.fetch(:port))
    @http_port = Integer(options[:http_port] || port + 1)
    @pidfile = options[:pidfile] || 'fakesmtpd.pid'
    @startup_sleep = options[:startup_sleep] || 0.5
    @logfile = options[:logfile] || $stderr
  end

  def description
    "fakesmtpd server on port #{port}"
  end

  def command
    (
      [
        RbConfig.ruby,
        File.expand_path('../server.rb', __FILE__),
        port.to_s,
        dir,
        '--pidfile', pidfile,
      ] + (logfile == $stderr ? [] : ['--logfile', logfile])
    ).join(' ')
  end

  def start
    if dir
      FileUtils.mkdir_p(dir)
    end
    process_command = command
    log.info "Starting #{description}"
    log.info "  ---> #{process_command}"
    @server_pid = Process.spawn(process_command)
    sleep startup_sleep
    server_pid
  end

  def stop
    real_pid = Integer(File.read(pidfile).chomp) rescue nil
    if server_pid && real_pid
      log.info "Stopping #{description} " <<
               "(shell PID=#{server_pid}, server PID=#{real_pid})"

      [real_pid, server_pid].each do |pid|
        Process.kill(:TERM, pid) rescue nil
      end
    end
  end

  def log
    @log ||= Logger.new(@logfile).tap do |l|
      l.formatter = proc do |severity, datetime, _, msg|
        "[fakesmtpd-runner] #{severity} #{datetime} - #{msg}\n"
      end
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
fakesmtpd-0.3.1 lib/fakesmtpd/runner.rb
fakesmtpd-0.3.0 lib/fakesmtpd/runner.rb
fakesmtpd-0.2.0 lib/fakesmtpd/runner.rb