mirror of
https://github.com/livebook-dev/livebook.git
synced 2025-09-29 16:24:27 +08:00
Test remote intellisense on a standalone runtime node (#2638)
This commit is contained in:
parent
e88e5f02c7
commit
130e94eb7f
1 changed files with 42 additions and 34 deletions
|
@ -3,7 +3,6 @@ defmodule Livebook.RemoteIntellisenseTest do
|
|||
alias Livebook.Intellisense
|
||||
|
||||
@moduletag :with_epmd
|
||||
@tmp_dir "tmp/test/remote_intellisense"
|
||||
|
||||
# Returns intellisense context resulting from evaluating
|
||||
# the given block of code in a fresh context.
|
||||
|
@ -22,43 +21,52 @@ defmodule Livebook.RemoteIntellisenseTest do
|
|||
end
|
||||
|
||||
setup_all do
|
||||
{:ok, _pid, node} =
|
||||
:peer.start(%{
|
||||
name: :remote_runtime,
|
||||
args: [~c"-setcookie", Atom.to_charlist(Node.get_cookie())],
|
||||
wait_boot: 30_000
|
||||
# We use the standalone runtime to mimic a remote node. Note that
|
||||
# in the past we used :peer.start, but it was often failing on CI
|
||||
# (the start was timing out)
|
||||
|
||||
{:ok, runtime} = Livebook.Runtime.ElixirStandalone.new() |> Livebook.Runtime.connect()
|
||||
|
||||
parent = self()
|
||||
|
||||
runtime_owner_pid =
|
||||
start_supervised!({
|
||||
Task,
|
||||
fn ->
|
||||
Livebook.Runtime.take_ownership(runtime)
|
||||
|
||||
code =
|
||||
~S'''
|
||||
defmodule RemoteModule do
|
||||
@moduledoc """
|
||||
RemoteModule module docs
|
||||
"""
|
||||
|
||||
@doc """
|
||||
Hello doc
|
||||
"""
|
||||
def hello(message) do
|
||||
message
|
||||
end
|
||||
end
|
||||
'''
|
||||
|
||||
Livebook.Runtime.evaluate_code(runtime, :elixir, code, {:c1, :e1}, [])
|
||||
|
||||
receive do: ({:runtime_evaluation_response, :e1, _, _} -> :ok)
|
||||
send(parent, :continue)
|
||||
|
||||
Process.sleep(:infinity)
|
||||
end
|
||||
})
|
||||
|
||||
{:module, Elixir.RemoteModule, bytecode, _} =
|
||||
defmodule Elixir.RemoteModule do
|
||||
@compile {:autoload, false}
|
||||
@moduledoc """
|
||||
RemoteModule module docs
|
||||
"""
|
||||
receive do: (:continue -> :ok)
|
||||
|
||||
@doc """
|
||||
Hello doc
|
||||
"""
|
||||
def hello(message) do
|
||||
message
|
||||
end
|
||||
end
|
||||
on_exit(fn ->
|
||||
Process.exit(runtime_owner_pid, :kill)
|
||||
end)
|
||||
|
||||
false = Code.ensure_loaded?(RemoteModule)
|
||||
|
||||
File.rm_rf!(@tmp_dir)
|
||||
File.mkdir_p!(@tmp_dir)
|
||||
File.write!("#{@tmp_dir}/Elixir.RemoteModule.beam", bytecode)
|
||||
|
||||
elixir_path = Path.join(:code.lib_dir(:elixir), "ebin")
|
||||
|
||||
:ok = :erpc.call(node, :code, :add_paths, [[~c"#{@tmp_dir}", ~c"#{elixir_path}"]])
|
||||
{:ok, _} = :erpc.call(node, :application, :ensure_all_started, [:elixir])
|
||||
{:module, RemoteModule} = :erpc.call(node, :code, :load_file, [RemoteModule])
|
||||
:loaded = :erpc.call(node, :code, :module_status, [RemoteModule])
|
||||
:ok = :erpc.call(node, :application, :load, [:mnesia])
|
||||
|
||||
[node: node]
|
||||
[node: runtime.node]
|
||||
end
|
||||
|
||||
describe "intellisense completion for remote nodes" do
|
||||
|
|
Loading…
Add table
Reference in a new issue