From 1057ad126a89c5823f40e30763a6b1dab3388200 Mon Sep 17 00:00:00 2001
From: Lars Thorsen <lars@erlang.org>
Date: Fri, 30 Sep 2016 09:20:58 +0200
Subject: [megaco] Use the test_server app and appup tests

---
 lib/megaco/test/megaco_app_test.erl   | 308 ++-------------------
 lib/megaco/test/megaco_appup_test.erl | 498 +---------------------------------
 2 files changed, 33 insertions(+), 773 deletions(-)

(limited to 'lib')

diff --git a/lib/megaco/test/megaco_app_test.erl b/lib/megaco/test/megaco_app_test.erl
index 346a123c66..981d93f5dd 100644
--- a/lib/megaco/test/megaco_app_test.erl
+++ b/lib/megaco/test/megaco_app_test.erl
@@ -16,8 +16,6 @@
 %% limitations under the License.
 %%
 %% %CopyrightEnd%
-%%
-
 %%
 %%----------------------------------------------------------------------
 %% Purpose: Verify the application specifics of the Megaco application
@@ -26,296 +24,26 @@
 
 -compile(export_all).
 
--include("megaco_test_lib.hrl").
-
-
-t()     -> megaco_test_lib:t(?MODULE).
-t(Case) -> megaco_test_lib:t({?MODULE, Case}).
-
-
-%% Test server callbacks
-init_per_testcase(undef_funcs = Case, Config) ->
-    NewConfig = [{tc_timeout, ?MINUTES(10)} | Config], 
-    megaco_test_lib:init_per_testcase(Case, NewConfig);
-init_per_testcase(Case, Config) ->
-    megaco_test_lib:init_per_testcase(Case, Config).
-
-end_per_testcase(Case, Config) ->
-    megaco_test_lib:end_per_testcase(Case, Config).
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+-include_lib("common_test/include/ct.hrl").
 
+%%--------------------------------------------------------------------
+%% Common Test interface functions -----------------------------------
+%%--------------------------------------------------------------------
 all() -> 
     [
-     fields, 
-     modules, 
-     exportall, 
-     app_depend,
-     undef_funcs
+     app, 
+     appup
     ].
 
