sup

A curses threads-with-tags style email client

sup.git

git clone https://supmua.dev/git/sup/
commit bc309d8cc770f2a94ab3f14f0554e8f0a163aebd
parent 1a08164e54dbd282991145150de879cb2b8dd21e
Author: Rich Lane <rlane@club.cc.cmu.edu>
Date:   Sat,  5 Jun 2010 16:30:34 -0700

add server test harness

Diffstat:
A test/test_server.rb | 89 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 89 insertions(+), 0 deletions(-)
diff --git a/test/test_server.rb b/test/test_server.rb
@@ -0,0 +1,89 @@
+#!/usr/bin/ruby
+# encoding: utf-8
+
+require 'test/unit'
+require 'iconv'
+require 'stringio'
+require 'tmpdir'
+require 'fileutils'
+require 'thread'
+require 'eventmachine'
+require 'sup'
+require 'sup/server'
+
+Thread.abort_on_exception = true
+
+module EM
+  def self.spawn_reactor_thread
+    fail if EM.reactor_running?
+    q = ::Queue.new
+    Thread.new { EM.run { q << nil } }
+    q.pop
+    fail unless EM.reactor_running?
+    fail if EM.reactor_thread?
+  end
+
+  def self.kill_reactor_thread
+    fail unless EM.reactor_running?
+    fail if EM.reactor_thread?
+    EM.stop
+    EM.reactor_thread.join
+    fail if EM.reactor_running?
+  end
+end
+
+class QueueingClient < EM::P::RedwoodClient
+  def initialize
+    super
+    @q = Queue.new
+    @readyq = Queue.new
+  end
+
+  def receive_message type, tag, params
+    @q << [type, params]
+  end
+
+  def connection_established
+    @readyq << nil
+  end
+
+  def wait_until_ready
+    @readyq.pop
+  end
+
+  def read
+    @q.pop
+  end
+
+  alias write send_message
+end
+
+class TestServer < Test::Unit::TestCase
+  def setup
+    port = rand(1000) + 30000
+    EM.spawn_reactor_thread
+    @path = Dir.mktmpdir
+    socket_path = File.join(@path, 'socket')
+    @server = EM.start_server socket_path, Redwood::Server
+    @client = EM.connect socket_path, QueueingClient
+    @client.wait_until_ready
+  end
+
+  def teardown
+    FileUtils.rm_r @path if passed?
+    puts "not cleaning up #{@path}" unless passed?
+    EM.kill_reactor_thread
+  end
+
+  def test_invalid_request
+    @client.write 'foo', {}
+    check @client.read, 'error'
+  end
+
+  def check resp, type, args={}
+    assert_equal type.to_s, resp[0]
+    args.each do |k,v|
+      assert_equal v, resp[1][k.to_s]
+    end
+  end
+end