src.dualinventive.com/go/influxdb-logger/internal/influxdb/influx_test.go

113 lines
2.5 KiB
Go

package influxdb
import (
"context"
"sync"
"testing"
"time"
client "github.com/influxdata/influxdb1-client/v2"
"github.com/stretchr/testify/require"
"src.dualinventive.com/go/dinet/ditime"
"src.dualinventive.com/go/dinet/rpc"
"src.dualinventive.com/go/lib/kv"
)
type testWriter struct {
c chan *client.Point
}
func (t *testWriter) Add(i *client.Point) {
t.c <- i
}
func (t *testWriter) Dispatch(ctx context.Context, interval time.Duration) {
}
func TestUnsupportedScheme(t *testing.T) {
ramKV, err := kv.New(kv.TypeRAM, "")
require.Nil(t, err)
i, err := New("ftp://127.0.0.1", "root", "root", "db", 5, ramKV, 1, time.Second)
require.Nil(t, i)
require.EqualError(t, err, "Unsupported protocol scheme: ftp, your address"+
" must start with http:// or https://")
}
func TestSendFail(t *testing.T) {
testCases := []struct {
name string
msg *rpc.Msg
expectRPCWrite bool
}{
{"request", &rpc.Msg{
Dinetrpc: 1,
DeviceUID: "01234567890123456789012345678901",
ID: 1,
Time: ditime.Now(),
Type: rpc.MsgTypeRequest,
ClassMethod: rpc.ClassMethodSensorData,
}, false},
{"error", &rpc.Msg{
Dinetrpc: 1,
DeviceUID: "01234567890123456789012345678901",
ID: 1,
Time: ditime.Now(),
Type: rpc.MsgTypeReply,
ClassMethod: rpc.ClassMethodSensorData,
Error: rpc.GetError(rpc.EAgain),
}, true},
{"invalid result", &rpc.Msg{
Dinetrpc: 1,
DeviceUID: "01234567890123456789012345678901",
ID: 1,
Time: ditime.Now(),
Type: rpc.MsgTypeReply,
Result: rpc.NewResult(map[int]interface{}{5: "hoi"}),
}, true},
}
for _, tc := range testCases {
tc := tc
t.Run(tc.name, func(t *testing.T) {
ramKV, err := kv.New(kv.TypeRAM, "")
require.Nil(t, err)
i, err := New("http://127.0.0.1", "root", "root", "db", 5, ramKV, 1, time.Second)
require.Nil(t, err)
require.NotNil(t, i)
// Convert the writer is mock writer
tw := &testWriter{c: make(chan *client.Point)}
i.writer = tw
ctx, cancel := context.WithCancel(context.Background())
var wg sync.WaitGroup
wg.Add(2)
go func(cancel func()) {
defer wg.Done()
err = i.Send(tc.msg)
_ = err
cancel()
}(cancel)
go func() {
defer wg.Done()
if tc.expectRPCWrite {
<-tw.c
}
time.Sleep(time.Second)
select {
case <-tw.c:
require.Fail(t, "expected no points")
default:
}
}()
i.Process(ctx, time.Second)
wg.Wait()
})
}
}