tailscale 0.2.0

A work-in-progress Tailscale implementation
Documentation
defmodule Tailscale.Test do
  use ExUnit.Case, async: true
  
  describe "client connect" do
    setup [:check_net, :auth_key, :state_file]

    test "connect", %{state_file: state_file, auth_key: auth_key} do
      {:ok, dev} = Tailscale.connect(state_file, auth_key)
      IO.puts("connected!")

      {:ok, ip} = Tailscale.ipv4(dev)
      IO.puts("tailnet ip: #{ip |> :inet.ntoa}")
    end
  end
  
  describe "connected client" do
    setup [:connected_client]

    test "ip4", %{ts: dev} do
      {:ok, ip} = Tailscale.ipv4(dev)
      assert :inet.is_ipv4_address(ip)
    end

    test "ip6", %{ts: dev} do
      {:ok, ip} = Tailscale.ipv6(dev)
      assert :inet.is_ipv6_address(ip)
    end

    test "udp bind", %{ts: dev} do
      {:ok, ip} = Tailscale.ipv4(dev)
      {:ok, _sock} = Tailscale.Udp.bind(dev, ip, 1234)
    end

    test "tcp listen", %{ts: dev} do
      {:ok, ip} = Tailscale.ipv4(dev)
      {:ok, _sock} = Tailscale.Tcp.listen(dev, ip, 1234)
    end
  end
  
  defp check_net(ctx), do: Tailscale.Test.Helpers.check_net(ctx)
  defp auth_key(ctx), do: Tailscale.Test.Helpers.auth_key(ctx)
  defp state_file(ctx), do: Tailscale.Test.Helpers.state_file(ctx)
  defp connected_client(ctx), do: Tailscale.Test.Helpers.connected_client(ctx)
end