blob: b75556197bf81012bff9f13cb1bc9cf4c302be35 [file] [log] [blame]
// Copyright 2021 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 {
fuchsia_cobalt::CobaltSender,
futures::channel::mpsc,
fuzz::fuzz,
tempfile::TempDir,
wlan_common::assert_variant,
wlancfg_lib::config_management::{
network_config::{Credential, NetworkIdentifier},
SavedNetworksManager, SavedNetworksManagerApi,
},
};
#[fuzz]
async fn fuzz_saved_networks_manager_store(id: NetworkIdentifier, credential: Credential) {
// Test with fuzzed inputs that if a network is stored, we can look it up again and if it is
// loaded from stash when SavedNetworksManager is initialized from stash the values of the
// saved network are correct.
let stash_id = "store_and_lookup";
// Expect the store to be constructed successfully even if the file doesn't
// exist yet
let saved_networks = create_saved_networks(stash_id).await;
assert!(saved_networks.lookup(&id).await.is_empty());
assert_eq!(0, saved_networks.known_network_count().await);
// Store a fuzzed network identifier and credential.
assert!(saved_networks
.store(id.clone(), credential.clone())
.await
.expect("storing network failed")
.is_none());
assert_variant!(saved_networks.lookup(&id).await.as_slice(),
[network_config] => {
assert_eq!(network_config.ssid, id.ssid);
assert_eq!(network_config.security_type, id.security_type);
assert_eq!(network_config.credential, credential);
}
);
assert_eq!(1, saved_networks.known_network_count().await);
// Saved networks should persist when we create a saved networks manager with the same ID.
let saved_networks = create_saved_networks(stash_id).await;
assert_variant!(saved_networks.lookup(&id).await.as_slice(),
[network_config] => {
assert_eq!(network_config.ssid, id.ssid);
assert_eq!(network_config.security_type, id.security_type);
assert_eq!(network_config.credential, credential);
}
);
assert_eq!(1, saved_networks.known_network_count().await);
}
/// Create a saved networks manager with the specified stash ID. Stash ID should be different for
/// each test so that they don't interfere.
async fn create_saved_networks(stash_id: impl AsRef<str>) -> SavedNetworksManager {
// This file doesn't really matter, it will only be deleted if it exists.
let temp_dir = TempDir::new().expect("failed to create temporary directory");
let path = temp_dir.path().join("networks.json");
let saved_networks =
SavedNetworksManager::new_with_stash_or_paths(stash_id, path, create_mock_cobalt_sender())
.await
.expect("Failed to create SavedNetworksManager");
saved_networks
}
pub fn create_mock_cobalt_sender() -> CobaltSender {
// Arbitrary number that is (much) larger than the count of metrics we might send to it
const MOCK_COBALT_MSG_BUFFER: usize = 100;
let (cobalt_mpsc_sender, _cobalt_mpsc_receiver) = mpsc::channel(MOCK_COBALT_MSG_BUFFER);
CobaltSender::new(cobalt_mpsc_sender)
}