test: Rewrite line_parser tests at a lower level

This will ease extracting them to a separate crate
pull/24376/head
Jake Goulding 2020-05-22 16:26:03 -04:00
parent e573ca0061
commit d394e2177f
1 changed files with 123 additions and 56 deletions

View File

@ -348,7 +348,7 @@ impl<'a> Series<'a> {
} }
} }
#[derive(Debug)] #[derive(Debug, Copy, Clone)]
enum FieldValue { enum FieldValue {
I64(i64), I64(i64),
F64(f64), F64(f64),
@ -796,6 +796,26 @@ mod test {
type Error = Box<dyn std::error::Error>; type Error = Box<dyn std::error::Error>;
type Result<T = (), E = Error> = std::result::Result<T, E>; type Result<T = (), E = Error> = std::result::Result<T, E>;
impl FieldValue {
fn unwrap_i64(self) -> i64 {
match self {
Self::I64(v) => v,
_ => panic!("field was not an i64"),
}
}
fn unwrap_f64(self) -> f64 {
match self {
Self::F64(v) => v,
_ => panic!("field was not an f64"),
}
}
}
fn parse(s: &str) -> Result<Vec<ParsedLine<'_>>, super::Error> {
super::parse_lines(s).collect()
}
#[test] #[test]
fn parse_no_fields() -> Result { fn parse_no_fields() -> Result {
let input = "foo 1234"; let input = "foo 1234";
@ -811,9 +831,10 @@ mod test {
let input = "foo asdf=23i 1234"; let input = "foo asdf=23i 1234";
let vals = parse(input)?; let vals = parse(input)?;
assert_eq!(vals[0].series(), "foo\tasdf"); assert_eq!(vals[0].series.measurement, "foo");
assert_eq!(vals[0].time(), 1234); assert_eq!(vals[0].timestamp, Some(1234));
assert_eq!(vals[0].i64_value().unwrap(), 23); assert_eq!(vals[0].field_set[0].0, "asdf");
assert_eq!(vals[0].field_set[0].1.unwrap_i64(), 23);
Ok(()) Ok(())
} }
@ -823,9 +844,13 @@ mod test {
let input = "foo asdf=44 546"; let input = "foo asdf=44 546";
let vals = parse(input)?; let vals = parse(input)?;
assert_eq!(vals[0].series(), "foo\tasdf"); assert_eq!(vals[0].series.measurement, "foo");
assert_eq!(vals[0].time(), 546); assert_eq!(vals[0].timestamp, Some(546));
assert!(approximately_equal(vals[0].f64_value().unwrap(), 44.0)); assert_eq!(vals[0].field_set[0].0, "asdf");
assert!(approximately_equal(
vals[0].field_set[0].1.unwrap_f64(),
44.0
));
Ok(()) Ok(())
} }
@ -835,9 +860,13 @@ mod test {
let input = "foo asdf=3.74 123"; let input = "foo asdf=3.74 123";
let vals = parse(input)?; let vals = parse(input)?;
assert_eq!(vals[0].series(), "foo\tasdf"); assert_eq!(vals[0].series.measurement, "foo");
assert_eq!(vals[0].time(), 123); assert_eq!(vals[0].timestamp, Some(123));
assert!(approximately_equal(vals[0].f64_value().unwrap(), 3.74)); assert_eq!(vals[0].field_set[0].0, "asdf");
assert!(approximately_equal(
vals[0].field_set[0].1.unwrap_f64(),
3.74
));
Ok(()) Ok(())
} }
@ -847,13 +876,14 @@ mod test {
let input = "foo asdf=23i,bar=5i 1234"; let input = "foo asdf=23i,bar=5i 1234";
let vals = parse(input)?; let vals = parse(input)?;
assert_eq!(vals[0].series(), "foo\tasdf"); assert_eq!(vals[0].series.measurement, "foo");
assert_eq!(vals[0].time(), 1234); assert_eq!(vals[0].timestamp, Some(1234));
assert_eq!(vals[0].i64_value().unwrap(), 23);
assert_eq!(vals[1].series(), "foo\tbar"); assert_eq!(vals[0].field_set[0].0, "asdf");
assert_eq!(vals[1].time(), 1234); assert_eq!(vals[0].field_set[0].1.unwrap_i64(), 23);
assert_eq!(vals[1].i64_value().unwrap(), 5);
assert_eq!(vals[0].field_set[1].0, "bar");
assert_eq!(vals[0].field_set[1].1.unwrap_i64(), 5);
Ok(()) Ok(())
} }
@ -863,13 +893,20 @@ mod test {
let input = "foo asdf=23.1,bar=5 1234"; let input = "foo asdf=23.1,bar=5 1234";
let vals = parse(input)?; let vals = parse(input)?;
assert_eq!(vals[0].series(), "foo\tasdf"); assert_eq!(vals[0].series.measurement, "foo");
assert_eq!(vals[0].time(), 1234); assert_eq!(vals[0].timestamp, Some(1234));
assert!(approximately_equal(vals[0].f64_value().unwrap(), 23.1));
assert_eq!(vals[1].series(), "foo\tbar"); assert_eq!(vals[0].field_set[0].0, "asdf");
assert_eq!(vals[1].time(), 1234); assert!(approximately_equal(
assert!(approximately_equal(vals[1].f64_value().unwrap(), 5.0)); vals[0].field_set[0].1.unwrap_f64(),
23.1
));
assert_eq!(vals[0].field_set[1].0, "bar");
assert!(approximately_equal(
vals[0].field_set[1].1.unwrap_f64(),
5.0
));
Ok(()) Ok(())
} }
@ -879,13 +916,17 @@ mod test {
let input = "foo asdf=23.1,bar=5i 1234"; let input = "foo asdf=23.1,bar=5i 1234";
let vals = parse(input)?; let vals = parse(input)?;
assert_eq!(vals[0].series(), "foo\tasdf"); assert_eq!(vals[0].series.measurement, "foo");
assert_eq!(vals[0].time(), 1234); assert_eq!(vals[0].timestamp, Some(1234));
assert!(approximately_equal(vals[0].f64_value().unwrap(), 23.1));
assert_eq!(vals[1].series(), "foo\tbar"); assert_eq!(vals[0].field_set[0].0, "asdf");
assert_eq!(vals[1].time(), 1234); assert!(approximately_equal(
assert_eq!(vals[1].i64_value().unwrap(), 5); vals[0].field_set[0].1.unwrap_f64(),
23.1
));
assert_eq!(vals[0].field_set[1].0, "bar");
assert_eq!(vals[0].field_set[1].1.unwrap_i64(), 5);
Ok(()) Ok(())
} }
@ -896,7 +937,7 @@ mod test {
let vals = parse(input)?; let vals = parse(input)?;
assert_eq!(vals.len(), 1); assert_eq!(vals.len(), 1);
assert_eq!(vals[0].i64_value().unwrap(), -1); assert_eq!(vals[0].field_set[0].1.unwrap_i64(), -1);
Ok(()) Ok(())
} }
@ -907,7 +948,10 @@ mod test {
let vals = parse(input)?; let vals = parse(input)?;
assert_eq!(vals.len(), 1); assert_eq!(vals.len(), 1);
assert!(approximately_equal(vals[0].f64_value().unwrap(), -1.0)); assert!(approximately_equal(
vals[0].field_set[0].1.unwrap_f64(),
-1.0
));
Ok(()) Ok(())
} }
@ -945,25 +989,39 @@ mod test {
let input = "foo,tag1=1,tag2=2 value=1 123"; let input = "foo,tag1=1,tag2=2 value=1 123";
let vals = parse(input)?; let vals = parse(input)?;
assert_eq!(vals[0].series(), "foo,tag1=1,tag2=2\tvalue"); assert_eq!(vals[0].series.measurement, "foo");
assert_eq!(vals[0].series.tag_set.as_ref().unwrap()[0].0, "tag1");
assert_eq!(vals[0].series.tag_set.as_ref().unwrap()[0].1, "1");
assert_eq!(vals[0].series.tag_set.as_ref().unwrap()[1].0, "tag2");
assert_eq!(vals[0].series.tag_set.as_ref().unwrap()[1].1, "2");
assert_eq!(vals[0].field_set[0].0, "value");
Ok(()) Ok(())
} }
#[test] #[test]
fn parse_tag_set_unsorted() -> Result { fn parse_tag_set_unsorted() -> Result {
let input = "foo,tag2=2,tag1=1 value=1 123"; let input = "foo,tag2=2,tag1=1";
let vals = parse(input)?; let (remaining, series) = series(input)?;
assert_eq!(vals[0].series(), "foo,tag1=1,tag2=2\tvalue"); assert!(remaining.is_empty());
assert_eq!(series.generate_base()?, "foo,tag1=1,tag2=2");
Ok(()) Ok(())
} }
#[test] #[test]
fn parse_tag_set_duplicate_tags() -> Result { fn parse_tag_set_duplicate_tags() -> Result {
let input = "foo,tag=1,tag=2 value=1 123"; let input = "foo,tag=1,tag=2";
let err = parse(input).expect_err("Parsing duplicate tags should fail"); let (remaining, series) = series(input)?;
assert!(remaining.is_empty());
let err = series
.generate_base()
.expect_err("Parsing duplicate tags should fail");
assert_eq!( assert_eq!(
err.to_string(), err.to_string(),
@ -979,13 +1037,15 @@ mod test {
foo value2=2i 123"#; foo value2=2i 123"#;
let vals = parse(input)?; let vals = parse(input)?;
assert_eq!(vals[0].series(), "foo\tvalue1"); assert_eq!(vals[0].series.measurement, "foo");
assert_eq!(vals[0].time(), 123); assert_eq!(vals[0].timestamp, Some(123));
assert_eq!(vals[0].i64_value().unwrap(), 1); assert_eq!(vals[0].field_set[0].0, "value1");
assert_eq!(vals[0].field_set[0].1.unwrap_i64(), 1);
assert_eq!(vals[1].series(), "foo\tvalue2"); assert_eq!(vals[1].series.measurement, "foo");
assert_eq!(vals[1].time(), 123); assert_eq!(vals[1].timestamp, Some(123));
assert_eq!(vals[1].i64_value().unwrap(), 2); assert_eq!(vals[1].field_set[0].0, "value2");
assert_eq!(vals[1].field_set[0].1.unwrap_i64(), 2);
Ok(()) Ok(())
} }
@ -1007,9 +1067,10 @@ foo value2=2i 123"#;
let input = r#"foo value1=1i -123"#; let input = r#"foo value1=1i -123"#;
let vals = parse(input)?; let vals = parse(input)?;
assert_eq!(vals[0].series(), "foo\tvalue1"); assert_eq!(vals[0].series.measurement, "foo");
assert_eq!(vals[0].time(), -123); assert_eq!(vals[0].timestamp, Some(-123));
assert_eq!(vals[0].i64_value().unwrap(), 1); assert_eq!(vals[0].field_set[0].0, "value1");
assert_eq!(vals[0].field_set[0].1.unwrap_i64(), 1);
Ok(()) Ok(())
} }
@ -1053,9 +1114,10 @@ foo value2=2i 123"#;
let input = " measurement a=1i 123 "; let input = " measurement a=1i 123 ";
let vals = parse(input)?; let vals = parse(input)?;
assert_eq!(vals[0].series(), "measurement\ta"); assert_eq!(vals[0].series.measurement, "measurement");
assert_eq!(vals[0].time(), 123); assert_eq!(vals[0].timestamp, Some(123));
assert_eq!(vals[0].i64_value().unwrap(), 1); assert_eq!(vals[0].field_set[0].0, "a");
assert_eq!(vals[0].field_set[0].1.unwrap_i64(), 1);
Ok(()) Ok(())
} }
@ -1311,15 +1373,20 @@ her"#,
let input = "foo,tag0=value1 asdf=23.1,bar=5i"; let input = "foo,tag0=value1 asdf=23.1,bar=5i";
let vals = parse(input)?; let vals = parse(input)?;
assert_eq!(vals[0].series(), "foo,tag0=value1\tasdf"); assert_eq!(vals[0].series.measurement, "foo");
// Just test that we haven't traveled back in time assert_eq!(vals[0].series.tag_set.as_ref().unwrap()[0].0, "tag0");
assert!(vals[0].time() > 1_583_443_428_970_606_000); assert_eq!(vals[0].series.tag_set.as_ref().unwrap()[0].1, "value1");
assert!(approximately_equal(vals[0].f64_value().unwrap(), 23.1));
assert_eq!(vals[1].series(), "foo,tag0=value1\tbar"); assert_eq!(vals[0].timestamp, None);
// Just test that we haven't traveled back in time
assert!(vals[1].time() > 1_583_443_428_970_606_000); assert_eq!(vals[0].field_set[0].0, "asdf");
assert_eq!(vals[1].i64_value().unwrap(), 5); assert!(approximately_equal(
vals[0].field_set[0].1.unwrap_f64(),
23.1
));
assert_eq!(vals[0].field_set[1].0, "bar");
assert_eq!(vals[0].field_set[1].1.unwrap_i64(), 5);
Ok(()) Ok(())
} }