http-test 0.1.1 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +24 -2
- data/lib/http-test.rb +49 -13
- data/lib/http-test/server.rb +29 -37
- data/lib/http-test/server/port.rb +52 -0
- data/lib/http-test/session.rb +32 -0
- data/lib/http-test/version.rb +1 -1
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7576a8a3222da33e7a0bf12deb38ff10349c6c10
|
4
|
+
data.tar.gz: 443c40c55cfbd964ed1c2042d90796429418680a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5ed39001ef88bc2599acf94e4bed1be3679a4179d4b631bb6c96fc93ca0a0516d4670cec6f4fba05179d5d602ad55fce94a8a124706a8d9144d616f2de334130
|
7
|
+
data.tar.gz: 0faeccf5395a928a6f4009ffe3ff91a038fdcbfd3b67d4d0a1e55e601df2ca034665bcb4aa05043b6abc63ac0a1ec0c31575b03c2ffde83d05aa69f61028a178
|
data/README.md
CHANGED
@@ -53,8 +53,26 @@ to start the server in a non-daemonized mode.
|
|
53
53
|
|
54
54
|
**Limitations:**
|
55
55
|
|
56
|
-
-
|
57
|
-
-
|
56
|
+
- test servers are always running locally. The port is determined randomly by http-test.
|
57
|
+
- The command must read the PORT environment value to determine which port to listen on.
|
58
|
+
- When being killed the command must kill all its children. For simple servers this is not a problem; for daemonizing servers or servers that start worker processes you might want to add a shell script which sets up servers correctly. This, for example, is a script which properly deals with a phoenix server:
|
59
|
+
|
60
|
+
#!/bin/bash
|
61
|
+
set -eu
|
62
|
+
|
63
|
+
HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
64
|
+
cd $HERE
|
65
|
+
|
66
|
+
_term() {
|
67
|
+
echo "Caught SIGTERM signal!"
|
68
|
+
kill -TERM "$child" 2>/dev/null
|
69
|
+
}
|
70
|
+
|
71
|
+
trap _term SIGTERM
|
72
|
+
mix phoenix.server &
|
73
|
+
|
74
|
+
child=$!
|
75
|
+
wait "$child"
|
58
76
|
|
59
77
|
## Development
|
60
78
|
|
@@ -62,6 +80,10 @@ After checking out the repo, run `bin/setup` to install dependencies. Then, run
|
|
62
80
|
|
63
81
|
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
64
82
|
|
83
|
+
Some of these tests talk to a remote server at http://jsonplaceholder.typicode.com. To skip these tests run rake with the following command:
|
84
|
+
|
85
|
+
SKIP_REMOTE_TESTS=1 rake
|
86
|
+
|
65
87
|
## Contributing
|
66
88
|
|
67
89
|
Bug reports and pull requests are welcome on GitHub at https://github.com/radiospiel/http-test.
|
data/lib/http-test.rb
CHANGED
@@ -2,32 +2,68 @@ require "test-unit"
|
|
2
2
|
require "forwardable"
|
3
3
|
|
4
4
|
module HttpTest
|
5
|
-
|
5
|
+
def self.start_session(session_parameters)
|
6
|
+
url_base, command = session_parameters.values_at :url_base, :command
|
7
|
+
@session = Session.start! url_base: url_base, command: command
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.stop_session
|
11
|
+
@session = nil
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.url_base
|
15
|
+
return @session.url_base if @session
|
6
16
|
|
7
|
-
def self.url_base(url_base = nil)
|
8
|
-
@url_base = url_base if url_base
|
9
|
-
return @url_base if @url_base
|
10
17
|
STDERR.puts <<-MSG
|
11
18
|
Either define a API endpoint via url_base <url>, or define a command to start a test_server via test_server "command"'
|
12
19
|
MSG
|
13
|
-
|
20
|
+
#STDERR.puts "called from\n\t#{caller[0,6].join("\n\t")}"
|
21
|
+
raise "Missing session definition"
|
14
22
|
end
|
15
23
|
|
16
|
-
|
17
|
-
Server.start!(command)
|
18
|
-
url_base "http://localhost:#{PORT}"
|
19
|
-
end
|
24
|
+
# ---------------------------------------------------------------------------
|
20
25
|
|
21
26
|
module TestUnitAdapter
|
22
|
-
|
27
|
+
module ClassMethods
|
28
|
+
attr_accessor :session_parameters
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.extended(base)
|
32
|
+
base.extend ClassMethods
|
33
|
+
end
|
34
|
+
|
35
|
+
def url_base(url_base)
|
36
|
+
class << self
|
37
|
+
def startup
|
38
|
+
HttpTest.start_session(session_parameters)
|
39
|
+
end
|
40
|
+
|
41
|
+
def shutdown
|
42
|
+
HttpTest.stop_session
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
self.session_parameters = { url_base: url_base }
|
47
|
+
end
|
48
|
+
|
49
|
+
def test_server(command)
|
50
|
+
class << self
|
51
|
+
def startup
|
52
|
+
HttpTest.start_session(session_parameters)
|
53
|
+
end
|
54
|
+
|
55
|
+
def shutdown
|
56
|
+
HttpTest.stop_session
|
57
|
+
end
|
58
|
+
end
|
23
59
|
|
24
|
-
|
25
|
-
|
60
|
+
self.session_parameters = { command: command }
|
61
|
+
end
|
26
62
|
end
|
27
63
|
end
|
28
64
|
|
29
65
|
require_relative "http-test/http_methods"
|
30
|
-
require_relative "http-test/
|
66
|
+
require_relative "http-test/session"
|
31
67
|
|
32
68
|
class HttpTest::TestCase < Test::Unit::TestCase
|
33
69
|
include HttpTest::HttpMethods # include HTTP helper methods, like GET, PUT etc.
|
data/lib/http-test/server.rb
CHANGED
@@ -1,63 +1,55 @@
|
|
1
|
-
|
2
|
-
require "timeout"
|
1
|
+
require_relative "server/port"
|
3
2
|
|
4
3
|
module HttpTest::Server
|
5
4
|
extend self
|
6
5
|
|
7
|
-
|
6
|
+
# Kills the current server process and checks that the port becomes unavailable.
|
7
|
+
def kill!
|
8
|
+
return unless @pid
|
8
9
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
10
|
+
Process.kill("TERM", @pid)
|
11
|
+
Process.wait
|
12
|
+
|
13
|
+
if @port && Port.available?(@port)
|
14
|
+
STDERR.puts "Could not stop server"
|
15
|
+
exit 1
|
14
16
|
end
|
15
17
|
|
16
|
-
|
17
|
-
|
18
|
-
s&.close
|
18
|
+
@port = nil
|
19
|
+
@pid = nil
|
19
20
|
end
|
20
21
|
|
21
|
-
def
|
22
|
-
|
23
|
-
true
|
24
|
-
rescue Errno::ECONNREFUSED, Errno::EHOSTUNREACH, Timeout::Error
|
25
|
-
false
|
22
|
+
def url_base
|
23
|
+
"http://127.0.0.1:#{@port}"
|
26
24
|
end
|
27
25
|
|
28
|
-
def
|
29
|
-
|
30
|
-
return true if available?(PORT)
|
31
|
-
sleep(0.1)
|
32
|
-
end
|
26
|
+
def start!(command)
|
27
|
+
return if @started == command && @port
|
33
28
|
|
34
|
-
|
35
|
-
end
|
29
|
+
kill! if @started
|
36
30
|
|
37
|
-
|
38
|
-
@started ? true : false
|
39
|
-
end
|
31
|
+
started_at = Time.now
|
40
32
|
|
41
|
-
|
42
|
-
return if started?
|
33
|
+
@port = Port.choose
|
43
34
|
|
44
|
-
pid = fork do
|
35
|
+
@pid = fork do
|
45
36
|
# Signal.trap("HUP") { STDERR.puts "Exiting web server"; exit }
|
46
37
|
# # ... do some work ...
|
47
38
|
ENV["RACK_ENV"] = "test"
|
48
|
-
ENV["PORT"] =
|
39
|
+
ENV["PORT"] = @port.to_s
|
49
40
|
|
50
41
|
exec command
|
51
42
|
end
|
52
43
|
|
53
|
-
|
44
|
+
Port.wait(@port)
|
54
45
|
|
55
|
-
|
56
|
-
|
57
|
-
Process.wait
|
58
|
-
end
|
46
|
+
secs = Time.now - started_at
|
47
|
+
STDERR.puts "\n[http-test##{@pid}] test server '#{command}' running on #{url_base} after #{'%.3f secs' % secs}"
|
59
48
|
|
60
|
-
|
61
|
-
@started = true
|
49
|
+
@started = command
|
62
50
|
end
|
63
51
|
end
|
52
|
+
|
53
|
+
at_exit do
|
54
|
+
HttpTest::Server.kill!
|
55
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require "socket"
|
2
|
+
require "timeout"
|
3
|
+
|
4
|
+
# helper methods for port handling ---------------------------------------
|
5
|
+
module HttpTest
|
6
|
+
module Server
|
7
|
+
module Port
|
8
|
+
extend self
|
9
|
+
|
10
|
+
# return an unused port.
|
11
|
+
def choose
|
12
|
+
server = TCPServer.new('127.0.0.1', 0)
|
13
|
+
port = server.addr[1]
|
14
|
+
ensure
|
15
|
+
# don't know if this is really necessary
|
16
|
+
server&.close
|
17
|
+
end
|
18
|
+
|
19
|
+
# is a given port available? This raises ECONNREFUSED or EHOSTUNREACH if not,
|
20
|
+
# and Timeout::Error if we don't know.
|
21
|
+
def available!(port, timeout = 0.1)
|
22
|
+
s = nil
|
23
|
+
Timeout.timeout(timeout) do
|
24
|
+
STDERR.print "."
|
25
|
+
s = TCPSocket.new("127.0.0.1", port)
|
26
|
+
end
|
27
|
+
ensure
|
28
|
+
s&.close
|
29
|
+
end
|
30
|
+
|
31
|
+
# is a given port available? This returns true if so, and false if not or unsure.
|
32
|
+
def available?(port, timeout = 0.1)
|
33
|
+
available!(port, timeout)
|
34
|
+
true
|
35
|
+
rescue Errno::ECONNREFUSED, Errno::EHOSTUNREACH, Timeout::Error
|
36
|
+
false
|
37
|
+
end
|
38
|
+
|
39
|
+
# wait until a port becomes available. Raises either ECONNREFUSED, EHOSTUNREACH,
|
40
|
+
# or Timeout::Error if the port cannot be established.
|
41
|
+
def wait(port, timeout = 10)
|
42
|
+
(timeout / 0.1).to_i.times do
|
43
|
+
return true if available?(port)
|
44
|
+
sleep(0.1)
|
45
|
+
end
|
46
|
+
|
47
|
+
available!(port)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require_relative "server"
|
2
|
+
|
3
|
+
module HttpTest
|
4
|
+
# A session of the test server. Note that one might think that a session would
|
5
|
+
# holds its own test server instance; we do, however, reuse servers between
|
6
|
+
# tests in case multiple test cases use the same test server - which is quite
|
7
|
+
# likely the most common use case.
|
8
|
+
class Session
|
9
|
+
attr_reader :url_base
|
10
|
+
attr_reader :command
|
11
|
+
|
12
|
+
def initialize(url_base: nil, command: nil)
|
13
|
+
@url_base = url_base
|
14
|
+
@command = command
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def start!
|
20
|
+
return unless @command
|
21
|
+
|
22
|
+
Server.start! @command
|
23
|
+
@url_base = Server.url_base
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.start!(url_base: nil, command: nil)
|
27
|
+
session = Session.new url_base: url_base, command: command
|
28
|
+
session.send :start!
|
29
|
+
session
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
data/lib/http-test/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: http-test
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- eno
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-01-
|
11
|
+
date: 2017-01-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: faraday
|
@@ -86,6 +86,8 @@ files:
|
|
86
86
|
- lib/http-test.rb
|
87
87
|
- lib/http-test/http_methods.rb
|
88
88
|
- lib/http-test/server.rb
|
89
|
+
- lib/http-test/server/port.rb
|
90
|
+
- lib/http-test/session.rb
|
89
91
|
- lib/http-test/version.rb
|
90
92
|
homepage:
|
91
93
|
licenses:
|