mirror of
https://github.com/ninenines/cowboy.git
synced 2025-07-14 12:20:24 +00:00
Add a PropEr test for cowboy_dispatcher:split_host/1
Mostly thanks to Magnus Klaar as it took me a while to figure out how PropEr tests had to be written.
This commit is contained in:
parent
503a0c7662
commit
e5d4c1f22f
4 changed files with 109 additions and 2 deletions
2
Makefile
2
Makefile
|
@ -19,7 +19,7 @@ clean:
|
|||
tests: clean app eunit ct
|
||||
|
||||
eunit:
|
||||
@$(REBAR) eunit
|
||||
@$(REBAR) eunit skip_deps=true
|
||||
|
||||
ct:
|
||||
@$(REBAR) ct
|
||||
|
|
|
@ -1,7 +1,9 @@
|
|||
{cover_enabled, true}.
|
||||
{deps, [
|
||||
{quoted, "1.0.0",
|
||||
{git, "git://github.com/klaar/quoted.erl.git", {tag, "1.0.1"}}}
|
||||
{git, "git://github.com/klaar/quoted.erl.git", {tag, "1.0.1"}}},
|
||||
{proper, "1.0",
|
||||
{git, "git://github.com/manopapad/proper.git", {tag, "v1.0"}}}
|
||||
]}.
|
||||
{erl_opts, [
|
||||
%% bin_opt_info,
|
||||
|
|
68
test/dispatcher_prop.erl
Normal file
68
test/dispatcher_prop.erl
Normal file
|
@ -0,0 +1,68 @@
|
|||
%% Copyright (c) 2011, Magnus Klaar <magnus.klaar@gmail.com>
|
||||
%% Copyright (c) 2011, Loïc Hoguin <essen@dev-extend.eu>
|
||||
%%
|
||||
%% Permission to use, copy, modify, and/or distribute this software for any
|
||||
%% purpose with or without fee is hereby granted, provided that the above
|
||||
%% copyright notice and this permission notice appear in all copies.
|
||||
%%
|
||||
%% THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
%% WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
%% MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
%% ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
%% WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
%% ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
%% OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
|
||||
-module(dispatcher_prop).
|
||||
-include_lib("proper/include/proper.hrl").
|
||||
|
||||
%% Generators.
|
||||
|
||||
hostname_head_char() ->
|
||||
oneof([choose($a, $z), choose($A, $Z), choose($0, $9)]).
|
||||
|
||||
hostname_char() ->
|
||||
oneof([choose($a, $z), choose($A, $Z), choose($0, $9), $-]).
|
||||
|
||||
hostname_label() ->
|
||||
?SUCHTHAT(Label, [hostname_head_char()|list(hostname_char())],
|
||||
length(Label) < 64).
|
||||
|
||||
hostname() ->
|
||||
?SUCHTHAT(Hostname,
|
||||
?LET(Labels, list(hostname_label()), string:join(Labels, ".")),
|
||||
length(Hostname) > 0 andalso length(Hostname) =< 255).
|
||||
|
||||
port_number() ->
|
||||
choose(1, 16#ffff).
|
||||
|
||||
port_str() ->
|
||||
oneof(["", ?LET(Port, port_number(), ":" ++ integer_to_list(Port))]).
|
||||
|
||||
server() ->
|
||||
?LET({Hostname, PortStr}, {hostname(), port_str()},
|
||||
list_to_binary(Hostname ++ PortStr)).
|
||||
|
||||
%% Properties.
|
||||
|
||||
prop_split_host_symmetric() ->
|
||||
?FORALL(Server, server(),
|
||||
begin case cowboy_dispatcher:split_host(Server) of
|
||||
{Tokens, RawHost, undefined} ->
|
||||
(Server == RawHost) and (Server == binary_join(Tokens, "."));
|
||||
{Tokens, RawHost, Port} ->
|
||||
PortBin = (list_to_binary(":" ++ integer_to_list(Port))),
|
||||
(Server == << RawHost/binary, PortBin/binary >>)
|
||||
and (Server == << (binary_join(Tokens, "."))/binary,
|
||||
PortBin/binary >>)
|
||||
end end).
|
||||
|
||||
%% Internal.
|
||||
|
||||
%% Contributed by MononcQc on #erlounge.
|
||||
binary_join(Flowers, Leaf) ->
|
||||
case Flowers of
|
||||
[] -> <<>>;
|
||||
[Petal|Pot] -> iolist_to_binary(
|
||||
[Petal | [[Leaf | Pollen] || Pollen <- Pot]])
|
||||
end.
|
37
test/proper_SUITE.erl
Normal file
37
test/proper_SUITE.erl
Normal file
|
@ -0,0 +1,37 @@
|
|||
%% Copyright (c) 2011, Loïc Hoguin <essen@dev-extend.eu>
|
||||
%%
|
||||
%% Permission to use, copy, modify, and/or distribute this software for any
|
||||
%% purpose with or without fee is hereby granted, provided that the above
|
||||
%% copyright notice and this permission notice appear in all copies.
|
||||
%%
|
||||
%% THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
%% WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
%% MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
%% ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
%% WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
%% ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
%% OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
|
||||
-module(proper_SUITE).
|
||||
|
||||
-include_lib("common_test/include/ct.hrl").
|
||||
|
||||
-export([all/0, groups/0]). %% ct.
|
||||
-export([dispatcher_split_host/1]). %% cowboy_dispatcher.
|
||||
|
||||
%% ct.
|
||||
|
||||
all() ->
|
||||
[{group, dispatcher}].
|
||||
|
||||
groups() ->
|
||||
[{dispatcher, [], [dispatcher_split_host]}].
|
||||
|
||||
%% cowboy_dispatcher.
|
||||
|
||||
dispatcher_split_host(_Config) ->
|
||||
true = proper:quickcheck(dispatcher_prop:prop_split_host_symmetric(),
|
||||
[{on_output, fun(Format, Data) ->
|
||||
io:format(user, Format, Data), %% Console.
|
||||
io:format(Format, Data) %% Logs.
|
||||
end}]).
|
Loading…
Add table
Add a link
Reference in a new issue