tough 0.7.1

The Update Framework (TUF) repository client
Documentation
// Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: MIT OR Apache-2.0

use std::fs::File;
use tempfile::TempDir;
use test_utils::{dir_url, test_data};
use tough::error::Error::ExpiredMetadata;
use tough::schema::RoleType;
use tough::{ExpirationEnforcement, FilesystemTransport, Limits, Repository, Settings};

mod test_utils;

/// Test that `tough` fails to load an expired repository when `expiration_enforcement` is `Safe`.
///
#[test]
fn test_expiration_enforcement_safe() {
    let base = test_data().join("expired-repository");
    let datastore = TempDir::new().unwrap();

    let metadata_base_url = &dir_url(base.join("metadata"));
    let targets_base_url = &dir_url(base.join("targets"));

    let result = Repository::load(
        &FilesystemTransport,
        Settings {
            root: File::open(base.join("metadata").join("1.root.json")).unwrap(),
            datastore: datastore.as_ref(),
            metadata_base_url,
            targets_base_url,
            limits: Limits::default(),
            expiration_enforcement: ExpirationEnforcement::Safe,
        },
    );

    if let Err(err) = result {
        match err {
            ExpiredMetadata { role, backtrace: _ } => {
                assert_eq!(role, RoleType::Timestamp);
            }
            _ => {
                panic!(
                    "Expected an error type of 'ExpiredMetadata' but received a different error."
                );
            }
        }
    } else {
        panic!("Repository::load was expected to return an error.")
    }
}

/// Test that `tough` loads an expired repository when `expiration_enforcement` is `Unsafe`.
///
#[test]
fn test_expiration_enforcement_unsafe() {
    let base = test_data().join("expired-repository");
    let datastore = TempDir::new().unwrap();

    let metadata_base_url = &dir_url(base.join("metadata"));
    let targets_base_url = &dir_url(base.join("targets"));

    let result = Repository::load(
        &FilesystemTransport,
        Settings {
            root: File::open(base.join("metadata").join("1.root.json")).unwrap(),
            datastore: datastore.as_ref(),
            metadata_base_url,
            targets_base_url,
            limits: Limits::default(),
            expiration_enforcement: ExpirationEnforcement::Unsafe,
        },
    );

    assert!(result.is_ok())
}