1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
|
require File.expand_path('test_helper', File.dirname(__FILE__))
require 'json'
#
# Some important notes to understanding these tests:
#
# (1) Requests to localhost always bypass HTTP stub.
#
# (2) All requests to nickserver are to localhost.
#
# (3) the "Host" header for requests to nickserver must be set, because this
# is how it decides if a request is local. I am not happy about this design,
# but that is how it works for now.
#
# (4) When stubbing requests to couchdb, the couchdb host is changed from the
# default (localhost) to a dummy value (notlocalhost).
#
class NickserverTest < MiniTest::Unit::TestCase
def test_GET_served_via_SKS
uid = 'cloudadmin@leap.se'
key_id = 'E818C478D3141282F7590D29D041EB11B1647490'
stub_sks_vindex_reponse(uid, :body => file_content(:leap_vindex_result))
stub_sks_get_reponse(key_id, :body => file_content(:leap_public_key))
start do
params = {:query => {"address" => uid}}
get(params) do |http|
assert_equal file_content(:leap_public_key), JSON.parse(http.response)["openpgp"]
stop
end
end
end
def test_POST_served_via_SKS
uid = 'cloudadmin@leap.se'
key_id = 'E818C478D3141282F7590D29D041EB11B1647490'
stub_sks_vindex_reponse(uid, :body => file_content(:leap_vindex_result))
stub_sks_get_reponse(key_id, :body => file_content(:leap_public_key))
start do
params = {:body => {"address" => uid}}
post(params) do |http|
assert_equal file_content(:leap_public_key), JSON.parse(http.response)["openpgp"]
stop
end
end
end
def test_GET_served_via_couch_not_found
domain = "example.org"
uid = "bananas@" + domain
stub_couch_response(uid, :status => 404) do
start do
params = {:query => {"address" => uid}, :head => {:host => domain}}
get(params) do |http|
assert_equal 404, http.response_header.status
stop
end
end
end
end
def test_GET_served_via_couch_success
domain = "example.org"
uid = "blue@" + domain
stub_couch_response(uid, :body => file_content(:blue_couchdb_result)) do
start do
params = {:query => {"address" => uid}, :head => {:host => domain}}
get(params) do |http|
assert_equal file_content(:blue_nickserver_result), http.response
stop
end
end
end
end
protected
#
# start nickserver
#
def start(timeout = 1)
Timeout::timeout(timeout) do
EM.run do
Nickserver::Server.start
EM.epoll
yield
end
end
rescue Timeout::Error
flunk 'EventMachine was not stopped before the timeout expired'
end
#
# http GET requests to nickserver
#
def get(params, &block)
request(:get, params, &block)
end
#
# http POST requests to nickserver
#
def post(params, &block)
request(:post, params, &block)
end
#
# http request to nickserver
#
# this works because http requests to localhost are not stubbed, but requests to other domains are.
#
def request(method, params)
EventMachine::HttpRequest.new("http://localhost:#{Nickserver::Config.port}/").send(method,params).callback {|http|
# p http.response_header.status
# p http.response_header
# p http.response
yield http
}.errback {|http|
flunk(http.error) if http.error
EM.stop
}
end
#
# stop nickserver
#
def stop
EM.stop
end
end
|