diff options
author | Loïc Hoguin <[email protected]> | 2011-07-26 10:46:06 +0200 |
---|---|---|
committer | Loïc Hoguin <[email protected]> | 2011-07-26 10:46:06 +0200 |
commit | e5d4c1f22f29d2ab9e7fb8b5bdd298d02ffaec1e (patch) | |
tree | 5be8603b0da98114b62a2781bf9b0ddd1fb356cd /test | |
parent | 503a0c76628236ed14a22802c2ebd523148ab0e3 (diff) | |
download | cowboy-e5d4c1f22f29d2ab9e7fb8b5bdd298d02ffaec1e.tar.gz cowboy-e5d4c1f22f29d2ab9e7fb8b5bdd298d02ffaec1e.tar.bz2 cowboy-e5d4c1f22f29d2ab9e7fb8b5bdd298d02ffaec1e.zip |
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.
Diffstat (limited to 'test')
-rw-r--r-- | test/dispatcher_prop.erl | 68 | ||||
-rw-r--r-- | test/proper_SUITE.erl | 37 |
2 files changed, 105 insertions, 0 deletions
diff --git a/test/dispatcher_prop.erl b/test/dispatcher_prop.erl new file mode 100644 index 0000000..b6a1c92 --- /dev/null +++ b/test/dispatcher_prop.erl @@ -0,0 +1,68 @@ +%% Copyright (c) 2011, Magnus Klaar <[email protected]> +%% Copyright (c) 2011, Loïc Hoguin <[email protected]> +%% +%% 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. diff --git a/test/proper_SUITE.erl b/test/proper_SUITE.erl new file mode 100644 index 0000000..440aa5f --- /dev/null +++ b/test/proper_SUITE.erl @@ -0,0 +1,37 @@ +%% Copyright (c) 2011, Loïc Hoguin <[email protected]> +%% +%% 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}]). |