blob: 2ae8015d69dd92521702b952b15b71e622b8c782 [file] [log] [blame]
Hisham Muhammad2939a842015-03-27 16:29:09 -03001#!/usr/bin/env lua
2
Hisham Muhammad99e58b32015-03-28 19:36:06 -03003local VISUALDELAY = os.getenv("VISUALDELAY")
Christian Göttscheb92f62f2020-08-21 10:37:33 +02004
Hisham Muhammad99e58b32015-03-28 19:36:06 -03005local visual = VISUALDELAY or false
6local visual_delay = VISUALDELAY and (tonumber(VISUALDELAY)) or 0.1
Hishamf5ddb972016-02-19 13:40:00 -02007local short_delay = 0.3
8local long_delay = 1
Hisham Muhammad2939a842015-03-27 16:29:09 -03009
Hisham Muhammad2939a842015-03-27 16:29:09 -030010local unistd = require("posix.unistd")
11local time = require("posix.time")
12local curses = require("posix.curses")
13local rote = require("rote")
14
15local rt = rote.RoteTerm(24, 80)
16
Hishamf5ddb972016-02-19 13:40:00 -020017--[[
Hisham Muhammade5b08442015-04-02 02:13:07 -030018local 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$", ""))
23end
Hishamf5ddb972016-02-19 13:40:00 -020024]]
25--local branch = os_execread("git branch | grep '*'"):sub(3)
26--print("Running in branch "..branch)
Hisham Muhammade5b08442015-04-02 02:13:07 -030027
Hisham Muhammad2939a842015-03-27 16:29:09 -030028os.execute("make coverage")
29os.execute("rm -f *.gcda */*.gcda")
30os.execute("rm -f coverage.info test.htoprc")
31os.execute("rm -rf lcov")
Hisham Muhammad849adf62015-03-30 01:52:39 -030032os.execute("killall htop")
33os.execute("ps aux | grep '[s]leep 12345' | awk '{print $2}' | xargs kill 2> /dev/null")
Hisham Muhammad2939a842015-03-27 16:29:09 -030034
Hisham Muhammad849adf62015-03-30 01:52:39 -030035os.execute("cp ./default.htoprc ./test.htoprc")
Hishamf5ddb972016-02-19 13:40:00 -020036rt:forkPty("LC_ALL=C HTOPRC=./test.htoprc ./htop 2> htop-valgrind.txt")
Hisham Muhammad2939a842015-03-27 16:29:09 -030037
38local stdscr, term_win
Hishamd4a80232016-08-30 12:37:31 -030039-- Curses initialization needed even when not in visual mode
Hisham Muhammad2939a842015-03-27 16:29:09 -030040-- because luaposix only initializes KEY_* constants after initscr().
41stdscr = curses.initscr()
42if 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
61else
62 curses.endwin()
63end
64
Hisham Muhammad2939a842015-03-27 16:29:09 -030065local 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öttscheb92f62f2020-08-21 10:37:33 +020073
Hisham Muhammad2939a842015-03-27 16:29:09 -030074 delay(visual_delay)
75 end
76end
77
Hisham Muhammade3d1ca02015-04-02 03:33:12 -030078local function send(key, times, quick)
Hisham Muhammad849adf62015-03-30 01:52:39 -030079 if times == 0 then return end
Hisham Muhammada7236552015-03-31 23:23:40 -030080 for _ = 1, times or 1 do
Hisham Muhammad2939a842015-03-27 16:29:09 -030081 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 Muhammade3d1ca02015-04-02 03:33:12 -030089 if not quick then
90 show(key)
91 end
92 end
93 if quick then
Hisham Muhammad2939a842015-03-27 16:29:09 -030094 show(key)
95 end
96end
97
98local 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)
105end
106
107local function is_string_at(x, y, str)
108 return string_at(x, y, #str) == str
109end
110
111local function check_string_at(x, y, str)
112 return { str, string_at(x, y, #str) }
113end
114
Hisham Muhammad849adf62015-03-30 01:52:39 -0300115local ESC = "\27\27"
Hisham Muhammad2939a842015-03-27 16:29:09 -0300116
Hishamf5ddb972016-02-19 13:40:00 -0200117function delay(t)
118 time.nanosleep({ tv_sec = math.floor(t), tv_nsec = (t - math.floor(t)) * 1000000000 })
119end
120
121delay(2) -- give some time for htop to initialize.
122rt:update()
Hisham Muhammad2939a842015-03-27 16:29:09 -0300123
Hisham Muhammad849adf62015-03-30 01:52:39 -0300124local y_panelhdr = (function()
125 for y = 1, 24 do
126 if is_string_at(3, y, "PID") then
127 return y
Hisham Muhammad2939a842015-03-27 16:29:09 -0300128 end
129 end
130end)() or 1
131
Hishamf5ddb972016-02-19 13:40:00 -0200132assert.not_equal(y_panelhdr, 1)
133
134local x_metercol2 = 41
Hisham Muhammad849adf62015-03-30 01:52:39 -0300135
Hisham Muhammad2939a842015-03-27 16:29:09 -0300136show()
137
Hisham Muhammad849adf62015-03-30 01:52:39 -0300138os.execute("sleep 12345 &")
139
140local function terminated()
141 return not os.execute("ps aux | grep -q '\\./[h]top'")
142end
Hisham Muhammad2939a842015-03-27 16:29:09 -0300143
144local function running_it(desc, fn)
145 it(desc, function()
Hisham Muhammad849adf62015-03-30 01:52:39 -0300146 assert(not terminated())
Hisham Muhammad2939a842015-03-27 16:29:09 -0300147 show()
148 fn()
Hisham Muhammad849adf62015-03-30 01:52:39 -0300149 assert(not terminated())
Hisham Muhammad2939a842015-03-27 16:29:09 -0300150 end)
151end
152
153local function check(t)
154 return t[1], t[2]
155end
156
Hisham Muhammad849adf62015-03-30 01:52:39 -0300157local attrs = {
158 black_on_cyan = 6,
159 red_on_cyan = 22,
Hisham Muhammade3d1ca02015-04-02 03:33:12 -0300160 white_on_black = 176,
161 yellow_on_black = 112,
Hisham Muhammad849adf62015-03-30 01:52:39 -0300162}
163
Hisham Muhammada7236552015-03-31 23:23:40 -0300164local function find_selected_y(from)
165 rt:update()
166 for y = from or (y_panelhdr + 1), rt:rows() - 1 do
Hisham Muhammad849adf62015-03-30 01:52:39 -0300167 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
173end
174
175local 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
182end
183
Hisham Muhammade3d1ca02015-04-02 03:33:12 -0300184local function set_display_option(n)
185 send("S")
186 send(curses.KEY_DOWN)
187 send(curses.KEY_RIGHT)
Hisham Muhammad01a29f02015-04-08 21:27:52 -0300188 send(curses.KEY_DOWN, n, "quick")
Hisham Muhammade3d1ca02015-04-02 03:33:12 -0300189 send("\n")
190 send(curses.KEY_F10)
191end
192
Hisham Muhammad2939a842015-03-27 16:29:09 -0300193describe("htop test suite", function()
Christian Göttscheb92f62f2020-08-21 10:37:33 +0200194
Hisham Muhammad849adf62015-03-30 01:52:39 -0300195 running_it("performs incremental filter", function()
196 send("\\")
Hisham Muhammada7236552015-03-31 23:23:40 -0300197 send("x\127bux\127sted") -- test backspace
Hisham Muhammad849adf62015-03-30 01:52:39 -0300198 send("\n")
Hishamf5ddb972016-02-19 13:40:00 -0200199 delay(short_delay)
Hisham Muhammad849adf62015-03-30 01:52:39 -0300200 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)
Hishamf5ddb972016-02-19 13:40:00 -0200207 delay(short_delay)
Hisham Muhammad849adf62015-03-30 01:52:39 -0300208 rt:update()
209 local initpid = check_string_at(1, y_panelhdr + 1, " 1")
Hishamf5ddb972016-02-19 13:40:00 -0200210 delay(short_delay)
Hisham Muhammad849adf62015-03-30 01:52:39 -0300211 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)
Hishamf5ddb972016-02-19 13:40:00 -0200222 delay(short_delay)
Hisham Muhammad849adf62015-03-30 01:52:39 -0300223 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 Muhammadfde34572015-04-08 19:07:41 -0300227 send("\n")
Hisham Muhammad849adf62015-03-30 01:52:39 -0300228 send(curses.KEY_HOME)
229 assert.equal(check(ourpid))
230 end)
231
Hisham Muhammad01a29f02015-04-08 21:27:52 -0300232 running_it("performs pid search", function()
233 send(curses.KEY_F5)
234 send(curses.KEY_END)
235 send("1")
Hishamf5ddb972016-02-19 13:40:00 -0200236 delay(short_delay)
Hisham Muhammad01a29f02015-04-08 21:27:52 -0300237 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)
Hishamf5ddb972016-02-19 13:40:00 -0200247 delay(short_delay)
Hisham Muhammad01a29f02015-04-08 21:27:52 -0300248 local str1 = string_at(1+h_scroll, y_panelhdr+1, 5)
249 send(curses.KEY_RIGHT)
Hishamf5ddb972016-02-19 13:40:00 -0200250 delay(short_delay)
Hisham Muhammad01a29f02015-04-08 21:27:52 -0300251 local str2 = string_at(1, y_panelhdr+1, 5)
252 send(curses.KEY_LEFT)
Hishamf5ddb972016-02-19 13:40:00 -0200253 delay(short_delay)
Hisham Muhammad01a29f02015-04-08 21:27:52 -0300254 local str3 = string_at(1+h_scroll, y_panelhdr+1, 5)
255 send(curses.KEY_LEFT)
Hishamf5ddb972016-02-19 13:40:00 -0200256 delay(short_delay)
Hisham Muhammad01a29f02015-04-08 21:27:52 -0300257 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 Muhammad849adf62015-03-30 01:52:39 -0300264 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")
Hishamf5ddb972016-02-19 13:40:00 -0200271 delay(short_delay)
Hisham Muhammad849adf62015-03-30 01:52:39 -0300272 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)
Hishamf5ddb972016-02-19 13:40:00 -0200279 delay(short_delay)
Hisham Muhammad849adf62015-03-30 01:52:39 -0300280 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")
Hishamf5ddb972016-02-19 13:40:00 -0200290 delay(long_delay)
Hisham Muhammad849adf62015-03-30 01:52:39 -0300291 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")
Hishamf5ddb972016-02-19 13:40:00 -0200300 delay(long_delay)
Hisham Muhammad849adf62015-03-30 01:52:39 -0300301 send(ESC)
302 end)
303
Hisham Muhammada7236552015-03-31 23:23:40 -0300304 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")
Hishamf5ddb972016-02-19 13:40:00 -0200312 delay(long_delay)
Hisham Muhammada7236552015-03-31 23:23:40 -0300313 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")
Hishamf5ddb972016-02-19 13:40:00 -0200326 delay(long_delay)
Hisham Muhammada7236552015-03-31 23:23:40 -0300327 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 Muhammad849adf62015-03-30 01:52:39 -0300335 send("S")
Hisham Muhammada7236552015-03-31 23:23:40 -0300336 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 Muhammad849adf62015-03-30 01:52:39 -0300343 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)
Hishamf5ddb972016-02-19 13:40:00 -0200350 delay(short_delay)
Hisham Muhammad849adf62015-03-30 01:52:39 -0300351 rt:update()
352 local chosen = string_at(1, y_panelhdr + 2, 9)
353 send("\n")
354 send(curses.KEY_HOME)
Hishamf5ddb972016-02-19 13:40:00 -0200355 delay(short_delay)
Hisham Muhammad849adf62015-03-30 01:52:39 -0300356 rt:update()
357 local shown = string_at(7, y_panelhdr + 1, 9)
358 send("u")
359 send("\n")
360 send(curses.KEY_HOME)
Hishamf5ddb972016-02-19 13:40:00 -0200361 delay(short_delay)
Hisham Muhammad849adf62015-03-30 01:52:39 -0300362 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")
Hishamf5ddb972016-02-19 13:40:00 -0200373 delay(short_delay)
Hisham Muhammad849adf62015-03-30 01:52:39 -0300374 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öttscheb92f62f2020-08-21 10:37:33 +0200400
Hisham Muhammad2939a842015-03-27 16:29:09 -0300401 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öttscheb92f62f2020-08-21 10:37:33 +0200406
Hisham Muhammad99e58b32015-03-28 19:36:06 -0300407 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)
Hishamf5ddb972016-02-19 13:40:00 -0200414 delay(short_delay)
Hisham Muhammad849adf62015-03-30 01:52:39 -0300415 local ppid = check_string_at(2, y_panelhdr, "PPID")
Hisham Muhammad99e58b32015-03-28 19:36:06 -0300416 send("S")
417 send(curses.KEY_DOWN, 3)
418 send(curses.KEY_RIGHT, 1)
419 send(curses.KEY_DC)
420 send(curses.KEY_F10)
Hishamf5ddb972016-02-19 13:40:00 -0200421 delay(short_delay)
Hisham Muhammad849adf62015-03-30 01:52:39 -0300422 local not_ppid = check_string_at(2, y_panelhdr, "PPID")
Hisham Muhammad99e58b32015-03-28 19:36:06 -0300423 assert.equal(check(ppid))
424 assert.not_equal(check(not_ppid))
425 end)
Christian Göttscheb92f62f2020-08-21 10:37:33 +0200426
Hisham Muhammad2939a842015-03-27 16:29:09 -0300427 running_it("changes CPU affinity for a process", function()
428 send("a")
429 send(" \n")
430 send(ESC)
431 end)
Hisham Muhammade3d1ca02015-04-02 03:33:12 -0300432
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)
Hishamf5ddb972016-02-19 13:40:00 -0200440 delay(short_delay)
Hisham Muhammade3d1ca02015-04-02 03:33:12 -0300441 local after = check_string_at(22, line, " 1")
442 assert.equal(check(before))
443 assert.equal(check(after))
444 end)
Hisham Muhammad01a29f02015-04-08 21:27:52 -0300445
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)
Hishamf5ddb972016-02-19 13:40:00 -0200453 delay(short_delay)
Hisham Muhammad01a29f02015-04-08 21:27:52 -0300454 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)
Hishamf5ddb972016-02-19 13:40:00 -0200463 delay(short_delay)
Hisham Muhammad01a29f02015-04-08 21:27:52 -0300464 local zerocpu = check_string_at(cpu_col, y_panelhdr + 1, " 0.0")
465 send("I")
Hishamf5ddb972016-02-19 13:40:00 -0200466 delay(short_delay)
Hisham Muhammad01a29f02015-04-08 21:27:52 -0300467 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öttscheb92f62f2020-08-21 10:37:33 +0200471
Hisham Muhammad849adf62015-03-30 01:52:39 -0300472 running_it("changes IO priority for a process", function()
473 send("/")
474 send("htop")
Hisham Muhammad2939a842015-03-27 16:29:09 -0300475 send("\n")
Hisham Muhammad849adf62015-03-30 01:52:39 -0300476 send("i")
477 send(curses.KEY_END)
Hisham Muhammad2939a842015-03-27 16:29:09 -0300478 send("\n")
479 send(ESC)
480 end)
Hisham Muhammade3d1ca02015-04-02 03:33:12 -0300481
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 Muhammad01a29f02015-04-08 21:27:52 -0300490
491 running_it("moves meters around", function()
Hishamf5ddb972016-02-19 13:40:00 -0200492 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 Muhammad01a29f02015-04-08 21:27:52 -0300504 end)
Christian Göttscheb92f62f2020-08-21 10:37:33 +0200505
Hisham Muhammad849adf62015-03-30 01:52:39 -0300506 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" },
Hishamf5ddb972016-02-19 13:40:00 -0200511 { name = "memory", down = 3, string = "Mem" },
Hisham Muhammad01a29f02015-04-08 21:27:52 -0300512 { name = "CPU average", down = 16, string = "Avg" },
Hisham Muhammad849adf62015-03-30 01:52:39 -0300513 }
Hisham Muhammad01a29f02015-04-08 21:27:52 -0300514
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
Hishamf5ddb972016-02-19 13:40:00 -0200520 send("\n")
521 send("\n")
522 send(curses.KEY_DC)
523 send(curses.KEY_RIGHT)
524 send(curses.KEY_DOWN)
Hisham Muhammad01a29f02015-04-08 21:27:52 -0300525 end
526 end)
527
Hisham Muhammad849adf62015-03-30 01:52:39 -0300528 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)
Hishamf5ddb972016-02-19 13:40:00 -0200533 send("\n")
534 send(curses.KEY_UP, 4)
535 send("\n")
Hisham Muhammada7236552015-03-31 23:23:40 -0300536 send(curses.KEY_F4, 4) -- cycle through meter modes
Hishamf5ddb972016-02-19 13:40:00 -0200537 delay(short_delay)
Hisham Muhammad849adf62015-03-30 01:52:39 -0300538 rt:update()
539 local with = check_string_at(x_metercol2, 2, item.string)
540 send(curses.KEY_DC)
Hishamf5ddb972016-02-19 13:40:00 -0200541 delay(short_delay)
Hisham Muhammad849adf62015-03-30 01:52:39 -0300542 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 Muhammada7236552015-03-31 23:23:40 -0300553 for _ = 1, 6 do
Hisham Muhammad849adf62015-03-30 01:52:39 -0300554 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öttscheb92f62f2020-08-21 10:37:33 +0200561
Hisham Muhammad849adf62015-03-30 01:52:39 -0300562 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öttscheb92f62f2020-08-21 10:37:33 +0200577
Hisham Muhammad849adf62015-03-30 01:52:39 -0300578 for _, item in ipairs(display_options) do
579 running_it("checks display option to "..item.name, function()
580 for _ = 1, 2 do
Hisham Muhammade3d1ca02015-04-02 03:33:12 -0300581 set_display_option(item.down)
Hishamf5ddb972016-02-19 13:40:00 -0200582 delay(short_delay)
Hisham Muhammad849adf62015-03-30 01:52:39 -0300583 end
584 end)
585 end
Hisham Muhammada7236552015-03-31 23:23:40 -0300586
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 Muhammad01a29f02015-04-08 21:27:52 -0300596 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 Muhammada7236552015-03-31 23:23:40 -0300600 send(curses.KEY_F10)
Hishamf5ddb972016-02-19 13:40:00 -0200601 delay(short_delay)
Hisham Muhammada7236552015-03-31 23:23:40 -0300602 end
603 end)
Hisham Muhammade3d1ca02015-04-02 03:33:12 -0300604
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
Hishamf5ddb972016-02-19 13:40:00 -0200628 delay(short_delay)
Hisham Muhammade3d1ca02015-04-02 03:33:12 -0300629 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öttscheb92f62f2020-08-21 10:37:33 +0200644
Hisham Muhammada7236552015-03-31 23:23:40 -0300645 for i = 1, 62 do
Hisham Muhammad849adf62015-03-30 01:52:39 -0300646 running_it("show column "..i, function()
647 send("S")
648 send(curses.KEY_END)
Hisham Muhammade3d1ca02015-04-02 03:33:12 -0300649 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 Muhammad849adf62015-03-30 01:52:39 -0300660 send("\n")
661 send(curses.KEY_F10)
Hisham Muhammade3d1ca02015-04-02 03:33:12 -0300662 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 Muhammad849adf62015-03-30 01:52:39 -0300671 end)
672 end
Christian Göttscheb92f62f2020-08-21 10:37:33 +0200673
Hisham Muhammad2939a842015-03-27 16:29:09 -0300674 it("finally quits", function()
Hisham Muhammad849adf62015-03-30 01:52:39 -0300675 assert(not terminated())
Hisham Muhammad2939a842015-03-27 16:29:09 -0300676 send("q")
Hisham Muhammad849adf62015-03-30 01:52:39 -0300677 while not terminated() do
Hisham Muhammad2939a842015-03-27 16:29:09 -0300678 unistd.sleep(1)
Hishamf5ddb972016-02-19 13:40:00 -0200679 send("q")
Hisham Muhammad2939a842015-03-27 16:29:09 -0300680 end
Hisham Muhammad849adf62015-03-30 01:52:39 -0300681 assert(terminated())
Hisham Muhammad2939a842015-03-27 16:29:09 -0300682 if visual then
683 curses.endwin()
684 end
685 os.execute("make lcov && xdg-open lcov/index.html")
686 end)
687end)