<!DOCTYPE html>
<html data-lt-installed="true">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body style="padding-bottom: 1px;">
<p>Hi, Sergey,</p>
<p>changes applied and force-pushed.</p>
<p>Sergey<br>
</p>
<div class="moz-cite-prefix">On 24.02.2025 15:46, Sergey Kaplun via
Tarantool-patches wrote:<br>
</div>
<blockquote type="cite" cite="mid:Z7xqDHtLuS0NHxCe@root">
<pre wrap="" class="moz-quote-pre">Hi, Sergey!
Thanks for the fixes!
LGTM, after the final polishing, please consider my comments below.
On 20.02.25, Sergey Bronnikov wrote:
</pre>
<blockquote type="cite">
<pre wrap="" class="moz-quote-pre">sysprof has a number of options and with any incorrect option it
returns `false` and error message "profiler misuse". This message
discourages sysprof users and makes using sysprof more
complicated. The patch sets the default profiling mode ("D", that
shows only virtual machine state counters) if it was not passed
and adds details to the error message with possible reasons of
misuse.
</pre>
</blockquote>
<pre wrap="" class="moz-quote-pre">
Please add the following notes.
| Also, it fixes the bug when the error isn't raised if the given argument
| type is incorrect.
| Also, the profiler can start if it has extra arguments given.
| They are just ignored now.</pre>
</blockquote>
Added.<br>
<blockquote type="cite" cite="mid:Z7xqDHtLuS0NHxCe@root">
<pre wrap="" class="moz-quote-pre">
</pre>
<blockquote type="cite">
<pre wrap="" class="moz-quote-pre">---
src/lib_misc.c | 77 ++++++++++++-------
src/lj_errmsg.h | 5 ++
.../profilers/misclib-sysprof-lapi.test.lua | 68 ++++++++++++++--
3 files changed, 114 insertions(+), 36 deletions(-)
diff --git a/src/lib_misc.c b/src/lib_misc.c
index 5b7a4b62..1fd06dd1 100644
--- a/src/lib_misc.c
+++ b/src/lib_misc.c
@@ -14,6 +14,7 @@
#include "lj_obj.h"
#include "lj_str.h"
+#include "lj_strfmt.h"
</pre>
</blockquote>
<pre wrap="" class="moz-quote-pre">
Please add the corresponding include (after lj_str.h) in <src/Makefile.dep.original> to
avoid conflicts when we use this file (for crossbuilds or whatever).
</pre>
<blockquote type="cite">
<pre wrap="" class="moz-quote-pre"> #include "lj_tab.h"
#include "lj_lib.h"
#include "lj_gc.h<a class="moz-txt-link-rfc2396E" href="mailto:@@-163,6+164,7@@staticinton_stop_cb_default(void*opt,uint8_t*buf)/*Thedefaultprofilingintervalequalsto10ms.*/#defineSYSPROF_DEFAULT_INTERVAL10+#defineSYSPROF_DEFAULT_MODE">"
@@ -163,6 +164,7 @@ static int on_stop_cb_default(void *opt, uint8_t *buf)
/* The default profiling interval equals to 10 ms. */
#define SYSPROF_DEFAULT_INTERVAL 10
+#define SYSPROF_DEFAULT_MODE "</a>D"
#define SYSPROF_DEFAULT_OUTPUT "sysprof.bin"
static int set_output_path(const char *path, struct luam_Sysprof_Options *opt) {
@@ -177,21 +179,36 @@ static int set_output_path(const char *path, struct luam_Sysprof_Options *opt) {
return PROFILE_SUCCESS;
}
-static int parse_sysprof_opts(lua_State *L, struct luam_Sysprof_Options *opt, int idx) {
- GCtab *options = lj_lib_checktab(L, idx);
+static int parse_sysprof_opts(lua_State *L, struct luam_Sysprof_Options *opt,
+ const char **err_details) {
</pre>
</blockquote>
<pre wrap="" class="moz-quote-pre">
Nit: Please, replace every 8 spaces with one tab.</pre>
</blockquote>
<p>Fixed:</p>
<p>--- a/src/lib_misc.c<br>
+++ b/src/lib_misc.c<br>
@@ -180,7 +180,7 @@ static int set_output_path(const char *path,
struct luam_Sysprof_Options *opt) {<br>
}<br>
<br>
static int parse_sysprof_opts(lua_State *L, struct
luam_Sysprof_Options *opt,<br>
- const char **err_details) {<br>
+ const char **err_details) {<br>
int n = (int)(L->top - L->base);<br>
if (n == 0) {<br>
opt->mode = LUAM_SYSPROF_DEFAULT;<br>
</p>
<blockquote type="cite" cite="mid:Z7xqDHtLuS0NHxCe@root">
<pre wrap="" class="moz-quote-pre">
</pre>
<blockquote type="cite">
<pre wrap="" class="moz-quote-pre">+ int n = (int)(L->top - L->base);
+ if (n == 0) {
+ opt->mode = LUAM_SYSPROF_DEFAULT;
+ opt->interval = SYSPROF_DEFAULT_INTERVAL;
+ return PROFILE_SUCCESS;
+ }
+
+ GCtab *options = lj_lib_checktab(L, 1);
</pre>
</blockquote>
<pre wrap="" class="moz-quote-pre">
Please, declare (not initialize) `options` before `if` branch to avoid
-Wdeclaration-after-statement warnings.</pre>
</blockquote>
<p>Fixed:</p>
<p> int n = (int)(L->top - L->base);<br>
+ GCtab *options;<br>
if (n == 0) {<br>
opt->mode = LUAM_SYSPROF_DEFAULT;<br>
opt->interval = SYSPROF_DEFAULT_INTERVAL;<br>
return PROFILE_SUCCESS;<br>
}<br>
<br>
- GCtab *options = lj_lib_checktab(L, 1);<br>
+ options = lj_lib_checktab(L, 1);<br>
<br>
/* Get profiling mode. */<br>
{<br>
</p>
<blockquote type="cite" cite="mid:Z7xqDHtLuS0NHxCe@root">
<pre wrap="" class="moz-quote-pre">
Please, also add the comment that we ignore all other arguments given to
this function.</pre>
</blockquote>
<p>Added:</p>
<p> if (n == 0) {<br>
opt->mode = LUAM_SYSPROF_DEFAULT;<br>
opt->interval = SYSPROF_DEFAULT_INTERVAL;<br>
return PROFILE_SUCCESS;<br>
}<br>
<br>
- GCtab *options = lj_lib_checktab(L, 1);<br>
+ /* All other arguments given to this function are ignored. */<br>
+ options = lj_lib_checktab(L, 1);<br>
<br>
/* Get profiling mode. */<br>
{<br>
</p>
<blockquote type="cite" cite="mid:Z7xqDHtLuS0NHxCe@root">
<pre wrap="" class="moz-quote-pre">
</pre>
<blockquote type="cite">
<pre wrap="" class="moz-quote-pre">
/* Get profiling mode. */
{
</pre>
</blockquote>
<pre wrap="" class="moz-quote-pre">
<snipped>
</pre>
<blockquote type="cite">
<pre wrap="" class="moz-quote-pre"> }
@@ -214,8 +232,10 @@ static int parse_sysprof_opts(lua_State *L, struct luam_Sysprof_Options *opt, in
opt->interval = SYSPROF_DEFAULT_INTERVAL;
if (interval && tvisnumber(interval)) {
int32_t signed_interval = numberVint(interval);
- if (signed_interval < 1)
+ if (signed_interval < 1) {
+ *err_details = err2msg(LJ_ERR_PROF_DETAILS_BADINTERVAL);
return PROFILE_ERRUSE;
+ }
opt->interval = signed_interval;
}
}
@@ -230,9 +250,10 @@ static int parse_sysprof_opts(lua_State *L, struct luam_Sysprof_Options *opt, in
cTValue *pathtv = lj_tab_getstr(options, lj_str_newlit(L, "path"));
if (!pathtv)
</pre>
</blockquote>
<pre wrap="" class="moz-quote-pre">
Please, add the `{` braces here too.</pre>
</blockquote>
<p>Added:</p>
<p>@@ -248,13 +250,14 @@ static int parse_sysprof_opts(lua_State *L,
struct luam_Sysprof_Options *opt,<br>
int status = 0;<br>
<br>
cTValue *pathtv = lj_tab_getstr(options, lj_str_newlit(L,
"path"));<br>
- if (!pathtv)<br>
+ if (!pathtv) {<br>
path = SYSPROF_DEFAULT_OUTPUT;<br>
- else if (!tvisstr(pathtv)) {<br>
+ } else if (!tvisstr(pathtv)) {<br>
*err_details = err2msg(LJ_ERR_PROF_DETAILS_BADPATH);<br>
return PROFILE_ERRUSE;<br>
- } else<br>
+ } else {<br>
path = strVdata(pathtv);<br>
+ }<br>
<br>
ctx = lj_mem_new(L, sizeof(*ctx));<br>
ctx->g = G(L);<br>
</p>
<blockquote type="cite" cite="mid:Z7xqDHtLuS0NHxCe@root">
<pre wrap="" class="moz-quote-pre">
</pre>
<blockquote type="cite">
<pre wrap="" class="moz-quote-pre"> path = SYSPROF_DEFAULT_OUTPUT;
- else if (!tvisstr(pathtv))
+ else if (!tvisstr(pathtv)) {
+ *err_details = err2msg(LJ_ERR_PROF_DETAILS_BADPATH);
return PROFILE_ERRUSE;
- else
+ } else
</pre>
</blockquote>
<pre wrap="" class="moz-quote-pre">
Ditto.</pre>
</blockquote>
@@ -248,13 +250,14 @@ static int parse_sysprof_opts(lua_State *L,
struct luam_Sysprof_Options *opt,<br>
int status = 0;<br>
<br>
cTValue *pathtv = lj_tab_getstr(options, lj_str_newlit(L,
"path"));<br>
- if (!pathtv)<br>
+ if (!pathtv) {<br>
path = SYSPROF_DEFAULT_OUTPUT;<br>
- else if (!tvisstr(pathtv)) {<br>
+ } else if (!tvisstr(pathtv)) {<br>
*err_details = err2msg(LJ_ERR_PROF_DETAILS_BADPATH);<br>
return PROFILE_ERRUSE;<br>
- } else<br>
+ } else {<br>
path = strVdata(pathtv);<br>
+ }<br>
<br>
ctx = lj_mem_new(L, sizeof(*ctx));<br>
ctx->g = G(L);<br>
<blockquote type="cite" cite="mid:Z7xqDHtLuS0NHxCe@root">
<pre wrap="" class="moz-quote-pre">
</pre>
<blockquote type="cite">
<pre wrap="" class="moz-quote-pre"> path = strVdata(pathtv);
ctx = lj_mem_new(L, sizeof(*ctx));
@@ -251,29 +272,26 @@ static int parse_sysprof_opts(lua_State *L, struct luam_Sysprof_Options *opt, in
return PROFILE_SUCCESS;
}
</pre>
</blockquote>
<pre wrap="" class="moz-quote-pre">
<snipped>
</pre>
<blockquote type="cite">
<pre wrap="" class="moz-quote-pre">+static int sysprof_error(lua_State *L, int status, const char *err_details)
{
switch (status) {
case PROFILE_ERRUSE:
lua_pushnil(L);
- lua_pushstring(L, err2msg(LJ_ERR_PROF_MISUSE));
+ if (err_details) {
</pre>
</blockquote>
<pre wrap="" class="moz-quote-pre">
Nit: OTOH, there is no need for them here and below.
Feel free to ignore.
</pre>
</blockquote>
<p>Removed:</p>
<p>@@ -277,21 +280,16 @@ static int sysprof_error(lua_State *L, int
status, const char *err_details)<br>
switch (status) {<br>
case PROFILE_ERRUSE:<br>
lua_pushnil(L);<br>
- if (err_details) {<br>
+ if (err_details)<br>
lj_strfmt_pushf(L, "%s: %s", err2msg(LJ_ERR_PROF_MISUSE),
err_details);<br>
- } else {<br>
+ else<br>
lua_pushstring(L, err2msg(LJ_ERR_PROF_MISUSE));<br>
- }<br>
lua_pushinteger(L, EINVAL);<br>
return 3;<br>
</p>
<blockquote type="cite" cite="mid:Z7xqDHtLuS0NHxCe@root">
<pre wrap="" class="moz-quote-pre">
</pre>
<blockquote type="cite">
<pre wrap="" class="moz-quote-pre">+ lj_strfmt_pushf(L, "%s: %s", err2msg(LJ_ERR_PROF_MISUSE), err_details);
+ } else {
+ lua_pushstring(L, err2msg(LJ_ERR_PROF_MISUSE));
+ }
lua_pushinteger(L, EINVAL);
return 3;
#if LJ_HASSYSPROF
case PROFILE_ERRRUN:
lua_pushnil(L);
- lua_pushstring(L, err2msg(LJ_ERR_PROF_ISRUNNING));
+ if (err_details) {
</pre>
</blockquote>
<pre wrap="" class="moz-quote-pre">
Side note: `err_deails` is always `NULL` here. I suppose we don't need
this branch for now (to avoid the dead code), so these changes may be
avoided.
</pre>
</blockquote>
<p>Removed:</p>
<p> #if LJ_HASSYSPROF<br>
case PROFILE_ERRRUN:<br>
lua_pushnil(L);<br>
- if (err_details) {<br>
- lj_strfmt_pushf(L, "%s: %s", err2msg(LJ_ERR_PROF_MISUSE),
err_details);<br>
- } else {<br>
- lua_pushstring(L, err2msg(LJ_ERR_PROF_ISRUNNING));<br>
- }<br>
+ lua_pushstring(L, err2msg(LJ_ERR_PROF_ISRUNNING));<br>
lua_pushinteger(L, EINVAL);<br>
return 3;<br>
case PROFILE_ERRIO:<br>
</p>
<blockquote type="cite" cite="mid:Z7xqDHtLuS0NHxCe@root">
<pre wrap="" class="moz-quote-pre">
</pre>
<blockquote type="cite">
<pre wrap="" class="moz-quote-pre">+ lj_strfmt_pushf(L, "%s: %s", err2msg(LJ_ERR_PROF_MISUSE), err_details);
</pre>
</blockquote>
<pre wrap="" class="moz-quote-pre">
Typo: s/LJ_ERR_PROF_MISUSE/LJ_ERR_PROF_ISRUNNING/
Irrelevant, after fixing the comment above.</pre>
</blockquote>
Yep, irrelevant now.<br>
<blockquote type="cite" cite="mid:Z7xqDHtLuS0NHxCe@root">
<pre wrap="" class="moz-quote-pre">
</pre>
<blockquote type="cite">
<pre wrap="" class="moz-quote-pre">+ } else {
+ lua_pushstring(L, err2msg(LJ_ERR_PROF_ISRUNNING));
+ }
lua_pushinteger(L, EINVAL);
return 3;
case PROFILE_ERRIO:
@@ -291,15 +309,16 @@ LJLIB_CF(misc_sysprof_start)
</pre>
</blockquote>
<pre wrap="" class="moz-quote-pre">
<snipped>
</pre>
<blockquote type="cite">
<pre wrap="" class="moz-quote-pre">diff --git a/src/lj_errmsg.h b/src/lj_errmsg.h
index 19c41f0b..b5c3a275 100644
--- a/src/lj_errmsg.h
+++ b/src/lj_errmsg.h
@@ -188,6 +188,11 @@ ERRDEF(PROF_ISRUNNING, "profiler is running already")
ERRDEF(PROF_NOTRUNNING, "profiler is not running")
#endif
+ERRDEF(PROF_DETAILS_BADMODE, "profiler mode must be 'D', 'L' or 'C'")
+ERRDEF(PROF_DETAILS_BADINTERVAL, "profiler interval must be greater than 1")
+ERRDEF(PROF_DETAILS_BADPATH, "profiler path does not exist")
</pre>
</blockquote>
<pre wrap="" class="moz-quote-pre">
This should be something like the following:
| "profiler path should be a string"</pre>
</blockquote>
<p>Fixed:</p>
<p>--- a/src/lj_errmsg.h<br>
+++ b/src/lj_errmsg.h<br>
@@ -190,8 +190,7 @@ ERRDEF(PROF_NOTRUNNING, "profiler is not
running")<br>
<br>
ERRDEF(PROF_DETAILS_BADMODE, "profiler mode must be 'D', 'L' or
'C'")<br>
ERRDEF(PROF_DETAILS_BADINTERVAL, "profiler interval must be
greater than 1")<br>
-ERRDEF(PROF_DETAILS_BADPATH, "profiler path does not exist")<br>
-ERRDEF(PROF_DETAILS_BADTABLE, "profiler expects a table with
parameters")<br>
+ERRDEF(PROF_DETAILS_BADPATH, "profiler path should be a string")<br>
<br>
#undef ERRDEF<br>
</p>
<blockquote type="cite" cite="mid:Z7xqDHtLuS0NHxCe@root">
<pre wrap="" class="moz-quote-pre">
</pre>
<blockquote type="cite">
<pre wrap="" class="moz-quote-pre">+ERRDEF(PROF_DETAILS_BADTABLE, "profiler expects a table with parameters")
</pre>
</blockquote>
<pre wrap="" class="moz-quote-pre">
This errmsg is unused now and can be deleted.</pre>
</blockquote>
<p>Thanks, fixed:</p>
<p>--- a/src/lj_errmsg.h<br>
+++ b/src/lj_errmsg.h<br>
@@ -190,8 +190,7 @@ ERRDEF(PROF_NOTRUNNING, "profiler is not
running")<br>
<br>
ERRDEF(PROF_DETAILS_BADMODE, "profiler mode must be 'D', 'L' or
'C'")<br>
ERRDEF(PROF_DETAILS_BADINTERVAL, "profiler interval must be
greater than 1")<br>
-ERRDEF(PROF_DETAILS_BADPATH, "profiler path does not exist")<br>
-ERRDEF(PROF_DETAILS_BADTABLE, "profiler expects a table with
parameters")<br>
+ERRDEF(PROF_DETAILS_BADPATH, "profiler path should be a string")<br>
<br>
#undef ERRDEF</p>
<p>@@ -127,6 +127,13 @@ <a class="moz-txt-link-freetext" href="test:ok(res">test:ok(res</a> == nil and <a class="moz-txt-link-freetext" href="err:match(">err:match(</a>"No such
file or directory"),<br>
"result status and error with bad path")<br>
<a class="moz-txt-link-freetext" href="test:ok(type(errno)">test:ok(type(errno)</a> == "number", "errno with bad path")<br>
<br>
+-- Path is not a string.<br>
+res, err, errno = misc.sysprof.start({ mode = 'C', path = 190 })<br>
+test:ok(res == nil, "result status with path is not a string")<br>
+test:ok(<a class="moz-txt-link-freetext" href="err:match(">err:match(</a>"profiler path should be a string"),<br>
+ "err with path is not a string")<br>
+test:ok(type(errno) == "number", "errno with path is not a
string")<br>
+<br>
-- Bad interval.<br>
res, err, errno = misc.sysprof.start{ mode = "C", interval =
BAD_INTERVAL }<br>
<a class="moz-txt-link-freetext" href="test:is(res">test:is(res</a>, nil, "result status and error with bad interval")<br>
</p>
<blockquote type="cite" cite="mid:Z7xqDHtLuS0NHxCe@root">
<pre wrap="" class="moz-quote-pre">
</pre>
<blockquote type="cite">
<pre wrap="" class="moz-quote-pre">+
#undef ERRDEF
/* Detecting unused error messages:
diff --git a/test/tarantool-tests/profilers/misclib-sysprof-lapi.test.lua b/test/tarantool-tests/profilers/misclib-sysprof-lapi.test.lua
index 32fa384c..9915f565 100644
--- a/test/tarantool-tests/profilers/misclib-sysprof-lapi.test.lua
+++ b/test/tarantool-tests/profilers/misclib-sysprof-lapi.test.lua
</pre>
</blockquote>
<pre wrap="" class="moz-quote-pre">
<snipped>
</pre>
<blockquote type="cite">
<pre wrap="" class="moz-quote-pre">@@ -24,6 +24,8 @@ local profilename = require("utils").tools.profilename
local TMP_BINFILE = profilename("sysprofdata.tmp.bin")
local BAD_PATH = profilename("sysprofdata/tmp.bin")
+local BAD_MODE = "A"
+local BAD_INTERVAL = -1
</pre>
</blockquote>
<pre wrap="" class="moz-quote-pre">
Why do we need this definition for only one type of bad interval?
Let's consistently declare both of them like:
| local BAD_INTERVAL_M1 = -1
| local BAD_INTERVAL_0 = 0
Or don't declare them at all.
I'm OK with both variants.
</pre>
</blockquote>
<br>
<pre wrap="" class="moz-quote-pre">BAD_INTERVAL is used in two testcases therefore it is declared as constant.</pre>
<blockquote type="cite" cite="mid:Z7xqDHtLuS0NHxCe@root">
<pre wrap="" class="moz-quote-pre">
</pre>
<blockquote type="cite">
<pre wrap="" class="moz-quote-pre">
local function payload()
local function fib(n)
@@ -64,11 +66,44 @@ end
</pre>
</blockquote>
<pre wrap="" class="moz-quote-pre">
<snipped>
</pre>
<blockquote type="cite">
<pre wrap="" class="moz-quote-pre"> <a class="moz-txt-link-freetext" href="test:ok(type(errno)">test:ok(type(errno)</a> == "number", "errno with wrong profiling mode")
+-- Missed profiling mode.
+res, err, errno = misc.sysprof.start{}
+test:is(res, true, "res with missed profiling mode")
+test:is(err, nil, "no error with missed profiling mode")
+test:is(errno, nil, "no errno with missed profiling mode")
+assert(misc.sysprof.stop())
</pre>
</blockquote>
<pre wrap="" class="moz-quote-pre">
Minor: It would be nice to check that there is no default file created,
i.e., that we actually run the default profiler mode without stack
inspection. Feel free to ignore, through.
</pre>
</blockquote>
<p>Added:</p>
<p>@@ -77,6 +79,9 @@ res, err, errno = misc.sysprof.start{}<br>
<a class="moz-txt-link-freetext" href="test:is(res">test:is(res</a>, true, "res with missed profiling mode")<br>
<a class="moz-txt-link-freetext" href="test:is(err">test:is(err</a>, nil, "no error with missed profiling mode")<br>
<a class="moz-txt-link-freetext" href="test:is(errno">test:is(errno</a>, nil, "no errno with missed profiling mode")<br>
+local ok, err_msg = pcall(read_file, SYSPROF_DEFAULT_OUTPUT_FILE)<br>
+test:ok(ok == false and err_<a class="moz-txt-link-freetext" href="msg:match(">msg:match(</a>"cannot open a file"),<br>
+ "default output file is empty")<br>
assert(misc.sysprof.stop())<br>
<br>
-- Not a table.<br>
</p>
<blockquote type="cite" cite="mid:Z7xqDHtLuS0NHxCe@root">
<pre wrap="" class="moz-quote-pre">
</pre>
<blockquote type="cite">
<pre wrap="" class="moz-quote-pre">+
+-- Not a table.
+res, err, errno = pcall(misc.sysprof.start, "NOT A TABLE")
+print(res, err, errno)
</pre>
</blockquote>
<pre wrap="" class="moz-quote-pre">
Excess debug print.</pre>
</blockquote>
Removed, thanks!<br>
<blockquote type="cite" cite="mid:Z7xqDHtLuS0NHxCe@root">
<pre wrap="" class="moz-quote-pre">
</pre>
<blockquote type="cite">
<pre wrap="" class="moz-quote-pre">+test:is(res, false, "res with not a table")
+test:ok(<a class="moz-txt-link-freetext" href="err:match(">err:match(</a>"table expected, got string"),
+ "error with not a table")
+test:is(errno, nil, "errno with not a table")
</pre>
</blockquote>
<pre wrap="" class="moz-quote-pre">
There is no need to check or declare the `errno` variable. It's always
`nil` for the case when the error is raised.</pre>
</blockquote>
<p>The check is cheap, why not?</p>
<p><br>
</p>
<blockquote type="cite" cite="mid:Z7xqDHtLuS0NHxCe@root">
<pre wrap="" class="moz-quote-pre">
</pre>
<blockquote type="cite">
<pre wrap="" class="moz-quote-pre">+
+-- All parameters are invalid.
+res, err, errno = misc.sysprof.start({
+ mode = BAD_MODE, path = BAD_PATH, interval = BAD_INTERVAL })
+test:ok(res == nil, "res with all invalid parameters")
+test:ok(<a class="moz-txt-link-freetext" href="err:match(">err:match(</a>"profiler misuse: profiler mode must be 'D', 'L' or 'C'"),
+ "error with all invalid parameters")
+test:ok(type(errno) == "number", "errno with all invalid parameters")
+
+-- All parameters are invalid, except the first one.
+res, err, errno = misc.sysprof.start({
+ mode = "C", path = BAD_PATH, interval = BAD_INTERVAL })
+test:ok(res == nil, "res with all invalid parameters except the first one")
+test:ok(<a class="moz-txt-link-freetext" href="err:match(">err:match(</a>"profiler misuse: profiler interval must be greater than 1"),
+ "error with all invalid parameters except the first one")
+test:ok(type(errno) == "number",
+ "errno with all invalid parameters except the first one")
</pre>
</blockquote>
<pre wrap="" class="moz-quote-pre">
This is not exactly what I mean by invalid/partially invalid parameters
(sorry, for the bad wording):
I mean to add tests that cover the following calls:
| pcall(misc.sysprof.start, '', '', '') -- shouldn't started -- error
| -- (expected table got nil)
| misc.sysprof.start({}, '', '') -- should started with the default options
</pre>
</blockquote>
<p>Verbally decided to left these testcases with a comment:</p>
<p> <a class="moz-txt-link-freetext" href="test:is(res">test:is(res</a>, false, "res with not a table")<br>
<a class="moz-txt-link-freetext" href="test:ok(err:match(">test:ok(err:match(</a>"table expected, got string"),<br>
"error with not a table")<br>
<a class="moz-txt-link-freetext" href="test:is(errno">test:is(errno</a>, nil, "errno with not a table")<br>
<br>
--- All parameters are invalid.<br>
+-- All parameters are invalid. Check parameter validation order<br>
+-- (not strict documented behaviour).<br>
res, err, errno = misc.sysprof.start({<br>
mode = BAD_MODE, path = BAD_PATH, interval = BAD_INTERVAL })<br>
<a class="moz-txt-link-freetext" href="test:ok(res">test:ok(res</a> == nil, "res with all invalid parameters")<br>
@@ -95,7 +100,8 @@ <a class="moz-txt-link-freetext" href="test:ok(err:match(">test:ok(err:match(</a>"profiler misuse: profiler
mode must be 'D', 'L' or 'C'"),<br>
"error with all invalid parameters")<br>
<a class="moz-txt-link-freetext" href="test:ok(type(errno)">test:ok(type(errno)</a> == "number", "errno with all invalid
parameters")<br>
<br>
--- All parameters are invalid, except the first one.<br>
+-- All parameters are invalid, except the first one. Check<br>
+-- parameter validation order (not strict documented behaviour).<br>
res, err, errno = misc.sysprof.start({<br>
mode = "C", path = BAD_PATH, interval = BAD_INTERVAL })<br>
<a class="moz-txt-link-freetext" href="test:ok(res">test:ok(res</a> == nil, "res with all invalid parameters except the
first one")<br>
</p>
<br>
<blockquote type="cite" cite="mid:Z7xqDHtLuS0NHxCe@root">
<blockquote type="cite">
<pre wrap="" class="moz-quote-pre">+
-- Already running.
res, err = misc.sysprof.start{ mode = "D" }
assert(res, err)
@@ -93,11 +128,30 @@ <a class="moz-txt-link-freetext" href="test:ok(res">test:ok(res</a> == nil and <a class="moz-txt-link-freetext" href="err:match(">err:match(</a>"No such file or directory"),
<a class="moz-txt-link-freetext" href="test:ok(type(errno)">test:ok(type(errno)</a> == "number", "errno with bad path")
-- Bad interval.
-res, err, errno = misc.sysprof.start{ mode = "C", interval = -1 }
-test:ok(res == nil and <a class="moz-txt-link-freetext" href="err:match(">err:match(</a>"profiler misuse"),
- "result status and error with bad interval")
+res, err, errno = misc.sysprof.start{ mode = "C", interval = BAD_INTERVAL }
</pre>
</blockquote>
<pre wrap="" class="moz-quote-pre">
Side note: See my comments about this constant above.</pre>
</blockquote>
decided to left as is<br>
<blockquote type="cite" cite="mid:Z7xqDHtLuS0NHxCe@root">
<pre wrap="" class="moz-quote-pre">
</pre>
<blockquote type="cite">
<pre wrap="" class="moz-quote-pre">+test:is(res, nil, "result status and error with bad interval")
+test:ok(<a class="moz-txt-link-freetext" href="err:match(">err:match(</a>"profiler interval must be greater than 1"),
+ "error with bad interval")
<a class="moz-txt-link-freetext" href="test:ok(type(errno)">test:ok(type(errno)</a> == "number", "errno with bad interval")
+-- Bad interval (0).
+res, err, errno = misc.sysprof.start{ mode = "C", interval = 0 }
+test:ok(res == nil, "res with bad interval 0")
+test:ok(<a class="moz-txt-link-freetext" href="err:match(">err:match(</a>"profiler interval must be greater than 1"),
+ "error with bad interval 0")
+test:ok(type(errno) == "number", "errno with bad interval 0")
+
+-- Good interval (1).
+res, err, errno = misc.sysprof.start{
+ mode = "C",
+ interval = 1,
+ path = "/dev/null",
+}
+test:is(res, true, "res with good interval 1")
+test:is(err, nil, "no error with good interval 1")
+test:is(errno, nil, "no errno with good interval 1")
+misc.sysprof.stop()
+
-- DEFAULT MODE
if not pcall(generate_output, { mode = "D", interval = 100 }) then
--
2.43.0
</pre>
</blockquote>
<pre wrap="" class="moz-quote-pre">
</pre>
</blockquote>
</body>
<lt-container></lt-container>
</html>