package org.http4s.client.blaze

import scala.concurrent.duration._
import scalaz.concurrent.Task

import org.http4s._

// TODO: this should have a more comprehensive test suite
class ExternalBlazeHttp1ClientSpec extends Http4sSpec {
  private val timeout = 30.seconds

  private val simpleClient = SimpleHttp1Client()

  "Blaze Simple Http1 Client" should {
    "Make simple https requests" in {
      val resp = simpleClient.expect[String](uri("https://github.com/")).runFor(timeout)
      resp.length mustNotEqual 0
    }
  }

  step {
    simpleClient.shutdown.run
  }

  private val pooledClient = PooledHttp1Client()

  "RecyclingHttp1Client" should {
    def fetchBody = pooledClient.toService(_.as[String]).local { uri: Uri => Request(uri = uri) }

    "Make simple https requests" in {
      val resp = fetchBody.run(uri("https://github.com/")).runFor(timeout)
      resp.length mustNotEqual 0
    }

    "Repeat a simple https request" in {
      val f = (0 until 10).map(_ => Task.fork {
        val resp = fetchBody.run(uri("https://github.com/"))
        resp.map(_.length)
      })

      foreach(Task.gatherUnordered(f).runFor(timeout)) { length =>
        length mustNotEqual 0
      }
    }
  }

  step {
    pooledClient.shutdown.run
  }
}

package org.http4s.client.blaze

import scalaz.concurrent.Task

import org.http4s._

import org.specs2.mutable.After

// TODO: this should have a more comprehensive test suite
class ExternalBlazeHttp1ClientSpec extends Http4sSpec {

  private val simpleClient = SimpleHttp1Client()

  "Blaze Simple Http1 Client" should {
    "Make simple https requests" in {
      val resp = simpleClient.expect[String](uri("https://github.com/")).run
      resp.length mustNotEqual 0
    }
  }

  step {
    simpleClient.shutdown.run
  }

  private val pooledClient = PooledHttp1Client()

  "RecyclingHttp1Client" should {
    def fetchBody = pooledClient.toService(_.as[String]).local { uri: Uri => Request(uri = uri) }

    "Make simple https requests" in {
      val resp = fetchBody.run(uri("https://github.com/")).run
      resp.length mustNotEqual 0
    }

    "Repeat a simple https request" in {
      val f = (0 until 10).map(_ => Task.fork {
        val resp = fetchBody.run(uri("https://github.com/"))
        resp.map(_.length)
      })

      foreach(Task.gatherUnordered(f).run) { length =>
        length mustNotEqual 0
      }
    }
  }

  step {
    pooledClient.shutdown.run
  }
}

--- 
+++ 
@@ -1,19 +1,19 @@
 package org.http4s.client.blaze
 
+import scala.concurrent.duration._
 import scalaz.concurrent.Task
 
 import org.http4s._
 
-import org.specs2.mutable.After
-
 // TODO: this should have a more comprehensive test suite
 class ExternalBlazeHttp1ClientSpec extends Http4sSpec {
+  private val timeout = 30.seconds
 
   private val simpleClient = SimpleHttp1Client()
 
   "Blaze Simple Http1 Client" should {
     "Make simple https requests" in {
-      val resp = simpleClient.expect[String](uri("https://github.com/")).run
+      val resp = simpleClient.expect[String](uri("https://github.com/")).runFor(timeout)
       resp.length mustNotEqual 0
     }
   }
@@ -28,7 +28,7 @@
     def fetchBody = pooledClient.toService(_.as[String]).local { uri: Uri => Request(uri = uri) }
 
     "Make simple https requests" in {
-      val resp = fetchBody.run(uri("https://github.com/")).run
+      val resp = fetchBody.run(uri("https://github.com/")).runFor(timeout)
       resp.length mustNotEqual 0
     }
 
@@ -38,7 +38,7 @@
         resp.map(_.length)
       })
 
-      foreach(Task.gatherUnordered(f).run) { length =>
+      foreach(Task.gatherUnordered(f).runFor(timeout)) { length =>
         length mustNotEqual 0
       }
     }
Set 30 second timeout on blaze client requests to github.com

Thread dumps[1,2] from http4s/http4s#897 show `ExternalBlazeHttp1ClientSpec`
running just before `AsyncHttpClientSpec` times out.  Might be
coincidence, but it seems reasonable to have a (long) timeout for
calls to external URLs anyhow.

[1] https://travis-ci.org/http4s/http4s/jobs/197158086http4s/http4s#L6885
[2] https://travis-ci.org/http4s/http4s/jobs/198883683http4s/http4s#L8345

Refs http4s/http4s#858 and http4s/http4s#817
