func TestParsePointMissingTagKey(t *testing.T) { expectedSuffix := "missing tag key" examples := []string{ `cpu, value=1`, `cpu,`, `cpu,,,`, `cpu,host=serverA,=us-east value=1i`, `cpu,host=serverAa\,,=us-east value=1i`, `cpu,host=serverA\,,=us-east value=1i`, `cpu, =serverA value=1i`, } for i, example := range examples { _, err := models.ParsePointsString(example) if err == nil { t.Errorf(`[Example %d] ParsePoints("%s") mismatch. got nil, exp error`, i, example) } else if !strings.HasSuffix(err.Error(), expectedSuffix) { t.Errorf(`[Example %d] ParsePoints("%s") mismatch. got %q, exp suffix %q`, i, example, err, expectedSuffix) } } _, err := models.ParsePointsString(`cpu,host=serverA,\ =us-east value=1i`) if err != nil { t.Errorf(`ParsePoints("%s") mismatch. got %v, exp nil`, `cpu,host=serverA,\ =us-east value=1i`, err) } }
func TestParsePointMissingFieldValue(t *testing.T) { _, err := models.ParsePointsString(`cpu,host=serverA,region=us-west value=`) if err == nil { t.Errorf(`ParsePoints("%s") mismatch. got nil, exp error`, `cpu,host=serverA,region=us-west value=`) } _, err = models.ParsePointsString(`cpu,host=serverA,region=us-west value= 1000000000i`) if err == nil { t.Errorf(`ParsePoints("%s") mismatch. got nil, exp error`, `cpu,host=serverA,region=us-west value= 1000000000i`) } _, err = models.ParsePointsString(`cpu,host=serverA,region=us-west value=,value2=1i`) if err == nil { t.Errorf(`ParsePoints("%s") mismatch. got nil, exp error`, `cpu,host=serverA,region=us-west value=,value2=1i`) } _, err = models.ParsePointsString(`cpu,host=server01,region=us-west 1434055562000000000i`) if err == nil { t.Errorf(`ParsePoints("%s") mismatch. got nil, exp error`, `cpu,host=server01,region=us-west 1434055562000000000i`) } _, err = models.ParsePointsString(`cpu,host=server01,region=us-west value=1i,b`) if err == nil { t.Errorf(`ParsePoints("%s") mismatch. got nil, exp error`, `cpu,host=server01,region=us-west value=1i,b`) } }
func TestParsePointsQuotesInFieldKey(t *testing.T) { buf := `cpu "a=1 cpu value=2 1` points, err := models.ParsePointsString(buf) if err != nil { t.Fatalf("failed to write points: %s", err.Error()) } pointFields := points[0].Fields() value, ok := pointFields["\"a"] if !ok { t.Fatalf("expected to parse field '\"a'") } if value != float64(1) { t.Fatalf("expected field value to be 1, got %v", value) } // The following input should not parse buf = `cpu "\, '= "\ v=1.0` _, err = models.ParsePointsString(buf) if err == nil { t.Fatalf("expected parsing failure but got no error") } }
func TestParsePointScientificIntInvalid(t *testing.T) { _, err := models.ParsePointsString(`cpu,host=serverA,region=us-west value=9ie10`) if err == nil { t.Errorf(`ParsePoints("%s") mismatch. got nil, exp error`, `cpu,host=serverA,region=us-west value=9ie10`) } _, err = models.ParsePointsString(`cpu,host=serverA,region=us-west value=9e10i`) if err == nil { t.Errorf(`ParsePoints("%s") mismatch. got nil, exp error`, `cpu,host=serverA,region=us-west value=9e10i`) } }
func TestParsePointBadNumber(t *testing.T) { _, err := models.ParsePointsString(`cpu,host=serverA,region=us-west value=1a`) if err == nil { t.Errorf(`ParsePoints("%s") mismatch. got nil, exp error`, `cpu,host=serverA,region=us-west value=1a`) } _, err = models.ParsePointsString(`cpu,host=serverA,region=us-west value=1ii`) if err == nil { t.Errorf(`ParsePoints("%s") mismatch. got nil, exp error`, `cpu,host=serverA,region=us-west value=1ii`) } _, err = models.ParsePointsString(`cpu,host=serverA,region=us-west value=1.0i`) if err == nil { t.Errorf(`ParsePoints("%s") mismatch. got nil, exp error`, `cpu,host=serverA,region=us-west value=1.0i`) } }
func TestParsePointFloatScientificUpper(t *testing.T) { _, err := models.ParsePointsString(`cpu,host=serverA,region=us-west value=1.0E4`) if err != nil { t.Errorf(`ParsePoints("%s") mismatch. got %v, exp nil`, `cpu,host=serverA,region=us-west value=1.0E4`, err) } pts, err := models.ParsePointsString(`cpu,host=serverA,region=us-west value=1E4`) if err != nil { t.Errorf(`ParsePoints("%s") mismatch. got %v, exp nil`, `cpu,host=serverA,region=us-west value=1.0E4`, err) } if pts[0].Fields()["value"] != 1e4 { t.Errorf(`ParsePoints("%s") mismatch. got %v, exp nil`, `cpu,host=serverA,region=us-west value=1E4`, err) } }
func TestParsePointsUnbalancedQuotedTags(t *testing.T) { pts, err := models.ParsePointsString("baz,mytag=\"a x=1 1441103862125\nbaz,mytag=a z=1 1441103862126") if err != nil { t.Fatalf("ParsePoints failed: %v", err) } if exp := 2; len(pts) != exp { t.Fatalf("ParsePoints count mismatch. got %v, exp %v", len(pts), exp) } // Expected " in the tag value exp := models.MustNewPoint("baz", models.Tags{"mytag": `"a`}, models.Fields{"x": float64(1)}, time.Unix(0, 1441103862125)) if pts[0].String() != exp.String() { t.Errorf("Point mismatch:\ngot: %v\nexp: %v", pts[0].String(), exp.String()) } // Expected two points to ensure we did not overscan the line exp = models.MustNewPoint("baz", models.Tags{"mytag": `a`}, models.Fields{"z": float64(1)}, time.Unix(0, 1441103862126)) if pts[1].String() != exp.String() { t.Errorf("Point mismatch:\ngot: %v\nexp: %v", pts[1].String(), exp.String()) } }
// MustParsePointsString parses points from a string. Panic on error. func MustParsePointsString(buf string) []models.Point { a, err := models.ParsePointsString(buf) if err != nil { panic(err) } return a }
func TestParsePointNaN(t *testing.T) { _, err := models.ParsePointsString("cpu value=NaN 1000000000") if err == nil { t.Fatalf("ParsePoints expected error, got nil") } _, err = models.ParsePointsString("cpu value=nAn 1000000000") if err == nil { t.Fatalf("ParsePoints expected error, got nil") } _, err = models.ParsePointsString("cpu value=NaN") if err == nil { t.Fatalf("ParsePoints expected error, got nil") } }
func TestParsePointMinInt64(t *testing.T) { // out of range _, err := models.ParsePointsString(`cpu,host=serverA,region=us-west value=-9223372036854775809i`) if err == nil { t.Errorf(`ParsePoints("%s") mismatch. got nil, exp error`, `cpu,host=serverA,region=us-west value=-9223372036854775809i`) } // min int _, err = models.ParsePointsString(`cpu,host=serverA,region=us-west value=-9223372036854775808i`) if err != nil { t.Errorf(`ParsePoints("%s") mismatch. got %v, exp nil`, `cpu,host=serverA,region=us-west value=-9223372036854775808i`, err) } // leading zeros _, err = models.ParsePointsString(`cpu,host=serverA,region=us-west value=-0009223372036854775808i`) if err != nil { t.Errorf(`ParsePoints("%s") mismatch. got %v, exp nil`, `cpu,host=serverA,region=us-west value=-0009223372036854775808i`, err) } }
func TestParsePointMaxFloat64(t *testing.T) { // out of range _, err := models.ParsePointsString(fmt.Sprintf(`cpu,host=serverA,region=us-west value=%s`, "1"+string(maxFloat64))) if err == nil { t.Errorf(`ParsePoints("%s") mismatch. got nil, exp error`, `cpu,host=serverA,region=us-west value=...`) } // max float _, err = models.ParsePointsString(fmt.Sprintf(`cpu,host=serverA,region=us-west value=%s`, string(maxFloat64))) if err != nil { t.Errorf(`ParsePoints("%s") mismatch. got %v, exp nil`, `cpu,host=serverA,region=us-west value=9223372036854775807`, err) } // leading zeros _, err = models.ParsePointsString(fmt.Sprintf(`cpu,host=serverA,region=us-west value=%s`, "0000"+string(maxFloat64))) if err != nil { t.Errorf(`ParsePoints("%s") mismatch. got %v, exp nil`, `cpu,host=serverA,region=us-west value=0009223372036854775807`, err) } }
func TestParsePointWhitespaceValue(t *testing.T) { pts, err := models.ParsePointsString(" ") if err != nil { t.Errorf(`ParsePoints("%s") mismatch. got %v, exp nil`, "", err) } if exp := 0; len(pts) != exp { t.Errorf(`ParsePoints("%s") len mismatch. got %v, exp %v`, "", len(pts), exp) } }
func TestParsePointMinFloat64(t *testing.T) { // out of range _, err := models.ParsePointsString(fmt.Sprintf(`cpu,host=serverA,region=us-west value=%s`, "-1"+string(minFloat64)[1:])) if err == nil { t.Errorf(`ParsePoints("%s") mismatch. got nil, exp error`, `cpu,host=serverA,region=us-west value=...`) } // min float _, err = models.ParsePointsString(fmt.Sprintf(`cpu,host=serverA,region=us-west value=%s`, string(minFloat64))) if err != nil { t.Errorf(`ParsePoints("%s") mismatch. got %v, exp nil`, `cpu,host=serverA,region=us-west value=...`, err) } // leading zeros _, err = models.ParsePointsString(fmt.Sprintf(`cpu,host=serverA,region=us-west value=%s`, "-0000000"+string(minFloat64)[1:])) if err != nil { t.Errorf(`ParsePoints("%s") mismatch. got %v, exp nil`, `cpu,host=serverA,region=us-west value=...`, err) } }
func TestParsePointMissingFieldName(t *testing.T) { _, err := models.ParsePointsString(`cpu,host=serverA,region=us-west =`) if err == nil { t.Errorf(`ParsePoints("%s") mismatch. got nil, exp error`, `cpu,host=serverA,region=us-west =`) } _, err = models.ParsePointsString(`cpu,host=serverA,region=us-west =123i`) if err == nil { t.Errorf(`ParsePoints("%s") mismatch. got nil, exp error`, `cpu,host=serverA,region=us-west =123i`) } _, err = models.ParsePointsString(`cpu,host=serverA,region=us-west a\ =123i`) if err != nil { t.Errorf(`ParsePoints("%s") mismatch. got nil, exp error`, `cpu,host=serverA,region=us-west a\ =123i`) } _, err = models.ParsePointsString(`cpu,host=serverA,region=us-west value=123i,=456i`) if err == nil { t.Errorf(`ParsePoints("%s") mismatch. got nil, exp error`, `cpu,host=serverA,region=us-west value=123i,=456i`) } }
func TestParsePointsQuotesInTags(t *testing.T) { buf := `t159,label=hey\ "ya a=1i,value=0i t159,label=another a=2i,value=1i 1` points, err := models.ParsePointsString(buf) if err != nil { t.Fatalf("failed to write points: %s", err.Error()) } if len(points) != 2 { t.Fatalf("expected 2 points, got %d", len(points)) } }
func TestParsePointInvalidTimestamp(t *testing.T) { _, err := models.ParsePointsString("cpu value=1 9223372036854775808") if err == nil { t.Fatalf("ParsePoints failed: %v", err) } _, err = models.ParsePointsString("cpu value=1 -92233720368547758078") if err == nil { t.Fatalf("ParsePoints failed: %v", err) } _, err = models.ParsePointsString("cpu value=1 -") if err == nil { t.Fatalf("ParsePoints failed: %v", err) } _, err = models.ParsePointsString("cpu value=1 -/") if err == nil { t.Fatalf("ParsePoints failed: %v", err) } _, err = models.ParsePointsString("cpu value=1 -1?") if err == nil { t.Fatalf("ParsePoints failed: %v", err) } _, err = models.ParsePointsString("cpu value=1 1-") if err == nil { t.Fatalf("ParsePoints failed: %v", err) } }
func TestParsePointMaxInt64(t *testing.T) { // out of range _, err := models.ParsePointsString(`cpu,host=serverA,region=us-west value=9223372036854775808i`) exp := `unable to parse 'cpu,host=serverA,region=us-west value=9223372036854775808i': unable to parse integer 9223372036854775808: strconv.ParseInt: parsing "9223372036854775808": value out of range` if err == nil || (err != nil && err.Error() != exp) { t.Fatalf("Error mismatch:\nexp: %s\ngot: %v", exp, err) } // max int p, err := models.ParsePointsString(`cpu,host=serverA,region=us-west value=9223372036854775807i`) if err != nil { t.Fatalf(`ParsePoints("%s") mismatch. got %v, exp nil`, `cpu,host=serverA,region=us-west value=9223372036854775807i`, err) } if exp, got := int64(9223372036854775807), p[0].Fields()["value"].(int64); exp != got { t.Fatalf("ParsePoints Value mismatch. \nexp: %v\ngot: %v", exp, got) } // leading zeros _, err = models.ParsePointsString(`cpu,host=serverA,region=us-west value=0009223372036854775807i`) if err != nil { t.Fatalf(`ParsePoints("%s") mismatch. got %v, exp nil`, `cpu,host=serverA,region=us-west value=0009223372036854775807i`, err) } }
func TestNewPointsRejectsMaxKey(t *testing.T) { var key string for i := 0; i < 65536; i++ { key += "a" } if _, err := models.NewPoint(key, nil, models.Fields{"value": 1}, time.Now()); err == nil { t.Fatalf("new point with max key. got: nil, expected: error") } if _, err := models.ParsePointsString(fmt.Sprintf("%v value=1", key)); err == nil { t.Fatalf("parse point with max key. got: nil, expected: error") } }
func TestNewPointLargeNumberOfTags(t *testing.T) { tags := "" for i := 0; i < 255; i++ { tags += fmt.Sprintf(",tag%d=value%d", i, i) } pt, err := models.ParsePointsString(fmt.Sprintf("cpu%s value=1", tags)) if err != nil { t.Fatalf("ParsePoints() with max tags failed: %v", err) } if len(pt[0].Tags()) != 255 { t.Fatalf("expected %d tags, got %d", 255, len(pt[0].Tags())) } }
func TestParsePointMissingQuote(t *testing.T) { expectedSuffix := "unbalanced quotes" examples := []string{ `cpu,host=serverA value="test`, `cpu,host=serverA value="test""`, } for i, example := range examples { _, err := models.ParsePointsString(example) if err == nil { t.Errorf(`[Example %d] ParsePoints("%s") mismatch. got nil, exp error`, i, example) } else if !strings.HasSuffix(err.Error(), expectedSuffix) { t.Errorf(`[Example %d] ParsePoints("%s") mismatch. got %q, exp suffix %q`, i, example, err, expectedSuffix) } } }
func TestParsePointInvalidTagFormat(t *testing.T) { expectedSuffix := "invalid tag format" examples := []string{ `cpu,host=f=o,`, `cpu,host=f\==o,`, } for i, example := range examples { _, err := models.ParsePointsString(example) if err == nil { t.Errorf(`[Example %d] ParsePoints("%s") mismatch. got nil, exp error`, i, example) } else if !strings.HasSuffix(err.Error(), expectedSuffix) { t.Errorf(`[Example %d] ParsePoints("%s") mismatch. got %q, exp suffix %q`, i, example, err, expectedSuffix) } } }
func TestParsePointNoFields(t *testing.T) { expectedSuffix := "missing fields" examples := []string{ "cpu_load_short,host=server01,region=us-west", "cpu", "cpu,host==", "=", } for i, example := range examples { _, err := models.ParsePointsString(example) if err == nil { t.Errorf(`[Example %d] ParsePoints("%s") mismatch. got nil, exp error`, i, example) } else if !strings.HasSuffix(err.Error(), expectedSuffix) { t.Errorf(`[Example %d] ParsePoints("%s") mismatch. got %q, exp suffix %q`, i, example, err, expectedSuffix) } } }
func TestParsePointBadNumber(t *testing.T) { for _, tt := range []string{ "cpu v=- ", "cpu v=-i ", "cpu v=-. ", "cpu v=. ", "cpu v=1.0i ", "cpu v=1ii ", "cpu v=1a ", "cpu v=-e-e-e ", "cpu v=42+3 ", "cpu v= ", } { _, err := models.ParsePointsString(tt) if err == nil { t.Errorf("Point %q should be invalid", tt) } } }
func TestParsePointsStringWithExtraBuffer(t *testing.T) { b := make([]byte, 70*5000) buf := bytes.NewBuffer(b) key := "cpu,host=A,region=uswest" buf.WriteString(fmt.Sprintf("%s value=%.3f 1\n", key, rand.Float64())) points, err := models.ParsePointsString(buf.String()) if err != nil { t.Fatalf("failed to write points: %s", err.Error()) } pointKey := string(points[0].Key()) if len(key) != len(pointKey) { t.Fatalf("expected length of both keys are same but got %d and %d", len(key), len(pointKey)) } if key != pointKey { t.Fatalf("expected both keys are same but got %s and %s", key, pointKey) } }
func TestParsePointMissingTagValue(t *testing.T) { expectedSuffix := "missing tag value" examples := []string{ `cpu,host`, `cpu,host,`, `cpu,host=`, `cpu,host value=1i`, `cpu,host=serverA,region value=1i`, `cpu,host=serverA,region= value=1i`, `cpu,host=serverA,region=,zone=us-west value=1i`, } for i, example := range examples { _, err := models.ParsePointsString(example) if err == nil { t.Errorf(`[Example %d] ParsePoints("%s") mismatch. got nil, exp error`, i, example) } else if !strings.HasSuffix(err.Error(), expectedSuffix) { t.Errorf(`[Example %d] ParsePoints("%s") mismatch. got %q, exp suffix %q`, i, example, err, expectedSuffix) } } }
func TestService_CreatesDatabase(t *testing.T) { t.Parallel() s := NewTestService(nil) s.WritePointsFn = func(string, string, models.ConsistencyLevel, []models.Point) error { return nil } called := make(chan struct{}) s.MetaClient.CreateDatabaseWithRetentionPolicyFn = func(name string, _ *meta.RetentionPolicySpec) (*meta.DatabaseInfo, error) { if name != s.Service.database { t.Errorf("\n\texp = %s\n\tgot = %s\n", s.Service.database, name) } // Allow some time for the caller to return and the ready status to // be set. time.AfterFunc(10*time.Millisecond, func() { called <- struct{}{} }) return nil, errors.New("an error") } if err := s.Service.Open(); err != nil { t.Fatal(err) } points, err := models.ParsePointsString(`cpu value=1`) if err != nil { t.Fatal(err) } s.Service.batcher.In() <- points[0] // Send a point. s.Service.batcher.Flush() select { case <-called: // OK case <-time.NewTimer(5 * time.Second).C: t.Fatal("Service should have attempted to create database") } // ready status should not have been switched due to meta client error. s.Service.mu.RLock() ready := s.Service.ready s.Service.mu.RUnlock() if got, exp := ready, false; got != exp { t.Fatalf("got %v, expected %v", got, exp) } // This time MC won't cause an error. s.MetaClient.CreateDatabaseWithRetentionPolicyFn = func(name string, _ *meta.RetentionPolicySpec) (*meta.DatabaseInfo, error) { // Allow some time for the caller to return and the ready status to // be set. time.AfterFunc(10*time.Millisecond, func() { called <- struct{}{} }) return nil, nil } s.Service.batcher.In() <- points[0] // Send a point. s.Service.batcher.Flush() select { case <-called: // OK case <-time.NewTimer(5 * time.Second).C: t.Fatal("Service should have attempted to create database") } // ready status should now be true. s.Service.mu.RLock() ready = s.Service.ready s.Service.mu.RUnlock() if got, exp := ready, true; got != exp { t.Fatalf("got %v, expected %v", got, exp) } s.Service.Close() }
func TestParsePointBooleanInvalid(t *testing.T) { _, err := models.ParsePointsString(`cpu,host=serverA,region=us-west value=a`) if err == nil { t.Errorf(`ParsePoints("%s") mismatch. got nil, exp error`, `cpu,host=serverA,region=us-west value=a`) } }
func TestParsePointFloatNegativeScientific(t *testing.T) { _, err := models.ParsePointsString(`cpu,host=serverA,region=us-west value=-1.0e-4`) if err != nil { t.Errorf(`ParsePoints("%s") mismatch. got %v, exp nil`, `cpu,host=serverA,region=us-west value=-1.0e-4`, err) } }
func TestParsePointFloatNoLeadingDigit(t *testing.T) { _, err := models.ParsePointsString(`cpu,host=serverA,region=us-west value=.1`) if err != nil { t.Errorf(`ParsePoints("%s") mismatch. got %v, exp nil`, `cpu,host=serverA,region=us-west value=-1.0`, err) } }
func TestParsePointNegativeInteger(t *testing.T) { _, err := models.ParsePointsString(`cpu,host=serverA,region=us-west value=-1i`) if err != nil { t.Errorf(`ParsePoints("%s") mismatch. got %v, exp nil`, `cpu,host=serverA,region=us-west value=-1i`, err) } }