blob: 9c4eb575613426a362255e4d431a5b57c406f501 [file] [log] [blame]
// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
use super::*;
use crate::protocol::Cohort;
use pretty_assertions::assert_eq;
use serde_json::json;
#[test]
fn test_invalid_json() {
assert!(parse_json_response(b"invalid_json").is_err());
}
#[test]
fn test_empty_json() {
assert!(parse_json_response(b"{}").is_err());
}
#[test]
fn test_minimal() {
let json = br#"
{"response":{
"server":"prod",
"protocol":"3.0",
"app":[
{
"appid":"{00000000-0000-0000-0000-000000000001}",
"status":"ok"
}
]
}}"#;
let result = parse_json_response(json);
assert!(result.is_ok());
let response = result.unwrap();
let expected = Response {
protocol_version: "3.0".to_string(),
server: "prod".to_string(),
daystart: None,
apps: vec![App {
id: "{00000000-0000-0000-0000-000000000001}".to_string(),
..App::default()
}],
};
assert_eq!(response, expected);
}
#[test]
fn test_all_fields() {
let json = br##"
{"response":{
"messagetype":"response",
"server":"test",
"protocol":"3.0",
"daystart":{"elapsed_seconds":54956,"elapsed_days":4242},
"app":[
{
"appid":"{00000000-0000-0000-0000-000000000001}",
"cohort":"",
"status":"ok",
"cohorthint":"",
"cohortname":"",
"updatecheck":{"status":"noupdate","info":"no update for you"},
"ping":{"status":"ok"},
"event":[
{"status":"ok"},
{"status":"ok"}
],
"data":{
"name":"install",
"index":"default",
"status":"ok",
"#text":
"{\n \"distribution\" : {\n \"some_flag\" : true\n }\n}\n"}
},
{
"appid":"{11111111-1111-1111-1111-111111111111}",
"cohort":"",
"status":"ok",
"cohortname":"",
"updatecheck":{
"status":"ok",
"urls":{
"url":[
{"codebase":"http://url/base/"},
{"codebase":"https://url/base/"}
]
},
"manifest":{
"version":"1.3.33.17",
"actions":{
"action":[
{"run":"update_package",
"arguments":"/update","event":"update"},
{"event":"postinstall"},
{"run":"ChromeRecovery.crx"}
]
},
"packages":{
"package":[
{
"hash_sha256":
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"size":2000000,
"name":"update_package",
"fp":
"1.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"required":true,
"hash":"qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq"
}
]
}
}
},
"ping":{"status":"ok"},
"event":[
{"status":"ok"}
]
}
]
}}"##;
let result = parse_json_response(json);
assert!(result.is_ok());
let response = result.unwrap();
let expected = Response {
protocol_version: "3.0".to_string(),
server: "test".to_string(),
daystart: Some(DayStart { elapsed_seconds: Some(54956), elapsed_days: Some(4242) }),
apps: vec![
App {
id: "{00000000-0000-0000-0000-000000000001}".to_string(),
status: OmahaStatus::Ok,
cohort: Cohort {
id: Some("".to_string()),
hint: Some("".to_string()),
name: Some("".to_string())
},
ping: Some(Ping { status: OmahaStatus::Ok }),
update_check: Some(UpdateCheck {
status: OmahaStatus::NoUpdate,
info: Some("no update for you".to_string()),
urls: None,
manifest: None,
}),
events: Some(vec![
Event{ status: OmahaStatus::Ok },
Event{ status: OmahaStatus::Ok },
]),
extra_attributes: json!({"data":{
"name":"install",
"index":"default",
"status":"ok",
"#text":"{\n \"distribution\" : {\n \"some_flag\" : true\n }\n}\n"
}})
.as_object()
.unwrap()
.to_owned(),
},
App {
id: "{11111111-1111-1111-1111-111111111111}".to_string(),
status: OmahaStatus::Ok,
cohort: Cohort {
id: Some("".to_string()),
hint: None,
name: Some("".to_string())
},
ping: Some(Ping { status: OmahaStatus::Ok }),
update_check: Some(UpdateCheck {
status: OmahaStatus::Ok,
info: None,
urls: Some(URLs::new(vec![
"http://url/base/".to_string(),
"https://url/base/".to_string()
])),
manifest: Some(Manifest {
version: "1.3.33.17".to_string(),
actions: Actions{action:vec![
Action {
event: Some("update".to_string()),
run: Some("update_package".to_string()),
extra_attributes: json!({"arguments":"/update"})
.as_object()
.unwrap()
.to_owned(),
},
Action {
event: Some("postinstall".to_string()),
run: None,
extra_attributes: Map::new(),
},
Action {
event: None,
run: Some("ChromeRecovery.crx".to_string()),
extra_attributes: Map::new(),
},
]},
packages: Packages{package: vec![Package{
name: "update_package".to_string(),
required: true,
size: 2000000,
hash: Some("qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq".to_string()),
hash_sha256:
Some("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa".to_string()),
fingerprint:
"1.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa".to_string(),
extra_attributes: Map::new(),
}]},
}),
}),
events: Some(vec![Event{status: OmahaStatus::Ok}]),
extra_attributes: Map::new(),
},
],
};
assert_eq!(response, expected);
}
#[test]
fn test_new_cohort() {
let json = br#"
{"response":{
"server":"prod",
"protocol":"3.0",
"app":[
{
"appid":"{00000000-0000-0000-0000-000000000001}",
"cohort":"1:3:",
"status":"ok",
"cohortname":"stable",
"updatecheck":{"status":"noupdate"},
"ping":{"status":"ok"}
}
]
}}"#;
let result = parse_json_response(json);
assert!(result.is_ok());
let response = result.unwrap();
let expected = Response {
protocol_version: "3.0".to_string(),
server: "prod".to_string(),
daystart: None,
apps: vec![App {
id: "{00000000-0000-0000-0000-000000000001}".to_string(),
status: OmahaStatus::Ok,
cohort: Cohort {
id: Some("1:3:".to_string()),
hint: None,
name: Some("stable".to_string()),
},
ping: Some(Ping { status: OmahaStatus::Ok }),
update_check: Some(UpdateCheck::no_update()),
..App::default()
}],
};
assert_eq!(response, expected);
}
#[test]
fn test_unknown_app_id() {
let json = br#"
{"response":{
"server":"prod",
"protocol":"3.0",
"app":[
{
"appid":"{00000000-0000-0000-0000-000000000001}",
"status": "error-unknownApplication"
}
]
}}"#;
let result = parse_json_response(json);
assert!(result.is_ok());
let response = result.unwrap();
let expected = Response {
protocol_version: "3.0".to_string(),
server: "prod".to_string(),
daystart: None,
apps: vec![App {
id: "{00000000-0000-0000-0000-000000000001}".to_string(),
status: OmahaStatus::Error("error-unknownApplication".to_string()),
..App::default()
}],
};
assert_eq!(response, expected);
}
#[test]
fn test_single_url() {
let json = br#"
{"response":{
"server":"prod",
"protocol":"3.0",
"app":[
{
"appid":"single-url-appid",
"status":"ok",
"updatecheck":{
"status":"ok",
"urls":{
"url":[
{"codebase":"http://url/base/"}
]
},
"manifest":{
"version":"1.0",
"actions":{
"action":[
{"event":"install", "run":"full.payload"}
]
},
"packages":{
"package":[
{
"hash_sha256":
"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
"size":100000000,
"name":"full.payload",
"fp":
"1.bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
"required":true
}
]
}
}
}
}
]
}}"#;
let result = parse_json_response(json);
assert!(result.is_ok());
let response = result.unwrap();
let expected = Response {
protocol_version: "3.0".to_string(),
server: "prod".to_string(),
daystart: None,
apps: vec![App {
id: "single-url-appid".to_string(),
status: OmahaStatus::Ok,
update_check: Some(UpdateCheck {
status: OmahaStatus::Ok,
info: None,
urls: Some(URLs::new(vec!["http://url/base/".to_string()])),
manifest: Some(Manifest {
version: "1.0".to_string(),
actions: Actions {
action: vec![Action {
event: Some("install".to_string()),
run: Some("full.payload".to_string()),
extra_attributes: Map::new(),
}],
},
packages: Packages {
package: vec![Package {
name: "full.payload".to_string(),
required: true,
size: 100000000,
hash: None,
hash_sha256: Some(
"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
.to_string(),
),
fingerprint:
"1.bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
.to_string(),
extra_attributes: Map::new(),
}],
},
}),
}),
..App::default()
}],
};
assert_eq!(response, expected);
}
#[test]
fn test_no_update() {
let json = br#"
{"response":{
"server":"prod",
"protocol":"3.0",
"app":[
{
"appid":"no-update-appid",
"status":"ok",
"updatecheck":{
"status":"noupdate"
}
}
]
}}"#;
let result = parse_json_response(json);
assert!(result.is_ok());
let response = result.unwrap();
let expected = Response {
protocol_version: "3.0".to_string(),
server: "prod".to_string(),
daystart: None,
apps: vec![App {
id: "no-update-appid".to_string(),
update_check: Some(UpdateCheck::no_update()),
..App::default()
}],
};
assert_eq!(response, expected);
}
#[test]
fn test_unsupported_protocol_version() {
let json = br#"
{"response":{
"server":"prod",
"protocol":"2.0",
"app":[
{
"appid":"{00000000-0000-0000-0000-000000000001}",
"status":"ok"
}
]
}}"#;
let result = parse_json_response(json);
assert!(result.is_ok());
let response = result.unwrap();
let expected = Response {
protocol_version: "2.0".to_string(),
server: "prod".to_string(),
daystart: None,
apps: vec![App {
id: "{00000000-0000-0000-0000-000000000001}".to_string(),
..App::default()
}],
};
assert_eq!(response, expected);
}
#[test]
fn test_missing_app() {
let json = br#"
{"response":{
"server":"prod",
"protocol":"3.0"
}}"#;
assert!(parse_json_response(json).is_err());
}