use crate::clock::MeasurementReading;
use crate::descriptor::{
AuthoredTableName, ClaimRef, GeneratedSupportSchemaId, TablePosture, TrialKey,
};
use crate::identity::{DomainTag, IdentityProfileVersion};
#[path = "type_guard.rs"]
mod guard;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub enum TrialProfile {
Unprofiled,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct ProfiledTrial {
key: TrialKey,
profile: TrialProfile,
}
pub const TRIAL_IDENTITY_TAG: DomainTag =
DomainTag::declared("trial-identity", IdentityProfileVersion::declared(1));
crate::identity::content_address_reference! {
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct TrialId;
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct TrialSite {
module_path: &'static str,
file: &'static str,
line: u32,
name: &'static str,
}
pub const ROW_REVISION_TAG: DomainTag =
DomainTag::declared("row-revision", IdentityProfileVersion::declared(1));
crate::identity::content_address_reference! {
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct RowRevisionId;
}
crate::identity::content_address_reference! {
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct SubjectRevisionId;
}
crate::identity::content_address_reference! {
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct CheckRevisionId;
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct ExecutionRevisions {
subject: SubjectRevisionId,
check: CheckRevisionId,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct TargetTriple(String);
#[derive(Debug, Clone, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct ToolchainIdentity(String);
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct TargetBinding {
target: TargetTriple,
toolchain: ToolchainIdentity,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct CaseBudget(u32);
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct ByteBudget(u64);
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct TimeBudget(u64);
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct InvocationProfile {
cases: CaseBudget,
bytes: ByteBudget,
time: TimeBudget,
}
pub const EXECUTION_KEY_TAG: DomainTag =
DomainTag::declared("execution-key", IdentityProfileVersion::declared(1));
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct ExecutionKey {
trial: TrialId,
revisions: ExecutionRevisions,
invocation: InvocationProfile,
target: TargetBinding,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum CacheEligibility {
Eligible,
NeverEligible,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum ReplayPosture {
ExactDerived,
DeclaredByAuthor,
UnavailableBecauseUntracked,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct GenerationProfile {
name: &'static str,
version: u32,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct MinimizationProfile {
name: &'static str,
version: u32,
}
pub const REPLAY_CAPSULE_TAG: DomainTag =
DomainTag::declared("replay-capsule", IdentityProfileVersion::declared(2));
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ReplayCapsule {
key: ExecutionKey,
input: Vec<u8>,
fingerprint: Fingerprint,
generation: GenerationProfile,
minimization: MinimizationProfile,
schema: GeneratedSupportSchemaId,
posture: ReplayPosture,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub enum FailureClass {
RefusedByCheck,
PropertyDisagreement,
OracleDisagreement,
SubjectPanic,
BudgetExhausted,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct FindingCause {
family: &'static str,
local: &'static str,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct FindingLocation {
file: &'static str,
line: u32,
}
pub const FOREIGN_TEXT_MAX_BYTES: usize = 4096;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum Truncation {
Complete,
TruncatedAt {
admitted: usize,
offered: usize,
},
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum TextFidelity {
Exact,
LossyReplacement,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct ForeignText {
bytes: Vec<u8>,
truncation: Truncation,
fidelity: TextFidelity,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct TrialFinding {
class: FailureClass,
cause: FindingCause,
located: FindingLocation,
foreign: Option<ForeignText>,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub enum TrialConclusion {
Passed,
Refused(TrialFinding),
}
pub const FINGERPRINT_TAG: DomainTag =
DomainTag::declared("failure-fingerprint", IdentityProfileVersion::declared(1));
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct Fingerprint {
trial: TrialId,
cause: FindingCause,
class: FailureClass,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum SkipReason {
BudgetExhausted,
TargetUnsupported,
PrerequisiteAbsent,
SatisfiedByCachedExecution,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum InfrastructureFault {
GenerationUnavailable,
SupportAbsent,
CaptureFailed,
BackendUnavailable,
BackendInitializationFailed,
BackendExecutionUnresolved,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct InfrastructureFailure {
fault: InfrastructureFault,
foreign: Option<ForeignText>,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub enum RunAttempt {
Executed(TrialConclusion),
SkippedWithReason(SkipReason),
TimedOut,
InfrastructureFailed(InfrastructureFailure),
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct HostTrialRecord {
trial: TrialId,
attempt: RunAttempt,
measurement: MeasurementReading,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct TrialRunStanding {
key: ExecutionKey,
replay: ReplayPosture,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct TrialReport {
standing: TrialRunStanding,
site: TrialSite,
attempt: RunAttempt,
measurement: MeasurementReading,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum NotSelectedReason {
OutsideSelection,
SuiteNotRun,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub enum SelectionDisposition {
Selected(Box<TrialReport>),
NotSelected {
trial: TrialId,
reason: NotSelectedReason,
},
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum Exercise {
Exercised,
Unexercised,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct TrialAccounting {
row: RowRevisionId,
revisions: ExecutionRevisions,
claim: ClaimRef,
disposition: SelectionDisposition,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum EmptySelectionReason {
CarriedOverFromAPreviousRun,
AskingWhatTheWorldHolds,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum SelectionExpectation {
AtLeastOne,
AllowEmpty(EmptySelectionReason),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum SelectionOutcome {
Satisfied,
UnsatisfiedByEmptySelection,
EmptyAsStated(EmptySelectionReason),
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct RunReport {
census: Vec<TrialAccounting>,
posture: TablePosture,
selection: SelectionOutcome,
invocation: InvocationProfile,
target: TargetBinding,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum NoBaselineReason {
NotRecorded,
Unreadable,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Baseline<'previous> {
Previous(&'previous RunReport),
FirstRun,
Unavailable(NoBaselineReason),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum NotComparedReason {
FirstRun,
Unavailable(NoBaselineReason),
PostureMismatch {
left: TablePosture,
right: TablePosture,
},
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum CensusDirection {
Grew,
Unchanged,
Shrank,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct CensusDelta {
before: usize,
after: usize,
direction: CensusDirection,
}
crate::report::declare_change_pair! {
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct RowRevisionChange {
context { trial: TrialId, }
value: RowRevisionId,
}
}
crate::report::declare_change_pair! {
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct ExecutionRevisionChange {
context { trial: TrialId, }
value: ExecutionRevisions,
}
}
crate::report::declare_change_pair! {
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct InvocationProfileChange {
context {}
value: InvocationProfile,
}
}
crate::report::declare_change_pair! {
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct TargetBindingChange {
context {}
value: TargetBinding,
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum OutcomeClass {
Passed,
Refused(FailureClass),
Skipped(SkipReason),
TimedOut,
InfrastructureFailed(InfrastructureFault),
NotSelected(NotSelectedReason),
}
crate::report::declare_change_pair! {
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct ConclusionFlip {
context { trial: TrialId, }
value: OutcomeClass,
}
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct ReportPopulationDiff {
added: Vec<TrialId>,
removed: Vec<TrialId>,
revised: Vec<RowRevisionChange>,
census: CensusDelta,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct ReportExecutionDiff {
revisions: Vec<ExecutionRevisionChange>,
flips: Vec<ConclusionFlip>,
invocation: Option<InvocationProfileChange>,
target: Option<Box<TargetBindingChange>>,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct ReportDiff {
population: ReportPopulationDiff,
execution: ReportExecutionDiff,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum ReportComparison {
Compared(ReportDiff),
NotCompared(NotComparedReason),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum CoverageRefusal {
StagedPosture {
parent: AuthoredTableName,
},
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct ClaimExercise {
claim: ClaimRef,
exercised: usize,
unexercised: usize,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct ClaimCoverage {
entries: Vec<ClaimExercise>,
}