featurebase/dax/computer/logmessage_test.go
Travis Turner ce32a1bde6 Rename some interfaces. Remove the ComputeAPI (#2333)
* Clean up dax service interfaces

Rename some of the `computer` interfaces and organize them in the
appropriate files.
Remove `dax/computer/alpha` package

* Remove ComputeAPI (it was replaced by batch.Importer)

* add nss-tools dependecy to smoke test

(cherry picked from commit 969bf055b2)
2022-12-12 09:01:20 -08:00

154 lines
3.3 KiB
Go

package computer_test
import (
"fmt"
"reflect"
"testing"
"github.com/molecula/featurebase/v3/dax/computer"
"github.com/stretchr/testify/assert"
)
func TestComputer_WriteLog(t *testing.T) {
t.Run("Marshal", func(t *testing.T) {
tableName := "tbl"
type invalidType struct{}
tests := []struct {
msg computer.LogMessage
encodeType string
expVersion byte
expEncodeType byte
expMessageType byte
expError string
}{
{
msg: &computer.ImportRoaringMessage{
Table: tableName,
},
encodeType: computer.EncodeTypeJSON,
expVersion: 1,
expEncodeType: 0,
expMessageType: 0,
},
{
msg: &computer.ImportMessage{
Table: tableName,
},
encodeType: computer.EncodeTypeJSON,
expVersion: 1,
expEncodeType: 0,
expMessageType: 1,
},
{
msg: &computer.ImportValueMessage{
Table: tableName,
},
encodeType: computer.EncodeTypeJSON,
expVersion: 1,
expEncodeType: 0,
expMessageType: 2,
},
{
msg: &computer.ImportRoaringShardMessage{
Table: tableName,
},
encodeType: computer.EncodeTypeJSON,
expVersion: 1,
expEncodeType: 0,
expMessageType: 3,
},
// Error cases.
{
msg: &invalidType{},
encodeType: computer.EncodeTypeJSON,
expError: "don't have type",
},
{
msg: &computer.ImportMessage{
Table: tableName,
},
encodeType: "badencoding",
expError: "invalid encode type",
},
}
for i, test := range tests {
t.Run(fmt.Sprintf("test-%d", i), func(t *testing.T) {
b, err := computer.MarshalLogMessage(test.msg, test.encodeType)
if test.expError != "" {
if assert.Error(t, err) {
assert.Contains(t, err.Error(), test.expError)
}
return
} else {
assert.NoError(t, err)
}
// Version
assert.Equal(t, test.expVersion, b[0])
// EncodeType
assert.Equal(t, test.expEncodeType, b[1])
// MessageType
assert.Equal(t, test.expMessageType, b[2])
logMessage, err := computer.UnmarshalLogMessage(b)
assert.NoError(t, err)
// Get the value in Table for the instance of LogMessage.
val := reflect.ValueOf(logMessage).Elem()
fld := val.FieldByName("Table")
assert.Equal(t, tableName, fld.String())
})
}
})
t.Run("Unmarshal", func(t *testing.T) {
tests := []struct {
b []byte
expError string
}{
{
b: []byte{1, 0, 1, '{', '}'},
expError: "",
},
{
b: []byte{},
expError: "log record does not contain a full header",
},
{
b: []byte{1, 0, 1},
expError: "unexpected end of JSON input",
},
{
b: []byte{1, 255, 1},
expError: "getting encoder by key: invalid encode type: 255",
},
{
b: []byte{1, 0, 255},
expError: "unknown message type",
},
{
b: []byte{255, 0, 1},
expError: "encode version is unsupported",
},
}
for i, test := range tests {
t.Run(fmt.Sprintf("test-%d", i), func(t *testing.T) {
_, err := computer.UnmarshalLogMessage(test.b)
if test.expError != "" {
if assert.Error(t, err) {
assert.Contains(t, err.Error(), test.expError)
}
return
} else {
assert.NoError(t, err)
}
})
}
})
}