From 457c2bf135be68b3c49ff20d3f23a6f8507aeda5 Mon Sep 17 00:00:00 2001 From: elijah Date: Mon, 24 Dec 2012 02:02:24 -0800 Subject: initial commit --- test/files/hkp_vindex_result | 21 ++++++++ test/files/leap_public_key | 46 ++++++++++++++++ test/files/leap_vindex_result | 4 ++ test/test_helper.rb | 75 ++++++++++++++++++++++++++ test/unit/hkp_test.rb | 120 ++++++++++++++++++++++++++++++++++++++++++ test/unit/server_test.rb | 34 ++++++++++++ test/unit/test_helper.rb | 1 + 7 files changed, 301 insertions(+) create mode 100644 test/files/hkp_vindex_result create mode 100644 test/files/leap_public_key create mode 100644 test/files/leap_vindex_result create mode 100644 test/test_helper.rb create mode 100644 test/unit/hkp_test.rb create mode 100644 test/unit/server_test.rb create mode 100644 test/unit/test_helper.rb (limited to 'test') diff --git a/test/files/hkp_vindex_result b/test/files/hkp_vindex_result new file mode 100644 index 0000000..677c242 --- /dev/null +++ b/test/files/hkp_vindex_result @@ -0,0 +1,21 @@ +info:1:7 +pub:0EE5BE979282D80B9F7540F1CCD2ED94D21739E9:1:4096:1180812858:1424970931: +uid:Lemur :1330362947:: +uid:Lemur :1330362946:: +uat:::: +pub:B59941F741EAEAF8726F45D88974E514A54B6365:1:2048:944761959:1180812858: +uid:Lemur :1032066007:: +uid:Lemur :1165682982:: +uat:::: +pub:3790027A:1:4096:1354554342:: +uid:Gazelle :1354554342:: +pub:997FA77F:1:4096:1243472517:: +uid:Gazelle :1304892367:: +uid:Gazelle :1354352902:: +pub:3A893F69:1:4096:1304037659:: +uid:Frog :1304037659:: +pub:00440025:1:4096:1243467172:: +uid:Frog :1243467172:: +pub:2518C3B5:17:1024:1089226421:: +uid:Frog :1089226421:: + diff --git a/test/files/leap_public_key b/test/files/leap_public_key new file mode 100644 index 0000000..d58631c --- /dev/null +++ b/test/files/leap_public_key @@ -0,0 +1,46 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- +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 +eFpdYglTIA== +=wcWV +-----END PGP PUBLIC KEY BLOCK----- \ No newline at end of file diff --git a/test/files/leap_vindex_result b/test/files/leap_vindex_result new file mode 100644 index 0000000..cdb4e46 --- /dev/null +++ b/test/files/leap_vindex_result @@ -0,0 +1,4 @@ +info:1:1 +pub:E818C478D3141282F7590D29D041EB11B1647490:1:4096:1350720169:1382256169: +uid:Cloudadmin at LEAP.se (Collective key for infrastructure at LEAP.se) :1350720169:: + diff --git a/test/test_helper.rb b/test/test_helper.rb new file mode 100644 index 0000000..031a90f --- /dev/null +++ b/test/test_helper.rb @@ -0,0 +1,75 @@ +$LOAD_PATH.unshift File.expand_path(File.dirname(__FILE__) + '/../lib') + +require 'rubygems' +require 'minitest/autorun' +require 'webmock/minitest' +require 'nickserver' + +class MiniTest::Unit::TestCase + # Add global extensions to the test case class here + + def setup + # by default, mock all non-localhost network connections + WebMock.disable_net_connect!(:allow_localhost => true) + end + + def file_content(filename) + (@file_contents ||= {})[filename] ||= File.read("%s/files/%s" % [File.dirname(__FILE__), filename]) + end + + def real_network + if ENV['REAL_NET'] == 'true' + WebMock.allow_net_connect! + yield + WebMock.disable_net_connect! + end + end + + def stub_vindex_response(uid, opts = {}) + options = {:status => 200, :body => ""}.merge(opts) + stub_http_request(:get, Nickserver::Config.sks_url).with( + :query => {:op => 'vindex', :search => uid, :exact => 'on', :options => 'mr', :fingerprint => 'on'} + ).to_return(options) + end + + def stub_get_response(key_id, opts = {}) + options = {:status => 200, :body => ""}.merge(opts) + stub_http_request(:get, Nickserver::Config.sks_url).with( + :query => {:op => 'get', :search => "0x"+key_id, :exact => 'on', :options => 'mr'} + ).to_return(options) + end + + #def without_webmock + # WebMock.disable_net_connect!(:allow_localhost => true) + # yield + # WebMock.disable_net_connect! + #end +end + +# +# a simple EM connection with callbacks for various lifecycle stages, +# useful for testing +# +class TestSocketClient < EventMachine::Connection + attr_writer :onopen, :onclose, :onmessage + attr_reader :data + + def initialize + @state = :new + @data = [] + end + + def receive_data(data) + @data << data + if @state == :new + @onopen.call if @onopen + @state = :open + else + @onmessage.call(data) if @onmessage + end + end + + def unbind + @onclose.call if @onclose + end +end diff --git a/test/unit/hkp_test.rb b/test/unit/hkp_test.rb new file mode 100644 index 0000000..c9c28cf --- /dev/null +++ b/test/unit/hkp_test.rb @@ -0,0 +1,120 @@ +require File.expand_path('test_helper', File.dirname(__FILE__)) + +class HkpTest < MiniTest::Unit::TestCase + + def test_key_info_expired + fetch_key_info(:hkp_vindex_result, 'lemur@leap.se') do |keys| + assert_equal 1, keys.length, 'should find a single key' + assert_equal ['lemur@example.org', 'lemur@leap.se'].sort, keys.first.uids.sort, 'should find both uids' + assert_equal '0EE5BE979282D80B9F7540F1CCD2ED94D21739E9', keys.first.keyid + end + end + + def test_key_info_multiple_valid_results + fetch_key_info :hkp_vindex_result, 'gazelle@leap.se' do |keys| + assert_equal 2, keys.length, 'should find two keys' + assert_equal ['gazelle@leap.se'], keys.first.uids + assert_equal '3790027A', keys.first.keyid + assert keys.last.uids.include? 'gazelle@leap.se' + end + end + + def test_key_info_reject_keysize + fetch_key_info :hkp_vindex_result, 'frog@leap.se' do |keys| + assert_equal 1, keys.length, 'should find one key' + assert_equal '00440025', keys.first.keyid + end + end + + def test_key_info_not_found + uid = 'leaping_lemur@leap.se' + stub_vindex_response(uid, :status => 404) + test_em_errback "Nickserver::HKP::FetchKeyInfo.new.search '#{uid}'" do |error| + assert_equal 404, error + end + end + + def test_key_info_real_network + real_network do + uid = 'elijah@riseup.net' + test_em_callback "Nickserver::HKP::FetchKeyInfo.new.search '#{uid}'" do |keys| + assert_equal 1, keys.size + assert keys.first.keyid =~ /00440025$/ + end + end + end + + def test_fetch_key + uid = 'cloudadmin@leap.se' + key_id = 'E818C478D3141282F7590D29D041EB11B1647490' + stub_vindex_response(uid, :body => file_content(:leap_vindex_result)) + stub_get_response(key_id, :body => file_content(:leap_public_key)) + + test_em_callback "Nickserver::HKP::FetchKey.new.get '#{uid}'" do |key_text| + assert_equal file_content(:leap_public_key), key_text + end + end + + def test_fetch_key_not_found + uid = 'cloudadmin@leap.se' + key_id = 'E818C478D3141282F7590D29D041EB11B1647490' + + stub_vindex_response(uid, :body => file_content(:leap_vindex_result)) + stub_get_response(key_id, :status => 404) + + test_em_errback "Nickserver::HKP::FetchKey.new.get '#{uid}'" do |error| + assert_equal 404, error + end + end + + protected + + # + # Takes a code snippet that returns a Deferrable, and yields the callback result. + # Assertion fails if errback is called instead of callback. + # + # This method takes care of the calls to EM.run and EM.stop. It works kind of like EM.run_block, + # except I couldn't get run_block to work with multiple nested HTTP requests. + # + def test_em_callback(code, &block) + EM.run do + deferrable = instance_eval(code) + deferrable.callback {|response| + EM.stop + yield response + return + } + deferrable.errback {|response| + EM.stop + flunk "Expecting callback, but errback invoked with response: #{response}" + } + end + assert false, 'should not get here' + end + + # + # like test_em_callback, except value yielded is the result of errback, and + # we raise an exception if errback was not called. + # + def test_em_errback(code, &block) + EM.run do + deferrable = instance_eval(code) + deferrable.callback {|response| + EM.stop + flunk "Expecting errback, but callback invoked with response: #{response}" + } + deferrable.errback {|response| + EM.stop + yield response + return + } + end + assert false, 'should not get here' + end + + def fetch_key_info(body_source, uid, &block) + stub_vindex_response(uid, :body => file_content(body_source)) + test_em_callback "Nickserver::HKP::FetchKeyInfo.new.search '#{uid}'", &block + end + +end diff --git a/test/unit/server_test.rb b/test/unit/server_test.rb new file mode 100644 index 0000000..ba462d0 --- /dev/null +++ b/test/unit/server_test.rb @@ -0,0 +1,34 @@ +require File.expand_path('test_helper', File.dirname(__FILE__)) + +class ServerTest < MiniTest::Unit::TestCase + + def test_server + uid = 'cloudadmin@leap.se' + key_id = 'E818C478D3141282F7590D29D041EB11B1647490' + stub_vindex_response(uid, :body => file_content(:leap_vindex_result)) + stub_get_response(key_id, :body => file_content(:leap_public_key)) + + EM.run do + EM.start_server '0.0.0.0', Nickserver::Config.port, Nickserver::Server + + params = {:query => {}, :path => "key/#{CGI.escape(uid)}"} + http = EventMachine::HttpRequest.new("http://localhost:#{Nickserver::Config.port}").get(params) + http.callback { + assert_equal file_content(:leap_public_key), http.response + EM.stop + }.errback { + puts http.error + EM.stop + } + + #socket = EM.connect('0.0.0.0', Nickserver::Config.port, TestSocketClient) + #socket.onopen = lambda { + # server.players.size.should == 1 + # socket.data.last.chomp.should == "READY" + # EM.stop + #} + end + end + +end + diff --git a/test/unit/test_helper.rb b/test/unit/test_helper.rb new file mode 100644 index 0000000..ade21a0 --- /dev/null +++ b/test/unit/test_helper.rb @@ -0,0 +1 @@ +require File.dirname(File.dirname(__FILE__)) + '/test_helper' \ No newline at end of file -- cgit v1.2.3