%% %% %CopyrightBegin% %% %% Copyright Ericsson AB 2018-2018. All Rights Reserved. %% %% Licensed under the Apache License, Version 2.0 (the "License"); %% you may not use this file except in compliance with the License. %% You may obtain a copy of the License at %% %% http://www.apache.org/licenses/LICENSE-2.0 %% %% Unless required by applicable law or agreed to in writing, software %% distributed under the License is distributed on an "AS IS" BASIS, %% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %% See the License for the specific language governing permissions and %% limitations under the License. %% %% %CopyrightEnd% %% -module(socket_test_ttest_lib). -compile({no_auto_import, [error/2]}). -export([ t/0, tdiff/2, formated_timestamp/0, format_timestamp/1, format_time/1, formated_process_stats/1, formated_process_stats/2, format/2, error/1, error/2, info/1, info/2 ]). %% ========================================================================== t() -> os:timestamp(). tdiff({A1, B1, C1} = _T1x, {A2, B2, C2} = _T2x) -> T1 = A1*1000000000+B1*1000+(C1 div 1000), T2 = A2*1000000000+B2*1000+(C2 div 1000), T2 - T1. formated_timestamp() -> format_timestamp(os:timestamp()). format_timestamp({_N1, _N2, N3} = TS) -> {_Date, Time} = calendar:now_to_local_time(TS), {Hour,Min,Sec} = Time, FormatTS = io_lib:format("~.2.0w:~.2.0w:~.2.0w.4~w", [Hour, Min, Sec, round(N3/1000)]), lists:flatten(FormatTS). %% Time is always in number os ms (milli seconds) %% At some point, we should convert this to a more readable format... format_time(T) when (T < 1000) -> format("~w ms", [T]); format_time(T) -> format("~w sec (~w ms)", [T div 1000, T]). formated_process_stats(Pid) -> formated_process_stats("", Pid). formated_process_stats(Prefix, Pid) when is_list(Prefix) andalso is_pid(Pid) -> try begin TotHeapSz = pi(Pid, total_heap_size), HeapSz = pi(Pid, heap_size), StackSz = pi(Pid, stack_size), Reds = pi(Pid, reductions), GCInfo = pi(Pid, garbage_collection), MinBinVHeapSz = proplists:get_value(min_bin_vheap_size, GCInfo), MinHeapSz = proplists:get_value(min_heap_size, GCInfo), MinGCS = proplists:get_value(minor_gcs, GCInfo), format("~n ~sTotal Heap Size: ~p" "~n ~sHeap Size: ~p" "~n ~sStack Size: ~p" "~n ~sReductions: ~p" "~n ~s[GC] Min Bin VHeap Size: ~p" "~n ~s[GC] Min Heap Size: ~p" "~n ~s[GC] Minor GCS: ~p", [Prefix, TotHeapSz, Prefix, HeapSz, Prefix, StackSz, Prefix, Reds, Prefix, MinBinVHeapSz, Prefix, MinHeapSz, Prefix, MinGCS]) end catch _:_:_ -> "" end. pi(Pid, Item) -> {Item, Info} = process_info(Pid, Item), Info. %% ========================================================================== format(F, A) -> lists:flatten(io_lib:format(F, A)). error(F) -> error(F, []). error(F, A) -> print(get(sname), " " ++ F, A). info(F) -> info(F, []). info(F, A) -> print(get(sname), " " ++ F, A). print(undefined, F, A) -> print("- ", F, A); print(Prefix, F, A) -> io:format("[~s, ~s] " ++ F ++ "~n", [formated_timestamp(), Prefix |A]).