Add fuzzy testing for cfg param parser

Change-Id: I2cb118e46f99f61ee5e113c7f5f1b8393ba5c542
diff --git a/Makefile b/Makefile
index 0c5ed24..debd0f4 100644
--- a/Makefile
+++ b/Makefile
@@ -39,7 +39,8 @@
 	go vet ./...
 
 fuzz:
-	go test -fuzz=FuzzTransformEndpoint -fuzztime=1m ./cmd/koralmapper
+	# go test -fuzz=FuzzTransformEndpoint -fuzztime=1m ./cmd/koralmapper
+	go test -fuzz=FuzzParseCfgParam -fuzztime=1m ./cmd/koralmapper
 
 docker:
 	docker build -f Dockerfile -t korap/koral-mapper:latest .
diff --git a/cmd/koralmapper/cfgparam_fuzz_test.go b/cmd/koralmapper/cfgparam_fuzz_test.go
new file mode 100644
index 0000000..c018a01
--- /dev/null
+++ b/cmd/koralmapper/cfgparam_fuzz_test.go
@@ -0,0 +1,34 @@
+package main
+
+import (
+	"reflect"
+	"testing"
+)
+
+func FuzzParseCfgParam(f *testing.F) {
+	f.Add("")
+	f.Add("stts-upos:atob")
+	f.Add("stts-upos:btoa:opennlp:p:upos:p")
+	f.Add("stts-upos:atob;other-mapper:btoa:stts:p:ud:pos")
+	f.Add("corpus-map:atob")
+	f.Add("unknown-id:atob")
+	f.Add("stts-upos:invalid")
+	f.Add("stts-upos:atob::::")
+
+	f.Fuzz(func(t *testing.T, raw string) {
+		parsed, err := ParseCfgParam(raw, cfgTestLists)
+		if err != nil {
+			return
+		}
+
+		rebuilt := BuildCfgParam(parsed)
+		reparsed, err := ParseCfgParam(rebuilt, cfgTestLists)
+		if err != nil {
+			t.Fatalf("reparse failed for rebuilt cfg %q from raw %q: %v", rebuilt, raw, err)
+		}
+
+		if !reflect.DeepEqual(parsed, reparsed) {
+			t.Fatalf("round-trip mismatch for raw %q: parsed=%#v reparsed=%#v rebuilt=%q", raw, parsed, reparsed, rebuilt)
+		}
+	})
+}