This patch makes protoio use the new protobuf API for marshalling/unmarshalling text protobufs, as well as extends the tests to cover marshalling failures. The protobuf text output is not stable/deterministic and some spaces are added randomly, so some integration tests have to be adjusted to account for it.
143 lines
3.5 KiB
Go
143 lines
3.5 KiB
Go
package protoio
|
|
|
|
import (
|
|
"os"
|
|
"testing"
|
|
|
|
"blitiri.com.ar/go/chasquid/internal/protoio/testpb"
|
|
"blitiri.com.ar/go/chasquid/internal/testlib"
|
|
)
|
|
|
|
func TestBin(t *testing.T) {
|
|
dir := testlib.MustTempDir(t)
|
|
defer testlib.RemoveIfOk(t, dir)
|
|
pb := &testpb.M{Content: "hola"}
|
|
|
|
if err := WriteMessage("f", pb, 0600); err != nil {
|
|
t.Error(err)
|
|
}
|
|
|
|
pb2 := &testpb.M{}
|
|
if err := ReadMessage("f", pb2); err != nil {
|
|
t.Error(err)
|
|
}
|
|
if pb.Content != pb2.Content {
|
|
t.Errorf("content mismatch, got %q, expected %q", pb2.Content, pb.Content)
|
|
}
|
|
}
|
|
|
|
func TestText(t *testing.T) {
|
|
dir := testlib.MustTempDir(t)
|
|
defer testlib.RemoveIfOk(t, dir)
|
|
pb := &testpb.M{Content: "hola"}
|
|
|
|
if err := WriteTextMessage("f", pb, 0600); err != nil {
|
|
t.Error(err)
|
|
}
|
|
|
|
pb2 := &testpb.M{}
|
|
if err := ReadTextMessage("f", pb2); err != nil {
|
|
t.Error(err)
|
|
}
|
|
if pb.Content != pb2.Content {
|
|
t.Errorf("content mismatch, got %q, expected %q", pb2.Content, pb.Content)
|
|
}
|
|
}
|
|
|
|
func TestStore(t *testing.T) {
|
|
dir := testlib.MustTempDir(t)
|
|
defer testlib.RemoveIfOk(t, dir)
|
|
st, err := NewStore(dir + "/store")
|
|
if err != nil {
|
|
t.Fatalf("failed to create store: %v", err)
|
|
}
|
|
|
|
if ids, err := st.ListIDs(); len(ids) != 0 || err != nil {
|
|
t.Errorf("expected no ids, got %v - %v", ids, err)
|
|
}
|
|
|
|
pb := &testpb.M{Content: "hola"}
|
|
|
|
if err := st.Put("f", pb); err != nil {
|
|
t.Error(err)
|
|
}
|
|
|
|
pb2 := &testpb.M{}
|
|
if ok, err := st.Get("f", pb2); err != nil || !ok {
|
|
t.Errorf("Get(f): %v - %v", ok, err)
|
|
}
|
|
if pb.Content != pb2.Content {
|
|
t.Errorf("content mismatch, got %q, expected %q", pb2.Content, pb.Content)
|
|
}
|
|
|
|
if ok, err := st.Get("notexists", pb2); err != nil || ok {
|
|
t.Errorf("Get(notexists): %v - %v", ok, err)
|
|
}
|
|
|
|
// Add an extraneous file, which ListIDs should ignore.
|
|
mustCreate(t, dir+"/store/"+"somefile")
|
|
|
|
// Add a file that is not properly query-escaped, and should be ignored.
|
|
mustCreate(t, dir+"/store/"+"s:somefile%N")
|
|
|
|
if ids, err := st.ListIDs(); len(ids) != 1 || ids[0] != "f" || err != nil {
|
|
t.Errorf("expected [f], got %v - %v", ids, err)
|
|
}
|
|
}
|
|
|
|
func mustCreate(t *testing.T, fname string) {
|
|
t.Helper()
|
|
|
|
f, err := os.Create(fname)
|
|
if f != nil {
|
|
f.Close()
|
|
}
|
|
if err != nil {
|
|
t.Fatalf("failed to create file %q: %v", fname, err)
|
|
}
|
|
}
|
|
|
|
func TestFileErrors(t *testing.T) {
|
|
dir := testlib.MustTempDir(t)
|
|
defer testlib.RemoveIfOk(t, dir)
|
|
pb := &testpb.M{Content: "hola"}
|
|
|
|
if err := WriteMessage("/proc/doesnotexist", pb, 0600); err == nil {
|
|
t.Errorf("write to /proc/doesnotexist worked, expected error")
|
|
}
|
|
|
|
if err := WriteTextMessage("/proc/doesnotexist", pb, 0600); err == nil {
|
|
t.Errorf("text write to /proc/doesnotexist worked, expected error")
|
|
}
|
|
|
|
if err := ReadMessage("/doesnotexist", pb); err == nil {
|
|
t.Errorf("read from /doesnotexist worked, expected error")
|
|
}
|
|
|
|
if err := ReadTextMessage("/doesnotexist", pb); err == nil {
|
|
t.Errorf("text read from /doesnotexist worked, expected error")
|
|
}
|
|
|
|
s := &Store{dir: "/doesnotexist"}
|
|
if ids, err := s.ListIDs(); !(ids == nil && err != nil) {
|
|
t.Errorf("list /doesnotexist worked (%v, %v), expected error", ids, err)
|
|
}
|
|
}
|
|
|
|
func TestMarshalErrors(t *testing.T) {
|
|
dir := testlib.MustTempDir(t)
|
|
defer testlib.RemoveIfOk(t, dir)
|
|
|
|
// The marshaller enforces that strings are well-formed utf8. So to create
|
|
// a marshalling error, we use a non-utf8 string.
|
|
pb := &testpb.M{Content: "\xc3\x28"}
|
|
|
|
if err := WriteMessage("f", pb, 0600); err == nil {
|
|
t.Errorf("write worked, expected error")
|
|
}
|
|
|
|
if err := WriteTextMessage("ft", pb, 0600); err == nil {
|
|
t.Errorf("text write worked, expected error")
|
|
}
|
|
}
|