aboutsummaryrefslogtreecommitdiffstats
path: root/tests/mason-core/installer/handle_spec.lua
blob: 66a9a5c4fb1a7852e1f43e6eaba4f2b5747d9a2c (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
local InstallHandle = require "mason-core.installer.handle"
local mock = require "luassert.mock"
local spy = require "luassert.spy"
local stub = require "luassert.stub"

describe("installer handle", function()
    local snapshot

    before_each(function()
        snapshot = assert.snapshot()
    end)

    after_each(function()
        snapshot:revert()
    end)

    it("should register spawn handle", function()
        local handle = InstallHandle.new(mock.new {})
        local spawn_handle_change_handler = spy.new()
        local luv_handle = mock.new {}

        handle:once("spawn_handles:change", spawn_handle_change_handler)
        handle:register_spawn_handle(luv_handle, 1337, "tar", { "-xvf", "file" })

        assert.same({
            uv_handle = luv_handle,
            pid = 1337,
            cmd = "tar",
            args = { "-xvf", "file" },
        }, handle:peek_spawn_handle():get())
        assert.spy(spawn_handle_change_handler).was_called(1)
    end)

    it("should deregister spawn handle", function()
        local handle = InstallHandle.new(mock.new {})
        local spawn_handle_change_handler = spy.new()
        local luv_handle1 = mock.new {}
        local luv_handle2 = mock.new {}

        handle:on("spawn_handles:change", spawn_handle_change_handler)
        handle:register_spawn_handle(luv_handle1, 42, "curl", { "someurl" })
        handle:register_spawn_handle(luv_handle2, 1337, "tar", { "-xvf", "file" })

        assert.is_true(handle:deregister_spawn_handle(luv_handle1))
        assert.equals(1, #handle.spawn_handles)
        assert.same({
            uv_handle = luv_handle2,
            pid = 1337,
            cmd = "tar",
            args = { "-xvf", "file" },
        }, handle:peek_spawn_handle():get())
        assert.spy(spawn_handle_change_handler).was_called(3)
    end)

    it("should change state", function()
        local handle = InstallHandle.new(mock.new {})
        local state_change_handler = spy.new()

        handle:once("state:change", state_change_handler)
        handle:set_state "QUEUED"

        assert.equals("QUEUED", handle.state)
        assert.spy(state_change_handler).was_called(1)
        assert.spy(state_change_handler).was_called_with("QUEUED", "IDLE")
    end)

    it("should send signals to registered handles", function()
        local process = require "mason-core.process"
        stub(process, "kill")
        local uv_handle = {}
        local handle = InstallHandle.new(mock.new {})
        local kill_handler = spy.new()

        handle:once("kill", kill_handler)
        handle.state = "ACTIVE"
        handle.spawn_handles = { { uv_handle = uv_handle } }
        handle:kill(9)

        assert.spy(process.kill).was_called(1)
        assert.spy(process.kill).was_called_with(uv_handle, 9)
        assert.spy(kill_handler).was_called(1)
        assert.spy(kill_handler).was_called_with(9)
    end)

    it("should terminate handle", function()
        local process = require "mason-core.process"
        stub(process, "kill")
        local uv_handle1 = {}
        local uv_handle2 = {}
        local handle = InstallHandle.new(mock.new {})
        local kill_handler = spy.new()
        local terminate_handler = spy.new()
        local closed_handler = spy.new()

        handle:once("kill", kill_handler)
        handle:once("terminate", terminate_handler)
        handle:once("closed", closed_handler)
        handle.state = "ACTIVE"
        handle.spawn_handles = { { uv_handle = uv_handle2 }, { uv_handle = uv_handle2 } }
        handle:terminate()

        assert.spy(process.kill).was_called(2)
        assert.spy(process.kill).was_called_with(uv_handle1, 15)
        assert.spy(process.kill).was_called_with(uv_handle2, 15)
        assert.spy(kill_handler).was_called(1)
        assert.spy(kill_handler).was_called_with(15)
        assert.spy(terminate_handler).was_called(1)
        assert.is_true(handle.is_terminated)
        assert.wait(function()
            assert.is_true(handle:is_closed())
            assert.spy(closed_handler).was_called(1)
        end)
    end)
end)