-groups() -> 
-    [].
-
-init_per_group(_GroupName, Config) ->
-    Config.
-
-end_per_group(_GroupName, Config) ->
-    Config.
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-init_per_suite(suite) -> [];
-init_per_suite(doc) -> [];
-init_per_suite(Config) when is_list(Config) ->
-    case is_app(megaco) of
-	{ok, AppFile} ->
-	    io:format("AppFile: ~n~p~n", [AppFile]),
-	    case megaco_flex_scanner:is_enabled() of
-		true ->
-		    case megaco_flex_scanner:is_reentrant_enabled() of
-			true ->
-			    io:format("~nMegaco reentrant flex scanner enabled~n~n", []);
-			false ->
-			    io:format("~nMegaco non-reentrant flex scanner enabled~n~n", [])
-		    end;
-		false ->
-		    io:format("~nMegaco flex scanner disabled~n~n", [])
-	    end,
-	    megaco:print_version_info(),
-	    [{app_file, AppFile}|Config];
-	{error, Reason} ->
-	    fail(Reason)
-    end.
-
-is_app(App) ->
-    LibDir = code:lib_dir(App),
-    File = filename:join([LibDir, "ebin", atom_to_list(App) ++ ".app"]),
-    case file:consult(File) of
-	{ok, [{application, App, AppFile}]} ->
-	    {ok, AppFile};
-	{error, {LineNo, Mod, Code}} ->
-	    IoList = lists:concat([File, ":", LineNo, ": ",
-				   Mod:format_error(Code)]),
-	    {error, list_to_atom(lists:flatten(IoList))};
-	Error ->
-	    {error, {invalid_format, Error}}
-    end.
-
-
-end_per_suite(suite) -> [];
-end_per_suite(doc) -> [];
-end_per_suite(Config) when is_list(Config) ->
-    Config.
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-fields(suite) ->
-    [];
-fields(doc) ->
-    [];
-fields(Config) when is_list(Config) ->
-    AppFile = key1search(app_file, Config),
-    Fields  = [vsn, description, modules, registered, applications],
-    case check_fields(Fields, AppFile, []) of
-	[] ->
-	    ok;
-	Missing ->
-	    fail({missing_fields, Missing})
-    end.
-
-check_fields([], _AppFile, Missing) ->
-    Missing;
-check_fields([Field|Fields], AppFile, Missing) ->
-    check_fields(Fields, AppFile, check_field(Field, AppFile, Missing)).
-
-check_field(Name, AppFile, Missing) ->
-    io:format("checking field: ~p~n", [Name]),
-    case lists:keymember(Name, 1, AppFile) of
-	true ->
-	    Missing;
-	false ->
-	    [Name|Missing]
-    end.
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-modules(suite) ->
-    [];
-modules(doc) ->
-    [];
-modules(Config) when is_list(Config) ->
-    AppFile  = key1search(app_file, Config),
-    Mods     = key1search(modules, AppFile),
-    EbinList = get_ebin_mods(megaco),
-    case missing_modules(Mods, EbinList, []) of
-	[] ->
-	    ok;
-	Missing ->
-	    throw({error, {missing_modules, Missing}})
-    end,
-    case extra_modules(Mods, EbinList, []) of
-	[] ->
-	    ok;
-	Extra ->
-	    throw({error, {extra_modules, Extra}})
-    end,
-    {ok, Mods}.
-	    
-get_ebin_mods(App) ->
-    LibDir  = code:lib_dir(App),
-    EbinDir = filename:join([LibDir,"ebin"]),
-    {ok, Files0} = file:list_dir(EbinDir),
-    Files1 = [lists:reverse(File) || File <- Files0],
-    [list_to_atom(lists:reverse(Name)) || [$m,$a,$e,$b,$.|Name] <- Files1].
-    
-
-missing_modules([], _Ebins, Missing) ->
-    Missing;
-missing_modules([Mod|Mods], Ebins, Missing) ->
-    case lists:member(Mod, Ebins) of
-	true ->
-	    missing_modules(Mods, Ebins, Missing);
-	false ->
-	    io:format("missing module: ~p~n", [Mod]),
-	    missing_modules(Mods, Ebins, [Mod|Missing])
-    end.
-
-
-extra_modules(_Mods, [], Extra) ->
-    Extra;
-extra_modules(Mods, [Mod|Ebins], Extra) ->
-    case lists:member(Mod, Mods) of
-	true ->
-	    extra_modules(Mods, Ebins, Extra);
-	false ->
-	    io:format("supefluous module: ~p~n", [Mod]),
-	    extra_modules(Mods, Ebins, [Mod|Extra])
-    end.
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-
-exportall(suite) ->
-    [];
-exportall(doc) ->
-    [];
-exportall(Config) when is_list(Config) ->
-    AppFile = key1search(app_file, Config),
-    Mods    = key1search(modules, AppFile),
-    check_export_all(Mods).
-
-
-check_export_all([]) ->
-    ok;
-check_export_all([Mod|Mods]) ->
-    case (catch apply(Mod, module_info, [compile])) of
-	{'EXIT', {undef, _}} ->
-	    check_export_all(Mods);
-	O ->
-            case lists:keysearch(options, 1, O) of
-                false ->
-                    check_export_all(Mods);
-                {value, {options, List}} ->
-                    case lists:member(export_all, List) of
-                        true ->
-			    throw({error, {export_all, Mod}});
-			false ->
-			    check_export_all(Mods)
-                    end
-            end
-    end.
-
-	    
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-app_depend(suite) ->
-    [];
-app_depend(doc) ->
-    [];
-app_depend(Config) when is_list(Config) ->
-    AppFile = key1search(app_file, Config),
-    Apps    = key1search(applications, AppFile),
-    check_apps(Apps).
-
-
-check_apps([]) ->
-    ok;
-check_apps([App|Apps]) ->
-    case is_app(App) of
-	{ok, _} ->
-	    check_apps(Apps);
-	Error ->
-	    throw({error, {missing_app, {App, Error}}})
-    end.
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-undef_funcs(suite) ->
-    [];
-undef_funcs(doc) ->
-    [];
-undef_funcs(Config) when is_list(Config) ->
-    App            = megaco,
-    AppFile        = key1search(app_file, Config),
-    Mods           = key1search(modules, AppFile),
-    Root           = code:root_dir(),
-    LibDir         = code:lib_dir(App),
-    EbinDir        = filename:join([LibDir,"ebin"]),
-    XRefTestName   = undef_funcs_make_name(App, xref_test_name),
-    {ok, XRef}     = xref:start(XRefTestName),
-    ok             = xref:set_default(XRef,
-                                      [{verbose,false},{warnings,false}]),
-    XRefName       = undef_funcs_make_name(App, xref_name),
-    {ok, XRefName} = xref:add_release(XRef, Root, {name,XRefName}),
-    {ok, App}      = xref:replace_application(XRef, App, EbinDir),
-    {ok, Undefs}   = xref:analyze(XRef, undefined_function_calls),
-    xref:stop(XRef),
-    analyze_undefined_function_calls(Undefs, Mods, []).
-
-analyze_undefined_function_calls([], _, []) ->
-    ok;
-analyze_undefined_function_calls([], _, AppUndefs) ->
-    exit({suite_failed, {undefined_function_calls, AppUndefs}});
-analyze_undefined_function_calls([{{Mod, _F, _A}, _C} = AppUndef|Undefs],
-                                 AppModules, AppUndefs) ->
-    %% Check that this module is our's
-    case lists:member(Mod,AppModules) of
-        true ->
-            {Calling,Called} = AppUndef,
-            {Mod1,Func1,Ar1} = Calling,
-            {Mod2,Func2,Ar2} = Called,
-            io:format("undefined function call: "
-                      "~n   ~w:~w/~w calls ~w:~w/~w~n",
-                      [Mod1,Func1,Ar1,Mod2,Func2,Ar2]),
-            analyze_undefined_function_calls(Undefs, AppModules,
-                                             [AppUndef|AppUndefs]);
-        false ->
-            io:format("dropping ~p~n", [Mod]),
-            analyze_undefined_function_calls(Undefs, AppModules, AppUndefs)
-    end.
-
-%% This function is used simply to avoid cut-and-paste errors later...
-undef_funcs_make_name(App, PostFix) ->
-    list_to_atom(atom_to_list(App) ++ "_" ++ atom_to_list(PostFix)).
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-
-fail(Reason) ->
-    exit({suite_failed, Reason}).
-
-key1search(Key, L) ->
-    case lists:keysearch(Key, 1, L) of
-	undefined ->
-	    fail({not_found, Key, L});
-	{value, {Key, Value}} ->
-	    Value
-    end.
+%%--------------------------------------------------------------------
+%% Test Cases --------------------------------------------------------
+%%--------------------------------------------------------------------
+app() ->
+    [{doc, "Test that the megaco app file is ok"}].
+app(Config) when is_list(Config) ->
+    ok = test_server:app_test(megaco).
+%%--------------------------------------------------------------------
+appup() ->
+    [{doc, "Test that the megaco appup file is ok"}].
+appup(Config) when is_list(Config) ->
+    ok = test_server:appup_test(megaco).
diff --git a/lib/megaco/test/megaco_appup_test.erl b/lib/megaco/test/megaco_appup_test.erl
index 325e7a6096..8dc3ad51a0 100644
--- a/lib/megaco/test/megaco_appup_test.erl
+++ b/lib/megaco/test/megaco_appup_test.erl
@@ -16,8 +16,6 @@
 %% limitations under the License.
 %% 
 %% %CopyrightEnd%
