|
Play Framework/Scala example source code file (GzipSpec.scala)
The GzipSpec.scala Play Framework example source code
/*
* Copyright (C) 2009-2013 Typesafe Inc. <http://www.typesafe.com>
*/
package play.filters.gzip
import concurrent.Await
import play.api.libs.iteratee.{Iteratee, Enumeratee, Enumerator}
import concurrent.duration.Duration
import org.specs2.mutable.Specification
import scala.concurrent.ExecutionContext.Implicits._
object GzipSpec extends Specification {
"gzip" should {
/**
* Uses both Java's GZIPOutputStream and GZIPInputStream to verify correctness.
*/
def test(values: String*) = {
import java.io._
import java.util.zip._
val valuesBytes = values.map(_.getBytes("utf-8"))
val result: Array[Byte] = Await.result(Enumerator.enumerate(valuesBytes) &> Gzip.gzip() |>>> Iteratee.consume[Array[Byte]](), Duration.Inf)
// Check that it exactly matches the gzip output stream
val baos = new ByteArrayOutputStream()
val os = new GZIPOutputStream(baos)
valuesBytes.foreach(bytes => os.write(bytes))
os.close()
val baosResult = baos.toByteArray
for (i <- 0 until result.length) {
if (result(i) != baosResult(i)) {
result(i) must_== baosResult(i)
}
}
result must_== baos.toByteArray
// Check that it can be unzipped
val bais = new ByteArrayInputStream(result)
val is = new GZIPInputStream(bais)
val check: Array[Byte] = Await.result(Enumerator.fromStream(is) |>>> Iteratee.consume[Array[Byte]](), Duration.Inf)
values.mkString("") must_== new String(check, "utf-8")
}
"gzip simple input" in {
test("Hello world")
}
"gzip multiple inputs" in {
test("Hello", " ", "world")
}
"gzip large repeating input" in {
val bigString = Seq.fill(1000)("Hello world").mkString("")
test(bigString)
}
"gzip multiple large repeating inputs" in {
val bigString = Seq.fill(1000)("Hello world").mkString("")
test(bigString, bigString, bigString)
}
"gzip large random input" in {
test(scala.util.Random.nextString(10000))
}
"gzip multiple large random inputs" in {
test(scala.util.Random.nextString(10000),
scala.util.Random.nextString(10000),
scala.util.Random.nextString(10000))
}
}
"gunzip" should {
/**
* Uses the gzip enumeratee to verify correctness.
*/
def test(value: String, gunzip: Enumeratee[Array[Byte], Array[Byte]] = Gzip.gunzip(), gzip: Enumeratee[Array[Byte], Array[Byte]] = Gzip.gzip()) = {
val future = Enumerator(value.getBytes("utf-8")) &> gzip &> gunzip |>>> Iteratee.consume[Array[Byte]]()
val result = new String(Await.result(future, Duration.Inf), "utf-8")
result must_== value
}
"gunzip simple input" in {
test("Hello world")
}
"gunzip simple input in small chunks" in {
test("Hello world", gzip = Gzip.gzip(5))
}
"gunzip large repeating input" in {
test(Seq.fill(1000)("Hello world").mkString(""))
}
"gunzip large repeating input in small chunks" in {
test(Seq.fill(1000)("Hello world").mkString(""), gzip = Gzip.gzip(100))
}
"gunzip large random input" in {
test(scala.util.Random.nextString(10000))
}
"gunzip large random input in small chunks" in {
test(scala.util.Random.nextString(10000), gzip = Gzip.gzip(100))
}
}
}
Other Play Framework source code examplesHere is a short list of links related to this Play Framework GzipSpec.scala source code file: |
| ... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.