snapshot testingのライブラリを書いた #go
書いた。
なぜ書いたか
snapshot testingのライブラリを使ってライブラリを作ろうとしていたが
いまいち使い勝手が合わなかったので、機能を落としたものを作った。
試したのは以下の2つだが、goldieのほうが挙動としては近かったが
使い方には合わないかなと思って小さいライブラリを書いてみた。
使い方
以下のような形で、snapshotに追記できるようになっている。
これは、順序のあるデータを記録できるようにこうしている。
(が、Snapshotという関数は変な気もしてきたが気にしないことにする)
func TestSnapshot(t *testing.T) { s := New() _ = s.Snapshot("xxx") _ = s.Snapshot("xxx") _ = s.Snapshot("xxxy") s.Assert(t) }
snapshotとしては以下のようなファイルが生成される。
xxx xxx xxxy
io.Writerのインターフェースも実装しておいた。
func TestCanUseAsIoWriter(t *testing.T) { s := New() b := bytes.NewBufferString("test") _, _ = io.Copy(s, b) s.Assert(t) }
AWS SQSの代替として使える elasticmq の公式dockerイメージでqueueを起動時に作る方法
elasticmqの公式dockerイメージでqueueを起動時に作成する方法を紹介します。 動作は、softwaremill/elasticmq:0.15.7で確認しました。
TL;DR
- 環境変数JAVA_OPTSに "-Dconfig.override_with_env_vars=true" を追加する
- CONFIG_FORCE_queues<your-queue-name>fifoに "false" を設定する
以下はCircleCIの設定例です。
- image: softwaremill/elasticmq:0.15.7 environment: JAVA_OPTS: "-Dconfig.override_with_env_vars=true" CONFIG_FORCE_queues_queue1_fifo: false
なぜこれが動くのか
elasticmqは設定ファイルとして、typesafe configを使っています。 そのため、System propertiesとして、config.override_with_env_vars=trueを渡すと 環境変数で設定を上書き出来るようになります。 また環境変数は以下のルールで変形された後、設定名として使われます。
- CONFIG_FORCE_ を取り除く
- 単一の アンダースコア
_
を ドット.
に置き換える - 2連続の アンダースコア
__
を ダッシュ-
に置き換える - 3連続の アンダースコア
___
を 単一のアンダースコア_
に置き換える
今回は、queues.<queue-name>がobjectである必要があるので
queues.<queue-name>からネストした値である fifo
に値を与えることで
queues.<queue-name> を objectになるように設定します。
そのため、環境変数としては、CONFIG_FORCE_queues<queue-name>fifoにfalse を設定することで 起動時にqueueが作成されることになります。
終わり
goでJavaのクラスファイルのパーサを書いた
そういえば、書いたことがないなぁと思って、Javaのクラスファイルのパーサを書きました。 Java SE 15のJVM Specification だけを見ながら フルスペックのクラスファイルのパーサを書きました。
書いたけど、パース出来るだけで pretty printが出来たり、なんかいい感じのAPIが生えてたりするわけではないです。
元々、emc(enhanced memory calculator) のために tinycedar/classp の フォークである wreulicke/go-java-class-parser を弄っていましたが メモリ計算のためのツールのために実装したので、フルスペックのパーサではなく、必要な部分しか実装していません。
実装の流れとしては、class File Format の項を上から読みながら実装していきました。 ハマったところは何個かあって、以下のようなところでハマりました。
- Long/DoubleのConstantはなぜかConstantPoolのindexを1つ先にずらすこと
- LineNumberTable attributeの場合になぜか、attributeLengthとlineNumberTableLengthから計算できる消費するバイト数が一致しないこと
- uint8のところをuint16で読み取りしていて、位置がズレてデバッグが大変
- パースする処理を単純に飛ばしてしまっていて、これまた位置がずれて大変
実装に掛かった時間としては、色々やりながら、大体2日で終わりました。 まだちょっと直せる部分とかはあるのと、APIとしては弱いので もう少し弄ろうと思います。
たぶん、これから互換性が失われるところがいくつか出ると思います。 終わり。