diff --git a/src/lua/argparse.lua b/src/lua/argparse.lua index 84d9d4cd1e2f5cc463da6d16e7bc23e14d2d7750..1471d58460970f50260f2317772ae1545dc57c1b 100644 --- a/src/lua/argparse.lua +++ b/src/lua/argparse.lua @@ -31,12 +31,20 @@ local function convert_parameter_simple(name, convert_from, convert_to) end return converted elseif convert_to == 'boolean' then - if type(convert_from) ~= 'boolean' then - error( - ('Bad input for parameter "%s". Expected boolean, got "%s"') - :format(name, convert_from) - ) + if type(convert_from) == 'boolean' then + return convert_from + end + convert_from = string.lower(convert_from) + if convert_from == '0' or convert_from == 'false' then + return false end + if convert_from == '1' or convert_from == 'true' then + return true + end + error( + ('Bad input for parameter "%s". Expected boolean, got "%s"') + :format(name, convert_from) + ) elseif convert_to == 'string' then if type(convert_from) ~= 'string' then error( diff --git a/test/app/argparse.result b/test/app/argparse.result index 739ce34f7d495cda95ed7c5cf3337bd09fb3defe..d57693bc2661b3efe77b12c5114044ae71a4f5ad 100644 --- a/test/app/argparse.result +++ b/test/app/argparse.result @@ -1,4 +1,11 @@ -- internal argparse test +test_run = require('test_run').new() +--- +... +test_run:cmd("push filter ".."'\\.lua.*:[0-9]+: ' to '.lua:<line>\"]: '") +--- +- true +... argparse = require('internal.argparse').parse --- ... @@ -92,7 +99,7 @@ argparse({'tarantoolctl', 'start', 'instance', '--start', 'lalochka'}) ... argparse({'tarantoolctl', 'start', 'instance', '--start', '--', 'lalochka'}) --- -- error: 'builtin/internal.argparse.lua:105: bad argument #5: ID not valid' +- error: 'builtin/internal.argparse.lua:<line>"]: bad argument #5: ID not valid' ... argparse({'tarantoolctl', 'start', 'instance', '--start', '-', 'lalochka'}) --- @@ -130,17 +137,17 @@ argparse({'--verh=42'}, {'verh'}) ... argparse({'--verh=42'}, {{'verh', 'boolean'}}) --- -- error: 'builtin/internal.argparse.lua:35: Bad input for parameter "verh". Expected +- error: 'builtin/internal.argparse.lua:<line>"]: Bad input for parameter "verh". Expected boolean, got "42"' ... argparse({'--verh=42'}, {{'verh', 'boolean+'}}) --- -- error: 'builtin/internal.argparse.lua:35: Bad input for parameter "verh". Expected +- error: 'builtin/internal.argparse.lua:<line>"]: Bad input for parameter "verh". Expected boolean, got "42"' ... argparse({'--verh=42'}, {'niz'}) --- -- error: 'builtin/internal.argparse.lua:142: unknown options: verh' +- error: 'builtin/internal.argparse.lua:<line>"]: unknown options: verh' ... argparse({'--super-option'}) --- @@ -156,3 +163,7 @@ argparse({'tarantoolctl', 'start', 'instance', '--start=lalochka', 'option', '-' 6: another option start: lalochka ... +test_run:cmd("clear filter") +--- +- true +... diff --git a/test/app/argparse.test.lua b/test/app/argparse.test.lua index 78b24b962343ea0b490f5df1a7b1829fb45a3e63..97c05049bbb91e323e04b5b06dc72a239ffcf14d 100644 --- a/test/app/argparse.test.lua +++ b/test/app/argparse.test.lua @@ -1,4 +1,6 @@ -- internal argparse test +test_run = require('test_run').new() +test_run:cmd("push filter ".."'\\.lua.*:[0-9]+: ' to '.lua:<line>\"]: '") argparse = require('internal.argparse').parse @@ -28,3 +30,5 @@ argparse({'--verh=42'}, {{'verh', 'boolean+'}}) argparse({'--verh=42'}, {'niz'}) argparse({'--super-option'}) argparse({'tarantoolctl', 'start', 'instance', '--start=lalochka', 'option', '-', 'another option'}) + +test_run:cmd("clear filter") diff --git a/test/app/gh-4076-argparse-wrong-bool-handling.result b/test/app/gh-4076-argparse-wrong-bool-handling.result new file mode 100644 index 0000000000000000000000000000000000000000..91895b9ed986db9eadd72d7674c16b6730420fec --- /dev/null +++ b/test/app/gh-4076-argparse-wrong-bool-handling.result @@ -0,0 +1,58 @@ +-- test-run result file version 2 +test_run = require('test_run').new() + | --- + | ... +test_run:cmd("push filter ".."'\\.lua.*:[0-9]+: ' to '.lua:<line>\"]: '") + | --- + | - true + | ... +argparse = require('internal.argparse').parse + | --- + | ... +-- +-- gh-4076: argparse incorrectly processed boolean parameters, +-- that led to problems with tarantoolctl usage. +-- +params = {} + | --- + | ... +params[1] = {'flag1', 'boolean'} + | --- + | ... +params[2] = {'flag2', 'boolean'} + | --- + | ... +params[3] = {'flag3', 'boolean'} + | --- + | ... +params[4] = {'flag4', 'boolean'} + | --- + | ... +params[5] = {'flag5', 'boolean'} + | --- + | ... +args = {'--flag1', 'true', '--flag2', '1', '--flag3', 'false', '--flag4', '0', '--flag5', 'TrUe'} + | --- + | ... +argparse(args, params) + | --- + | - flag4: false + | flag1: true + | flag5: true + | flag2: true + | flag3: false + | ... + +args = {'--flag1', 'abc'} + | --- + | ... +argparse(args, params) + | --- + | - error: 'builtin/internal.argparse.lua:<line>"]: Bad input for parameter "flag1". Expected + | boolean, got "abc"' + | ... + +test_run:cmd("clear filter") + | --- + | - true + | ... diff --git a/test/app/gh-4076-argparse-wrong-bool-handling.test.lua b/test/app/gh-4076-argparse-wrong-bool-handling.test.lua new file mode 100644 index 0000000000000000000000000000000000000000..abd6c6927a115fdbf86ba0e8201e908abad0ffa6 --- /dev/null +++ b/test/app/gh-4076-argparse-wrong-bool-handling.test.lua @@ -0,0 +1,20 @@ +test_run = require('test_run').new() +test_run:cmd("push filter ".."'\\.lua.*:[0-9]+: ' to '.lua:<line>\"]: '") +argparse = require('internal.argparse').parse +-- +-- gh-4076: argparse incorrectly processed boolean parameters, +-- that led to problems with tarantoolctl usage. +-- +params = {} +params[1] = {'flag1', 'boolean'} +params[2] = {'flag2', 'boolean'} +params[3] = {'flag3', 'boolean'} +params[4] = {'flag4', 'boolean'} +params[5] = {'flag5', 'boolean'} +args = {'--flag1', 'true', '--flag2', '1', '--flag3', 'false', '--flag4', '0', '--flag5', 'TrUe'} +argparse(args, params) + +args = {'--flag1', 'abc'} +argparse(args, params) + +test_run:cmd("clear filter")