class Heroku::Kensa::ProvisionCheck

Constants

READLEN

Public Instance Methods

call!() click to toggle source
# File lib/heroku/kensa/check.rb, line 271
def call!
  json = nil
  response = nil

  code = nil
  json = nil
  callback = "http://localhost:7779/callback/999"
  reader, writer = nil

  payload = {
    :heroku_id => heroku_id,
    :plan => data[:plan] || 'test',
    :callback_url => callback, 
    :logplex_token => nil,
    :options => data[:options] || {}
  }

  if data[:async]
    reader, writer = IO.pipe
  end

  test "POST #{base_path}"
  check "response" do
    if data[:async]
      child = fork do
        reader.close
        server = TCPServer.open(7779)
        client = server.accept
        writer.write(client.readpartial(READLEN))
        client.write("HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n")
        client.close
        writer.close
      end
      sleep(1)
    end

    code, json = post(credentials, base_path, payload)

    if code == 200
      # noop
    elsif code == -1
      error("unable to connect to #{url}")
    else
      error("expected 200, got #{code}")
    end

    true
  end

  if data[:async]
    check "async response to PUT #{callback}" do
      out = reader.readpartial(READLEN)
      _, json = out.split("\r\n\r\n")
    end
  end

  check "valid JSON" do
    begin
      response = OkJson.decode(json)
    rescue OkJson::Error => boom
      error boom.message
    rescue NoMethodError => boom
      error "error parsing JSON"
    end
    true
  end

  check "authentication" do
    wrong_credentials = ['wrong', 'secret']
    code, _ = post(wrong_credentials, base_path, payload)
    error("expected 401, got #{code}") if code != 401
    true
  end

  data[:provision_response] = response

  run ProvisionResponseCheck, data
end