trusty (3) ct.3erl.gz

Provided by: erlang-manpages_16.b.3-dfsg-1ubuntu2.2_all bug

NAME

       ct - Main user interface for the Common Test framework.

DESCRIPTION

       Main user interface for the Common Test framework.

       This  module  implements the command line interface for running tests and some basic functions for common
       test case issues such as configuration and logging.

       Test Suite Support Macros

       The config macro is defined in ct.hrl. This macro should be used to retrieve information from the  Config
       variable  sent  to  all  test  cases.  It  is used with two arguments, where the first is the name of the
       configuration variable you wish to retrieve, and the second is the Config variable supplied to  the  test
       case.

       Possible configuration variables include:

         * data_dir - Data file directory.

         * priv_dir - Scratch file directory.

         * Whatever added by init_per_suite/1 or init_per_testcase/2 in the test suite.

DATA TYPES

         handle() = handle() (see module ct_gen_conn) | term():

           The identity of a specific connection.

         target_name() = var_name():

           The name of a target.

         var_name() = atom():

           A     variable     name     which    is    specified    when    ct:require/2    is    called,    e.g.
           ct:require(mynodename,{node,[telnet]})

EXPORTS

       abort_current_testcase(Reason) -> ok | {error, ErrorReason}

              Types:

                 Reason = term()
                 ErrorReason = no_testcase_running | parallel_group

              When calling this function, the currently executing test case will be aborted. It  is  the  user's
              responsibility  to know for sure which test case is currently executing. The function is therefore
              only safe to call from a function which has been called (or synchronously  invoked)  by  the  test
              case.

              Reason, the reason for aborting the test case, is printed in the test case log.

       add_config(Callback, Config) -> ok | {error, Reason}

              Types:

                 Callback = atom()
                 Config = string()
                 Reason = term()

              This  function  loads  configuration  variables  using the given callback module and configuration
              string. Callback module should be either loaded or present in the code part. Loaded  configuration
              variables can later be removed using remove_config/2 function.

       break(Comment) -> ok | {error, Reason}

              Types:

                 Comment = string()
                 Reason = {multiple_cases_running, TestCases} | 'enable break with release_shell option'
                 TestCases = [atom()]

              This  function  will  cancel  any active timetrap and pause the execution of the current test case
              until the user calls the continue/0 function. It gives the user the opportunity to  interact  with
              the erlang node running the tests, e.g. for debugging purposes or for manually executing a part of
              the test case. If a parallel group is executing, break/2 should be called instead.

              A cancelled timetrap will not be automatically reactivated after the break, but  must  be  started
              exlicitly with ct:timetrap/1

              In  order for the break/continue functionality to work, Common Test must release the shell process
              controlling stdin. This is done by setting the release_shell start option to true. See the  User's
              Guide for more information.

       break(TestCase, Comment) -> ok | {error, Reason}

              Types:

                 TestCase = atom()
                 Comment = string()
                 Reason = 'test case not running' | 'enable break with release_shell option'

              This function works the same way as break/1, only the TestCase argument makes it possible to pause
              a test case executing in a parallel group. The  continue/1  function  should  be  used  to  resume
              execution of TestCase.

              See break/1 for more details.

       capture_get() -> ListOfStrings

              Types:

                 ListOfStrings = [string()]

              Equivalent to capture_get([default]).

       capture_get(ExclCategories) -> ListOfStrings

              Types:

                 ExclCategories = [atom()]
                 ListOfStrings = [string()]

              Return  and  purge  the  list  of  text  strings  buffered  during the latest session of capturing
              printouts to stdout. With ExclCategories it's possible to specify log categories  that  should  be
              ignored in ListOfStrings. If ExclCategories = [], no filtering takes place.

              See also: capture_start/0, capture_stop/0, log/3.

       capture_start() -> ok

              Start capturing all text strings printed to stdout during execution of the test case.

              See also: capture_get/1, capture_stop/0.

       capture_stop() -> ok

              Stop capturing text strings (a session started with capture_start/0).

              See also: capture_get/1, capture_start/0.

       comment(Comment) -> void()

              Types:

                 Comment = term()

              Print the given Comment in the comment field in the table on the test suite result page.

              If  called  several  times,  only  the  last  comment  is  printed.  The  test  case  return value
              {comment,Comment} overwrites the string set by this function.

       comment(Format, Args) -> void()

              Types:

                 Format = string()
                 Args = list()

              Print the formatted string in the comment field in the table on the test suite result page.

              The Format and Args arguments are used in call to io_lib:format/2 in order to create  the  comment
              string.  The behaviour of comment/2 is otherwise the same as the comment/1 function (see above for
              details).

       continue() -> ok

              This function must be called in order to continue after a test case (not executing in  a  parallel
              group) has called break/1.

       continue(TestCase) -> ok

              Types:

                 TestCase = atom()

              This  function  must  be  called in order to continue after a test case has called break/2. If the
              paused test case, TestCase, executes in a parallel group, this function - rather than continue/0 -
              must be used in order to let the test case proceed.

       decrypt_config_file(EncryptFileName, TargetFileName) -> ok | {error, Reason}

              Types:

                 EncryptFileName = string()
                 TargetFileName = string()
                 Reason = term()

              This  function  decrypts  EncryptFileName,  previously generated with encrypt_config_file/2/3. The
              original file contents is saved in the  target  file.  The  encryption  key,  a  string,  must  be
              available in a text file named .ct_config.crypt in the current directory, or the home directory of
              the user (it is searched for in that order).

       decrypt_config_file(EncryptFileName, TargetFileName, KeyOrFile) -> ok | {error, Reason}

              Types:

                 EncryptFileName = string()
                 TargetFileName = string()
                 KeyOrFile = {key, string()} | {file, string()}
                 Reason = term()

              This function decrypts EncryptFileName, previously  generated  with  encrypt_config_file/2/3.  The
              original  file  contents is saved in the target file. The key must have the the same value as that
              used for encryption.

       encrypt_config_file(SrcFileName, EncryptFileName) -> ok | {error, Reason}

              Types:

                 SrcFileName = string()
                 EncryptFileName = string()
                 Reason = term()

              This  function  encrypts  the  source  config  file  with  DES3  and  saves  the  result  in  file
              EncryptFileName. The key, a string, must be available in a text file named .ct_config.crypt in the
              current directory, or the home directory of the user (it is searched for in that order).

              See the Common Test User's Guide for information about using encrypted config files  when  running
              tests.

              See the crypto application for details on DES3 encryption/decryption.

       encrypt_config_file(SrcFileName, EncryptFileName, KeyOrFile) -> ok | {error, Reason}

              Types:

                 SrcFileName = string()
                 EncryptFileName = string()
                 KeyOrFile = {key, string()} | {file, string()}
                 Reason = term()

              This  function  encrypts  the source config file with DES3 and saves the result in the target file
              EncryptFileName. The encryption key to use is either the value in {key,Key} or the value stored in
              the file specified by {file,File}.

              See  the  Common Test User's Guide for information about using encrypted config files when running
              tests.

              See the crypto application for details on DES3 encryption/decryption.

       fail(Reason) -> void()

              Types:

                 Reason = term()

              Terminate a test case with the given error Reason.

       fail(Format, Args) -> void()

              Types:

                 Format = string()
                 Args = list()

              Terminate a test case with an error message specified by a format string  and  a  list  of  values
              (used as arguments to io_lib:format/2).

       get_config(Required) -> Value

              Equivalent to get_config(Required, undefined, []).

       get_config(Required, Default) -> Value

              Equivalent to get_config(Required, Default, []).

       get_config(Required, Default, Opts) -> ValueOrElement

              Types:

                 Required = KeyOrName | {KeyOrName, SubKey} | {KeyOrName, SubKey, SubKey}
                 KeyOrName = atom()
                 SubKey = atom()
                 Default = term()
                 Opts = [Opt] | []
                 Opt = element | all
                 ValueOrElement = term() | Default

              Read config data values.

              This  function  returns the matching value(s) or config element(s), given a config variable key or
              its associated name (if one has been specified with require/2 or a require statement).

              Example, given the following config file:

                 {unix,[{telnet,IpAddr},
                        {user,[{username,Username},
                               {password,Password}]}]}.

              ct:get_config(unix,Default)      ->      [{telnet,IpAddr},      {user,       [{username,Username},
              {password,Password}]}]
              ct:get_config({unix,telnet},Default) -> IpAddr
              ct:get_config({unix,user,username},Default) -> Username
              ct:get_config({unix,ftp},Default) -> Default
              ct:get_config(unknownkey,Default) -> Default

              If  a  config  variable  key  has  been associated with a name (by means of require/2 or a require
              statement), the name may be used instead of the key to read the value:

              ct:require(myuser,{unix,user}) -> ok.
              ct:get_config(myuser,Default) -> [{username,Username}, {password,Password}]

              If a config variable is defined in multiple files and you want to access all possible values,  use
              the all option. The values will be returned in a list and the order of the elements corresponds to
              the order that the config files were specified at startup.

              If you want config elements (key-value tuples) returned as  result  instead  of  values,  use  the
              element option. The returned elements will then be on the form {Required,Value}

              See also: get_config/1, get_config/2, require/1, require/2.

       get_status() -> TestStatus | {error, Reason} | no_tests_running

              Types:

                 TestStatus = [StatusElem]
                 StatusElem  = {current, TestCaseInfo} | {successful, Successful} | {failed, Failed} | {skipped,
                 Skipped} | {total, Total}
                 TestCaseInfo = {Suite, TestCase} | [{Suite, TestCase}]
                 Suite = atom()
                 TestCase = atom()
                 Successful = integer()
                 Failed = integer()
                 Skipped = {UserSkipped, AutoSkipped}
                 UserSkipped = integer()
                 AutoSkipped = integer()
                 Total = integer()
                 Reason = term()

              Returns status of ongoing test. The returned list contains info about which test case is currently
              executing  (a list of cases when a parallel test case group is executing), as well as counters for
              successful, failed, skipped, and total test cases so far.

       get_target_name(Handle) -> {ok, TargetName} | {error, Reason}

              Types:

                 Handle = handle()
                 TargetName = target_name()

              Return the name of the target that the given connection belongs to.

       get_timetrap_info() -> {Time, Scale}

              Types:

                 Time = integer() | infinity
                 Scale = true | false

              Read info about the timetrap set for the current test case. Scale indicates if  Common  Test  will
              attempt  to  automatically  compensate  timetraps for runtime delays introduced by e.g. tools like
              cover.

       install(Opts) -> ok | {error, Reason}

              Types:

                 Opts = [Opt]
                 Opt = {config, ConfigFiles} | {event_handler, Modules} | {decrypt, KeyOrFile}
                 ConfigFiles = [ConfigFile]
                 ConfigFile = string()
                 Modules = [atom()]
                 KeyOrFile = {key, Key} | {file, KeyFile}
                 Key = string()
                 KeyFile = string()

              Install config files and event handlers.

              Run this function once before first test.

              Example:
              install([{config,["config_node.ctc","config_user.ctc"]}]).

              Note that this function is automatically run by the ct_run program.

       listenv(Telnet) -> [Env]

              Types:

                 Telnet = term()
                 Env = {Key, Value}
                 Key = string()
                 Value = string()

              Performs the listenv command on the given telnet connection and returns the result as  a  list  of
              Key-Value pairs.

       log(Format) -> ok

              Equivalent to log(default, 50, Format, []).

       log(X1, X2) -> ok

              Types:

                 X1 = Category | Importance | Format
                 X2 = Format | Args

              Equivalent to log(Category, Importance, Format, Args).

       log(X1, X2, X3) -> ok

              Types:

                 X1 = Category | Importance
                 X2 = Importance | Format
                 X3 = Format | Args

              Equivalent to log(Category, Importance, Format, Args).

       log(Category, Importance, Format, Args) -> ok

              Types:

                 Category = atom()
                 Importance = integer()
                 Format = string()
                 Args = list()

              Printout from a test case to the log file.

              This function is meant for printing a string directly from a test case to the test case log file.

              Default  Category is default, default Importance is ?STD_IMPORTANCE, and default value for Args is
              [].

              Please see the User's Guide for details on Category and Importance.

       make_priv_dir() -> ok | {error, Reason}

              Types:

                 Reason = term()

              If the test has been started with the create_priv_dir option set to manual_per_tc,  in  order  for
              the test case to use the private directory, it must first create it by calling this function.

       notify(Name, Data) -> ok

              Types:

                 Name = atom()
                 Data = term()

              Sends a asynchronous notification of type Name with Datato the common_test event manager. This can
              later be caught by any installed event manager.

              See also: gen_event(3erl).

       pal(Format) -> ok

              Equivalent to pal(default, 50, Format, []).

       pal(X1, X2) -> ok

              Types:

                 X1 = Category | Importance | Format
                 X2 = Format | Args

              Equivalent to pal(Category, Importance, Format, Args).

       pal(X1, X2, X3) -> ok

              Types:

                 X1 = Category | Importance
                 X2 = Importance | Format
                 X3 = Format | Args

              Equivalent to pal(Category, Importance, Format, Args).

       pal(Category, Importance, Format, Args) -> ok

              Types:

                 Category = atom()
                 Importance = integer()
                 Format = string()
                 Args = list()

              Print and log from a test case.

              This function is meant for printing a string from a test case, both to the test case log file  and
              to the console.

              Default  Category is default, default Importance is ?STD_IMPORTANCE, and default value for Args is
              [].

              Please see the User's Guide for details on Category and Importance.

       parse_table(Data) -> {Heading, Table}

              Types:

                 Data = [string()]
                 Heading = tuple()
                 Table = [tuple()]

              Parse the printout from an SQL table and return a list of tuples.

              The printout to parse would typically be the result of a select command in SQL. The returned Table
              is a list of tuples, where each tuple is a row in the table.

              Heading is a tuple of strings representing the headings of each column in the table.

       print(Format) -> ok

              Equivalent to print(default, 50, Format, []).

       print(X1, X2) -> ok

              Types:

                 X1 = Category | Importance | Format
                 X2 = Format | Args

              Equivalent to print(Category, Importance, Format, Args).

       print(X1, X2, X3) -> ok

              Types:

                 X1 = Category | Importance
                 X2 = Importance | Format
                 X3 = Format | Args

              Equivalent to print(Category, Importance, Format, Args).

       print(Category, Importance, Format, Args) -> ok

              Types:

                 Category = atom()
                 Importance = integer()
                 Format = string()
                 Args = list()

              Printout from a test case to the console.

              This function is meant for printing a string from a test case to the console.

              Default  Category is default, default Importance is ?STD_IMPORTANCE, and default value for Args is
              [].

              Please see the User's Guide for details on Category and Importance.

       reload_config(Required) -> ValueOrElement

              Types:

                 Required = KeyOrName | {KeyOrName, SubKey} | {KeyOrName, SubKey, SubKey}
                 KeyOrName = atom()
                 SubKey = atom()
                 ValueOrElement = term()

              Reload config file which contains specified configuration key.

              This function performs updating of the configuration  data  from  which  the  given  configuration
              variable was read, and returns the (possibly) new value of this variable.

              Note  that  if  some  variables  were  present  in the configuration but are not loaded using this
              function, they will be removed from the configuration table together with their aliases.

       remove_config(Callback, Config) -> ok

              Types:

                 Callback = atom()
                 Config = string()
                 Reason = term()

              This function removes configuration variables (together with their aliases) which were loaded with
              specified callback module and configuration string.

       require(Required) -> ok | {error, Reason}

              Types:

                 Required = Key | {Key, SubKeys} | {Key, SubKey, SubKeys}
                 Key = atom()
                 SubKeys = SubKey | [SubKey]
                 SubKey = atom()

              Check  if  the  required  configuration  is  available. It is possible to specify arbitrarily deep
              tuples as Required. Note that it is only the last element of the tuple which  can  be  a  list  of
              SubKeys.

              Example 1: require the variable myvar:

              ok = ct:require(myvar).

              In this case the config file must at least contain:

              {myvar,Value}.

              Example 2: require the key myvar with subkeys sub1 and sub2:

              ok = ct:require({myvar,[sub1,sub2]}).

              In this case the config file must at least contain:

              {myvar,[{sub1,Value},{sub2,Value}]}.

              Example 3: require the key myvar with subkey sub1 with subsub1:

              ok = ct:require({myvar,sub1,sub2}).

              In this case the config file must at least contain:

              {myvar,[{sub1,[{sub2,Value}]}]}.

              See also: get_config/1, get_config/2, get_config/3, require/2.

       require(Name, Required) -> ok | {error, Reason}

              Types:

                 Name = atom()
                 Required = Key | {Key, SubKey} | {Key, SubKey, SubKey}
                 SubKey = Key
                 Key = atom()

              Check  if  the required configuration is available, and give it a name. The semantics for Required
              is the same as in required/1 except that it is not possible to specify a list of SubKeys.

              If the requested data is available, the sub entry will be associated with Name so that  the  value
              of the element can be read with get_config/1,2 provided Name instead of the whole Required term.

              Example: Require one node with a telnet connection and an ftp connection. Name the node a:

              ok = ct:require(a,{machine,node}).

              All  references  to  this node may then use the node name. E.g. you can fetch a file over ftp like
              this:

              ok = ct:ftp_get(a,RemoteFile,LocalFile).

              For this to work, the config file must at least contain:

              {machine,[{node,[{telnet,IpAddr},{ftp,IpAddr}]}]}.

          Note:
              The behaviour of this function changed radically in common_test 1.6.2.  In  order  too  keep  some
              backwards compatability it is still possible to do:
              ct:require(a,{node,[telnet,ftp]}).
              This  will  associate  the name a with the top level node entry. For this to work, the config file
              must at least contain:
              {node,[{telnet,IpAddr},{ftp,IpAddr}]}.

              See also: get_config/1, get_config/2, get_config/3, require/1.

       run(TestDirs) -> Result

              Types:

                 TestDirs = TestDir | [TestDir]

              Run all test cases in all suites in the given directories.

              See also: run/3.

       run(TestDir, Suite) -> Result

              Run all test cases in the given suite.

              See also: run/3.

       run(TestDir, Suite, Cases) -> Result

              Types:

                 TestDir = string()
                 Suite = atom()
                 Cases = atom() | [atom()]
                 Result = [TestResult] | {error, Reason}

              Run the given test case(s).

              Requires that ct:install/1 has been run first.

              Suites (*_SUITE.erl) files must be stored in TestDir or TestDir/test. All suites will be  compiled
              when test is run.

       run_test(Opts) -> Result

              Types:

                 Opts = [OptTuples]
                 OptTuples  =  {dir,  TestDirs} | {suite, Suites} | {group, Groups} | {testcase, Cases} | {spec,
                 TestSpecs}  |  {join_specs,  Bool}  |  {label,  Label}  |  {config,  CfgFiles}  |  {userconfig,
                 UserConfig}  |  {allow_user_terms,  Bool}  |  {logdir,  LogDir} | {silent_connections, Conns} |
                 {stylesheet, CSSFile} | {cover, CoverSpecFile}  |  {cover_stop,  Bool}  |  {step,  StepOpts}  |
                 {event_handler, EventHandlers} | {include, InclDirs} | {auto_compile, Bool} | {create_priv_dir,
                 CreatePrivDir} | {multiply_timetraps, M} | {scale_timetraps, Bool} | {repeat, N}  |  {duration,
                 DurTime}  |  {until,  StopTime}  |  {force_stop,  ForceStop}  |  {decrypt,  DecryptKeyOrFile} |
                 {refresh_logs, LogDir} | {logopts, LogOpts} |  {verbosity,  VLevels}  |  {basic_html,  Bool}  |
                 {ct_hooks, CTHs} | {enable_builtin_hooks, Bool} | {release_shell, Bool}
                 TestDirs = [string()] | string()
                 Suites = [string()] | [atom()] | string() | atom()
                 Cases = [atom()] | atom()
                 Groups = GroupNameOrPath | [GroupNameOrPath]
                 GroupNameOrPath = [atom()] | atom() | all
                 TestSpecs = [string()] | string()
                 Label = string() | atom()
                 CfgFiles = [string()] | string()
                 UserConfig = [{CallbackMod, CfgStrings}] | {CallbackMod, CfgStrings}
                 CallbackMod = atom()
                 CfgStrings = [string()] | string()
                 LogDir = string()
                 Conns = all | [atom()]
                 CSSFile = string()
                 CoverSpecFile = string()
                 StepOpts = [StepOpt] | []
                 StepOpt = config | keep_inactive
                 EventHandlers = EH | [EH]
                 EH = atom() | {atom(), InitArgs} | {[atom()], InitArgs}
                 InitArgs = [term()]
                 InclDirs = [string()] | string()
                 CreatePrivDir = auto_per_run | auto_per_tc | manual_per_tc
                 M = integer()
                 N = integer()
                 DurTime = string(HHMMSS)
                 StopTime = string(YYMoMoDDHHMMSS) | string(HHMMSS)
                 ForceStop = skip_rest | Bool
                 DecryptKeyOrFile = {key, DecryptKey} | {file, DecryptFile}
                 DecryptKey = string()
                 DecryptFile = string()
                 LogOpts = [LogOpt]
                 LogOpt = no_nl | no_src
                 VLevels = VLevel | [{Category, VLevel}]
                 VLevel = integer()
                 Category = atom()
                 CTHs = [CTHModule | {CTHModule, CTHInitArgs}]
                 CTHModule = atom()
                 CTHInitArgs = term()
                 Result = {Ok, Failed, {UserSkipped, AutoSkipped}} | TestRunnerPid | {error, Reason}
                 Ok = integer()
                 Failed = integer()
                 UserSkipped = integer()
                 AutoSkipped = integer()
                 TestRunnerPid = pid()
                 Reason = term()

              Run  tests  as  specified by the combination of options in Opts. The options are the same as those
              used with the ct_run program. Note that here a TestDir can be used to point  out  the  path  to  a
              Suite.  Note  also that the option testcase corresponds to the -case option in the ct_run program.
              Configuration files specified in Opts will be installed automatically at startup.

              TestRunnerPid is returned if release_shell == true (see break/1 for details).

              Reason indicates what type of error has been encountered.

       run_testspec(TestSpec) -> Result

              Types:

                 TestSpec = [term()]
                 Result = {Ok, Failed, {UserSkipped, AutoSkipped}} | {error, Reason}
                 Ok = integer()
                 Failed = integer()
                 UserSkipped = integer()
                 AutoSkipped = integer()
                 Reason = term()

              Run test specified by TestSpec. The terms are the same as those used in test specification files.

              Reason indicates what type of error has been encountered.

       sleep(Time) -> ok

              Types:

                 Time = {hours, Hours} | {minutes, Mins} | {seconds, Secs} | Millisecs | infinity
                 Hours = integer()
                 Mins = integer()
                 Secs = integer()
                 Millisecs = integer() | float()

              This function, similar to timer:sleep/1, suspends the test case for specified time. However,  this
              function  also  multiplies  Time  with  the  'multiply_timetraps' value (if set) and under certain
              circumstances also scales up the time automatically if 'scale_timetraps' is set to  true  (default
              is false).

       start_interactive() -> ok

              Start CT in interactive mode.

              From this mode all test case support functions can be executed directly from the erlang shell. The
              interactive mode can also be started  from  the  OS  command  line  with  ct_run  -shell  [-config
              File...].

              If any functions using "required config data" (e.g. telnet or ftp functions) are to be called from
              the erlang shell, config data must first be required with ct:require/2.

              Example:
              > ct:require(unix_telnet, unix).
              ok
              > ct_telnet:open(unix_telnet).
              {ok,<0.105.0>}
              > ct_telnet:cmd(unix_telnet, "ls .").
              {ok,["ls","file1 ...",...]}

       step(TestDir, Suite, Case) -> Result

              Types:

                 Case = atom()

              Step through a test case with the debugger.

              See also: run/3.

       step(TestDir, Suite, Case, Opts) -> Result

              Types:

                 Case = atom()
                 Opts = [Opt] | []
                 Opt = config | keep_inactive

              Step through a test case with the debugger. If the config option has been given, breakpoints  will
              be set also on the configuration functions in Suite.

              See also: run/3.

       stop_interactive() -> ok

              Exit the interactive mode.

              See also: start_interactive/0.

       sync_notify(Name, Data) -> ok

              Types:

                 Name = atom()
                 Data = term()

              Sends  a synchronous notification of type Name with Datato the common_test event manager. This can
              later be caught by any installed event manager.

              See also: gen_event(3erl).

       testcases(TestDir, Suite) -> Testcases | {error, Reason}

              Types:

                 TestDir = string()
                 Suite = atom()
                 Testcases = list()
                 Reason = term()

              Returns all test cases in the specified suite.

       timetrap(Time) -> ok

              Types:

                 Time = {hours, Hours} | {minutes, Mins} | {seconds, Secs} | Millisecs | infinity | Func
                 Hours = integer()
                 Mins = integer()
                 Secs = integer()
                 Millisecs = integer() | float()
                 Func = {M, F, A} | function()
                 M = atom()
                 F = atom()
                 A = list()

              Use this function to set a new timetrap for the running test case. If the argument  is  Func,  the
              timetrap  will  be  triggered  when  this function returns. Func may also return a new Time value,
              which in that case will be the value for the new timetrap.

       userdata(TestDir, Suite) -> SuiteUserData | {error, Reason}

              Types:

                 TestDir = string()
                 Suite = atom()
                 SuiteUserData = [term()]
                 Reason = term()

              Returns  any  data  specified  with  the  tag  userdata  in  the  list  of  tuples  returned  from
              Suite:suite/0.

       userdata(TestDir, Suite, Case::GroupOrCase) -> TCUserData | {error, Reason}

              Types:

                 TestDir = string()
                 Suite = atom()
                 GroupOrCase = {group, GroupName} | atom()
                 GroupName = atom()
                 TCUserData = [term()]
                 Reason = term()

              Returns  any  data  specified  with  the  tag  userdata  in  the  list  of  tuples  returned  from
              Suite:group(GroupName) or Suite:Case().

AUTHORS

       <>

                                                common_test 1.7.4                                       ct(3erl)