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