-%%
-
 %%
 %%----------------------------------------------------------------------
 %% Purpose: Verify the application specifics of the Megaco application
@@ -27,26 +25,18 @@
 -compile(export_all).
 -compile({no_auto_import,[error/1]}).
 
+-include_lib("common_test/include/ct.hrl").
 -include("megaco_test_lib.hrl").
 
--define(APPLICATION, megaco).
-
-t()     -> megaco_test_lib:t(?MODULE).
-t(Case) -> megaco_test_lib:t({?MODULE, Case}).
-
-
-%% Test server callbacks
-init_per_testcase(Case, Config) ->
-    megaco_test_lib:init_per_testcase(Case, Config).
-
-end_per_testcase(Case, Config) ->
-    megaco_test_lib:end_per_testcase(Case, Config).
-
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
 all() -> 
-    [appup].
+    Cases = 
+	[
+	 appup_file
+	],
+    Cases.
 
 groups() -> 
     [].
@@ -64,16 +54,9 @@ end_per_group(_GroupName, Config) ->
 init_per_suite(suite) -> [];
 init_per_suite(doc) -> [];
 init_per_suite(Config) when is_list(Config) ->
-    AppFile   = file_name(?APPLICATION, ".app"),
-    AppupFile = file_name(?APPLICATION, ".appup"),
-    [{app_file, AppFile}, {appup_file, AppupFile}|Config].
+    Config.
     
 
-file_name(App, Ext) ->
-    LibDir = code:lib_dir(App),
-    filename:join([LibDir, "ebin", atom_to_list(App) ++ Ext]).
-
-
 end_per_suite(suite) -> [];
 end_per_suite(doc) -> [];
 end_per_suite(Config) when is_list(Config) ->
