| Hisham Muhammad | 2939a84 | 2015-03-27 16:29:09 -0300 | [diff] [blame] | 1 | #!/usr/bin/env lua |
| 2 | |
| Hisham Muhammad | 99e58b3 | 2015-03-28 19:36:06 -0300 | [diff] [blame] | 3 | local VISUALDELAY = os.getenv("VISUALDELAY") |
| Christian Göttsche | b92f62f | 2020-08-21 10:37:33 +0200 | [diff] [blame] | 4 | |
| Hisham Muhammad | 99e58b3 | 2015-03-28 19:36:06 -0300 | [diff] [blame] | 5 | local visual = VISUALDELAY or false |
| 6 | local visual_delay = VISUALDELAY and (tonumber(VISUALDELAY)) or 0.1 |
| Hisham | f5ddb97 | 2016-02-19 13:40:00 -0200 | [diff] [blame] | 7 | local short_delay = 0.3 |
| 8 | local long_delay = 1 |
| Hisham Muhammad | 2939a84 | 2015-03-27 16:29:09 -0300 | [diff] [blame] | 9 | |
| Hisham Muhammad | 2939a84 | 2015-03-27 16:29:09 -0300 | [diff] [blame] | 10 | local unistd = require("posix.unistd") |
| 11 | local time = require("posix.time") |
| 12 | local curses = require("posix.curses") |
| 13 | local rote = require("rote") |
| 14 | |
| 15 | local rt = rote.RoteTerm(24, 80) |
| 16 | |
| Hisham | f5ddb97 | 2016-02-19 13:40:00 -0200 | [diff] [blame] | 17 | --[[ |
| Hisham Muhammad | e5b0844 | 2015-04-02 02:13:07 -0300 | [diff] [blame] | 18 | local function os_execread(cmd) |
| 19 | local fd = io.popen(cmd, "r") |
| 20 | local out = fd:read("*a") |
| 21 | fd:close() |
| 22 | return (out:gsub("\n$", "")) |
| 23 | end |
| Hisham | f5ddb97 | 2016-02-19 13:40:00 -0200 | [diff] [blame] | 24 | ]] |
| 25 | --local branch = os_execread("git branch | grep '*'"):sub(3) |
| 26 | --print("Running in branch "..branch) |
| Hisham Muhammad | e5b0844 | 2015-04-02 02:13:07 -0300 | [diff] [blame] | 27 | |
| Hisham Muhammad | 2939a84 | 2015-03-27 16:29:09 -0300 | [diff] [blame] | 28 | os.execute("make coverage") |
| 29 | os.execute("rm -f *.gcda */*.gcda") |
| 30 | os.execute("rm -f coverage.info test.htoprc") |
| 31 | os.execute("rm -rf lcov") |
| Hisham Muhammad | 849adf6 | 2015-03-30 01:52:39 -0300 | [diff] [blame] | 32 | os.execute("killall htop") |
| 33 | os.execute("ps aux | grep '[s]leep 12345' | awk '{print $2}' | xargs kill 2> /dev/null") |
| Hisham Muhammad | 2939a84 | 2015-03-27 16:29:09 -0300 | [diff] [blame] | 34 | |
| Hisham Muhammad | 849adf6 | 2015-03-30 01:52:39 -0300 | [diff] [blame] | 35 | os.execute("cp ./default.htoprc ./test.htoprc") |
| Hisham | f5ddb97 | 2016-02-19 13:40:00 -0200 | [diff] [blame] | 36 | rt:forkPty("LC_ALL=C HTOPRC=./test.htoprc ./htop 2> htop-valgrind.txt") |
| Hisham Muhammad | 2939a84 | 2015-03-27 16:29:09 -0300 | [diff] [blame] | 37 | |
| 38 | local stdscr, term_win |
| Hisham | d4a8023 | 2016-08-30 12:37:31 -0300 | [diff] [blame] | 39 | -- Curses initialization needed even when not in visual mode |
| Hisham Muhammad | 2939a84 | 2015-03-27 16:29:09 -0300 | [diff] [blame] | 40 | -- because luaposix only initializes KEY_* constants after initscr(). |
| 41 | stdscr = curses.initscr() |
| 42 | if visual then |
| 43 | curses.echo(false) |
| 44 | curses.start_color() |
| 45 | curses.raw(true) |
| 46 | curses.halfdelay(1) |
| 47 | stdscr:keypad(true) |
| 48 | term_win = curses.newwin(24, 80, 0, 0) |
| 49 | local function makePair(foreground, background) |
| 50 | return background * 8 + 7 - foreground |
| 51 | end |
| 52 | -- initialize the color pairs the way rt:draw() expects it |
| 53 | for foreground = 0, 7 do |
| 54 | for background = 0, 7 do |
| 55 | if foreground ~= 7 or background ~= 0 then |
| 56 | local pair = makePair(foreground, background) |
| 57 | curses.init_pair(pair, foreground, background) |
| 58 | end |
| 59 | end |
| 60 | end |
| 61 | else |
| 62 | curses.endwin() |
| 63 | end |
| 64 | |
| Hisham Muhammad | 2939a84 | 2015-03-27 16:29:09 -0300 | [diff] [blame] | 65 | local function show(key) |
| 66 | rt:update() |
| 67 | if visual then |
| 68 | rt:draw(term_win, 0, 0) |
| 69 | if key then |
| 70 | term_win:mvaddstr(0, 0, tostring(key)) |
| 71 | end |
| 72 | term_win:refresh() |
| Christian Göttsche | b92f62f | 2020-08-21 10:37:33 +0200 | [diff] [blame] | 73 | |
| Hisham Muhammad | 2939a84 | 2015-03-27 16:29:09 -0300 | [diff] [blame] | 74 | delay(visual_delay) |
| 75 | end |
| 76 | end |
| 77 | |
| Hisham Muhammad | e3d1ca0 | 2015-04-02 03:33:12 -0300 | [diff] [blame] | 78 | local function send(key, times, quick) |
| Hisham Muhammad | 849adf6 | 2015-03-30 01:52:39 -0300 | [diff] [blame] | 79 | if times == 0 then return end |
| Hisham Muhammad | a723655 | 2015-03-31 23:23:40 -0300 | [diff] [blame] | 80 | for _ = 1, times or 1 do |
| Hisham Muhammad | 2939a84 | 2015-03-27 16:29:09 -0300 | [diff] [blame] | 81 | delay(0.003) -- 30ms delay to avoid clobbering Esc sequences |
| 82 | if type(key) == "string" then |
| 83 | for c in key:gmatch('.') do |
| 84 | rt:keyPress(string.byte(c)) |
| 85 | end |
| 86 | else |
| 87 | rt:keyPress(key) |
| 88 | end |
| Hisham Muhammad | e3d1ca0 | 2015-04-02 03:33:12 -0300 | [diff] [blame] | 89 | if not quick then |
| 90 | show(key) |
| 91 | end |
| 92 | end |
| 93 | if quick then |
| Hisham Muhammad | 2939a84 | 2015-03-27 16:29:09 -0300 | [diff] [blame] | 94 | show(key) |
| 95 | end |
| 96 | end |
| 97 | |
| 98 | local function string_at(x, y, len) |
| 99 | rt:update() |
| 100 | local out = {} |
| 101 | for i = 1, len do |
| 102 | out[#out+1] = rt:cellChar(y-1, x+i-2) |
| 103 | end |
| 104 | return table.concat(out) |
| 105 | end |
| 106 | |
| 107 | local function is_string_at(x, y, str) |
| 108 | return string_at(x, y, #str) == str |
| 109 | end |
| 110 | |
| 111 | local function check_string_at(x, y, str) |
| 112 | return { str, string_at(x, y, #str) } |
| 113 | end |
| 114 | |
| Hisham Muhammad | 849adf6 | 2015-03-30 01:52:39 -0300 | [diff] [blame] | 115 | local ESC = "\27\27" |
| Hisham Muhammad | 2939a84 | 2015-03-27 16:29:09 -0300 | [diff] [blame] | 116 | |
| Hisham | f5ddb97 | 2016-02-19 13:40:00 -0200 | [diff] [blame] | 117 | function delay(t) |
| 118 | time.nanosleep({ tv_sec = math.floor(t), tv_nsec = (t - math.floor(t)) * 1000000000 }) |
| 119 | end |
| 120 | |
| 121 | delay(2) -- give some time for htop to initialize. |
| 122 | rt:update() |
| Hisham Muhammad | 2939a84 | 2015-03-27 16:29:09 -0300 | [diff] [blame] | 123 | |
| Hisham Muhammad | 849adf6 | 2015-03-30 01:52:39 -0300 | [diff] [blame] | 124 | local y_panelhdr = (function() |
| 125 | for y = 1, 24 do |
| 126 | if is_string_at(3, y, "PID") then |
| 127 | return y |
| Hisham Muhammad | 2939a84 | 2015-03-27 16:29:09 -0300 | [diff] [blame] | 128 | end |
| 129 | end |
| 130 | end)() or 1 |
| 131 | |
| Hisham | f5ddb97 | 2016-02-19 13:40:00 -0200 | [diff] [blame] | 132 | assert.not_equal(y_panelhdr, 1) |
| 133 | |
| 134 | local x_metercol2 = 41 |
| Hisham Muhammad | 849adf6 | 2015-03-30 01:52:39 -0300 | [diff] [blame] | 135 | |
| Hisham Muhammad | 2939a84 | 2015-03-27 16:29:09 -0300 | [diff] [blame] | 136 | show() |
| 137 | |
| Hisham Muhammad | 849adf6 | 2015-03-30 01:52:39 -0300 | [diff] [blame] | 138 | os.execute("sleep 12345 &") |
| 139 | |
| 140 | local function terminated() |
| 141 | return not os.execute("ps aux | grep -q '\\./[h]top'") |
| 142 | end |
| Hisham Muhammad | 2939a84 | 2015-03-27 16:29:09 -0300 | [diff] [blame] | 143 | |
| 144 | local function running_it(desc, fn) |
| 145 | it(desc, function() |
| Hisham Muhammad | 849adf6 | 2015-03-30 01:52:39 -0300 | [diff] [blame] | 146 | assert(not terminated()) |
| Hisham Muhammad | 2939a84 | 2015-03-27 16:29:09 -0300 | [diff] [blame] | 147 | show() |
| 148 | fn() |
| Hisham Muhammad | 849adf6 | 2015-03-30 01:52:39 -0300 | [diff] [blame] | 149 | assert(not terminated()) |
| Hisham Muhammad | 2939a84 | 2015-03-27 16:29:09 -0300 | [diff] [blame] | 150 | end) |
| 151 | end |
| 152 | |
| 153 | local function check(t) |
| 154 | return t[1], t[2] |
| 155 | end |
| 156 | |
| Hisham Muhammad | 849adf6 | 2015-03-30 01:52:39 -0300 | [diff] [blame] | 157 | local attrs = { |
| 158 | black_on_cyan = 6, |
| 159 | red_on_cyan = 22, |
| Hisham Muhammad | e3d1ca0 | 2015-04-02 03:33:12 -0300 | [diff] [blame] | 160 | white_on_black = 176, |
| 161 | yellow_on_black = 112, |
| Hisham Muhammad | 849adf6 | 2015-03-30 01:52:39 -0300 | [diff] [blame] | 162 | } |
| 163 | |
| Hisham Muhammad | a723655 | 2015-03-31 23:23:40 -0300 | [diff] [blame] | 164 | local function find_selected_y(from) |
| 165 | rt:update() |
| 166 | for y = from or (y_panelhdr + 1), rt:rows() - 1 do |
| Hisham Muhammad | 849adf6 | 2015-03-30 01:52:39 -0300 | [diff] [blame] | 167 | local attr = rt:cellAttr(y-1, 1) |
| 168 | if attr == attrs.black_on_cyan then |
| 169 | return y |
| 170 | end |
| 171 | end |
| 172 | return y_panelhdr + 1 |
| 173 | end |
| 174 | |
| 175 | local function find_command_x() |
| 176 | for x = 1, 80 do |
| 177 | if is_string_at(x, y_panelhdr, "Command") then |
| 178 | return x |
| 179 | end |
| 180 | end |
| 181 | return 64 |
| 182 | end |
| 183 | |
| Hisham Muhammad | e3d1ca0 | 2015-04-02 03:33:12 -0300 | [diff] [blame] | 184 | local function set_display_option(n) |
| 185 | send("S") |
| 186 | send(curses.KEY_DOWN) |
| 187 | send(curses.KEY_RIGHT) |
| Hisham Muhammad | 01a29f0 | 2015-04-08 21:27:52 -0300 | [diff] [blame] | 188 | send(curses.KEY_DOWN, n, "quick") |
| Hisham Muhammad | e3d1ca0 | 2015-04-02 03:33:12 -0300 | [diff] [blame] | 189 | send("\n") |
| 190 | send(curses.KEY_F10) |
| 191 | end |
| 192 | |
| Hisham Muhammad | 2939a84 | 2015-03-27 16:29:09 -0300 | [diff] [blame] | 193 | describe("htop test suite", function() |
| Christian Göttsche | b92f62f | 2020-08-21 10:37:33 +0200 | [diff] [blame] | 194 | |
| Hisham Muhammad | 849adf6 | 2015-03-30 01:52:39 -0300 | [diff] [blame] | 195 | running_it("performs incremental filter", function() |
| 196 | send("\\") |
| Hisham Muhammad | a723655 | 2015-03-31 23:23:40 -0300 | [diff] [blame] | 197 | send("x\127bux\127sted") -- test backspace |
| Hisham Muhammad | 849adf6 | 2015-03-30 01:52:39 -0300 | [diff] [blame] | 198 | send("\n") |
| Hisham | f5ddb97 | 2016-02-19 13:40:00 -0200 | [diff] [blame] | 199 | delay(short_delay) |
| Hisham Muhammad | 849adf6 | 2015-03-30 01:52:39 -0300 | [diff] [blame] | 200 | rt:update() |
| 201 | local pid = (" "..tostring(unistd.getpid())):sub(-5) |
| 202 | local ourpid = check_string_at(1, y_panelhdr + 1, pid) |
| 203 | send("\\") |
| 204 | send(ESC) |
| 205 | send(curses.KEY_F5) |
| 206 | send(curses.KEY_HOME) |
| Hisham | f5ddb97 | 2016-02-19 13:40:00 -0200 | [diff] [blame] | 207 | delay(short_delay) |
| Hisham Muhammad | 849adf6 | 2015-03-30 01:52:39 -0300 | [diff] [blame] | 208 | rt:update() |
| 209 | local initpid = check_string_at(1, y_panelhdr + 1, " 1") |
| Hisham | f5ddb97 | 2016-02-19 13:40:00 -0200 | [diff] [blame] | 210 | delay(short_delay) |
| Hisham Muhammad | 849adf6 | 2015-03-30 01:52:39 -0300 | [diff] [blame] | 211 | rt:update() |
| 212 | send(curses.KEY_F5) |
| 213 | assert.equal(check(ourpid)) |
| 214 | assert.equal(check(initpid)) |
| 215 | end) |
| 216 | |
| 217 | running_it("performs incremental search", function() |
| 218 | send(curses.KEY_HOME) |
| 219 | send("/") |
| 220 | send("busted") |
| 221 | local attr = rt:cellAttr(rt:rows() - 1, 30) |
| Hisham | f5ddb97 | 2016-02-19 13:40:00 -0200 | [diff] [blame] | 222 | delay(short_delay) |
| Hisham Muhammad | 849adf6 | 2015-03-30 01:52:39 -0300 | [diff] [blame] | 223 | local line = find_selected_y() |
| 224 | local pid = (" "..tostring(unistd.getpid())):sub(-5) |
| 225 | assert.equal(attr, attrs.black_on_cyan) |
| 226 | local ourpid = check_string_at(1, line, pid) |
| Hisham Muhammad | fde3457 | 2015-04-08 19:07:41 -0300 | [diff] [blame] | 227 | send("\n") |
| Hisham Muhammad | 849adf6 | 2015-03-30 01:52:39 -0300 | [diff] [blame] | 228 | send(curses.KEY_HOME) |
| 229 | assert.equal(check(ourpid)) |
| 230 | end) |
| 231 | |
| Hisham Muhammad | 01a29f0 | 2015-04-08 21:27:52 -0300 | [diff] [blame] | 232 | running_it("performs pid search", function() |
| 233 | send(curses.KEY_F5) |
| 234 | send(curses.KEY_END) |
| 235 | send("1") |
| Hisham | f5ddb97 | 2016-02-19 13:40:00 -0200 | [diff] [blame] | 236 | delay(short_delay) |
| Hisham Muhammad | 01a29f0 | 2015-04-08 21:27:52 -0300 | [diff] [blame] | 237 | local line = find_selected_y() |
| 238 | local initpid = check_string_at(1, line, " 1") |
| 239 | send(curses.KEY_F5) |
| 240 | assert.equal(check(initpid)) |
| 241 | end) |
| 242 | |
| 243 | |
| 244 | running_it("horizontal scroll", function() |
| 245 | local h_scroll = 20 |
| 246 | send(curses.KEY_F5) |
| Hisham | f5ddb97 | 2016-02-19 13:40:00 -0200 | [diff] [blame] | 247 | delay(short_delay) |
| Hisham Muhammad | 01a29f0 | 2015-04-08 21:27:52 -0300 | [diff] [blame] | 248 | local str1 = string_at(1+h_scroll, y_panelhdr+1, 5) |
| 249 | send(curses.KEY_RIGHT) |
| Hisham | f5ddb97 | 2016-02-19 13:40:00 -0200 | [diff] [blame] | 250 | delay(short_delay) |
| Hisham Muhammad | 01a29f0 | 2015-04-08 21:27:52 -0300 | [diff] [blame] | 251 | local str2 = string_at(1, y_panelhdr+1, 5) |
| 252 | send(curses.KEY_LEFT) |
| Hisham | f5ddb97 | 2016-02-19 13:40:00 -0200 | [diff] [blame] | 253 | delay(short_delay) |
| Hisham Muhammad | 01a29f0 | 2015-04-08 21:27:52 -0300 | [diff] [blame] | 254 | local str3 = string_at(1+h_scroll, y_panelhdr+1, 5) |
| 255 | send(curses.KEY_LEFT) |
| Hisham | f5ddb97 | 2016-02-19 13:40:00 -0200 | [diff] [blame] | 256 | delay(short_delay) |
| Hisham Muhammad | 01a29f0 | 2015-04-08 21:27:52 -0300 | [diff] [blame] | 257 | local str4 = string_at(1+h_scroll, y_panelhdr+1, 5) |
| 258 | send(curses.KEY_F5) |
| 259 | assert.equal(str1, str2) |
| 260 | assert.equal(str2, str3) |
| 261 | assert.equal(str3, str4) |
| 262 | end) |
| 263 | |
| Hisham Muhammad | 849adf6 | 2015-03-30 01:52:39 -0300 | [diff] [blame] | 264 | running_it("kills a process", function() |
| 265 | send(curses.KEY_HOME) |
| 266 | send("\\") |
| 267 | send("sleep 12345") |
| 268 | local attr = rt:cellAttr(rt:rows() - 1, 30) |
| 269 | assert.equal(attr, attrs.black_on_cyan) |
| 270 | send("\n") |
| Hisham | f5ddb97 | 2016-02-19 13:40:00 -0200 | [diff] [blame] | 271 | delay(short_delay) |
| Hisham Muhammad | 849adf6 | 2015-03-30 01:52:39 -0300 | [diff] [blame] | 272 | rt:update() |
| 273 | local col = find_command_x() |
| 274 | local procname = check_string_at(col, y_panelhdr + 1, "sleep 12345") |
| 275 | send("k") |
| 276 | send("\n") |
| 277 | send("\\") |
| 278 | send(ESC) |
| Hisham | f5ddb97 | 2016-02-19 13:40:00 -0200 | [diff] [blame] | 279 | delay(short_delay) |
| Hisham Muhammad | 849adf6 | 2015-03-30 01:52:39 -0300 | [diff] [blame] | 280 | assert.equal(check(procname)) |
| 281 | assert.not_equal((os.execute("ps aux | grep -q '[s]leep 12345'")), true) |
| 282 | end) |
| 283 | |
| 284 | running_it("runs strace", function() |
| 285 | send(curses.KEY_HOME) |
| 286 | send("/") |
| 287 | send("busted") |
| 288 | send("\n") |
| 289 | send("s") |
| Hisham | f5ddb97 | 2016-02-19 13:40:00 -0200 | [diff] [blame] | 290 | delay(long_delay) |
| Hisham Muhammad | 849adf6 | 2015-03-30 01:52:39 -0300 | [diff] [blame] | 291 | send(ESC) |
| 292 | end) |
| 293 | |
| 294 | running_it("runs lsof", function() |
| 295 | send(curses.KEY_HOME) |
| 296 | send("/") |
| 297 | send("busted") |
| 298 | send("\n") |
| 299 | send("l") |
| Hisham | f5ddb97 | 2016-02-19 13:40:00 -0200 | [diff] [blame] | 300 | delay(long_delay) |
| Hisham Muhammad | 849adf6 | 2015-03-30 01:52:39 -0300 | [diff] [blame] | 301 | send(ESC) |
| 302 | end) |
| 303 | |
| Hisham Muhammad | a723655 | 2015-03-31 23:23:40 -0300 | [diff] [blame] | 304 | running_it("performs filtering in lsof", function() |
| 305 | send(curses.KEY_HOME) |
| 306 | send("/") |
| 307 | send("htop") |
| 308 | send("\n") |
| 309 | send("l") |
| 310 | send(curses.KEY_F4) |
| 311 | send("pipe") |
| Hisham | f5ddb97 | 2016-02-19 13:40:00 -0200 | [diff] [blame] | 312 | delay(long_delay) |
| Hisham Muhammad | a723655 | 2015-03-31 23:23:40 -0300 | [diff] [blame] | 313 | local pipefd = check_string_at(1, 3, " 3") |
| 314 | send(ESC) |
| 315 | assert.equal(check(pipefd)) |
| 316 | end) |
| 317 | |
| 318 | running_it("performs search in lsof", function() |
| 319 | send(curses.KEY_HOME) |
| 320 | send("/") |
| 321 | send("htop") |
| 322 | send("\n") |
| 323 | send("l") |
| 324 | send(curses.KEY_F3) |
| 325 | send("pipe") |
| Hisham | f5ddb97 | 2016-02-19 13:40:00 -0200 | [diff] [blame] | 326 | delay(long_delay) |
| Hisham Muhammad | a723655 | 2015-03-31 23:23:40 -0300 | [diff] [blame] | 327 | local line = find_selected_y(3) |
| 328 | local pipefd = check_string_at(1, line, " 3") |
| 329 | send(ESC) |
| 330 | assert.equal(check(pipefd)) |
| 331 | end) |
| 332 | |
| 333 | |
| 334 | running_it("cycles through meter modes in the default meters", function() |
| Hisham Muhammad | 849adf6 | 2015-03-30 01:52:39 -0300 | [diff] [blame] | 335 | send("S") |
| Hisham Muhammad | a723655 | 2015-03-31 23:23:40 -0300 | [diff] [blame] | 336 | for _ = 1, 2 do |
| 337 | send(curses.KEY_RIGHT) |
| 338 | for _ = 1, 3 do |
| 339 | send("\n", 4) |
| 340 | send(curses.KEY_DOWN) |
| 341 | end |
| 342 | end |
| Hisham Muhammad | 849adf6 | 2015-03-30 01:52:39 -0300 | [diff] [blame] | 343 | send(ESC) |
| 344 | end) |
| 345 | |
| 346 | running_it("show process of a user", function() |
| 347 | send(curses.KEY_F5) |
| 348 | send("u") |
| 349 | send(curses.KEY_DOWN) |
| Hisham | f5ddb97 | 2016-02-19 13:40:00 -0200 | [diff] [blame] | 350 | delay(short_delay) |
| Hisham Muhammad | 849adf6 | 2015-03-30 01:52:39 -0300 | [diff] [blame] | 351 | rt:update() |
| 352 | local chosen = string_at(1, y_panelhdr + 2, 9) |
| 353 | send("\n") |
| 354 | send(curses.KEY_HOME) |
| Hisham | f5ddb97 | 2016-02-19 13:40:00 -0200 | [diff] [blame] | 355 | delay(short_delay) |
| Hisham Muhammad | 849adf6 | 2015-03-30 01:52:39 -0300 | [diff] [blame] | 356 | rt:update() |
| 357 | local shown = string_at(7, y_panelhdr + 1, 9) |
| 358 | send("u") |
| 359 | send("\n") |
| 360 | send(curses.KEY_HOME) |
| Hisham | f5ddb97 | 2016-02-19 13:40:00 -0200 | [diff] [blame] | 361 | delay(short_delay) |
| Hisham Muhammad | 849adf6 | 2015-03-30 01:52:39 -0300 | [diff] [blame] | 362 | rt:update() |
| 363 | local inituser = string_at(7, y_panelhdr + 1, 9) |
| 364 | send(curses.KEY_F5) |
| 365 | assert.equal(shown, chosen) |
| 366 | assert.equal(inituser, "root ") |
| 367 | end) |
| 368 | |
| 369 | running_it("performs failing search", function() |
| 370 | send(curses.KEY_HOME) |
| 371 | send("/") |
| 372 | send("xxxxxxxxxx") |
| Hisham | f5ddb97 | 2016-02-19 13:40:00 -0200 | [diff] [blame] | 373 | delay(short_delay) |
| Hisham Muhammad | 849adf6 | 2015-03-30 01:52:39 -0300 | [diff] [blame] | 374 | rt:update() |
| 375 | local attr = rt:cellAttr(rt:rows() - 1, 30) |
| 376 | assert.equal(attr, attrs.red_on_cyan) |
| 377 | send("\n") |
| 378 | end) |
| 379 | |
| 380 | running_it("cycles through search", function() |
| 381 | send(curses.KEY_HOME) |
| 382 | send("/") |
| 383 | send("sh") |
| 384 | local lastpid |
| 385 | local pidpairs = {} |
| 386 | for _ = 1, 3 do |
| 387 | send(curses.KEY_F3) |
| 388 | local line = find_selected_y() |
| 389 | local pid = string_at(1, line, 5) |
| 390 | if lastpid then |
| 391 | pidpairs[#pidpairs + 1] = { lastpid, pid } |
| 392 | lastpid = pid |
| 393 | end |
| 394 | end |
| 395 | send(curses.KEY_HOME) |
| 396 | for _, pair in pairs(pidpairs) do |
| 397 | assert.not_equal(pair[1], pair[2]) |
| 398 | end |
| 399 | end) |
| Christian Göttsche | b92f62f | 2020-08-21 10:37:33 +0200 | [diff] [blame] | 400 | |
| Hisham Muhammad | 2939a84 | 2015-03-27 16:29:09 -0300 | [diff] [blame] | 401 | running_it("visits each setup screen", function() |
| 402 | send("S") |
| 403 | send(curses.KEY_DOWN, 3) |
| 404 | send(curses.KEY_F10) |
| 405 | end) |
| Christian Göttsche | b92f62f | 2020-08-21 10:37:33 +0200 | [diff] [blame] | 406 | |
| Hisham Muhammad | 99e58b3 | 2015-03-28 19:36:06 -0300 | [diff] [blame] | 407 | running_it("adds and removes PPID column", function() |
| 408 | send("S") |
| 409 | send(curses.KEY_DOWN, 3) |
| 410 | send(curses.KEY_RIGHT, 2) |
| 411 | send(curses.KEY_DOWN, 2) |
| 412 | send("\n") |
| 413 | send(curses.KEY_F10) |
| Hisham | f5ddb97 | 2016-02-19 13:40:00 -0200 | [diff] [blame] | 414 | delay(short_delay) |
| Hisham Muhammad | 849adf6 | 2015-03-30 01:52:39 -0300 | [diff] [blame] | 415 | local ppid = check_string_at(2, y_panelhdr, "PPID") |
| Hisham Muhammad | 99e58b3 | 2015-03-28 19:36:06 -0300 | [diff] [blame] | 416 | send("S") |
| 417 | send(curses.KEY_DOWN, 3) |
| 418 | send(curses.KEY_RIGHT, 1) |
| 419 | send(curses.KEY_DC) |
| 420 | send(curses.KEY_F10) |
| Hisham | f5ddb97 | 2016-02-19 13:40:00 -0200 | [diff] [blame] | 421 | delay(short_delay) |
| Hisham Muhammad | 849adf6 | 2015-03-30 01:52:39 -0300 | [diff] [blame] | 422 | local not_ppid = check_string_at(2, y_panelhdr, "PPID") |
| Hisham Muhammad | 99e58b3 | 2015-03-28 19:36:06 -0300 | [diff] [blame] | 423 | assert.equal(check(ppid)) |
| 424 | assert.not_equal(check(not_ppid)) |
| 425 | end) |
| Christian Göttsche | b92f62f | 2020-08-21 10:37:33 +0200 | [diff] [blame] | 426 | |
| Hisham Muhammad | 2939a84 | 2015-03-27 16:29:09 -0300 | [diff] [blame] | 427 | running_it("changes CPU affinity for a process", function() |
| 428 | send("a") |
| 429 | send(" \n") |
| 430 | send(ESC) |
| 431 | end) |
| Hisham Muhammad | e3d1ca0 | 2015-04-02 03:33:12 -0300 | [diff] [blame] | 432 | |
| 433 | running_it("renices for a process", function() |
| 434 | send("/") |
| 435 | send("busted") |
| 436 | send("\n") |
| 437 | local line = find_selected_y() |
| 438 | local before = check_string_at(22, line, " 0") |
| 439 | send(curses.KEY_F8) |
| Hisham | f5ddb97 | 2016-02-19 13:40:00 -0200 | [diff] [blame] | 440 | delay(short_delay) |
| Hisham Muhammad | e3d1ca0 | 2015-04-02 03:33:12 -0300 | [diff] [blame] | 441 | local after = check_string_at(22, line, " 1") |
| 442 | assert.equal(check(before)) |
| 443 | assert.equal(check(after)) |
| 444 | end) |
| Hisham Muhammad | 01a29f0 | 2015-04-08 21:27:52 -0300 | [diff] [blame] | 445 | |
| 446 | running_it("tries to lower nice for a process", function() |
| 447 | send("/") |
| 448 | send("busted") |
| 449 | send("\n") |
| 450 | local line = find_selected_y() |
| 451 | local before = string_at(22, line, 2) |
| 452 | send(curses.KEY_F7) |
| Hisham | f5ddb97 | 2016-02-19 13:40:00 -0200 | [diff] [blame] | 453 | delay(short_delay) |
| Hisham Muhammad | 01a29f0 | 2015-04-08 21:27:52 -0300 | [diff] [blame] | 454 | local after = string_at(22, line, 2) |
| 455 | assert.equal(before, after) -- no permissions |
| 456 | end) |
| 457 | |
| 458 | running_it("invert sort order", function() |
| 459 | local cpu_col = 45 |
| 460 | send("P") |
| 461 | send("I") |
| 462 | send(curses.KEY_HOME) |
| Hisham | f5ddb97 | 2016-02-19 13:40:00 -0200 | [diff] [blame] | 463 | delay(short_delay) |
| Hisham Muhammad | 01a29f0 | 2015-04-08 21:27:52 -0300 | [diff] [blame] | 464 | local zerocpu = check_string_at(cpu_col, y_panelhdr + 1, " 0.0") |
| 465 | send("I") |
| Hisham | f5ddb97 | 2016-02-19 13:40:00 -0200 | [diff] [blame] | 466 | delay(short_delay) |
| Hisham Muhammad | 01a29f0 | 2015-04-08 21:27:52 -0300 | [diff] [blame] | 467 | local nonzerocpu = check_string_at(cpu_col, y_panelhdr + 1, " 0.0") |
| 468 | assert.equal(check(zerocpu)) |
| 469 | assert.not_equal(check(nonzerocpu)) |
| 470 | end) |
| Christian Göttsche | b92f62f | 2020-08-21 10:37:33 +0200 | [diff] [blame] | 471 | |
| Hisham Muhammad | 849adf6 | 2015-03-30 01:52:39 -0300 | [diff] [blame] | 472 | running_it("changes IO priority for a process", function() |
| 473 | send("/") |
| 474 | send("htop") |
| Hisham Muhammad | 2939a84 | 2015-03-27 16:29:09 -0300 | [diff] [blame] | 475 | send("\n") |
| Hisham Muhammad | 849adf6 | 2015-03-30 01:52:39 -0300 | [diff] [blame] | 476 | send("i") |
| 477 | send(curses.KEY_END) |
| Hisham Muhammad | 2939a84 | 2015-03-27 16:29:09 -0300 | [diff] [blame] | 478 | send("\n") |
| 479 | send(ESC) |
| 480 | end) |
| Hisham Muhammad | e3d1ca0 | 2015-04-02 03:33:12 -0300 | [diff] [blame] | 481 | |
| 482 | running_it("shows help", function() |
| 483 | send(curses.KEY_F1) |
| 484 | send("\n") |
| 485 | set_display_option(9) |
| 486 | send(curses.KEY_F1) |
| 487 | send("\n") |
| 488 | set_display_option(9) |
| 489 | end) |
| Hisham Muhammad | 01a29f0 | 2015-04-08 21:27:52 -0300 | [diff] [blame] | 490 | |
| 491 | running_it("moves meters around", function() |
| Hisham | f5ddb97 | 2016-02-19 13:40:00 -0200 | [diff] [blame] | 492 | send("S") |
| 493 | send(curses.KEY_RIGHT) |
| 494 | send(curses.KEY_UP) |
| 495 | send("\n") |
| 496 | send(curses.KEY_DOWN) |
| 497 | send(curses.KEY_UP) |
| 498 | send(curses.KEY_RIGHT) |
| 499 | send(curses.KEY_RIGHT) |
| 500 | send(curses.KEY_LEFT) |
| 501 | send(curses.KEY_LEFT) |
| 502 | send("\n") |
| 503 | send(curses.KEY_F10) |
| Hisham Muhammad | 01a29f0 | 2015-04-08 21:27:52 -0300 | [diff] [blame] | 504 | end) |
| Christian Göttsche | b92f62f | 2020-08-21 10:37:33 +0200 | [diff] [blame] | 505 | |
| Hisham Muhammad | 849adf6 | 2015-03-30 01:52:39 -0300 | [diff] [blame] | 506 | local meters = { |
| 507 | { name = "clock", down = 0, string = "Time" }, |
| 508 | { name = "load", down = 2, string = "Load" }, |
| 509 | { name = "battery", down = 7, string = "Battery" }, |
| 510 | { name = "hostname", down = 8, string = "Hostname" }, |
| Hisham | f5ddb97 | 2016-02-19 13:40:00 -0200 | [diff] [blame] | 511 | { name = "memory", down = 3, string = "Mem" }, |
| Hisham Muhammad | 01a29f0 | 2015-04-08 21:27:52 -0300 | [diff] [blame] | 512 | { name = "CPU average", down = 16, string = "Avg" }, |
| Hisham Muhammad | 849adf6 | 2015-03-30 01:52:39 -0300 | [diff] [blame] | 513 | } |
| Hisham Muhammad | 01a29f0 | 2015-04-08 21:27:52 -0300 | [diff] [blame] | 514 | |
| 515 | running_it("checks various CPU meters", function() |
| 516 | send("S") |
| 517 | send(curses.KEY_RIGHT, 3) |
| 518 | send(curses.KEY_DOWN, 9, "quick") |
| 519 | for _ = 9, 14 do |
| Hisham | f5ddb97 | 2016-02-19 13:40:00 -0200 | [diff] [blame] | 520 | send("\n") |
| 521 | send("\n") |
| 522 | send(curses.KEY_DC) |
| 523 | send(curses.KEY_RIGHT) |
| 524 | send(curses.KEY_DOWN) |
| Hisham Muhammad | 01a29f0 | 2015-04-08 21:27:52 -0300 | [diff] [blame] | 525 | end |
| 526 | end) |
| 527 | |
| Hisham Muhammad | 849adf6 | 2015-03-30 01:52:39 -0300 | [diff] [blame] | 528 | for _, item in ipairs(meters) do |
| 529 | running_it("adds and removes a "..item.name.." widget", function() |
| 530 | send("S") |
| 531 | send(curses.KEY_RIGHT, 3) |
| 532 | send(curses.KEY_DOWN, item.down) |
| Hisham | f5ddb97 | 2016-02-19 13:40:00 -0200 | [diff] [blame] | 533 | send("\n") |
| 534 | send(curses.KEY_UP, 4) |
| 535 | send("\n") |
| Hisham Muhammad | a723655 | 2015-03-31 23:23:40 -0300 | [diff] [blame] | 536 | send(curses.KEY_F4, 4) -- cycle through meter modes |
| Hisham | f5ddb97 | 2016-02-19 13:40:00 -0200 | [diff] [blame] | 537 | delay(short_delay) |
| Hisham Muhammad | 849adf6 | 2015-03-30 01:52:39 -0300 | [diff] [blame] | 538 | rt:update() |
| 539 | local with = check_string_at(x_metercol2, 2, item.string) |
| 540 | send(curses.KEY_DC) |
| Hisham | f5ddb97 | 2016-02-19 13:40:00 -0200 | [diff] [blame] | 541 | delay(short_delay) |
| Hisham Muhammad | 849adf6 | 2015-03-30 01:52:39 -0300 | [diff] [blame] | 542 | local without = check_string_at(x_metercol2, 2, item.string) |
| 543 | send(curses.KEY_F10) |
| 544 | assert.equal(check(with)) |
| 545 | assert.not_equal(check(without)) |
| 546 | end) |
| 547 | end |
| 548 | |
| 549 | running_it("goes through themes", function() |
| 550 | send(curses.KEY_F2) |
| 551 | send(curses.KEY_DOWN, 2) |
| 552 | send(curses.KEY_RIGHT) |
| Hisham Muhammad | a723655 | 2015-03-31 23:23:40 -0300 | [diff] [blame] | 553 | for _ = 1, 6 do |
| Hisham Muhammad | 849adf6 | 2015-03-30 01:52:39 -0300 | [diff] [blame] | 554 | send("\n") |
| 555 | send(curses.KEY_DOWN) |
| 556 | end |
| 557 | send(curses.KEY_UP, 6) |
| 558 | send("\n") |
| 559 | send(curses.KEY_F10) |
| 560 | end) |
| Christian Göttsche | b92f62f | 2020-08-21 10:37:33 +0200 | [diff] [blame] | 561 | |
| Hisham Muhammad | 849adf6 | 2015-03-30 01:52:39 -0300 | [diff] [blame] | 562 | local display_options = { |
| 563 | { name = "tree view", down = 0 }, |
| 564 | { name = "shadow other user's process", down = 1 }, |
| 565 | { name = "hide kernel threads", down = 2 }, |
| 566 | { name = "hide userland threads", down = 3 }, |
| 567 | { name = "display threads in different color", down = 4 }, |
| 568 | { name = "show custom thread names", down = 5 }, |
| 569 | { name = "highlight basename", down = 6 }, |
| 570 | { name = "highlight large numbers", down = 7 }, |
| 571 | { name = "leave margin around header", down = 8 }, |
| 572 | { name = "use detailed CPU time", down = 9 }, |
| 573 | { name = "count from zero", down = 10 }, |
| 574 | { name = "update process names", down = 11 }, |
| 575 | { name = "guest time in CPU%", down = 12 }, |
| 576 | } |
| Christian Göttsche | b92f62f | 2020-08-21 10:37:33 +0200 | [diff] [blame] | 577 | |
| Hisham Muhammad | 849adf6 | 2015-03-30 01:52:39 -0300 | [diff] [blame] | 578 | for _, item in ipairs(display_options) do |
| 579 | running_it("checks display option to "..item.name, function() |
| 580 | for _ = 1, 2 do |
| Hisham Muhammad | e3d1ca0 | 2015-04-02 03:33:12 -0300 | [diff] [blame] | 581 | set_display_option(item.down) |
| Hisham | f5ddb97 | 2016-02-19 13:40:00 -0200 | [diff] [blame] | 582 | delay(short_delay) |
| Hisham Muhammad | 849adf6 | 2015-03-30 01:52:39 -0300 | [diff] [blame] | 583 | end |
| 584 | end) |
| 585 | end |
| Hisham Muhammad | a723655 | 2015-03-31 23:23:40 -0300 | [diff] [blame] | 586 | |
| 587 | running_it("shows detailed CPU with guest time", function() |
| 588 | for _ = 1, 2 do |
| 589 | send("S") |
| 590 | send(curses.KEY_DOWN) |
| 591 | send(curses.KEY_RIGHT) |
| 592 | send(curses.KEY_DOWN, 9) |
| 593 | send("\n") |
| 594 | send(curses.KEY_DOWN, 3) |
| 595 | send("\n") |
| Hisham Muhammad | 01a29f0 | 2015-04-08 21:27:52 -0300 | [diff] [blame] | 596 | send(curses.KEY_LEFT) |
| 597 | send(curses.KEY_UP) |
| 598 | send(curses.KEY_RIGHT) |
| 599 | send(curses.KEY_F4, 4) -- cycle through CPU meter modes |
| Hisham Muhammad | a723655 | 2015-03-31 23:23:40 -0300 | [diff] [blame] | 600 | send(curses.KEY_F10) |
| Hisham | f5ddb97 | 2016-02-19 13:40:00 -0200 | [diff] [blame] | 601 | delay(short_delay) |
| Hisham Muhammad | a723655 | 2015-03-31 23:23:40 -0300 | [diff] [blame] | 602 | end |
| 603 | end) |
| Hisham Muhammad | e3d1ca0 | 2015-04-02 03:33:12 -0300 | [diff] [blame] | 604 | |
| 605 | running_it("expands and collapses tree", function() |
| 606 | send(curses.KEY_F5) -- tree view |
| 607 | send(curses.KEY_HOME) |
| 608 | send(curses.KEY_DOWN) -- second process in the tree |
| 609 | send("-") |
| 610 | send("+") |
| 611 | send(curses.KEY_F5) |
| 612 | end) |
| 613 | |
| 614 | running_it("sets sort key", function() |
| 615 | send(".") |
| 616 | send("\n") |
| 617 | end) |
| 618 | |
| 619 | running_it("tags all children", function() |
| 620 | send(curses.KEY_F5) -- tree view |
| 621 | send(curses.KEY_HOME) -- ensure we're at init |
| 622 | send("c") |
| 623 | local taggedattrs = {} |
| 624 | rt:update() |
| 625 | for y = y_panelhdr + 2, 23 do |
| 626 | table.insert(taggedattrs, rt:cellAttr(y-1, 4)) |
| 627 | end |
| Hisham | f5ddb97 | 2016-02-19 13:40:00 -0200 | [diff] [blame] | 628 | delay(short_delay) |
| Hisham Muhammad | e3d1ca0 | 2015-04-02 03:33:12 -0300 | [diff] [blame] | 629 | send("U") |
| 630 | local untaggedattrs = {} |
| 631 | rt:update() |
| 632 | for y = y_panelhdr + 2, 23 do |
| 633 | table.insert(untaggedattrs, rt:cellAttr(y-1, 4)) |
| 634 | end |
| 635 | send(curses.KEY_F5) |
| 636 | |
| 637 | for _, taggedattr in ipairs(taggedattrs) do |
| 638 | assert.equal(attrs.yellow_on_black, taggedattr) |
| 639 | end |
| 640 | for _, untaggedattr in ipairs(untaggedattrs) do |
| 641 | assert.equal(attrs.white_on_black, untaggedattr) |
| 642 | end |
| 643 | end) |
| Christian Göttsche | b92f62f | 2020-08-21 10:37:33 +0200 | [diff] [blame] | 644 | |
| Hisham Muhammad | a723655 | 2015-03-31 23:23:40 -0300 | [diff] [blame] | 645 | for i = 1, 62 do |
| Hisham Muhammad | 849adf6 | 2015-03-30 01:52:39 -0300 | [diff] [blame] | 646 | running_it("show column "..i, function() |
| 647 | send("S") |
| 648 | send(curses.KEY_END) |
| Hisham Muhammad | e3d1ca0 | 2015-04-02 03:33:12 -0300 | [diff] [blame] | 649 | send(curses.KEY_RIGHT, 1) |
| 650 | if i > 1 then |
| 651 | send(curses.KEY_DC) |
| 652 | end |
| 653 | send(curses.KEY_RIGHT, 1) |
| 654 | local down = i |
| 655 | while down > 13 do |
| 656 | send(curses.KEY_NPAGE) |
| 657 | down = down - 13 |
| 658 | end |
| 659 | send(curses.KEY_DOWN, down, "quick") |
| Hisham Muhammad | 849adf6 | 2015-03-30 01:52:39 -0300 | [diff] [blame] | 660 | send("\n") |
| 661 | send(curses.KEY_F10) |
| Hisham Muhammad | e3d1ca0 | 2015-04-02 03:33:12 -0300 | [diff] [blame] | 662 | if i == 62 then |
| 663 | send("S") |
| 664 | send(curses.KEY_END) |
| 665 | send(curses.KEY_RIGHT, 1) |
| 666 | if i > 1 then |
| 667 | send(curses.KEY_DC) |
| 668 | end |
| 669 | send(curses.KEY_F10) |
| 670 | end |
| Hisham Muhammad | 849adf6 | 2015-03-30 01:52:39 -0300 | [diff] [blame] | 671 | end) |
| 672 | end |
| Christian Göttsche | b92f62f | 2020-08-21 10:37:33 +0200 | [diff] [blame] | 673 | |
| Hisham Muhammad | 2939a84 | 2015-03-27 16:29:09 -0300 | [diff] [blame] | 674 | it("finally quits", function() |
| Hisham Muhammad | 849adf6 | 2015-03-30 01:52:39 -0300 | [diff] [blame] | 675 | assert(not terminated()) |
| Hisham Muhammad | 2939a84 | 2015-03-27 16:29:09 -0300 | [diff] [blame] | 676 | send("q") |
| Hisham Muhammad | 849adf6 | 2015-03-30 01:52:39 -0300 | [diff] [blame] | 677 | while not terminated() do |
| Hisham Muhammad | 2939a84 | 2015-03-27 16:29:09 -0300 | [diff] [blame] | 678 | unistd.sleep(1) |
| Hisham | f5ddb97 | 2016-02-19 13:40:00 -0200 | [diff] [blame] | 679 | send("q") |
| Hisham Muhammad | 2939a84 | 2015-03-27 16:29:09 -0300 | [diff] [blame] | 680 | end |
| Hisham Muhammad | 849adf6 | 2015-03-30 01:52:39 -0300 | [diff] [blame] | 681 | assert(terminated()) |
| Hisham Muhammad | 2939a84 | 2015-03-27 16:29:09 -0300 | [diff] [blame] | 682 | if visual then |
| 683 | curses.endwin() |
| 684 | end |
| 685 | os.execute("make lcov && xdg-open lcov/index.html") |
| 686 | end) |
| 687 | end) |