blob: cd193c8cef04394851658ee45fa19a66efd5b5f6 [file] [log] [blame]
// Copyright 2020 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::*, pretty_assertions::assert_eq};
async fn test_resolve_error_maps_to_cobalt_status_code(
error: fidl_fuchsia_pkg::ResolveError,
expected_status_code: metrics::OtaResultAttemptsMetricDimensionStatusCode,
) {
let env = TestEnv::builder().build().await;
let pkg_url = "fuchsia-pkg://fuchsia.com/failure/0?hash=00112233445566778899aabbccddeeffffeeddccbbaa99887766554433221100";
env.resolver
.register_package("update", "upd4t3")
.add_file("packages.json", make_packages_json([pkg_url]))
.add_file("epoch.json", make_epoch_json(SOURCE_EPOCH))
.add_file("zbi", "fake zbi");
env.resolver.url(pkg_url).fail(error);
let result = env.run_update().await;
assert!(result.is_err(), "system updater succeeded when it should fail");
assert_eq!(
env.get_ota_metrics().await,
OtaMetrics {
initiator: metrics::OtaResultAttemptsMetricDimensionInitiator::UserInitiatedCheck
as u32,
phase: metrics::OtaResultAttemptsMetricDimensionPhase::PackageDownload as u32,
status_code: expected_status_code as u32,
target: "".into(),
}
);
}
#[fasync::run_singlethreaded(test)]
async fn reports_untrusted_tuf_repo() {
test_resolve_error_maps_to_cobalt_status_code(
fidl_fuchsia_pkg::ResolveError::AccessDenied,
metrics::OtaResultAttemptsMetricDimensionStatusCode::ErrorUntrustedTufRepo,
)
.await;
}
#[fasync::run_singlethreaded(test)]
async fn reports_out_of_space() {
test_resolve_error_maps_to_cobalt_status_code(
fidl_fuchsia_pkg::ResolveError::NoSpace,
metrics::OtaResultAttemptsMetricDimensionStatusCode::ErrorStorageOutOfSpace,
)
.await;
}
#[fasync::run_singlethreaded(test)]
async fn reports_misc_storage() {
test_resolve_error_maps_to_cobalt_status_code(
fidl_fuchsia_pkg::ResolveError::Io,
metrics::OtaResultAttemptsMetricDimensionStatusCode::ErrorStorage,
)
.await;
}
#[fasync::run_singlethreaded(test)]
async fn reports_network() {
test_resolve_error_maps_to_cobalt_status_code(
fidl_fuchsia_pkg::ResolveError::UnavailableBlob,
metrics::OtaResultAttemptsMetricDimensionStatusCode::ErrorNetworking,
)
.await;
}
#[fasync::run_singlethreaded(test)]
async fn succeeds_even_if_metrics_fail_to_send() {
let env = TestEnvBuilder::new().unregister_protocol(Protocol::Cobalt).build().await;
env.resolver
.register_package("update", "upd4t3")
.add_file("packages.json", make_packages_json([]))
.add_file("epoch.json", make_epoch_json(SOURCE_EPOCH))
.add_file("zbi", "fake zbi");
env.run_update().await.expect("run system updater");
let loggers = env.logger_factory.loggers.lock().clone();
assert_eq!(loggers.len(), 0);
assert_eq!(
env.take_interactions(),
vec![
Paver(PaverEvent::QueryCurrentConfiguration),
Paver(PaverEvent::ReadAsset {
configuration: paver::Configuration::A,
asset: paver::Asset::VerifiedBootMetadata
}),
Paver(PaverEvent::ReadAsset {
configuration: paver::Configuration::A,
asset: paver::Asset::Kernel
}),
Paver(PaverEvent::QueryCurrentConfiguration),
Paver(PaverEvent::QueryConfigurationStatus { configuration: paver::Configuration::A }),
Paver(PaverEvent::SetConfigurationUnbootable {
configuration: paver::Configuration::B
}),
Paver(PaverEvent::BootManagerFlush),
Gc,
PackageResolve(UPDATE_PKG_URL.to_string()),
Gc,
BlobfsSync,
Paver(PaverEvent::WriteAsset {
configuration: paver::Configuration::B,
asset: paver::Asset::Kernel,
payload: b"fake zbi".to_vec(),
}),
Paver(PaverEvent::SetConfigurationActive { configuration: paver::Configuration::B }),
Paver(PaverEvent::DataSinkFlush),
Paver(PaverEvent::BootManagerFlush),
Reboot,
]
);
}