myfoot/ripple — pull request #56 by kannokanno (2013-05-05 02:09:47+00:00)
Title: MusicSpecのテストでJava heap spaceが出て落ちる件を対応

俺のローカルでだけ再現

## 再現情報

### テストコード

```scala
package models.music

import models.ModelSpecBase
import java.io.{FileInputStream, InputStream, File}

class MusicSpec extends ModelSpecBase {
val mp3TestDataName = "test-data.mp3"
val mp3TestDataPath = s"test/data/$mp3TestDataName"

"Music" should {
".apply(File)" >> {
"ファイルのデータが配列で取得できる" >> {
val file = new File(mp3TestDataPath)
Music(file).rawData must_== read(file)
}
}
}

def read(data: File): Array[Byte] = {
val buffer = new Array[Byte](data.length.toInt)
using(new FileInputStream(data)){ _.read(buffer) }
buffer
}

def using(in: InputStream)(f: InputStream => Unit) = {
try {
f(in)
} finally {
in.close
}
}
}
```

### 実行結果

/Users/kanno/workspace/app/ripple% sbt [design-register-error ~/workspace/app/ripple]
[ripple] $ test-only models.music.MusicSpec
[info] MusicSpec
[info]
[info] Music should
[info] .apply(File)
[error] ! ファイルのデータが配列で取得できる
[error] ThrowableException: Java heap space (TraversableLike.scala:244)
[error] Java heap space
[info]
[info]
[info]
[info] Total for specification MusicSpec
[info] Finished in 2 seconds, 509 ms
[info] 1 example, 0 failure, 1 error
[info]
[error] Error: Total 1, Failed 0, Errors 1, Passed 0, Skipped 0
[error] Error during tests:
[error]	models.music.MusicSpec
[error] (test:test-only) Tests unsuccessful
[error] Total time: 121 s, completed 2013/05/05 10:42:34
[ripple] $

## 問題箇所

以下のassert部分で落ちる。

```scala
Music(file).rawData must_== read(file)
```

* ファイルを読み込む段階では問題ないことを確認している
* データ配列確保時にヒープ不足で落ちていたわけではない
* Specs2の `must_==` を使ったときに落ちる
* どのタイミングか分からないが、内部でトラバースするときにメモリかスタックが溢れたのかも
* でかい配列の中身をすべて回すわけなので
* jconsleで見ている分には領域溢れしていないのがちょっと不思議だけど

## 対応

`must_==` で検証する値をArrayではなくbooleanに変更する。

```scala
"ファイルのデータが配列で取得できる" >> {
val file = new File(mp3TestDataPath)
Music(file).rawData sameElements read(file) must_== true
}
```