From 88088251732e36f72e3edf806a5561b569e62c19 Mon Sep 17 00:00:00 2001 From: Magnus Klaar Date: Sat, 24 Dec 2011 00:58:03 +0100 Subject: Add Autobahn test suite for websockets We're using the existing test suite for websocket servers from the Autobahn project to verify that out websockets implementation is sane. A CT test suite and python module wrapping the test suite has been added. The test suite is run when the 'make inttests' target is executed. --- test/autobahn_SUITE.erl | 97 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 test/autobahn_SUITE.erl (limited to 'test/autobahn_SUITE.erl') diff --git a/test/autobahn_SUITE.erl b/test/autobahn_SUITE.erl new file mode 100644 index 0000000..85647d3 --- /dev/null +++ b/test/autobahn_SUITE.erl @@ -0,0 +1,97 @@ +%% Copyright (c) 2011, Magnus Klaar +%% +%% 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(autobahn_SUITE). + +%% This CT suite reuses the websocket server test suite from the Autobahn +%% project. The Autobahn project is a websocket implementation for Python. +%% Given that we don't expect to find the packages and tools to properly +%% set up and run such a test on a system used primarily for Erlang devlopment +%% this test suite is not included in the default 'ct' target in the makefile. + +-include_lib("common_test/include/ct.hrl"). + +-export([all/0, groups/0, init_per_suite/1, end_per_suite/1, + init_per_group/2, end_per_group/2]). %% ct. +-export([run_tests/1]). %% autobahn. + +%% ct. + +all() -> + [{group, autobahn}]. + +groups() -> + BaseTests = [run_tests], + [{autobahn, [], BaseTests}]. + +init_per_suite(Config) -> + application:start(inets), + application:start(cowboy), + %% /tmp must be used as the parent directory for the virtualenv because + %% the directory names used in CT are so long that the interpreter path + %% in the scripts generated by virtualenv get so long that the system + %% refuses to execute them. + EnvPath = "/tmp/cowboy_autobahn_env", + os:putenv("AB_TESTS_ENV", EnvPath), + os:putenv("AB_TESTS_PRIV", ?config(priv_dir, Config)), + BinPath = filename:join(?config(data_dir, Config), "test.py"), + Stdout = os:cmd(BinPath ++ " setup"), + ct:log("~s~n", [Stdout]), + case string:str(Stdout, "AB-TESTS-SETUP-OK") of + 0 -> erlang:error(failed); + _ -> [{env_path, EnvPath},{bin_path,BinPath}|Config] + end. + +end_per_suite(_Config) -> + os:cmd("deactivate"), + application:stop(cowboy), + application:stop(inets), + ok. + +init_per_group(autobahn, Config) -> + Port = 33080, + cowboy:start_listener(autobahn, 100, + cowboy_tcp_transport, [{port, Port}], + cowboy_http_protocol, [{dispatch, init_dispatch()}] + ), + [{port, Port}|Config]. + +end_per_group(Listener, _Config) -> + cowboy:stop_listener(Listener), + ok. + +%% Dispatch configuration. + +init_dispatch() -> + [{[<<"localhost">>], [ + {[<<"echo">>], websocket_echo_handler, []}]}]. + +%% autobahn cases + +run_tests(Config) -> + PrivDir = ?config(priv_dir, Config), + IndexFile = filename:join([PrivDir, "reports", "servers", "index.html"]), + ct:log("

Full Test Results Report

~n", [IndexFile]), + BinPath = ?config(bin_path, Config), + Stdout = os:cmd(BinPath ++ " test"), + ct:log("~s~n", [Stdout]), + case string:str(Stdout, "AB-TESTS-TEST-OK") of + 0 -> erlang:error(failed); + _ -> ok + end, + {ok, IndexHTML} = file:read_file(IndexFile), + case binary:match(IndexHTML, <<"Fail">>) of + {_, _} -> erlang:error(failed); + nomatch -> ok + end. -- cgit v1.2.3