Linuxでテスト失敗してたのがあるんだよね。

ファイルの更新をチェックするコードがあって、テスト自体は、Windows上では問題ないのだが、Linux上ではうまく行かない(失敗する)というコードがあった。前までは、1個だし、いっかーとかおもってたのだが、色々コードをいじってたら、5個になっちゃった。こりゃ、なんかあるかもと思い色々調べ始めたのだが、さっぱりわからねー。そうこうするうちに、あるテストがWindows上でもひっかかるようになってきた。こりゃなんかあるかとおもったのだが、コード上はもんだいなさそうだ。タイミングかなー、でもJavaの時間を System.currentTimeMills() って、ミリ秒だし、変更前には数ミリ秒かわってるだろって、たかをくくってたら、どうもそこにヒットしていたらしい。
最初にファイルを作成した後、チェックして、ファイルを更新して、再度チェックしてた。例えば、こんな風:

1. ファイルを作成
2. 更新時刻を保存
3. ファイル更新確認 (更新前なので更新されていない)
4. ファイルを更新
5. Thread.sleep(1000)
6. ファイルの更新確認 (まだ、更新されていない状態...)

すると、3, 4 の作業があっても、6 で更新されてないよって出る(2で保存した時刻と比較)。そりゃ、時刻としてはちょこっとだけど、ミリ秒はかわるだろって思ってたら、どーもさっぱりかわらなかったようだ。キャッシュか、単にCPUの速度の問題か不明だが(Thread.sleep(1)を入れてもかわらないときがあったので、キャッシュかも)、そもそも sleep 入れる場所をまちがってるよね...。入れるなら、 2, 3 の間に入れて、ちゃんとファイル作成時刻と 更新時刻を離さないとね。

ということで、2, 3 の間に Thread.sleep(1000) ぐらいをいれることで、Linuxでもテストが通るようになった。