Add a functional testing for leaks with clients
This opens xterm, closes it and makes sure that the client object representing xterm is GC'able at the end. The test will fail currently. Signed-off-by: Uli Schlachter <psychon@znc.in>
This commit is contained in:
parent
7d32f7b733
commit
e2d75dbcfd
|
@ -0,0 +1,78 @@
|
||||||
|
-- Some memory leak checks involving clients as integration tests.
|
||||||
|
local awful = require("awful")
|
||||||
|
local wibox = require("wibox")
|
||||||
|
|
||||||
|
-- "Enable" titlebars (so that the titlebar can prevent garbage collection)
|
||||||
|
client.connect_signal("manage", function (c)
|
||||||
|
local buttons = awful.util.table.join(
|
||||||
|
awful.button({ }, 1, function()
|
||||||
|
client.focus = c
|
||||||
|
c:raise()
|
||||||
|
awful.mouse.client.move(c)
|
||||||
|
end),
|
||||||
|
awful.button({ }, 3, function()
|
||||||
|
client.focus = c
|
||||||
|
c:raise()
|
||||||
|
awful.mouse.client.resize(c)
|
||||||
|
end)
|
||||||
|
)
|
||||||
|
|
||||||
|
-- Widgets that are aligned to the left
|
||||||
|
local left_layout = wibox.layout.fixed.horizontal(awful.titlebar.widget.iconwidget(c))
|
||||||
|
left_layout:buttons(buttons)
|
||||||
|
|
||||||
|
-- The title goes in the middle
|
||||||
|
local title = awful.titlebar.widget.titlewidget(c)
|
||||||
|
title:set_align("center")
|
||||||
|
local middle_layout = wibox.layout.flex.horizontal(title)
|
||||||
|
middle_layout:buttons(buttons)
|
||||||
|
|
||||||
|
awful.titlebar(c):set_widget(wibox.layout.align.horizontal(
|
||||||
|
left_layout,
|
||||||
|
middle_layout,
|
||||||
|
wibox.layout.fixed.horizontal(
|
||||||
|
awful.titlebar.widget.floatingbutton(c),
|
||||||
|
awful.titlebar.widget.maximizedbutton(c),
|
||||||
|
awful.titlebar.widget.stickybutton(c),
|
||||||
|
awful.titlebar.widget.ontopbutton(c),
|
||||||
|
awful.titlebar.widget.closebutton(c)
|
||||||
|
)), { position = "bottom"})
|
||||||
|
end)
|
||||||
|
|
||||||
|
-- We tell the garbage collector when to work, disable it
|
||||||
|
collectgarbage("stop")
|
||||||
|
|
||||||
|
-- We try to get a client representing an already-closed client.
|
||||||
|
-- The first iteration starts xterm, the second keeps a weak reference to it and
|
||||||
|
-- closes it and the last one checks that the client object is GC'able.
|
||||||
|
local objs = nil
|
||||||
|
local steps = {
|
||||||
|
function(count)
|
||||||
|
if count == 1 then
|
||||||
|
awful.spawn("xterm")
|
||||||
|
elseif not objs then
|
||||||
|
local c = client.get()[1]
|
||||||
|
if c then
|
||||||
|
objs = setmetatable({ c }, { __mode = "v" })
|
||||||
|
c:kill()
|
||||||
|
end
|
||||||
|
else
|
||||||
|
assert(#objs == 1)
|
||||||
|
|
||||||
|
-- Test that we have a client and that it's invalid (tostring()
|
||||||
|
-- causes an "invalid object" error)
|
||||||
|
local success, msg = pcall(function() tostring(objs[1]) end)
|
||||||
|
assert(not success)
|
||||||
|
assert(msg:find("invalid object"), msg)
|
||||||
|
|
||||||
|
-- Check that it is garbage-collectable
|
||||||
|
collectgarbage("collect")
|
||||||
|
assert(#objs == 0)
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
}
|
||||||
|
|
||||||
|
require("_runner").run_steps(steps)
|
||||||
|
|
||||||
|
-- vim: filetype=lua:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:textwidth=80
|
Loading…
Reference in New Issue