@@ -82,468 +65,17 @@ end_per_suite(Config) when is_list(Config) ->
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
-appup(suite) ->
-    [];
-appup(doc) ->
-    "perform a simple check of the appup file";
-appup(Config) when is_list(Config) ->
-    AppupFile = key1search(appup_file, Config),
-    AppFile   = key1search(app_file, Config),
-    Modules   = modules(AppFile),
-    check_appup(AppupFile, Modules).
-
-modules(File) ->
-    case file:consult(File) of
-        {ok, [{application,megaco,Info}]} ->
-            case lists:keysearch(modules,1,Info) of
-                {value, {modules, Modules}} ->
-                    Modules;
-                false ->
-                    fail({bad_appinfo, Info})
-            end;
-        Error ->
-            fail({bad_appfile, Error})
-    end.
-
-    
-check_appup(AppupFile, Modules) ->
-    case file:consult(AppupFile) of
-	{ok, [{V, UpFrom, DownTo}]} ->
-	    check_appup(V, UpFrom, DownTo, Modules);
-	Else ->
-	    fail({bad_appupfile, Else})
-    end.
-
-
-check_appup(V, UpFrom, DownTo, Modules) ->
-    check_version(V),
-    check_depends(up,   UpFrom, Modules),
-    check_depends(down, DownTo, Modules),
-    check_module_subset(UpFrom),
-    check_module_subset(DownTo),
-    ok.
-
-
-check_depends(_, [], _) ->
-    ok;
-check_depends(UpDown, [Dep|Deps], Modules) ->
-    check_depend(UpDown, Dep, Modules),
-    check_depends(UpDown, Deps, Modules).
-
-
-check_depend(up = UpDown, {add_application, ?APPLICATION} = Instr, Modules) ->
-     d("check_instructions(~w) -> entry with"
-       "~n   Instruction: ~p"
-       "~n   Modules:     ~p", [UpDown, Instr, Modules]),
-     ok;
-check_depend(down = UpDown, {remove_application, ?APPLICATION} = Instr, 
-	     Modules) ->
-     d("check_instructions(~w) -> entry with"
-       "~n   Instruction: ~p"
-       "~n   Modules:     ~p", [UpDown, Instr, Modules]),
-     ok;
-check_depend(UpDown, {V, Instructions}, Modules) ->
-    d("check_instructions(~w) -> entry with"
-      "~n   V:       ~p"
-      "~n   Modules: ~p", [UpDown, V, Modules]),
-    check_version(V),
-    case check_instructions(UpDown, 
-			    Instructions, Instructions, [], [], Modules) of
-	{_Good, []} ->
-	    ok;
-	{_, Bad} ->
-	    fail({bad_instructions, Bad, UpDown})
-    end.
-
-
-check_instructions(_, [], _, Good, Bad, _) ->
-    {lists:reverse(Good), lists:reverse(Bad)};
-check_instructions(UpDown, [Instr|Instrs], AllInstr, Good, Bad, Modules) ->
-    d("check_instructions(~w) -> entry with"
-      "~n   Instr: ~p", [UpDown,Instr]),
-    case (catch check_instruction(UpDown, Instr, AllInstr, Modules)) of
-        ok ->
-            check_instructions(UpDown, Instrs, AllInstr, 
-			       [Instr|Good], Bad, Modules);
-        {error, Reason} ->
-	    d("check_instructions(~w) -> bad instruction: "
-	      "~n   Reason: ~p", [UpDown,Reason]),
-            check_instructions(UpDown, Instrs, AllInstr, Good, 
-                               [{Instr, Reason}|Bad], Modules)
-    end.
-
-%% A new module is added
-check_instruction(up, {add_module, Module}, _, Modules) 
-  when is_atom(Module) ->
-    d("check_instruction -> entry when up-add_module instruction with"
-      "~n   Module: ~p", [Module]),
-    check_module(Module, Modules);
-
-%% An old module is re-added
-check_instruction(down, {add_module, Module}, _, Modules) 
-  when is_atom(Module) ->
-    d("check_instruction -> entry when down-add_module instruction with"
-      "~n   Module: ~p", [Module]),
-    case (catch check_module(Module, Modules)) of
-	{error, {unknown_module, Module, Modules}} ->
-	    ok;
-	ok ->
-	    error({existing_readded_module, Module})
-    end;
-
-%% Removing a module on upgrade: 
-%% - the module has been removed from the app-file.
-%% - check that no module depends on this (removed) module
-check_instruction(up, {remove, {Module, Pre, Post}}, _, Modules) 
-  when is_atom(Module) andalso is_atom(Pre) andalso is_atom(Post) ->
-    d("check_instruction -> entry when up-remove instruction with"
-      "~n   Module: ~p"
-      "~n   Pre:    ~p"
-      "~n   Post:   ~p", [Module, Pre, Post]),
-    case (catch check_module(Module, Modules)) of
-	{error, {unknown_module, Module, Modules}} ->
-	    check_purge(Pre),
-	    check_purge(Post);
-	ok ->
-	    error({existing_removed_module, Module})
-    end;
-
-%% Removing a module on downgrade: the module exist
-%% in the app-file.
-check_instruction(down, {remove, {Module, Pre, Post}}, AllInstr, Modules) 
-  when is_atom(Module) andalso is_atom(Pre) andalso is_atom(Post) ->
-    d("check_instruction -> entry when down-remove instruction with"
-      "~n   Module: ~p"
-      "~n   Pre:    ~p"
-      "~n   Post:   ~p", [Module, Pre, Post]),
-    case (catch check_module(Module, Modules)) of
-	ok ->
-	    check_purge(Pre),
-	    check_purge(Post),
-	    check_no_remove_depends(Module, AllInstr);
-	{error, {unknown_module, Module, Modules}} ->
-	    error({nonexisting_removed_module, Module})
-    end;
-
-check_instruction(_, {load_module, Module, Pre, Post, Depend}, 
-		  AllInstr, Modules) 
-  when is_atom(Module) andalso is_atom(Pre) andalso is_atom(Post) andalso is_list(Depend) ->
-    d("check_instruction -> entry when load_module instruction with"
-      "~n   Module: ~p"
-      "~n   Pre:    ~p"
-      "~n   Post:   ~p"
-      "~n   Depend: ~p", [Module, Pre, Post, Depend]),
-    check_module(Module, Modules),
-    check_module_depend(Module, Depend, Modules),
-    check_module_depend(Module, Depend, updated_modules(AllInstr, [])),
-    check_purge(Pre),
-    check_purge(Post);
-
-check_instruction(_, {update, Module, Change, Pre, Post, Depend}, 
-		  AllInstr, Modules) 
-  when is_atom(Module) andalso is_atom(Pre) andalso is_atom(Post) andalso is_list(Depend) ->
-    d("check_instruction -> entry when update instruction with"
-      "~n   Module: ~p"
-      "~n   Change: ~p"
-      "~n   Pre:    ~p"
-      "~n   Post:   ~p"
-      "~n   Depend: ~p", [Module, Change, Pre, Post, Depend]),
-    check_module(Module, Modules),
-    check_module_depend(Module, Depend, Modules),
-    check_module_depend(Module, Depend, updated_modules(AllInstr, [])),
-    check_change(Change),
-    check_purge(Pre),
-    check_purge(Post);
-
-check_instruction(_, {update, Module, supervisor}, _, Modules) 
-  when is_atom(Module) ->
-    check_module(Module, Modules);
-
-check_instruction(_, {apply, {Module, Function, Args}}, _, Modules)
-   when is_atom(Module) andalso is_atom(Function) andalso is_list(Args) ->
-     d("check_instruction -> entry when down-apply instruction with"
-       "~n   Module:   ~p"
-       "~n   Function: ~p"
-       "~n   Args:     ~p", [Module, Function, Args]),
-     check_module(Module, Modules),
-     check_apply(Module, Function, Args);
-
-check_instruction(_, {restart_application, ?APPLICATION}, _AllInstr, _Modules) ->
-    ok;
-
-check_instruction(_, Instr, _AllInstr, _Modules) ->
-    d("check_instruction -> entry when unknown instruction with"
-      "~n   Instr: ~p", [Instr]),
-    error({error, {unknown_instruction, Instr}}).
-
-
-%% If Module X depends on Module Y, then module Y must have an update
-%% instruction of some sort (otherwise the depend is faulty).
-updated_modules([], Modules) ->
-    d("update_modules -> entry when done with"
-      "~n   Modules: ~p", [Modules]),
-    Modules;
-updated_modules([Instr|Instrs], Modules) ->
-    d("update_modules -> entry with"
-      "~n   Instr:   ~p"
-      "~n   Modules: ~p", [Instr,Modules]),
-    Module = instruction_module(Instr),
-    d("update_modules -> Module: ~p", [Module]),
-    updated_modules(Instrs, [Module|Modules]).
-    
-instruction_module({add_module, Module}) ->
-    Module;
-instruction_module({remove, {Module, _, _}}) ->
-    Module;
-instruction_module({load_module, Module, _, _, _}) ->
-    Module;
-instruction_module({update, Module, _, _, _, _}) ->
-    Module;
-instruction_module({apply, {Module, _, _}}) ->
-     Module;
-instruction_module(Instr) ->
-    d("instruction_module -> entry when unknown instruction with"
-      "~n   Instr: ~p", [Instr]),
-    error({error, {unknown_instruction, Instr}}).
-
-    
-%% Check that the modules handled in an instruction set for version X
-%% is a subset of the instruction set for version X-1.
-check_module_subset(Instructions) ->
-    %% io:format("check_module_subset -> "
-    %% 	      "~n   Instructions: ~p"
-    %% 	      "~n", [Instructions]),
-    do_check_module_subset(modules_of(Instructions)).
- 
-do_check_module_subset([]) ->
-    ok;
-do_check_module_subset([_]) ->
-    ok;
-do_check_module_subset([{_V1, Mods1}|T]) ->
-    %% io:format("do_check_module_subset -> "
-    %% 	      "~n   V1:    ~p"
-    %% 	      "~n   Mods1: ~p"
-    %% 	      "~n   T:     ~p"
-    %% 	      "~n", [_V1, Mods1, T]),
-    {V2, Mods2} = hd(T),
-    %% Check that the modules in V1 is a subset of V2
-    case do_check_module_subset2(Mods1, Mods2) of
-        ok ->
-            do_check_module_subset(T);
-        {error, Modules} ->
-            fail({subset_missing_instructions, V2, Modules})
-    end.
- 
-do_check_module_subset2(Mods1, Mods2) ->
-    do_check_module_subset2(Mods1, Mods2, []).
- 
-do_check_module_subset2([], _, []) ->
-    ok;
-do_check_module_subset2([], _, Acc) ->
-    {error, lists:reverse(Acc)};
-do_check_module_subset2([Mod|Mods], Mods2, Acc) ->
-    case lists:member(Mod, Mods2) of
-        true ->
-            do_check_module_subset2(Mods, Mods2, Acc);
-        false ->
-            do_check_module_subset2(Mods, Mods2, [Mod|Acc])
-    end.
-     
- 
-modules_of(Instructions) ->
-    modules_of(Instructions, []).
- 
-modules_of([], Acc) ->
-    lists:reverse(Acc);
-modules_of([{V,Instructions}|T], Acc) ->
-    %% io:format("modules_of -> "
-    %% 	      "~n   V:            ~p"
-    %% 	      "~n   Instructions: ~p"
-    %% 	      "~n", [V, Instructions]),
-    case modules_of2(Instructions, []) of
-	Mods when is_list(Mods) -> 
-	    %% io:format("modules_of -> "
-	    %% 	      "~n   Mods: ~p"
-	    %% 	      "~n", [Mods]),
-	    modules_of(T, [{V, Mods}|Acc]);
-	skip ->
-	    %% io:format("modules_of -> skip"
-	    %% 	      "~n", []),
-	    modules_of(T, Acc)
-    end.
- 
-modules_of2([], Acc) ->
-    lists:reverse(Acc);
-modules_of2([Instr|Instructions], Acc) ->
-    case module_of(Instr) of
-        {value, Mod} ->
-            modules_of2(Instructions, [Mod|Acc]);
-	skip ->
-	    skip;
-        false ->
-            modules_of2(Instructions, Acc)
-    end.
- 
-module_of({add_module, Module}) ->
-    {value, Module};
-module_of({remove, {Module, _Pre, _Post}}) ->
-    {value, Module};
-module_of({load_module, Module, _Pre, _Post, _Depend}) ->
-    {value, Module};
-module_of({update, Module, _Change, _Pre, _Post, _Depend}) ->
-    {value, Module};
-module_of({restart_application, _App}) ->
-    skip;
-module_of(_) ->
-    false.
- 
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-%% The version is a string consting of numbers separated by dots: "."
-%% Example: "3.3.3"
-%% 
-check_version(V) when is_list(V) ->
-    case do_check_version(string:tokens(V, [$.])) of
-	ok ->
-	    ok;
-	{error, BadVersionPart} ->
-	    throw({error, {bad_version, V, BadVersionPart}})
-    end;
-check_version(V) ->
-    error({bad_version, V}).
-
-do_check_version([]) ->
-    ok;
-do_check_version([H|T]) ->
-    case (catch list_to_integer(H)) of
-	I when is_integer(I) ->
-	    do_check_version(T);
-	_ ->
-	    {error, H}
-    end.
-	    
-check_module(M, Modules) when is_atom(M) ->
-    case lists:member(M,Modules) of
-        true ->
-            ok;
-        false ->
-            error({unknown_module, M, Modules})
-    end;
-check_module(M, _) ->
-    error({bad_module, M}).
-
-
-check_module_depend(M, [], _) when is_atom(M) ->
-    d("check_module_depend -> entry with"
-      "~n   M: ~p", [M]),    
-    ok;
-check_module_depend(M, Deps, Modules) when is_atom(M) andalso is_list(Deps) ->
-    d("check_module_depend -> entry with"
-      "~n   M: ~p"
-      "~n   Deps: ~p"
-      "~n   Modules: ~p", [M, Deps, Modules]),    
-    case [Dep || Dep <- Deps, lists:member(Dep, Modules) == false] of
-        [] ->
-            ok;
-        Unknown ->
-            error({unknown_depend_modules, Unknown})
-    end;
-check_module_depend(_M, D, _Modules) ->
-    d("check_module_depend -> entry when bad depend with"
-      "~n   D: ~p", [D]),    
-    error({bad_depend, D}).
-
-
-check_no_remove_depends(_Module, []) ->
-    ok;
-check_no_remove_depends(Module, [Instr|Instrs]) ->
-    check_no_remove_depend(Module, Instr),
-    check_no_remove_depends(Module, Instrs).
-
-check_no_remove_depend(Module, {load_module, Mod, _Pre, _Post, Depend}) ->
-    case lists:member(Module, Depend) of
-	true ->
-	    error({removed_module_in_depend, load_module, Mod, Module});
-	false ->
-	    ok
-    end;
-check_no_remove_depend(Module, {update, Mod, _Change, _Pre, _Post, Depend}) ->
-    case lists:member(Module, Depend) of
-	true ->
-	    error({removed_module_in_depend, update, Mod, Module});
-	false ->
-	    ok
-    end;
-check_no_remove_depend(_, _) ->
-    ok.
-    
-
-check_change(soft) ->
-    ok;
-check_change({advanced, _Something}) ->
-    ok;
-check_change(Change) ->
-    error({bad_change, Change}).
-
-
-check_purge(soft_purge) ->
-    ok;
-check_purge(brutal_purge) ->
-    ok;
-check_purge(Purge) ->
-    error({bad_purge, Purge}).
-
-
-check_apply(Module, Function, Args) ->
-     case (catch Module:module_info()) of
-	Info when is_list(Info) ->
-	    check_exported(Function, Args, Info);
-	{'EXIT', {undef, _}} ->
-	    error({not_existing_module, Module})
-     end.
-
-check_exported(Function, Args, Info) ->
-     case lists:keysearch(exports, 1, Info) of
-	{value, {exports, FuncList}} ->
-	     Arity   = length(Args), 
-	     Arities = [A || {F, A} <- FuncList, F == Function],
-	     case lists:member(Arity, Arities) of
-		 true ->
-		     ok;
-		 false ->
-		     error({not_exported_function, Function, Arity})
-	     end;
-	 _ ->
-	     error({bad_export, Info})
-     end.
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-error(Reason) ->
-    throw({error, Reason}).
-
-fail(Reason) ->
-    exit({suite_failed, Reason}).
+%% Test server callbacks
+init_per_testcase(_Case, Config) when is_list(Config) ->
+    Config.
 
