blob: a4b0a77b615b02bcaaaa281b2449ec9cdcd604ac [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 {
fidl_fuchsia_pkg_ext::{MirrorConfig, RepositoryConfig},
fuchsia_inspect::{self as inspect, NumericProperty, Property, StringReference},
fuchsia_inspect_contrib::inspectable::{Inspectable, Watch},
std::sync::Arc,
};
pub type InspectableRepositoryConfig =
Inspectable<Arc<RepositoryConfig>, InspectableRepositoryConfigWatcher>;
pub struct InspectableRepositoryConfigWatcher {
mirror_configs_node: inspect::Node,
_mirror_configs_states: Vec<MirrorConfigInspectState>,
root_keys_node: inspect::Node,
_root_keys_properties: Vec<inspect::StringProperty>,
update_package_url_property: inspect::StringProperty,
_node: inspect::Node,
}
impl Watch<Arc<RepositoryConfig>> for InspectableRepositoryConfigWatcher {
fn new<'a>(
config: &Arc<RepositoryConfig>,
node: &inspect::Node,
name: impl Into<StringReference<'a>>,
) -> Self {
let repo_config_node = node.create_child(name);
let mut ret = Self {
root_keys_node: repo_config_node.create_child("root_keys"),
_root_keys_properties: vec![],
mirror_configs_node: repo_config_node.create_child("mirrors"),
_mirror_configs_states: vec![],
update_package_url_property: repo_config_node
.create_string("update_package_url", format!("{:?}", config.update_package_url())),
_node: repo_config_node,
};
ret.watch(config);
ret
}
fn watch(&mut self, config: &Arc<RepositoryConfig>) {
self.update_package_url_property.set(&format!("{:?}", config.update_package_url()));
self._root_keys_properties = config
.root_keys()
.iter()
.enumerate()
.map(|(i, root_key)| {
self.root_keys_node.create_string(&i.to_string(), format!("{:?}", root_key))
})
.collect();
self._mirror_configs_states = config
.mirrors()
.iter()
.enumerate()
.map(|(i, mirror_config)| {
MirrorConfigInspectState::new(
mirror_config,
self.mirror_configs_node.create_child(&i.to_string()),
)
})
.collect();
}
}
#[derive(Debug)]
pub struct Counter {
prop: inspect::UintProperty,
}
impl Counter {
pub fn new(parent: &inspect::Node, name: &str) -> Self {
Self { prop: parent.create_uint(name, 0) }
}
pub fn increment(&self) {
self.prop.add(1);
}
}
pub struct MirrorConfigInspectState {
_mirror_url_property: inspect::StringProperty,
_subscribe_property: inspect::StringProperty,
_blob_mirror_url_property: inspect::StringProperty,
_node: inspect::Node,
}
impl MirrorConfigInspectState {
fn new(mirror_config: &MirrorConfig, node: inspect::Node) -> Self {
MirrorConfigInspectState {
_mirror_url_property: node
.create_string("mirror_url", format!("{:?}", mirror_config.mirror_url())),
_subscribe_property: node
.create_string("subscribe", format!("{:?}", &mirror_config.subscribe())),
_blob_mirror_url_property: node
.create_string("blob_mirror_url", format!("{:?}", mirror_config.blob_mirror_url())),
_node: node,
}
}
}
#[cfg(test)]
mod test_inspectable_repository_config {
use {
super::*,
fidl_fuchsia_pkg_ext::{MirrorConfigBuilder, RepositoryConfigBuilder, RepositoryKey},
fuchsia_inspect::assert_data_tree,
fuchsia_url::pkg_url::RepoUrl,
http::Uri,
};
#[test]
fn test_initialization() {
let inspector = inspect::Inspector::new();
let fuchsia_url = RepoUrl::parse("fuchsia-pkg://fuchsia.com/").unwrap();
let mirror_config =
MirrorConfigBuilder::new("http://fake-mirror.com".parse::<Uri>().unwrap())
.unwrap()
.build();
let config = Arc::new(
RepositoryConfigBuilder::new(fuchsia_url.clone())
.add_root_key(RepositoryKey::Ed25519(vec![0]))
.add_mirror(mirror_config.clone())
.build(),
);
let inspectable =
InspectableRepositoryConfig::new(config, inspector.root(), "test-property");
assert_data_tree!(
inspector,
root: {
"test-property": {
root_keys: {
"0": format!("{:?}", inspectable.root_keys()[0])
},
mirrors: {
"0": {
mirror_url: format!("{:?}", mirror_config.mirror_url()),
subscribe: format!("{:?}", mirror_config.subscribe()),
blob_mirror_url: format!("{:?}", mirror_config.blob_mirror_url())
}
},
update_package_url: format!("{:?}", inspectable.update_package_url()),
}
}
);
}
#[test]
fn test_watcher() {
let inspector = inspect::Inspector::new();
let fuchsia_url = RepoUrl::parse("fuchsia-pkg://fuchsia.com").unwrap();
let config = Arc::new(
RepositoryConfigBuilder::new(fuchsia_url.clone())
.add_root_key(RepositoryKey::Ed25519(vec![0]))
.build(),
);
let mirror_config =
MirrorConfigBuilder::new("http://fake-mirror.com".parse::<Uri>().unwrap())
.unwrap()
.build();
let mut inspectable =
InspectableRepositoryConfig::new(config, inspector.root(), "test-property");
Arc::get_mut(&mut inspectable.get_mut())
.expect("get repo config")
.insert_mirror(mirror_config.clone());
assert_data_tree!(
inspector,
root: {
"test-property": {
root_keys: {
"0": format!("{:?}", inspectable.root_keys()[0])
},
mirrors: {
"0": {
mirror_url: format!("{:?}", mirror_config.mirror_url()),
subscribe: format!("{:?}", mirror_config.subscribe()),
blob_mirror_url: format!("{:?}", mirror_config.blob_mirror_url())
}
},
update_package_url: format!("{:?}", inspectable.update_package_url()),
}
}
);
}
}