influxdata / line-protocol

MIT License
38 stars 10 forks source link

Time isZero after String/Byte conv #60

Open HenryVolkmer opened 8 months ago

HenryVolkmer commented 8 months ago

hi,

this test fails, any ideas?

package main

import (
    "testing"
    "time"
    "github.com/influxdata/line-protocol/v2/lineprotocol"
)

func TestTime(t *testing.T) {
    enc := lineprotocol.Encoder{}
    enc.StartLine("a_measurement")
    enc.AddField("temp",lineprotocol.MustNewValue(int64(10)))
    enc.EndLine(time.Now())

    // explicite from bytes to string and from string to bytes
    str := string(enc.Bytes())
    dec := lineprotocol.NewDecoderWithBytes([]byte(str))

    tests := map[string]lineprotocol.Precision {
        "nano": lineprotocol.Nanosecond,
        "micro": lineprotocol.Microsecond,
        "second": lineprotocol.Second,
    }

    for label,p := range tests {
        ti, err := dec.Time(p, time.Time{})
        if err != nil {
            panic(err)
        }
        if ti.IsZero() {
            t.Errorf("decoder.Time for precision %s should not be zero",label)
        }   
    }
}
tesibelda commented 6 days ago

Hi @HenryVolkmer, you are encodig with default precision (nanosecond) but trying to decode with other precisions. Using SetPrecision to encode and calling decoder.Next() before decoding makes the code not to fail:

package main

import (
    "testing"
    "time"

    "github.com/influxdata/line-protocol/v2/lineprotocol"
)

func TestTime(t *testing.T) {
    tests := map[string]lineprotocol.Precision{
        "nano":   lineprotocol.Nanosecond,
        "micro":  lineprotocol.Microsecond,
        "second": lineprotocol.Second,
    }

    for label, p := range tests {
        enc := lineprotocol.Encoder{}
        enc.SetPrecision(p)
        enc.StartLine("a_measurement")
        enc.AddField("temp", lineprotocol.MustNewValue(int64(10)))
        enc.EndLine(time.Now())

        // explicite from bytes to string and from string to bytes
        str := string(enc.Bytes())
        dec := lineprotocol.NewDecoderWithBytes([]byte(str))
        dec.Next()
        ti, err := dec.Time(p, time.Time{})
        if err != nil {
            panic(err)
        }
        if ti.IsZero() {
            t.Errorf("decoder.Time for precision %s should not be zero", label)
        }
    }
}