Skip to content
This repository was archived by the owner on Nov 1, 2023. It is now read-only.

Commit 07a0a92

Browse files
authored
Add deserialization compat functions (#2719)
1 parent 04f83e0 commit 07a0a92

File tree

6 files changed

+68
-34
lines changed

6 files changed

+68
-34
lines changed

src/agent/onefuzz-file-format/src/coverage/binary.rs

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,29 @@ pub mod v0;
88
pub mod v1;
99

1010
#[derive(Serialize, Deserialize)]
11-
#[serde(tag = "version")]
11+
#[serde(tag = "version", content = "coverage")]
1212
pub enum BinaryCoverageJson {
13-
#[serde(rename = "0")]
13+
#[serde(rename = "0.1")]
1414
V0(v0::BinaryCoverageJson),
1515

16-
#[serde(rename = "1")]
16+
#[serde(rename = "1.0")]
1717
V1(v1::BinaryCoverageJson),
1818
}
1919

20+
impl BinaryCoverageJson {
21+
pub fn deserialize(text: &str) -> Result<Self> {
22+
// Try unversioned legacy format.
23+
let v0 = serde_json::from_str::<v0::BinaryCoverageJson>(text);
24+
25+
if let Ok(v0) = v0 {
26+
return Ok(Self::V0(v0));
27+
}
28+
29+
// Try versioned formats.
30+
Ok(serde_json::from_str(text)?)
31+
}
32+
}
33+
2034
impl TryFrom<BinaryCoverageJson> for BinaryCoverage {
2135
type Error = anyhow::Error;
2236

src/agent/onefuzz-file-format/src/coverage/source.rs

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,29 @@ pub mod v0;
88
pub mod v1;
99

1010
#[derive(Serialize, Deserialize)]
11-
#[serde(tag = "version")]
11+
#[serde(tag = "version", content = "coverage")]
1212
pub enum SourceCoverageJson {
13-
#[serde(rename = "0")]
13+
#[serde(rename = "0.1")]
1414
V0(v0::SourceCoverageJson),
1515

16-
#[serde(rename = "1")]
16+
#[serde(rename = "1.0")]
1717
V1(v1::SourceCoverageJson),
1818
}
1919

20+
impl SourceCoverageJson {
21+
pub fn deserialize(text: &str) -> Result<Self> {
22+
// Try unversioned legacy format.
23+
let v0 = serde_json::from_str::<v0::SourceCoverageJson>(text);
24+
25+
if let Ok(v0) = v0 {
26+
return Ok(Self::V0(v0));
27+
}
28+
29+
// Try versioned formats.
30+
Ok(serde_json::from_str(text)?)
31+
}
32+
}
33+
2034
impl TryFrom<SourceCoverageJson> for SourceCoverage {
2135
type Error = anyhow::Error;
2236

src/agent/onefuzz-file-format/tests/binary.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use pretty_assertions::assert_eq;
55

66
use anyhow::Result;
77
use coverage::binary::{BinaryCoverage, Count, FilePath, ModuleBinaryCoverage, Offset};
8-
use onefuzz_file_format::coverage::binary::{v0, v1};
8+
use onefuzz_file_format::coverage::binary::BinaryCoverageJson;
99

1010
fn expected_binary_coverage() -> Result<BinaryCoverage> {
1111
let main_exe_path = FilePath::new("/setup/main.exe")?;
@@ -32,12 +32,12 @@ fn test_binary_coverage_formats() -> Result<()> {
3232
let expected = expected_binary_coverage()?;
3333

3434
let v0_text = include_str!("files/binary-coverage.v0.json");
35-
let v0_json: v0::BinaryCoverageJson = serde_json::from_str(v0_text)?;
35+
let v0_json = BinaryCoverageJson::deserialize(v0_text)?;
3636
let from_v0 = BinaryCoverage::try_from(v0_json)?;
3737
assert_eq!(from_v0, expected);
3838

3939
let v1_text = include_str!("files/binary-coverage.v1.json");
40-
let v1_json: v1::BinaryCoverageJson = serde_json::from_str(v1_text)?;
40+
let v1_json = BinaryCoverageJson::deserialize(v1_text)?;
4141
let from_v1 = BinaryCoverage::try_from(v1_json)?;
4242
assert_eq!(from_v1, expected);
4343

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,18 @@
11
{
2-
"/setup/main.exe": {
3-
"blocks": {
4-
"1": 0,
5-
"12c": 1,
6-
"1388": 0
7-
}
8-
},
9-
"/setup/lib/some.dll": {
10-
"blocks": {
11-
"7b": 0,
12-
"1c8": 10
2+
"version": "1.0",
3+
"coverage": {
4+
"/setup/main.exe": {
5+
"blocks": {
6+
"1": 0,
7+
"12c": 1,
8+
"1388": 0
9+
}
10+
},
11+
"/setup/lib/some.dll": {
12+
"blocks": {
13+
"7b": 0,
14+
"1c8": 10
15+
}
1316
}
1417
}
1518
}
Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,18 @@
11
{
2-
"src/bin/main.c": {
3-
"lines": {
4-
"4": 1,
5-
"9": 0,
6-
"12": 5
7-
}
8-
},
9-
"src/lib/common.c": {
10-
"lines": {
11-
"5": 1,
12-
"8": 0
2+
"version": "1.0",
3+
"coverage": {
4+
"src/bin/main.c": {
5+
"lines": {
6+
"4": 1,
7+
"9": 0,
8+
"12": 5
9+
}
10+
},
11+
"src/lib/common.c": {
12+
"lines": {
13+
"5": 1,
14+
"8": 0
15+
}
1316
}
1417
}
1518
}

src/agent/onefuzz-file-format/tests/source.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use pretty_assertions::assert_eq;
66
use anyhow::Result;
77
use coverage::source::{Count, Line, SourceCoverage};
88
use debuggable_module::path::FilePath;
9-
use onefuzz_file_format::coverage::source::{v0, v1};
9+
use onefuzz_file_format::coverage::source::SourceCoverageJson;
1010

1111
fn expected_source_coverage() -> Result<SourceCoverage> {
1212
let main_path = FilePath::new("src/bin/main.c")?;
@@ -31,12 +31,12 @@ fn test_source_coverage_formats() -> Result<()> {
3131
let expected = expected_source_coverage()?;
3232

3333
let v0_text = include_str!("files/source-coverage.v0.json");
34-
let v0_json: v0::SourceCoverageJson = serde_json::from_str(v0_text)?;
34+
let v0_json = SourceCoverageJson::deserialize(v0_text)?;
3535
let from_v0 = SourceCoverage::try_from(v0_json)?;
3636
assert_eq!(from_v0, expected);
3737

3838
let v1_text = include_str!("files/source-coverage.v1.json");
39-
let v1_json: v1::SourceCoverageJson = serde_json::from_str(v1_text)?;
39+
let v1_json = SourceCoverageJson::deserialize(v1_text)?;
4040
let from_v1 = SourceCoverage::try_from(v1_json)?;
4141
assert_eq!(from_v1, expected);
4242

0 commit comments

Comments
 (0)