diff --git a/meld-cli/src/main.rs b/meld-cli/src/main.rs index 15c080d..90cfb60 100644 --- a/meld-cli/src/main.rs +++ b/meld-cli/src/main.rs @@ -76,6 +76,13 @@ enum Commands { #[arg(long)] no_attestation: bool, + /// Emit a byte-reproducible artifact (#325): derive the attestation + /// id from the output content and take the timestamp from + /// `SOURCE_DATE_EPOCH` (default epoch 0) instead of a random UUID + + /// wall clock, so identical input yields an identical sha256. + #[arg(long)] + reproducible: bool, + /// Disable the `component-provenance` custom section (#192). /// The section maps each fused-module function index back to /// its originating component + function index; downstream @@ -163,6 +170,7 @@ fn main() -> Result<()> { address_rebase, stats, no_attestation, + reproducible, no_component_provenance, dwarf, preserve_names, @@ -178,6 +186,7 @@ fn main() -> Result<()> { address_rebase, stats, no_attestation, + reproducible, no_component_provenance, dwarf, preserve_names, @@ -235,6 +244,7 @@ fn fuse_command( address_rebase: bool, show_stats: bool, no_attestation: bool, + reproducible: bool, no_component_provenance: bool, dwarf: String, preserve_names: bool, @@ -333,6 +343,7 @@ fn fuse_command( let config = FuserConfig { memory_strategy, attestation: !no_attestation, + reproducible, component_provenance: !no_component_provenance, address_rebasing: address_rebase, preserve_names, diff --git a/meld-core/benches/fusion_benchmarks.rs b/meld-core/benches/fusion_benchmarks.rs index b6b42b9..6ecb29c 100644 --- a/meld-core/benches/fusion_benchmarks.rs +++ b/meld-core/benches/fusion_benchmarks.rs @@ -72,6 +72,7 @@ fn bench_config() -> FuserConfig { FuserConfig { memory_strategy: MemoryStrategy::MultiMemory, attestation: false, + reproducible: false, component_provenance: false, address_rebasing: false, preserve_names: false, diff --git a/meld-core/src/attestation.rs b/meld-core/src/attestation.rs index dd32dc5..d53c5a6 100644 --- a/meld-core/src/attestation.rs +++ b/meld-core/src/attestation.rs @@ -123,6 +123,7 @@ pub struct FusionAttestationBuilder { tool_version: String, tool_hash: Option, memory_strategy: String, + reproducible: bool, } impl FusionAttestationBuilder { @@ -134,9 +135,18 @@ impl FusionAttestationBuilder { tool_version: tool_version.into(), tool_hash: None, memory_strategy: "shared".to_string(), + reproducible: false, } } + /// Emit a byte-reproducible attestation (#325): derive the id from the + /// output content and take the timestamp from `SOURCE_DATE_EPOCH` + /// (default epoch 0) instead of a random UUID + wall clock. + pub fn reproducible(mut self, reproducible: bool) -> Self { + self.reproducible = reproducible; + self + } + /// Set the tool hash for reproducibility pub fn tool_hash(mut self, hash: impl Into) -> Self { self.tool_hash = Some(hash.into()); @@ -211,8 +221,16 @@ impl FusionAttestationBuilder { /// Build the attestation pub fn build(self, output_bytes: &[u8], stats: &FusionStats) -> FusionAttestation { let output_hash = compute_sha256(output_bytes); - let timestamp = chrono_timestamp(); - let attestation_id = generate_uuid(); + // #325: reproducible mode derives the id from the output content and + // the timestamp from SOURCE_DATE_EPOCH so the artifact is byte-stable. + let (timestamp, attestation_id) = if self.reproducible { + ( + chrono_timestamp_from(source_date_epoch()), + generate_uuid_from(entropy_from_hex(&output_hash)), + ) + } else { + (chrono_timestamp(), generate_uuid()) + }; let size_reduction = if stats.input_size > 0 { let diff = stats.input_size as i128 - stats.output_size as i128; @@ -328,6 +346,35 @@ pub(crate) fn generate_uuid_from(entropy: u128) -> String { ) } +/// Seconds-since-epoch for a reproducible attestation timestamp (#325). +/// +/// Honors the ecosystem-standard `SOURCE_DATE_EPOCH` environment variable +/// (a decimal seconds-since-Unix-epoch string); when it is unset or +/// unparseable, falls back to `0` (`1970-01-01T00:00:00Z`) so a reproducible +/// build is byte-stable regardless of the wall clock. Only consulted on the +/// `--reproducible` path; normal builds keep the real `chrono_timestamp()`. +pub(crate) fn source_date_epoch() -> u64 { + std::env::var("SOURCE_DATE_EPOCH") + .ok() + .and_then(|s| s.trim().parse::().ok()) + .unwrap_or(0) +} + +/// Derive deterministic UUID entropy from a content hash (#325). +/// +/// Takes the fused output's SHA-256 hex string and folds its first 32 hex +/// digits into a `u128`, so the attestation id is a stable function of the +/// artifact content rather than the wall clock. Short/odd input degrades +/// gracefully to whatever parses (never panics). +pub(crate) fn entropy_from_hex(hash_hex: &str) -> u128 { + let head: String = hash_hex + .chars() + .filter(|c| c.is_ascii_hexdigit()) + .take(32) + .collect(); + u128::from_str_radix(&head, 16).unwrap_or(0) +} + /// Get current timestamp in ISO 8601 format using the system clock. /// /// Thin wrapper over [`chrono_timestamp_from`] sourcing seconds-since-epoch diff --git a/meld-core/src/lib.rs b/meld-core/src/lib.rs index b41f67c..ff2cb12 100644 --- a/meld-core/src/lib.rs +++ b/meld-core/src/lib.rs @@ -84,6 +84,12 @@ pub struct FuserConfig { /// Whether to generate attestation data pub attestation: bool, + /// Whether to emit a byte-reproducible attestation (#325): derive the + /// attestation id from the output content and source the timestamp from + /// `SOURCE_DATE_EPOCH` (default epoch 0) instead of a random UUID + the + /// wall clock, so identical input yields an identical fused artifact. + pub reproducible: bool, + /// Whether to emit the `component-provenance` custom section /// (issue #192). When enabled (the default), every defined /// function in the fused module gets a back-pointer entry @@ -144,6 +150,7 @@ impl Default for FuserConfig { Self { memory_strategy: MemoryStrategy::Auto, attestation: true, + reproducible: false, component_provenance: true, address_rebasing: false, preserve_names: false, @@ -1832,7 +1839,8 @@ impl Fuser { stats: &FusionStats, ) -> attestation::FusionAttestation { let mut builder = FusionAttestationBuilder::new("meld", env!("CARGO_PKG_VERSION")) - .memory_strategy(self.memory_strategy_label()); + .memory_strategy(self.memory_strategy_label()) + .reproducible(self.config.reproducible); for (index, component) in self.components.iter().enumerate() { let name = component @@ -1863,8 +1871,20 @@ impl Fuser { }; let output_hash = attestation::compute_sha256(output_bytes); - let timestamp = attestation::chrono_timestamp(); - let attestation_id = attestation::generate_uuid(); + // #325: in reproducible mode, derive the id from the output content and + // the timestamp from SOURCE_DATE_EPOCH so the fused artifact is + // byte-stable across runs; otherwise keep the wall-clock/random id. + let (timestamp, attestation_id) = if self.config.reproducible { + ( + attestation::chrono_timestamp_from(attestation::source_date_epoch()), + attestation::generate_uuid_from(attestation::entropy_from_hex(&output_hash)), + ) + } else { + ( + attestation::chrono_timestamp(), + attestation::generate_uuid(), + ) + }; let mut inputs = Vec::new(); for (index, component) in self.components.iter().enumerate() { @@ -2822,6 +2842,93 @@ mod tests { } } + /// #325: with `reproducible: true`, the fused artifact is byte-identical + /// across runs — the attestation id is derived from the output content and + /// the timestamp from `SOURCE_DATE_EPOCH` (default epoch 0), so the + /// random-UUID + wall-clock non-determinism is removed. The control + /// (reproducible off) must differ, proving the flag is what fixes it. + /// + /// Scoped to the default build (the shipped configuration). Under the + /// optional `attestation` (wsc) feature the emitted section additionally + /// carries `tool_parameters` / `metadata` as `wsc_attestation` `HashMap` + /// fields, whose serialization order meld cannot control from this side — + /// full byte-reproducibility on that path needs an upstream fix (sorted / + /// BTreeMap serialization). The default `FusionAttestationBuilder` path has + /// no such maps and is fully reproducible. + #[cfg(not(feature = "attestation"))] + #[test] + fn test_reproducible_attestation_is_byte_stable() { + use wasm_encoder::{ + CodeSection, Component, ExportKind, ExportSection, Function, FunctionSection, + Instruction, MemorySection, MemoryType, Module as EncoderModule, ModuleSection, + TypeSection, ValType, + }; + fn build_minimal_component() -> Vec { + let mut types = TypeSection::new(); + types.ty().function([], [ValType::I32]); + let mut functions = FunctionSection::new(); + functions.function(0); + let mut memory = MemorySection::new(); + memory.memory(MemoryType { + minimum: 1, + maximum: None, + memory64: false, + shared: false, + page_size_log2: None, + }); + let mut exports = ExportSection::new(); + exports.export("run", ExportKind::Func, 0); + exports.export("memory", ExportKind::Memory, 0); + let mut code = CodeSection::new(); + let mut func = Function::new([]); + func.instruction(&Instruction::I32Const(42)); + func.instruction(&Instruction::End); + code.function(&func); + let mut module = EncoderModule::new(); + module + .section(&types) + .section(&functions) + .section(&memory) + .section(&exports) + .section(&code); + let mut component = Component::new(); + component.section(&ModuleSection(&module)); + component.finish() + } + let component_bytes = build_minimal_component(); + + let fuse_once = |reproducible: bool| -> Vec { + let config = FuserConfig { + attestation: true, + reproducible, + ..FuserConfig::default() + }; + let mut fuser = Fuser::new(config); + fuser + .add_component(&component_bytes) + .expect("add_component failed"); + fuser.fuse().expect("fuse failed") + }; + + // Reproducible: identical bytes across independent runs. + let a = fuse_once(true); + let b = fuse_once(true); + assert_eq!( + a, b, + "#325: reproducible fusion must be byte-identical across runs" + ); + + // Control: without reproducible, the attestation's random UUID makes + // the output differ — otherwise the flag would be a no-op. + let c = fuse_once(false); + let d = fuse_once(false); + assert_ne!( + c, d, + "#325: non-reproducible fusion is expected to differ (random attestation id); \ + if this ever holds, the reproducible flag is testing nothing" + ); + } + /// SR-20 / SC-8: Fail-fast when a core module (not a component) is passed /// to `add_component()`. /// diff --git a/meld-core/tests/adapter_dwarf_e2e.rs b/meld-core/tests/adapter_dwarf_e2e.rs index 5d9b641..0dbf9e3 100644 --- a/meld-core/tests/adapter_dwarf_e2e.rs +++ b/meld-core/tests/adapter_dwarf_e2e.rs @@ -76,6 +76,7 @@ fn fuse_remap() -> Vec { memory_strategy: MemoryStrategy::MultiMemory, dwarf_handling: DwarfHandling::Remap, attestation: false, + reproducible: false, ..Default::default() }); fuser.add_component_named(&a, Some("a")).unwrap(); diff --git a/meld-core/tests/adapter_safety.rs b/meld-core/tests/adapter_safety.rs index 1b504a7..7c328b9 100644 --- a/meld-core/tests/adapter_safety.rs +++ b/meld-core/tests/adapter_safety.rs @@ -431,6 +431,7 @@ fn test_sr12_adapter_generation_for_string_param() { let config = FuserConfig { memory_strategy: MemoryStrategy::MultiMemory, attestation: false, + reproducible: false, component_provenance: false, address_rebasing: false, preserve_names: false, @@ -819,6 +820,7 @@ fn test_sr13_cabi_realloc_targets_correct_memory() { let config = FuserConfig { memory_strategy: MemoryStrategy::MultiMemory, attestation: false, + reproducible: false, component_provenance: false, address_rebasing: false, preserve_names: false, @@ -1235,6 +1237,7 @@ fn test_sr15_list_copy_length() { let config = FuserConfig { memory_strategy: MemoryStrategy::MultiMemory, attestation: false, + reproducible: false, component_provenance: false, address_rebasing: false, preserve_names: false, @@ -1731,6 +1734,7 @@ fn test_sr16_inner_pointer_fixup_list_string() { let config = FuserConfig { memory_strategy: MemoryStrategy::MultiMemory, attestation: false, + reproducible: false, component_provenance: false, address_rebasing: false, preserve_names: false, @@ -2031,6 +2035,7 @@ fn test_sr17_utf8_to_utf16_string_transcoding() { let config = FuserConfig { memory_strategy: MemoryStrategy::MultiMemory, attestation: false, + reproducible: false, component_provenance: false, address_rebasing: false, preserve_names: false, @@ -2120,6 +2125,7 @@ fn test_sr17_utf8_to_utf16_supplementary_plane_transcoding() { let config = FuserConfig { memory_strategy: MemoryStrategy::MultiMemory, attestation: false, + reproducible: false, component_provenance: false, address_rebasing: false, preserve_names: false, @@ -2645,6 +2651,7 @@ fn test_sr17_utf16_to_utf8_supplementary_plane_transcoding() { let config = FuserConfig { memory_strategy: MemoryStrategy::MultiMemory, attestation: false, + reproducible: false, component_provenance: false, address_rebasing: false, preserve_names: false, @@ -2719,6 +2726,7 @@ fn test_sr17_utf16_to_utf8_lone_high_surrogate_replacement() { let config = FuserConfig { memory_strategy: MemoryStrategy::MultiMemory, attestation: false, + reproducible: false, component_provenance: false, address_rebasing: false, preserve_names: false, @@ -2783,6 +2791,7 @@ fn test_sr17_utf16_to_utf8_midstring_lone_surrogate_replacement() { let config = FuserConfig { memory_strategy: MemoryStrategy::MultiMemory, attestation: false, + reproducible: false, component_provenance: false, address_rebasing: false, preserve_names: false, @@ -2872,6 +2881,7 @@ fn test_sr17_utf16_to_utf8_malformed_surrogate_matrix() { let config = FuserConfig { memory_strategy: MemoryStrategy::MultiMemory, attestation: false, + reproducible: false, component_provenance: false, address_rebasing: false, preserve_names: false, @@ -3007,6 +3017,7 @@ fn ls_p_20_test_sr17_utf8_to_utf16_malformed_matrix() { let config = FuserConfig { memory_strategy: MemoryStrategy::MultiMemory, attestation: false, + reproducible: false, component_provenance: false, address_rebasing: false, preserve_names: false, @@ -3082,6 +3093,7 @@ fn test_sr17_latin1_to_utf16_transcoding() { let config = FuserConfig { memory_strategy: MemoryStrategy::MultiMemory, attestation: false, + reproducible: false, component_provenance: false, address_rebasing: false, preserve_names: false, @@ -3565,6 +3577,7 @@ fn fuse_run_i32(caller: &[u8], callee: &[u8], label: &str) -> i32 { let config = FuserConfig { memory_strategy: MemoryStrategy::MultiMemory, attestation: false, + reproducible: false, component_provenance: false, address_rebasing: false, preserve_names: false, diff --git a/meld-core/tests/component_provenance.rs b/meld-core/tests/component_provenance.rs index 39b696e..70f9f0e 100644 --- a/meld-core/tests/component_provenance.rs +++ b/meld-core/tests/component_provenance.rs @@ -316,6 +316,7 @@ fn opt_out_via_config_drops_the_section() { let mut fuser = Fuser::new(FuserConfig { memory_strategy: MemoryStrategy::MultiMemory, attestation: false, + reproducible: false, component_provenance: false, address_rebasing: false, preserve_names: false, diff --git a/meld-core/tests/cross_component_call.rs b/meld-core/tests/cross_component_call.rs index f5e8746..4501547 100644 --- a/meld-core/tests/cross_component_call.rs +++ b/meld-core/tests/cross_component_call.rs @@ -120,6 +120,7 @@ fn test_cross_module_call() { let config = FuserConfig { memory_strategy: MemoryStrategy::SharedMemory, attestation: false, + reproducible: false, component_provenance: false, ..Default::default() }; @@ -170,6 +171,7 @@ fn test_304_identity_direct_adapter_is_inlined() { let mut fuser = Fuser::new(FuserConfig { attestation: false, + reproducible: false, component_provenance: false, ..Default::default() }); @@ -201,6 +203,7 @@ fn test_cross_module_call_with_different_args() { let config = FuserConfig { memory_strategy: MemoryStrategy::SharedMemory, attestation: false, + reproducible: false, component_provenance: false, ..Default::default() }; @@ -346,6 +349,7 @@ fn test_unresolved_import_index_offset() { let config = FuserConfig { memory_strategy: MemoryStrategy::MultiMemory, attestation: false, + reproducible: false, component_provenance: false, ..Default::default() }; diff --git a/meld-core/tests/dwarf_passthrough.rs b/meld-core/tests/dwarf_passthrough.rs index 0a1c3e0..c258890 100644 --- a/meld-core/tests/dwarf_passthrough.rs +++ b/meld-core/tests/dwarf_passthrough.rs @@ -165,6 +165,7 @@ fn fuse_passthrough(input: &[u8]) -> Vec { let mut fuser = Fuser::new(FuserConfig { memory_strategy: MemoryStrategy::MultiMemory, attestation: false, + reproducible: false, component_provenance: false, address_rebasing: false, preserve_names: false, @@ -188,6 +189,7 @@ fn fuse_remap(input: &[u8]) -> Vec { let mut fuser = Fuser::new(FuserConfig { memory_strategy: MemoryStrategy::MultiMemory, attestation: false, + reproducible: false, component_provenance: false, address_rebasing: false, preserve_names: false, @@ -206,6 +208,7 @@ fn fuse_with_drop(input: &[u8]) -> Vec { let mut fuser = Fuser::new(FuserConfig { memory_strategy: MemoryStrategy::MultiMemory, attestation: false, + reproducible: false, component_provenance: false, address_rebasing: false, preserve_names: false, diff --git a/meld-core/tests/dwarf_remap_witness.rs b/meld-core/tests/dwarf_remap_witness.rs index 9f75ece..e1b1e56 100644 --- a/meld-core/tests/dwarf_remap_witness.rs +++ b/meld-core/tests/dwarf_remap_witness.rs @@ -51,6 +51,7 @@ fn fuse_remap(input: &[u8]) -> Vec { let mut fuser = Fuser::new(FuserConfig { memory_strategy: MemoryStrategy::MultiMemory, attestation: false, + reproducible: false, component_provenance: true, address_rebasing: false, preserve_names: false, diff --git a/meld-core/tests/golden_e2e.rs b/meld-core/tests/golden_e2e.rs index 7470752..c563678 100644 --- a/meld-core/tests/golden_e2e.rs +++ b/meld-core/tests/golden_e2e.rs @@ -188,6 +188,7 @@ fn fuse_many( let config = FuserConfig { memory_strategy, attestation: false, + reproducible: false, component_provenance: false, address_rebasing, preserve_names: false, diff --git a/meld-core/tests/issue_112_mythos_v04.rs b/meld-core/tests/issue_112_mythos_v04.rs index bf0413f..93107e6 100644 --- a/meld-core/tests/issue_112_mythos_v04.rs +++ b/meld-core/tests/issue_112_mythos_v04.rs @@ -175,6 +175,7 @@ fn fuse_config() -> FuserConfig { memory_strategy: MemoryStrategy::MultiMemory, output_format: OutputFormat::CoreModule, attestation: false, + reproducible: false, component_provenance: false, address_rebasing: false, preserve_names: false, diff --git a/meld-core/tests/multi_memory.rs b/meld-core/tests/multi_memory.rs index 80aa78e..cfdd106 100644 --- a/meld-core/tests/multi_memory.rs +++ b/meld-core/tests/multi_memory.rs @@ -206,6 +206,7 @@ fn test_multi_memory_separate_memories() { let config = FuserConfig { memory_strategy: MemoryStrategy::MultiMemory, attestation: false, + reproducible: false, component_provenance: false, address_rebasing: false, preserve_names: false, @@ -259,6 +260,7 @@ fn test_multi_memory_preserves_isolation() { let config = FuserConfig { memory_strategy: MemoryStrategy::MultiMemory, attestation: false, + reproducible: false, component_provenance: false, address_rebasing: false, preserve_names: false, @@ -333,6 +335,7 @@ fn test_multi_memory_preserves_isolation_three_components() { let config = FuserConfig { memory_strategy: MemoryStrategy::MultiMemory, attestation: false, + reproducible: false, component_provenance: false, address_rebasing: false, preserve_names: false, diff --git a/meld-core/tests/nested_component.rs b/meld-core/tests/nested_component.rs index 4c63ffa..95db3fa 100644 --- a/meld-core/tests/nested_component.rs +++ b/meld-core/tests/nested_component.rs @@ -64,6 +64,7 @@ fn test_fuse_composed_p2_component() { let config = FuserConfig { memory_strategy: MemoryStrategy::MultiMemory, attestation: false, + reproducible: false, component_provenance: false, address_rebasing: false, preserve_names: false, diff --git a/meld-core/tests/p3_bridge_runtime.rs b/meld-core/tests/p3_bridge_runtime.rs index 4be0ffb..ca107ad 100644 --- a/meld-core/tests/p3_bridge_runtime.rs +++ b/meld-core/tests/p3_bridge_runtime.rs @@ -333,6 +333,7 @@ fn fuse_pair() -> Vec { let config = FuserConfig { memory_strategy: MemoryStrategy::MultiMemory, attestation: false, + reproducible: false, component_provenance: false, address_rebasing: false, preserve_names: false, diff --git a/meld-core/tests/realloc_safety.rs b/meld-core/tests/realloc_safety.rs index d40fe4c..75912dd 100644 --- a/meld-core/tests/realloc_safety.rs +++ b/meld-core/tests/realloc_safety.rs @@ -504,6 +504,7 @@ fn ls_a_7_every_realloc_call_has_null_guard() { let config = FuserConfig { memory_strategy: MemoryStrategy::MultiMemory, attestation: false, + reproducible: false, component_provenance: false, address_rebasing: false, preserve_names: false, diff --git a/meld-core/tests/release_components.rs b/meld-core/tests/release_components.rs index 7db7553..7e04b5f 100644 --- a/meld-core/tests/release_components.rs +++ b/meld-core/tests/release_components.rs @@ -69,6 +69,7 @@ fn try_fuse(path: &str, name: &str) -> (bool, usize, String) { let config = FuserConfig { memory_strategy: MemoryStrategy::MultiMemory, attestation: false, + reproducible: false, component_provenance: false, address_rebasing: false, preserve_names: false, @@ -229,6 +230,7 @@ fn test_fused_output_validates() { let config = FuserConfig { memory_strategy: MemoryStrategy::MultiMemory, attestation: false, + reproducible: false, component_provenance: false, address_rebasing: false, preserve_names: false, @@ -323,6 +325,7 @@ fn test_p1_adapter_detection_with_instances() { let config = FuserConfig { memory_strategy: MemoryStrategy::MultiMemory, attestation: false, + reproducible: false, component_provenance: false, address_rebasing: false, preserve_names: false, @@ -405,6 +408,7 @@ fn test_reasonable_memory_count() { let config = FuserConfig { memory_strategy: MemoryStrategy::MultiMemory, attestation: false, + reproducible: false, component_provenance: false, address_rebasing: false, preserve_names: false, @@ -493,6 +497,7 @@ fn test_write_fused_output_for_runtime() { let config = FuserConfig { memory_strategy: MemoryStrategy::MultiMemory, attestation: false, + reproducible: false, component_provenance: false, address_rebasing: false, preserve_names: true, @@ -560,6 +565,7 @@ fn test_no_duplicate_imports() { let config = FuserConfig { memory_strategy: MemoryStrategy::MultiMemory, attestation: false, + reproducible: false, component_provenance: false, address_rebasing: false, preserve_names: false, @@ -646,6 +652,7 @@ fn test_adapter_generation_for_release_components() { let config = FuserConfig { memory_strategy: MemoryStrategy::MultiMemory, attestation: false, + reproducible: false, component_provenance: false, address_rebasing: false, preserve_names: false, @@ -715,6 +722,7 @@ fn test_adapter_call_site_wiring() { let config = FuserConfig { memory_strategy: MemoryStrategy::MultiMemory, attestation: false, + reproducible: false, component_provenance: false, address_rebasing: false, preserve_names: false, @@ -868,6 +876,7 @@ fn test_no_stale_resource_drop_versions() { let config = FuserConfig { memory_strategy: MemoryStrategy::MultiMemory, attestation: false, + reproducible: false, component_provenance: false, address_rebasing: false, preserve_names: false, @@ -954,6 +963,7 @@ fn test_component_wrap_validates() { let config = FuserConfig { memory_strategy: MemoryStrategy::MultiMemory, attestation: false, + reproducible: false, component_provenance: false, address_rebasing: false, preserve_names: false, diff --git a/meld-core/tests/runtime_from_exports.rs b/meld-core/tests/runtime_from_exports.rs index 6780e23..e3b3135 100644 --- a/meld-core/tests/runtime_from_exports.rs +++ b/meld-core/tests/runtime_from_exports.rs @@ -128,6 +128,7 @@ fn test_from_exports_resolution_runtime() { let config = FuserConfig { memory_strategy: MemoryStrategy::MultiMemory, attestation: false, + reproducible: false, component_provenance: false, address_rebasing: false, preserve_names: false, @@ -180,6 +181,7 @@ fn test_from_exports_shared_memory_strategy() { let config = FuserConfig { memory_strategy: MemoryStrategy::SharedMemory, attestation: false, + reproducible: false, component_provenance: false, address_rebasing: false, preserve_names: false, @@ -232,6 +234,7 @@ fn test_from_exports_function_count() { let config = FuserConfig { memory_strategy: MemoryStrategy::MultiMemory, attestation: false, + reproducible: false, component_provenance: false, address_rebasing: false, preserve_names: false, diff --git a/meld-core/tests/runtime_intra_adapter.rs b/meld-core/tests/runtime_intra_adapter.rs index a74ef54..c471706 100644 --- a/meld-core/tests/runtime_intra_adapter.rs +++ b/meld-core/tests/runtime_intra_adapter.rs @@ -209,6 +209,7 @@ fn test_intra_component_three_module_fusion() { let config = FuserConfig { memory_strategy: MemoryStrategy::MultiMemory, attestation: false, + reproducible: false, component_provenance: false, address_rebasing: false, preserve_names: false, @@ -263,6 +264,7 @@ fn test_intra_component_memory_count() { let config = FuserConfig { memory_strategy: MemoryStrategy::MultiMemory, attestation: false, + reproducible: false, component_provenance: false, address_rebasing: false, preserve_names: false, diff --git a/meld-core/tests/segidx_remap.rs b/meld-core/tests/segidx_remap.rs index 696b54f..94c6d99 100644 --- a/meld-core/tests/segidx_remap.rs +++ b/meld-core/tests/segidx_remap.rs @@ -46,6 +46,7 @@ fn fuser_config() -> FuserConfig { FuserConfig { memory_strategy: MemoryStrategy::MultiMemory, attestation: false, + reproducible: false, component_provenance: false, address_rebasing: false, preserve_names: false, diff --git a/meld-core/tests/wit_bindgen_runtime.rs b/meld-core/tests/wit_bindgen_runtime.rs index 33464b0..b80b36b 100644 --- a/meld-core/tests/wit_bindgen_runtime.rs +++ b/meld-core/tests/wit_bindgen_runtime.rs @@ -58,6 +58,7 @@ fn fuse_fixture(name: &str, output_format: OutputFormat) -> anyhow::Result