diff options
Diffstat (limited to 'lib/syntax_tools/test/syntax_tools_SUITE.erl')
-rw-r--r-- | lib/syntax_tools/test/syntax_tools_SUITE.erl | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/lib/syntax_tools/test/syntax_tools_SUITE.erl b/lib/syntax_tools/test/syntax_tools_SUITE.erl new file mode 100644 index 0000000000..16f794683b --- /dev/null +++ b/lib/syntax_tools/test/syntax_tools_SUITE.erl @@ -0,0 +1,82 @@ +%% ``The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved via the world wide web at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% The Initial Developer of the Original Code is Ericsson Utvecklings AB. +%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings +%% AB. All Rights Reserved.'' +%% +%% $Id$ +%% +-module(syntax_tools_SUITE). + +-include("test_server.hrl"). + +%% Test server specific exports +-export([all/1]). + +%% Test cases +-export([smoke_test/1]). + +all(suite) -> + [smoke_test]. + +%% Read and parse all source in the OTP release. +smoke_test(Config) when is_list(Config) -> + ?line Dog = ?t:timetrap(?t:minutes(12)), + ?line Wc = filename:join([code:lib_dir(),"*","src","*.erl"]), + ?line Fs = filelib:wildcard(Wc), + ?line io:format("~p files\n", [length(Fs)]), + ?line case p_run(fun smoke_test_file/1, Fs) of + 0 -> ok; + N -> ?line ?t:fail({N,errors}) + end, + ?line ?t:timetrap_cancel(Dog). + +smoke_test_file(File) -> + case epp_dodger:parse_file(File) of + {ok,Forms} -> + [print_error_markers(F, File) || F <- Forms], + ok; + {error,Reason} -> + io:format("~s: ~p\n", [File,Reason]), + error + end. + +print_error_markers(F, File) -> + case erl_syntax:type(F) of + error_marker -> + {L,M,Info} = erl_syntax:error_marker_info(F), + io:format("~s:~p: ~s", [File,L,M:format_error(Info)]); + _ -> + ok + end. + + +p_run(Test, List) -> + N = erlang:system_info(schedulers), + p_run_loop(Test, List, N, [], 0). + +p_run_loop(_, [], _, [], Errors) -> + Errors; +p_run_loop(Test, [H|T], N, Refs, Errors) when length(Refs) < N -> + {_,Ref} = erlang:spawn_monitor(fun() -> exit(Test(H)) end), + p_run_loop(Test, T, N, [Ref|Refs], Errors); +p_run_loop(Test, List, N, Refs0, Errors0) -> + receive + {'DOWN',Ref,process,_,Res} -> + Errors = case Res of + ok -> Errors0; + error -> Errors0+1 + end, + Refs = Refs0 -- [Ref], + p_run_loop(Test, List, N, Refs, Errors) + end. + |