blob: 59486f0773d8a741f09433f2a94115522c6e12be [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.
#![cfg(test)]
/// This module tests pkg_resolver's RewriteManager when
/// dynamic rewrite rules have been disabled.
use {
fidl_fuchsia_pkg_rewrite_ext::{Rule, RuleConfig},
fuchsia_async as fasync,
fuchsia_zircon::Status,
lib::{get_rules, mock_filesystem, Config, DirOrProxy, MountsBuilder, TestEnvBuilder},
};
fn make_rule_config(rule: &Rule) -> RuleConfig {
RuleConfig::Version1(vec![rule.clone()])
}
fn make_rule() -> Rule {
Rule::new("example.com", "example.com", "/", "/").unwrap()
}
#[fasync::run_singlethreaded(test)]
async fn load_dynamic_rules() {
let rule = make_rule();
let env = TestEnvBuilder::new()
.mounts(
MountsBuilder::new()
.dynamic_rewrite_rules(make_rule_config(&rule))
.config(Config { enable_dynamic_configuration: true })
.build(),
)
.build()
.await;
assert_eq!(get_rules(&env.proxies.rewrite_engine).await, vec![rule]);
env.stop().await;
}
#[fasync::run_singlethreaded(test)]
async fn no_load_dynamic_rules_if_disabled() {
let env = TestEnvBuilder::new()
.mounts(
MountsBuilder::new()
.dynamic_rewrite_rules(make_rule_config(&make_rule()))
.config(Config { enable_dynamic_configuration: false })
.build(),
)
.build()
.await;
assert_eq!(get_rules(&env.proxies.rewrite_engine).await, vec![]);
env.stop().await;
}
#[fasync::run_singlethreaded(test)]
async fn commit_transaction_succeeds() {
let env = TestEnvBuilder::new().build().await;
let (edit_transaction, edit_transaction_server) = fidl::endpoints::create_proxy().unwrap();
env.proxies.rewrite_engine.start_edit_transaction(edit_transaction_server).unwrap();
let rule = make_rule();
let () = edit_transaction.add(&mut rule.clone().into()).await.unwrap().unwrap();
edit_transaction.commit().await.unwrap().unwrap();
assert_eq!(get_rules(&env.proxies.rewrite_engine).await, vec![rule]);
env.stop().await;
}
#[fasync::run_singlethreaded(test)]
async fn commit_transaction_fails_if_disabled() {
let env = TestEnvBuilder::new()
.mounts(MountsBuilder::new().config(Config { enable_dynamic_configuration: false }).build())
.build()
.await;
let (edit_transaction, edit_transaction_server) = fidl::endpoints::create_proxy().unwrap();
env.proxies.rewrite_engine.start_edit_transaction(edit_transaction_server).unwrap();
let () = edit_transaction.add(&mut make_rule().into()).await.unwrap().unwrap();
assert_eq!(
Status::from_raw(edit_transaction.commit().await.unwrap().unwrap_err()),
Status::ACCESS_DENIED
);
assert_eq!(get_rules(&env.proxies.rewrite_engine).await, vec![]);
env.stop().await;
}
#[fasync::run_singlethreaded(test)]
async fn attempt_to_open_persisted_dynamic_rules() {
let (proxy, open_counts) = mock_filesystem::spawn_directory_handler();
let env = TestEnvBuilder::new()
.mounts(
MountsBuilder::default()
.pkg_resolver_data(DirOrProxy::Proxy(proxy))
.config(Config { enable_dynamic_configuration: true })
.build(),
)
.build()
.await;
// Waits for pkg_resolver to be initialized
get_rules(&env.proxies.rewrite_engine).await;
assert_eq!(open_counts.lock().get("rewrites.json"), Some(&1));
env.stop().await;
}
#[fasync::run_singlethreaded(test)]
async fn no_attempt_to_open_persisted_dynamic_rules_if_disabled() {
let (proxy, open_counts) = mock_filesystem::spawn_directory_handler();
let env = TestEnvBuilder::new()
.mounts(
MountsBuilder::new()
.pkg_resolver_data(DirOrProxy::Proxy(proxy))
.config(Config { enable_dynamic_configuration: false })
.build(),
)
.build()
.await;
// Waits for pkg_resolver to be initialized
get_rules(&env.proxies.rewrite_engine).await;
assert_eq!(open_counts.lock().get("rewrites.json"), None);
env.stop().await;
}
#[fasync::run_singlethreaded(test)]
async fn dynamic_rewrites_disabled_if_missing_config() {
let env = TestEnvBuilder::new().mounts(MountsBuilder::new().build()).build().await;
let (edit_transaction, edit_transaction_server) = fidl::endpoints::create_proxy().unwrap();
env.proxies.rewrite_engine.start_edit_transaction(edit_transaction_server).unwrap();
let () = edit_transaction.add(&mut make_rule().into()).await.unwrap().unwrap();
assert_eq!(
Status::from_raw(edit_transaction.commit().await.unwrap().unwrap_err()),
Status::ACCESS_DENIED
);
assert_eq!(get_rules(&env.proxies.rewrite_engine).await, vec![]);
env.stop().await;
}