-key1search(Key, L) ->
-    case lists:keysearch(Key, 1, L) of
-	undefined ->
-	    fail({not_found, Key, L});
-	{value, {Key, Value}} ->
-	    Value
-    end.
+end_per_testcase(_Case, Config) when is_list(Config) ->
+    Config.
 
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
-d(F, A) ->
-    d(false, F, A).
+%% Perform a simple check of the appup file
+appup_file(Config) when is_list(Config) ->
+    ok = ?t:appup_test(megaco).
 
-d(true, F, A) ->
-    io:format(F ++ "~n", A);
-d(_, _, _) ->
-    ok.
-
-    
-- 
cgit v1.2.3


From ae8f00912587cbb8e9ace6660434e921bae9730b Mon Sep 17 00:00:00 2001
From: Lars Thorsen <lars@erlang.org>
Date: Mon, 5 Dec 2016 12:16:47 +0100
Subject: [megaco} Update version

---
 lib/megaco/vsn.mk | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

(limited to 'lib')

diff --git a/lib/megaco/vsn.mk b/lib/megaco/vsn.mk
index b95cd66a81..87a8151dbc 100644
--- a/lib/megaco/vsn.mk
+++ b/lib/megaco/vsn.mk
@@ -19,6 +19,6 @@
 # %CopyrightEnd%
 
 APPLICATION = megaco
-MEGACO_VSN  = 3.18.1
+MEGACO_VSN  = 3.18.2
 PRE_VSN     =
 APP_VSN     = "$(APPLICATION)-$(MEGACO_VSN)$(PRE_VSN)"
-- 
cgit v1.2.3