server_spec.lua 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. local helpers = require('test.functional.helpers')(after_each)
  2. local eq, neq, eval = helpers.eq, helpers.neq, helpers.eval
  3. local clear, funcs, meths = helpers.clear, helpers.funcs, helpers.meths
  4. local iswin = helpers.iswin
  5. local ok = helpers.ok
  6. local matches = helpers.matches
  7. local pcall_err = helpers.pcall_err
  8. local function clear_serverlist()
  9. for _, server in pairs(funcs.serverlist()) do
  10. funcs.serverstop(server)
  11. end
  12. end
  13. describe('server', function()
  14. before_each(clear)
  15. it('serverstart(), serverstop() does not set $NVIM', function()
  16. local s = eval('serverstart()')
  17. assert(s ~= nil and s:len() > 0, "serverstart() returned empty")
  18. eq('', eval('$NVIM'))
  19. eq('', eval('$NVIM_LISTEN_ADDRESS'))
  20. eq(1, eval("serverstop('"..s.."')"))
  21. eq('', eval('$NVIM_LISTEN_ADDRESS'))
  22. end)
  23. it('sets new v:servername if $NVIM_LISTEN_ADDRESS is invalid', function()
  24. clear({env={NVIM_LISTEN_ADDRESS='.'}})
  25. -- Cleared on startup.
  26. eq('', eval('$NVIM_LISTEN_ADDRESS'))
  27. local servers = funcs.serverlist()
  28. eq(1, #servers)
  29. ok(string.len(servers[1]) > 4) -- Like /tmp/nvim…/… or \\.\pipe\…
  30. end)
  31. it('sets v:servername at startup or if all servers were stopped', function()
  32. local initial_server = meths.get_vvar('servername')
  33. assert(initial_server ~= nil and initial_server:len() > 0,
  34. 'v:servername was not initialized')
  35. -- v:servername is readonly so we cannot unset it--but we can test that it
  36. -- does not get set again thereafter.
  37. local s = funcs.serverstart()
  38. assert(s ~= nil and s:len() > 0, "serverstart() returned empty")
  39. neq(initial_server, s)
  40. -- serverstop() does _not_ modify v:servername...
  41. eq(1, funcs.serverstop(s))
  42. eq(initial_server, meths.get_vvar('servername'))
  43. -- ...unless we stop _all_ servers.
  44. eq(1, funcs.serverstop(funcs.serverlist()[1]))
  45. eq('', meths.get_vvar('servername'))
  46. -- v:servername and $NVIM take the next available server.
  47. local servername = (iswin() and [[\\.\pipe\Xtest-functional-server-pipe]]
  48. or 'Xtest-functional-server-socket')
  49. funcs.serverstart(servername)
  50. eq(servername, meths.get_vvar('servername'))
  51. -- Not set in the current process, only in children.
  52. eq('', eval('$NVIM'))
  53. end)
  54. it('serverstop() returns false for invalid input', function()
  55. eq(0, eval("serverstop('')"))
  56. eq(0, eval("serverstop('bogus-socket-name')"))
  57. end)
  58. it('parses endpoints correctly', function()
  59. clear_serverlist()
  60. eq({}, funcs.serverlist())
  61. local s = funcs.serverstart('127.0.0.1:0') -- assign random port
  62. if #s > 0 then
  63. assert(string.match(s, '127.0.0.1:%d+'))
  64. eq(s, funcs.serverlist()[1])
  65. clear_serverlist()
  66. end
  67. s = funcs.serverstart('127.0.0.1:') -- assign random port
  68. if #s > 0 then
  69. assert(string.match(s, '127.0.0.1:%d+'))
  70. eq(s, funcs.serverlist()[1])
  71. clear_serverlist()
  72. end
  73. local expected = {}
  74. local v4 = '127.0.0.1:12345'
  75. local status, _ = pcall(funcs.serverstart, v4)
  76. if status then
  77. table.insert(expected, v4)
  78. pcall(funcs.serverstart, v4) -- exists already; ignore
  79. end
  80. local v6 = '::1:12345'
  81. status, _ = pcall(funcs.serverstart, v6)
  82. if status then
  83. table.insert(expected, v6)
  84. pcall(funcs.serverstart, v6) -- exists already; ignore
  85. end
  86. eq(expected, funcs.serverlist())
  87. clear_serverlist()
  88. eq('Vim:Failed to start server: invalid argument',
  89. pcall_err(funcs.serverstart, '127.0.0.1:65536')) -- invalid port
  90. eq({}, funcs.serverlist())
  91. end)
  92. it('serverlist() returns the list of servers', function()
  93. -- There should already be at least one server.
  94. local n = eval('len(serverlist())')
  95. -- Add some servers.
  96. local servs = (iswin()
  97. and { [[\\.\pipe\Xtest-pipe0934]], [[\\.\pipe\Xtest-pipe4324]] }
  98. or { [[Xtest-pipe0934]], [[Xtest-pipe4324]] })
  99. for _, s in ipairs(servs) do
  100. eq(s, eval("serverstart('"..s.."')"))
  101. end
  102. local new_servs = eval('serverlist()')
  103. -- Exactly #servs servers should be added.
  104. eq(n + #servs, #new_servs)
  105. -- The new servers should be at the end of the list.
  106. for i = 1, #servs do
  107. eq(servs[i], new_servs[i + n])
  108. eq(1, eval("serverstop('"..servs[i].."')"))
  109. end
  110. -- After serverstop() the servers should NOT be in the list.
  111. eq(n, eval('len(serverlist())'))
  112. end)
  113. end)
  114. describe('startup --listen', function()
  115. it('validates', function()
  116. clear()
  117. local cmd = { unpack(helpers.nvim_argv) }
  118. table.insert(cmd, '--listen')
  119. matches('nvim.*: Argument missing after: "%-%-listen"', funcs.system(cmd))
  120. cmd = { unpack(helpers.nvim_argv) }
  121. table.insert(cmd, '--listen2')
  122. matches('nvim.*: Garbage after option argument: "%-%-listen2"', funcs.system(cmd))
  123. end)
  124. it('sets v:servername, overrides $NVIM_LISTEN_ADDRESS', function()
  125. local addr = (iswin() and [[\\.\pipe\Xtest-listen-pipe]]
  126. or 'Xtest-listen-pipe')
  127. clear({ env={ NVIM_LISTEN_ADDRESS='Xtest-env-pipe' },
  128. args={ '--listen', addr } })
  129. eq(addr, meths.get_vvar('servername'))
  130. end)
  131. end)