From b351345db932eef28263e95463b68ad35e9cb94a Mon Sep 17 00:00:00 2001 From: Jonathan Kelley Date: Fri, 30 Dec 2022 14:45:45 -0500 Subject: [PATCH] chore: use miri on native-core too --- .github/workflows/miri.yml | 21 +++- packages/native-core/Cargo.toml | 4 +- packages/native-core/tests/miri_native.rs | 146 ++++++++++++++++++++++ 3 files changed, 167 insertions(+), 4 deletions(-) create mode 100644 packages/native-core/tests/miri_native.rs diff --git a/.github/workflows/miri.yml b/.github/workflows/miri.yml index d1bba9964..ac6482b29 100644 --- a/.github/workflows/miri.yml +++ b/.github/workflows/miri.yml @@ -1,4 +1,4 @@ -name: CI +name: Miri Tests on: push: @@ -25,11 +25,25 @@ jobs: fail-fast: false matrix: include: - - os: windows-latest - host_target: i686-pc-windows-msvc + - os: ubuntu-latest + host_target: x86_64-unknown-linux-gnu + # - os: macos-latest + # host_target: x86_64-apple-darwin + # - os: windows-latest + # host_target: i686-pc-windows-msvc + # - os: windows-latest + # host_target: i686-pc-windows-msvc + # - os: windows-latest + # host_target: i686-pc-windows-msvc + # - os: windows-latest + # host_target: i686-pc-windows-msvc steps: - uses: actions/checkout@v3 + - name: Set the tag GC interval to 1 on linux + if: runner.os == 'Linux' + run: echo "MIRIFLAGS=-Zmiri-tag-gc=1" >> $GITHUB_ENV + # Cache the global cargo directory, but NOT the local `target` directory which # we cannot reuse anyway when the nightly changes (and it grows quite large # over time). @@ -70,3 +84,4 @@ jobs: - name: Test run: | MIRIFLAGS="-Zmiri-disable-isolation -Zmiri-ignore-leaks" cargo +nightly miri test --package dioxus-core --test miri_stress -- --exact --nocapture + MIRIFLAGS="-Zmiri-disable-isolation -Zmiri-ignore-leaks" cargo +nightly miri test --package dioxus-native-core --test miri_native -- --exact --nocapture diff --git a/packages/native-core/Cargo.toml b/packages/native-core/Cargo.toml index 309fba781..2c09ecf4c 100644 --- a/packages/native-core/Cargo.toml +++ b/packages/native-core/Cargo.toml @@ -26,4 +26,6 @@ dashmap = "5.4.0" [dev-dependencies] rand = "0.8.5" -dioxus = { path = "../dioxus", version = "^0.2.1" } \ No newline at end of file +dioxus = { path = "../dioxus", version = "^0.2.1" } +dioxus-native-core-macro = { path = "../native-core-macro" } +tokio = { version = "*", features = ["full"] } diff --git a/packages/native-core/tests/miri_native.rs b/packages/native-core/tests/miri_native.rs new file mode 100644 index 000000000..5823fb5a1 --- /dev/null +++ b/packages/native-core/tests/miri_native.rs @@ -0,0 +1,146 @@ +use dioxus::prelude::*; +use dioxus_native_core::*; +use dioxus_native_core::{ + node_ref::{AttributeMask, NodeView}, + real_dom::RealDom, + state::{ParentDepState, State}, + NodeMask, SendAnyMap, +}; +use dioxus_native_core_macro::{sorted_str_slice, State}; +use std::{ + sync::{Arc, Mutex}, + time::Duration, +}; +use tokio::time::sleep; + +#[derive(Debug, Clone, PartialEq, Default)] +pub struct BlablaState {} + +/// Font style are inherited by default if not specified otherwise by some of the supported attributes. +impl ParentDepState for BlablaState { + type Ctx = (); + type DepState = (Self,); + + const NODE_MASK: NodeMask = + NodeMask::new_with_attrs(AttributeMask::Static(&sorted_str_slice!(["blabla",]))); + + fn reduce<'a>( + &mut self, + _node: NodeView, + _parent: Option<(&'a Self,)>, + _ctx: &Self::Ctx, + ) -> bool { + false + } +} + +#[derive(Clone, State, Default, Debug)] +pub struct NodeState { + #[parent_dep_state(blabla)] + blabla: BlablaState, +} + +mod dioxus_elements { + macro_rules! builder_constructors { + ( + $( + $(#[$attr:meta])* + $name:ident { + $( + $(#[$attr_method:meta])* + $fil:ident: $vil:ident, + )* + }; + )* + ) => { + $( + #[allow(non_camel_case_types)] + $(#[$attr])* + pub struct $name; + + impl $name { + pub const TAG_NAME: &'static str = stringify!($name); + pub const NAME_SPACE: Option<&'static str> = None; + + $( + pub const $fil: (&'static str, Option<&'static str>, bool) = (stringify!($fil), None, false); + )* + } + + impl GlobalAttributes for $name {} + )* + } + } + + pub trait GlobalAttributes {} + + pub trait SvgAttributes {} + + builder_constructors! { + blabla { + + }; + } +} + +#[test] +fn native_core_is_okay() { + use std::time::Duration; + + fn app(cx: Scope) -> Element { + let colors = use_state(&cx, || vec!["green", "blue", "red"]); + let padding = use_state(&cx, || 10); + + use_effect(&cx, colors, |colors| async move { + sleep(Duration::from_millis(1000)).await; + colors.with_mut(|colors| colors.reverse()); + }); + + use_effect(&cx, padding, |padding| async move { + sleep(Duration::from_millis(10)).await; + padding.with_mut(|padding| { + if *padding < 65 { + *padding += 1; + } else { + *padding = 5; + } + }); + }); + + let big = colors[0]; + let mid = colors[1]; + let small = colors[2]; + + cx.render(rsx! { + blabla {} + }) + } + + let rt = tokio::runtime::Builder::new_current_thread() + .enable_time() + .build() + .unwrap(); + + rt.block_on(async { + let rdom = Arc::new(Mutex::new(RealDom::::new())); + let mut dom = VirtualDom::new(app); + + let muts = dom.rebuild(); + let (to_update, _diff) = rdom.lock().unwrap().apply_mutations(muts); + + let ctx = SendAnyMap::new(); + let ctx = SendAnyMap::new(); + rdom.lock().unwrap().update_state(to_update, ctx); + + for x in 0..10 { + dom.wait_for_work().await; + + let mutations = dom.render_immediate(); + let (to_update, _diff) = rdom.lock().unwrap().apply_mutations(mutations); + + let ctx = SendAnyMap::new(); + let ctx = SendAnyMap::new(); + rdom.lock().unwrap().update_state(to_update, ctx); + } + }); +}