1#!/usr/bin/env python3 2# SPDX-License-Identifier: BSD-3-Clause 3# Copyright(c) 2010-2014 Intel Corporation 4 5# collection of static data 6 7# keycode constants 8CTRL_A = chr(1) 9CTRL_B = chr(2) 10CTRL_C = chr(3) 11CTRL_D = chr(4) 12CTRL_E = chr(5) 13CTRL_F = chr(6) 14CTRL_K = chr(11) 15CTRL_L = chr(12) 16CTRL_N = chr(14) 17CTRL_P = chr(16) 18CTRL_W = chr(23) 19CTRL_Y = chr(25) 20ALT_B = chr(27) + chr(98) 21ALT_D = chr(27) + chr(100) 22ALT_F = chr(27) + chr(102) 23ALT_BKSPACE = chr(27) + chr(127) 24DEL = chr(27) + chr(91) + chr(51) + chr(126) 25TAB = chr(9) 26HELP = chr(63) 27BKSPACE = chr(127) 28RIGHT = chr(27) + chr(91) + chr(67) 29DOWN = chr(27) + chr(91) + chr(66) 30LEFT = chr(27) + chr(91) + chr(68) 31UP = chr(27) + chr(91) + chr(65) 32ENTER2 = '\r' 33ENTER = '\n' 34 35# expected result constants 36NOT_FOUND = "Command not found" 37BAD_ARG = "Bad arguments" 38AMBIG = "Ambiguous command" 39CMD1 = "Command 1 parsed!" 40CMD2 = "Command 2 parsed!" 41SINGLE = "Single word command parsed!" 42SINGLE_LONG = "Single long word command parsed!" 43AUTO1 = "Autocomplete command 1 parsed!" 44AUTO2 = "Autocomplete command 2 parsed!" 45 46# misc defines 47CMD_QUIT = "quit" 48CMD_GET_BUFSIZE = "get_history_bufsize" 49BUFSIZE_TEMPLATE = "History buffer size: " 50PROMPT = "CMDLINE_TEST>>" 51 52# test defines 53# each test tests progressively diverse set of keys. this way for example 54# if we want to use some key sequence in the test, we first need to test 55# that it itself does what it is expected to do. Most of the tests are 56# designed that way. 57# 58# example: "arrows & delete test 1". we enter a partially valid command, 59# then move 3 chars left and use delete three times. this way we get to 60# know that "delete", "left" and "ctrl+B" all work (because if any of 61# them fails, the whole test will fail and next tests won't be run). 62# 63# each test consists of name, character sequence to send to child, 64# and expected output (if any). 65 66tests = [ 67 # test basic commands 68 {"Name": "command test 1", 69 "Sequence": "ambiguous first" + ENTER, 70 "Result": CMD1}, 71 {"Name": "command test 2", 72 "Sequence": "ambiguous second" + ENTER, 73 "Result": CMD2}, 74 {"Name": "command test 3", 75 "Sequence": "ambiguous ambiguous" + ENTER, 76 "Result": AMBIG}, 77 {"Name": "command test 4", 78 "Sequence": "ambiguous ambiguous2" + ENTER, 79 "Result": AMBIG}, 80 81 {"Name": "invalid command test 1", 82 "Sequence": "ambiguous invalid" + ENTER, 83 "Result": BAD_ARG}, 84 # test invalid commands 85 {"Name": "invalid command test 2", 86 "Sequence": "invalid" + ENTER, 87 "Result": NOT_FOUND}, 88 {"Name": "invalid command test 3", 89 "Sequence": "ambiguousinvalid" + ENTER2, 90 "Result": NOT_FOUND}, 91 92 # test arrows and deletes 93 {"Name": "arrows & delete test 1", 94 "Sequence": "singlebad" + LEFT*2 + CTRL_B + DEL*3 + ENTER, 95 "Result": SINGLE}, 96 {"Name": "arrows & delete test 2", 97 "Sequence": "singlebad" + LEFT*5 + RIGHT + CTRL_F + DEL*3 + ENTER, 98 "Result": SINGLE}, 99 100 # test backspace 101 {"Name": "backspace test", 102 "Sequence": "singlebad" + BKSPACE*3 + ENTER, 103 "Result": SINGLE}, 104 105 # test goto left and goto right 106 {"Name": "goto left test", 107 "Sequence": "biguous first" + CTRL_A + "am" + ENTER, 108 "Result": CMD1}, 109 {"Name": "goto right test", 110 "Sequence": "biguous fir" + CTRL_A + "am" + CTRL_E + "st" + ENTER, 111 "Result": CMD1}, 112 113 # test goto words 114 {"Name": "goto left word test", 115 "Sequence": "ambiguous st" + ALT_B + "fir" + ENTER, 116 "Result": CMD1}, 117 {"Name": "goto right word test", 118 "Sequence": "ambig first" + CTRL_A + ALT_F + "uous" + ENTER, 119 "Result": CMD1}, 120 121 # test removing words 122 {"Name": "remove left word 1", 123 "Sequence": "single invalid" + CTRL_W + ENTER, 124 "Result": SINGLE}, 125 {"Name": "remove left word 2", 126 "Sequence": "single invalid" + ALT_BKSPACE + ENTER, 127 "Result": SINGLE}, 128 {"Name": "remove right word", 129 "Sequence": "single invalid" + ALT_B + ALT_D + ENTER, 130 "Result": SINGLE}, 131 132 # test kill buffer (copy and paste) 133 {"Name": "killbuffer test 1", 134 "Sequence": "ambiguous" + CTRL_A + CTRL_K + " first" + CTRL_A + 135 CTRL_Y + ENTER, 136 "Result": CMD1}, 137 {"Name": "killbuffer test 2", 138 "Sequence": "ambiguous" + CTRL_A + CTRL_K + CTRL_Y*26 + ENTER, 139 "Result": NOT_FOUND}, 140 141 # test newline 142 {"Name": "newline test", 143 "Sequence": "invalid" + CTRL_C + "single" + ENTER, 144 "Result": SINGLE}, 145 146 # test redisplay (nothing should really happen) 147 {"Name": "redisplay test", 148 "Sequence": "single" + CTRL_L + ENTER, 149 "Result": SINGLE}, 150 151 # test autocomplete 152 {"Name": "autocomplete test 1", 153 "Sequence": "si" + TAB + ENTER, 154 "Result": SINGLE}, 155 {"Name": "autocomplete test 2", 156 "Sequence": "si" + TAB + "_" + TAB + ENTER, 157 "Result": SINGLE_LONG}, 158 {"Name": "autocomplete test 3", 159 "Sequence": "in" + TAB + ENTER, 160 "Result": NOT_FOUND}, 161 {"Name": "autocomplete test 4", 162 "Sequence": "am" + TAB + ENTER, 163 "Result": BAD_ARG}, 164 {"Name": "autocomplete test 5", 165 "Sequence": "am" + TAB + "fir" + TAB + ENTER, 166 "Result": CMD1}, 167 {"Name": "autocomplete test 6", 168 "Sequence": "am" + TAB + "fir" + TAB + TAB + ENTER, 169 "Result": CMD1}, 170 {"Name": "autocomplete test 7", 171 "Sequence": "am" + TAB + "fir" + TAB + " " + TAB + ENTER, 172 "Result": CMD1}, 173 {"Name": "autocomplete test 8", 174 "Sequence": "am" + TAB + " am" + TAB + " " + ENTER, 175 "Result": AMBIG}, 176 {"Name": "autocomplete test 9", 177 "Sequence": "am" + TAB + "inv" + TAB + ENTER, 178 "Result": BAD_ARG}, 179 {"Name": "autocomplete test 10", 180 "Sequence": "au" + TAB + ENTER, 181 "Result": NOT_FOUND}, 182 {"Name": "autocomplete test 11", 183 "Sequence": "au" + TAB + "1" + ENTER, 184 "Result": AUTO1}, 185 {"Name": "autocomplete test 12", 186 "Sequence": "au" + TAB + "2" + ENTER, 187 "Result": AUTO2}, 188 {"Name": "autocomplete test 13", 189 "Sequence": "au" + TAB + "2" + TAB + ENTER, 190 "Result": AUTO2}, 191 {"Name": "autocomplete test 14", 192 "Sequence": "au" + TAB + "2 " + TAB + ENTER, 193 "Result": AUTO2}, 194 {"Name": "autocomplete test 15", 195 "Sequence": "24" + TAB + ENTER, 196 "Result": "24"}, 197 198 # test history 199 {"Name": "history test 1", 200 "Sequence": "invalid" + ENTER + "single" + ENTER + "invalid" + 201 ENTER + UP + CTRL_P + ENTER, 202 "Result": SINGLE}, 203 {"Name": "history test 2", 204 "Sequence": "invalid" + ENTER + "ambiguous first" + ENTER + "invalid" + 205 ENTER + "single" + ENTER + UP * 3 + CTRL_N + DOWN + ENTER, 206 "Result": SINGLE}, 207 208 # 209 # tests that improve coverage 210 # 211 212 # empty space tests 213 {"Name": "empty space test 1", 214 "Sequence": RIGHT + LEFT + CTRL_B + CTRL_F + ENTER, 215 "Result": PROMPT}, 216 {"Name": "empty space test 2", 217 "Sequence": BKSPACE + ENTER, 218 "Result": PROMPT}, 219 {"Name": "empty space test 3", 220 "Sequence": CTRL_E*2 + CTRL_A*2 + ENTER, 221 "Result": PROMPT}, 222 {"Name": "empty space test 4", 223 "Sequence": ALT_F*2 + ALT_B*2 + ENTER, 224 "Result": PROMPT}, 225 {"Name": "empty space test 5", 226 "Sequence": " " + CTRL_E*2 + CTRL_A*2 + ENTER, 227 "Result": PROMPT}, 228 {"Name": "empty space test 6", 229 "Sequence": " " + CTRL_A + ALT_F*2 + ALT_B*2 + ENTER, 230 "Result": PROMPT}, 231 {"Name": "empty space test 7", 232 "Sequence": " " + CTRL_A + CTRL_D + CTRL_E + CTRL_D + ENTER, 233 "Result": PROMPT}, 234 {"Name": "empty space test 8", 235 "Sequence": " space" + CTRL_W*2 + ENTER, 236 "Result": PROMPT}, 237 {"Name": "empty space test 9", 238 "Sequence": " space" + ALT_BKSPACE*2 + ENTER, 239 "Result": PROMPT}, 240 {"Name": "empty space test 10", 241 "Sequence": " space " + CTRL_A + ALT_D*3 + ENTER, 242 "Result": PROMPT}, 243 244 # non-printable char tests 245 {"Name": "non-printable test 1", 246 "Sequence": chr(27) + chr(47) + ENTER, 247 "Result": PROMPT}, 248 {"Name": "non-printable test 2", 249 "Sequence": chr(27) + chr(128) + ENTER*7, 250 "Result": PROMPT}, 251 {"Name": "non-printable test 3", 252 "Sequence": chr(27) + chr(91) + chr(127) + ENTER*6, 253 "Result": PROMPT}, 254 255 # miscellaneous tests 256 {"Name": "misc test 1", 257 "Sequence": ENTER, 258 "Result": PROMPT}, 259 {"Name": "misc test 2", 260 "Sequence": "single #comment" + ENTER, 261 "Result": SINGLE}, 262 {"Name": "misc test 3", 263 "Sequence": "#empty line" + ENTER, 264 "Result": PROMPT}, 265 {"Name": "misc test 4", 266 "Sequence": " single " + ENTER, 267 "Result": SINGLE}, 268 {"Name": "misc test 5", 269 "Sequence": "single#" + ENTER, 270 "Result": SINGLE}, 271 {"Name": "misc test 6", 272 "Sequence": 'a' * 257 + ENTER, 273 "Result": NOT_FOUND}, 274 {"Name": "misc test 7", 275 "Sequence": "clear_history" + UP*5 + DOWN*5 + ENTER, 276 "Result": PROMPT}, 277 {"Name": "misc test 8", 278 "Sequence": "a" + HELP + CTRL_C, 279 "Result": PROMPT}, 280 {"Name": "misc test 9", 281 "Sequence": CTRL_D*3, 282 "Result": None}, 283] 284