require "language/go"

class Probe < Formula
  desc "Command-line service interrogator"
  homepage "https://github.com/karlkfi/probe"
  head "https://github.com/karlkfi/probe.git"

  stable do
    url "https://github.com/karlkfi/probe/archive/v0.2.0.tar.gz"
    sha256 "03dc39b8941f416edabdf5cdbe1e13dadd661fbade90eab6080231d0f9df5e1b"
  end

  depends_on "go" => :build

  go_resource "github.com/tools/godep" do
    url "https://github.com/tools/godep.git", :revision => "aeda8bab6aa7e64e94a83b40e29858daeb85ee87"
  end

  def install
    contents = Dir["{*,.git,.gitignore}"]
    gopath = buildpath/"gopath"
    (gopath/"src/github.com/karlkfi/probe").install contents

    ENV["GOPATH"] = gopath
    ENV.prepend_create_path "PATH", gopath/"bin"
    Language::Go.stage_deps resources, gopath/"src"

    cd gopath/"src/github.com/tools/godep" do
      system "go", "install"
    end

    cd gopath/"src/github.com/karlkfi/probe" do
      system "make", "restoredeps"
      system "make", "build"
      bin.install "probe"
    end
  end

  test do
    # Open pipe to read server port
    rd, wr = IO.pipe

    # Launch test server
    pid = fork do
      require "socket"

      # Ask OS for free port
      server = TCPServer.new "127.0.0.1", 0
      port = server.addr[1]

      puts "Listening on port #{port}"

      # Write port to pipe
      rd.close
      wr.write port
      wr.close

      loop do
        socket = server.accept
        resp = "Ready\n"
        headers = [
          "HTTP/1.1 200 OK",
          "Content-Type: text/plain; charset=iso-8859-1",
          "Content-Length: #{resp.length}",
          "",
          ""
        ].join("\r\n")
        socket.puts headers
        socket.puts resp
        socket.close
      end
    end

    # Read port from pipe
    wr.close
    port = rd.read
    rd.close

    # Yield and wait for server to come up
    sleep 1

    # Expect exit 0
    system "probe", "http://127.0.0.1:#{port}"

    # Kill test server
    Process.kill("TERM", pid)
  end
end