1*2d9fd380Sjfb8856606#!/usr/bin/env python3
24418919fSjohnjiang# SPDX-License-Identifier: BSD-3-Clause
34418919fSjohnjiang# Copyright(c) 2010-2014 Intel Corporation
44418919fSjohnjiang
54418919fSjohnjiang# collection of static data
64418919fSjohnjiang
74418919fSjohnjiang# keycode constants
84418919fSjohnjiangCTRL_A = chr(1)
94418919fSjohnjiangCTRL_B = chr(2)
104418919fSjohnjiangCTRL_C = chr(3)
114418919fSjohnjiangCTRL_D = chr(4)
124418919fSjohnjiangCTRL_E = chr(5)
134418919fSjohnjiangCTRL_F = chr(6)
144418919fSjohnjiangCTRL_K = chr(11)
154418919fSjohnjiangCTRL_L = chr(12)
164418919fSjohnjiangCTRL_N = chr(14)
174418919fSjohnjiangCTRL_P = chr(16)
184418919fSjohnjiangCTRL_W = chr(23)
194418919fSjohnjiangCTRL_Y = chr(25)
204418919fSjohnjiangALT_B = chr(27) + chr(98)
214418919fSjohnjiangALT_D = chr(27) + chr(100)
224418919fSjohnjiangALT_F = chr(27) + chr(102)
234418919fSjohnjiangALT_BKSPACE = chr(27) + chr(127)
244418919fSjohnjiangDEL = chr(27) + chr(91) + chr(51) + chr(126)
254418919fSjohnjiangTAB = chr(9)
264418919fSjohnjiangHELP = chr(63)
274418919fSjohnjiangBKSPACE = chr(127)
284418919fSjohnjiangRIGHT = chr(27) + chr(91) + chr(67)
294418919fSjohnjiangDOWN = chr(27) + chr(91) + chr(66)
304418919fSjohnjiangLEFT = chr(27) + chr(91) + chr(68)
314418919fSjohnjiangUP = chr(27) + chr(91) + chr(65)
324418919fSjohnjiangENTER2 = '\r'
334418919fSjohnjiangENTER = '\n'
344418919fSjohnjiang
354418919fSjohnjiang# expected result constants
364418919fSjohnjiangNOT_FOUND = "Command not found"
374418919fSjohnjiangBAD_ARG = "Bad arguments"
384418919fSjohnjiangAMBIG = "Ambiguous command"
394418919fSjohnjiangCMD1 = "Command 1 parsed!"
404418919fSjohnjiangCMD2 = "Command 2 parsed!"
414418919fSjohnjiangSINGLE = "Single word command parsed!"
424418919fSjohnjiangSINGLE_LONG = "Single long word command parsed!"
434418919fSjohnjiangAUTO1 = "Autocomplete command 1 parsed!"
444418919fSjohnjiangAUTO2 = "Autocomplete command 2 parsed!"
454418919fSjohnjiang
464418919fSjohnjiang# misc defines
474418919fSjohnjiangCMD_QUIT = "quit"
484418919fSjohnjiangCMD_GET_BUFSIZE = "get_history_bufsize"
494418919fSjohnjiangBUFSIZE_TEMPLATE = "History buffer size: "
504418919fSjohnjiangPROMPT = "CMDLINE_TEST>>"
514418919fSjohnjiang
524418919fSjohnjiang# test defines
534418919fSjohnjiang# each test tests progressively diverse set of keys. this way for example
544418919fSjohnjiang# if we want to use some key sequence in the test, we first need to test
554418919fSjohnjiang# that it itself does what it is expected to do. Most of the tests are
564418919fSjohnjiang# designed that way.
574418919fSjohnjiang#
584418919fSjohnjiang# example: "arrows & delete test 1". we enter a partially valid command,
594418919fSjohnjiang# then move 3 chars left and use delete three times. this way we get to
604418919fSjohnjiang# know that "delete", "left" and "ctrl+B" all work (because if any of
614418919fSjohnjiang# them fails, the whole test will fail and next tests won't be run).
624418919fSjohnjiang#
634418919fSjohnjiang# each test consists of name, character sequence to send to child,
644418919fSjohnjiang# and expected output (if any).
654418919fSjohnjiang
664418919fSjohnjiangtests = [
674418919fSjohnjiang    # test basic commands
684418919fSjohnjiang    {"Name": "command test 1",
694418919fSjohnjiang     "Sequence": "ambiguous first" + ENTER,
704418919fSjohnjiang     "Result": CMD1},
714418919fSjohnjiang    {"Name": "command test 2",
724418919fSjohnjiang     "Sequence": "ambiguous second" + ENTER,
734418919fSjohnjiang     "Result": CMD2},
744418919fSjohnjiang    {"Name": "command test 3",
754418919fSjohnjiang     "Sequence": "ambiguous ambiguous" + ENTER,
764418919fSjohnjiang     "Result": AMBIG},
774418919fSjohnjiang    {"Name": "command test 4",
784418919fSjohnjiang     "Sequence": "ambiguous ambiguous2" + ENTER,
794418919fSjohnjiang     "Result": AMBIG},
804418919fSjohnjiang
814418919fSjohnjiang    {"Name": "invalid command test 1",
824418919fSjohnjiang     "Sequence": "ambiguous invalid" + ENTER,
834418919fSjohnjiang     "Result": BAD_ARG},
844418919fSjohnjiang    # test invalid commands
854418919fSjohnjiang    {"Name": "invalid command test 2",
864418919fSjohnjiang     "Sequence": "invalid" + ENTER,
874418919fSjohnjiang     "Result": NOT_FOUND},
884418919fSjohnjiang    {"Name": "invalid command test 3",
894418919fSjohnjiang     "Sequence": "ambiguousinvalid" + ENTER2,
904418919fSjohnjiang     "Result": NOT_FOUND},
914418919fSjohnjiang
924418919fSjohnjiang    # test arrows and deletes
934418919fSjohnjiang    {"Name": "arrows & delete test 1",
944418919fSjohnjiang     "Sequence": "singlebad" + LEFT*2 + CTRL_B + DEL*3 + ENTER,
954418919fSjohnjiang     "Result": SINGLE},
964418919fSjohnjiang    {"Name": "arrows & delete test 2",
974418919fSjohnjiang     "Sequence": "singlebad" + LEFT*5 + RIGHT + CTRL_F + DEL*3 + ENTER,
984418919fSjohnjiang     "Result": SINGLE},
994418919fSjohnjiang
1004418919fSjohnjiang    # test backspace
1014418919fSjohnjiang    {"Name": "backspace test",
1024418919fSjohnjiang     "Sequence": "singlebad" + BKSPACE*3 + ENTER,
1034418919fSjohnjiang     "Result": SINGLE},
1044418919fSjohnjiang
1054418919fSjohnjiang    # test goto left and goto right
1064418919fSjohnjiang    {"Name": "goto left test",
1074418919fSjohnjiang     "Sequence": "biguous first" + CTRL_A + "am" + ENTER,
1084418919fSjohnjiang     "Result": CMD1},
1094418919fSjohnjiang    {"Name": "goto right test",
1104418919fSjohnjiang     "Sequence": "biguous fir" + CTRL_A + "am" + CTRL_E + "st" + ENTER,
1114418919fSjohnjiang     "Result": CMD1},
1124418919fSjohnjiang
1134418919fSjohnjiang    # test goto words
1144418919fSjohnjiang    {"Name": "goto left word test",
1154418919fSjohnjiang     "Sequence": "ambiguous st" + ALT_B + "fir" + ENTER,
1164418919fSjohnjiang     "Result": CMD1},
1174418919fSjohnjiang    {"Name": "goto right word test",
1184418919fSjohnjiang     "Sequence": "ambig first" + CTRL_A + ALT_F + "uous" + ENTER,
1194418919fSjohnjiang     "Result": CMD1},
1204418919fSjohnjiang
1214418919fSjohnjiang    # test removing words
1224418919fSjohnjiang    {"Name": "remove left word 1",
1234418919fSjohnjiang     "Sequence": "single invalid" + CTRL_W + ENTER,
1244418919fSjohnjiang     "Result": SINGLE},
1254418919fSjohnjiang    {"Name": "remove left word 2",
1264418919fSjohnjiang     "Sequence": "single invalid" + ALT_BKSPACE + ENTER,
1274418919fSjohnjiang     "Result": SINGLE},
1284418919fSjohnjiang    {"Name": "remove right word",
1294418919fSjohnjiang     "Sequence": "single invalid" + ALT_B + ALT_D + ENTER,
1304418919fSjohnjiang     "Result": SINGLE},
1314418919fSjohnjiang
1324418919fSjohnjiang    # test kill buffer (copy and paste)
1334418919fSjohnjiang    {"Name": "killbuffer test 1",
1344418919fSjohnjiang     "Sequence": "ambiguous" + CTRL_A + CTRL_K + " first" + CTRL_A +
1354418919fSjohnjiang                 CTRL_Y + ENTER,
1364418919fSjohnjiang     "Result": CMD1},
1374418919fSjohnjiang    {"Name": "killbuffer test 2",
1384418919fSjohnjiang     "Sequence": "ambiguous" + CTRL_A + CTRL_K + CTRL_Y*26 + ENTER,
1394418919fSjohnjiang     "Result": NOT_FOUND},
1404418919fSjohnjiang
1414418919fSjohnjiang    # test newline
1424418919fSjohnjiang    {"Name": "newline test",
1434418919fSjohnjiang     "Sequence": "invalid" + CTRL_C + "single" + ENTER,
1444418919fSjohnjiang     "Result": SINGLE},
1454418919fSjohnjiang
1464418919fSjohnjiang    # test redisplay (nothing should really happen)
1474418919fSjohnjiang    {"Name": "redisplay test",
1484418919fSjohnjiang     "Sequence": "single" + CTRL_L + ENTER,
1494418919fSjohnjiang     "Result": SINGLE},
1504418919fSjohnjiang
1514418919fSjohnjiang    # test autocomplete
1524418919fSjohnjiang    {"Name": "autocomplete test 1",
1534418919fSjohnjiang     "Sequence": "si" + TAB + ENTER,
1544418919fSjohnjiang     "Result": SINGLE},
1554418919fSjohnjiang    {"Name": "autocomplete test 2",
1564418919fSjohnjiang     "Sequence": "si" + TAB + "_" + TAB + ENTER,
1574418919fSjohnjiang     "Result": SINGLE_LONG},
1584418919fSjohnjiang    {"Name": "autocomplete test 3",
1594418919fSjohnjiang     "Sequence": "in" + TAB + ENTER,
1604418919fSjohnjiang     "Result": NOT_FOUND},
1614418919fSjohnjiang    {"Name": "autocomplete test 4",
1624418919fSjohnjiang     "Sequence": "am" + TAB + ENTER,
1634418919fSjohnjiang     "Result": BAD_ARG},
1644418919fSjohnjiang    {"Name": "autocomplete test 5",
1654418919fSjohnjiang     "Sequence": "am" + TAB + "fir" + TAB + ENTER,
1664418919fSjohnjiang     "Result": CMD1},
1674418919fSjohnjiang    {"Name": "autocomplete test 6",
1684418919fSjohnjiang     "Sequence": "am" + TAB + "fir" + TAB + TAB + ENTER,
1694418919fSjohnjiang     "Result": CMD1},
1704418919fSjohnjiang    {"Name": "autocomplete test 7",
1714418919fSjohnjiang     "Sequence": "am" + TAB + "fir" + TAB + " " + TAB + ENTER,
1724418919fSjohnjiang     "Result": CMD1},
1734418919fSjohnjiang    {"Name": "autocomplete test 8",
1744418919fSjohnjiang     "Sequence": "am" + TAB + "     am" + TAB + "   " + ENTER,
1754418919fSjohnjiang     "Result": AMBIG},
1764418919fSjohnjiang    {"Name": "autocomplete test 9",
1774418919fSjohnjiang     "Sequence": "am" + TAB + "inv" + TAB + ENTER,
1784418919fSjohnjiang     "Result": BAD_ARG},
1794418919fSjohnjiang    {"Name": "autocomplete test 10",
1804418919fSjohnjiang     "Sequence": "au" + TAB + ENTER,
1814418919fSjohnjiang     "Result": NOT_FOUND},
1824418919fSjohnjiang    {"Name": "autocomplete test 11",
1834418919fSjohnjiang     "Sequence": "au" + TAB + "1" + ENTER,
1844418919fSjohnjiang     "Result": AUTO1},
1854418919fSjohnjiang    {"Name": "autocomplete test 12",
1864418919fSjohnjiang     "Sequence": "au" + TAB + "2" + ENTER,
1874418919fSjohnjiang     "Result": AUTO2},
1884418919fSjohnjiang    {"Name": "autocomplete test 13",
1894418919fSjohnjiang     "Sequence": "au" + TAB + "2" + TAB + ENTER,
1904418919fSjohnjiang     "Result": AUTO2},
1914418919fSjohnjiang    {"Name": "autocomplete test 14",
1924418919fSjohnjiang     "Sequence": "au" + TAB + "2   " + TAB + ENTER,
1934418919fSjohnjiang     "Result": AUTO2},
1944418919fSjohnjiang    {"Name": "autocomplete test 15",
1954418919fSjohnjiang     "Sequence": "24" + TAB + ENTER,
1964418919fSjohnjiang     "Result": "24"},
1974418919fSjohnjiang
1984418919fSjohnjiang    # test history
1994418919fSjohnjiang    {"Name": "history test 1",
2004418919fSjohnjiang     "Sequence": "invalid" + ENTER + "single" + ENTER + "invalid" +
2014418919fSjohnjiang                 ENTER + UP + CTRL_P + ENTER,
2024418919fSjohnjiang     "Result": SINGLE},
2034418919fSjohnjiang    {"Name": "history test 2",
2044418919fSjohnjiang     "Sequence": "invalid" + ENTER + "ambiguous first" + ENTER + "invalid" +
2054418919fSjohnjiang                 ENTER + "single" + ENTER + UP * 3 + CTRL_N + DOWN + ENTER,
2064418919fSjohnjiang     "Result": SINGLE},
2074418919fSjohnjiang
2084418919fSjohnjiang    #
2094418919fSjohnjiang    # tests that improve coverage
2104418919fSjohnjiang    #
2114418919fSjohnjiang
2124418919fSjohnjiang    # empty space tests
2134418919fSjohnjiang    {"Name": "empty space test 1",
2144418919fSjohnjiang     "Sequence": RIGHT + LEFT + CTRL_B + CTRL_F + ENTER,
2154418919fSjohnjiang     "Result": PROMPT},
2164418919fSjohnjiang    {"Name": "empty space test 2",
2174418919fSjohnjiang     "Sequence": BKSPACE + ENTER,
2184418919fSjohnjiang     "Result": PROMPT},
2194418919fSjohnjiang    {"Name": "empty space test 3",
2204418919fSjohnjiang     "Sequence": CTRL_E*2 + CTRL_A*2 + ENTER,
2214418919fSjohnjiang     "Result": PROMPT},
2224418919fSjohnjiang    {"Name": "empty space test 4",
2234418919fSjohnjiang     "Sequence": ALT_F*2 + ALT_B*2 + ENTER,
2244418919fSjohnjiang     "Result": PROMPT},
2254418919fSjohnjiang    {"Name": "empty space test 5",
2264418919fSjohnjiang     "Sequence": " " + CTRL_E*2 + CTRL_A*2 + ENTER,
2274418919fSjohnjiang     "Result": PROMPT},
2284418919fSjohnjiang    {"Name": "empty space test 6",
2294418919fSjohnjiang     "Sequence": " " + CTRL_A + ALT_F*2 + ALT_B*2 + ENTER,
2304418919fSjohnjiang     "Result": PROMPT},
2314418919fSjohnjiang    {"Name": "empty space test 7",
2324418919fSjohnjiang     "Sequence": "  " + CTRL_A + CTRL_D + CTRL_E + CTRL_D + ENTER,
2334418919fSjohnjiang     "Result": PROMPT},
2344418919fSjohnjiang    {"Name": "empty space test 8",
2354418919fSjohnjiang     "Sequence": " space" + CTRL_W*2 + ENTER,
2364418919fSjohnjiang     "Result": PROMPT},
2374418919fSjohnjiang    {"Name": "empty space test 9",
2384418919fSjohnjiang     "Sequence": " space" + ALT_BKSPACE*2 + ENTER,
2394418919fSjohnjiang     "Result": PROMPT},
2404418919fSjohnjiang    {"Name": "empty space test 10",
2414418919fSjohnjiang     "Sequence": " space " + CTRL_A + ALT_D*3 + ENTER,
2424418919fSjohnjiang     "Result": PROMPT},
2434418919fSjohnjiang
2444418919fSjohnjiang    # non-printable char tests
2454418919fSjohnjiang    {"Name": "non-printable test 1",
2464418919fSjohnjiang     "Sequence": chr(27) + chr(47) + ENTER,
2474418919fSjohnjiang     "Result": PROMPT},
2484418919fSjohnjiang    {"Name": "non-printable test 2",
2494418919fSjohnjiang     "Sequence": chr(27) + chr(128) + ENTER*7,
2504418919fSjohnjiang     "Result": PROMPT},
2514418919fSjohnjiang    {"Name": "non-printable test 3",
2524418919fSjohnjiang     "Sequence": chr(27) + chr(91) + chr(127) + ENTER*6,
2534418919fSjohnjiang     "Result": PROMPT},
2544418919fSjohnjiang
2554418919fSjohnjiang    # miscellaneous tests
2564418919fSjohnjiang    {"Name": "misc test 1",
2574418919fSjohnjiang     "Sequence": ENTER,
2584418919fSjohnjiang     "Result": PROMPT},
2594418919fSjohnjiang    {"Name": "misc test 2",
2604418919fSjohnjiang     "Sequence": "single #comment" + ENTER,
2614418919fSjohnjiang     "Result": SINGLE},
2624418919fSjohnjiang    {"Name": "misc test 3",
2634418919fSjohnjiang     "Sequence": "#empty line" + ENTER,
2644418919fSjohnjiang     "Result": PROMPT},
2654418919fSjohnjiang    {"Name": "misc test 4",
2664418919fSjohnjiang     "Sequence": "   single  " + ENTER,
2674418919fSjohnjiang     "Result": SINGLE},
2684418919fSjohnjiang    {"Name": "misc test 5",
2694418919fSjohnjiang     "Sequence": "single#" + ENTER,
2704418919fSjohnjiang     "Result": SINGLE},
2714418919fSjohnjiang    {"Name": "misc test 6",
2724418919fSjohnjiang     "Sequence": 'a' * 257 + ENTER,
2734418919fSjohnjiang     "Result": NOT_FOUND},
2744418919fSjohnjiang    {"Name": "misc test 7",
2754418919fSjohnjiang     "Sequence": "clear_history" + UP*5 + DOWN*5 + ENTER,
2764418919fSjohnjiang     "Result": PROMPT},
2774418919fSjohnjiang    {"Name": "misc test 8",
2784418919fSjohnjiang     "Sequence": "a" + HELP + CTRL_C,
2794418919fSjohnjiang     "Result": PROMPT},
2804418919fSjohnjiang    {"Name": "misc test 9",
2814418919fSjohnjiang     "Sequence": CTRL_D*3,
2824418919fSjohnjiang     "Result": None},
2834418919fSjohnjiang]
284