package mon import ( "fmt" "reflect" "testing" "time" "github.com/stretchr/testify/assert" "go.mongodb.org/mongo-driver/bson/bsoncodec" "go.mongodb.org/mongo-driver/bson/bsonrw" mopt "go.mongodb.org/mongo-driver/mongo/options" ) func TestSetSlowThreshold(t *testing.T) { assert.Equal(t, defaultSlowThreshold, slowThreshold.Load()) SetSlowThreshold(time.Second) assert.Equal(t, time.Second, slowThreshold.Load()) } func Test_defaultTimeoutOption(t *testing.T) { opts := mopt.Client() defaultTimeoutOption()(opts) assert.Equal(t, defaultTimeout, *opts.Timeout) } func TestWithTimeout(t *testing.T) { opts := mopt.Client() WithTimeout(time.Second)(opts) assert.Equal(t, time.Second, *opts.Timeout) } func TestDisableLog(t *testing.T) { assert.True(t, logMon.True()) assert.True(t, logSlowMon.True()) defer func() { logMon.Set(true) logSlowMon.Set(true) }() DisableLog() assert.False(t, logMon.True()) assert.False(t, logSlowMon.True()) } func TestDisableInfoLog(t *testing.T) { assert.True(t, logMon.True()) assert.True(t, logSlowMon.True()) defer func() { logMon.Set(true) logSlowMon.Set(true) }() DisableInfoLog() assert.False(t, logMon.True()) assert.True(t, logSlowMon.True()) } func TestWithRegistryForTimestampRegisterType(t *testing.T) { opts := mopt.Client() // mongoDateTimeEncoder allow user convert time.Time to primitive.DateTime. var mongoDateTimeEncoder bsoncodec.ValueEncoderFunc = func(ect bsoncodec.EncodeContext, w bsonrw.ValueWriter, value reflect.Value) error { // Use reflect, determine if it can be converted to time.Time. dec, ok := value.Interface().(time.Time) if !ok { return fmt.Errorf("value %v to encode is not of type time.Time", value) } return w.WriteDateTime(dec.Unix()) } // mongoDateTimeEncoder allow user convert primitive.DateTime to time.Time. var mongoDateTimeDecoder bsoncodec.ValueDecoderFunc = func(ect bsoncodec.DecodeContext, r bsonrw.ValueReader, value reflect.Value) error { primTime, err := r.ReadDateTime() if err != nil { return fmt.Errorf("error reading primitive.DateTime from ValueReader: %v", err) } value.Set(reflect.ValueOf(time.Unix(primTime, 0))) return nil } codecs := []TypeCodec{ { ValueType: reflect.TypeOf(time.Time{}), Encoder: mongoDateTimeEncoder, Decoder: mongoDateTimeDecoder, }, } WithTypeCodec(codecs...)(opts) for _, v := range codecs { // Validate Encoder enc, err := opts.Registry.LookupEncoder(v.ValueType) if err != nil { t.Fatal(err) } if assert.ObjectsAreEqual(v.Encoder, enc) { t.Errorf("Encoder got from Registry: %v, but want: %v", enc, v.Encoder) } // Validate Decoder dec, err := opts.Registry.LookupDecoder(v.ValueType) if err != nil { t.Fatal(err) } if assert.ObjectsAreEqual(v.Decoder, dec) { t.Errorf("Decoder got from Registry: %v, but want: %v", dec, v.Decoder) } } }