tests: For real move tests into seperate creates to avoid cyclic deps
Change-Id: Iee440cd8a462b601ae7a23552238d71945b137f8
Reviewed-on: https://pigweed-review.googlesource.com/c/pigweed/maize/+/259375
Commit-Queue: Erik Gilling <konkers@google.com>
Lint: Lint 🤖 <android-build-ayeaye@system.gserviceaccount.com>
Reviewed-by: Travis Geiselbrecht <travisg@google.com>
diff --git a/kernel/sync/BUILD.bazel b/kernel/sync/BUILD.bazel
index f07f0a1..bed7740 100644
--- a/kernel/sync/BUILD.bazel
+++ b/kernel/sync/BUILD.bazel
@@ -28,10 +28,11 @@
rust_test(
name = "spinlock_test",
- crate = ":spinlock",
+ srcs = ["tests/spinlock_test.rs"],
use_libtest_harness = False,
visibility = ["//visibility:public"],
deps = [
+ ":spinlock",
"//lib/unittest",
"//target:linker_script",
],
diff --git a/kernel/sync/spinlock.rs b/kernel/sync/spinlock.rs
index 7e30ae9..cbbcf30 100644
--- a/kernel/sync/spinlock.rs
+++ b/kernel/sync/spinlock.rs
@@ -13,7 +13,6 @@
// the License.
#![no_std]
-#![cfg_attr(test, no_main)]
use core::cell::UnsafeCell;
use core::ops::{Deref, DerefMut};
@@ -68,39 +67,3 @@
}
}
}
-
-#[cfg(test)]
-mod tests {
- use super::*;
- use unittest::test;
-
- #[test]
- fn bare_try_lock_returns_correct_value() -> unittest::Result<()> {
- let lock = BareSpinLock::new();
-
- {
- let _sentinel = lock.lock();
- unittest::assert_true!(lock.try_lock().is_none());
- }
-
- unittest::assert_true!(lock.try_lock().is_some());
-
- Ok(())
- }
-
- #[test]
- fn try_lock_returns_correct_value() -> unittest::Result<()> {
- let lock = SpinLock::new(false);
-
- {
- let mut guard = lock.lock();
- *guard = true;
- unittest::assert_true!(lock.try_lock().is_none());
- }
-
- let guard = lock.lock();
- unittest::assert_true!(*guard);
-
- Ok(())
- }
-}
diff --git a/lib/list/BUILD.bazel b/lib/list/BUILD.bazel
index 4748110..0a99c8e 100644
--- a/lib/list/BUILD.bazel
+++ b/lib/list/BUILD.bazel
@@ -23,9 +23,10 @@
rust_test(
name = "list_test",
- crate = ":list",
+ srcs = ["tests/list_test.rs"],
use_libtest_harness = False,
deps = [
+ ":list",
"//lib/unittest",
"//target:linker_script",
],
diff --git a/lib/list/list.rs b/lib/list/list.rs
index 9e7be6f..93578d5 100644
--- a/lib/list/list.rs
+++ b/lib/list/list.rs
@@ -203,8 +203,11 @@
/// unlinks element from the linked list.
///
- /// Precondition: element is in the link list.
- unsafe fn unlink_element(&mut self, element: &T) {
+ /// # Safety
+ /// It is up to the caller to ensure exclusive access to the list and its
+ /// members.
+ /// It is up to the caller to ensure the element is in the list
+ pub unsafe fn unlink_element(&mut self, element: &T) {
let element_ptr = Self::get_link_ptr(element);
let prev = (*element_ptr.as_ptr()).get_prev();
@@ -287,271 +290,3 @@
Self::new()
}
}
-
-#[cfg(test)]
-mod tests {
- use core::mem::offset_of;
-
- use super::*;
- use unittest::test;
-
- struct TestMember {
- value: u32,
- link: Link,
- }
-
- struct TestAdapter {}
- impl Adapter for TestAdapter {
- const LINK_OFFSET: usize = offset_of!(TestMember, link);
- }
-
- unsafe fn validate_list(
- list: &UnsafeList<TestMember, TestAdapter>,
- expected_values: &[u32],
- ) -> unittest::Result<()> {
- let mut index = 0;
- list.for_each(|element| {
- unittest::assert_eq!(element.value, expected_values[index]);
- index += 1;
- Ok(())
- })?;
-
- unittest::assert_eq!(index, expected_values.len());
- Ok(())
- }
-
- #[test]
- fn new_link_is_not_linked() -> unittest::Result<()> {
- let link = Link::new();
- unittest::assert_false!(link.is_linked());
- unittest::assert_true!(link.is_unlinked());
- Ok(())
- }
-
- #[test]
- fn new_list_is_empty() -> unittest::Result<()> {
- let list = UnsafeList::<TestMember, TestAdapter>::new();
- unittest::assert_true!(unsafe { list.is_empty() });
- Ok(())
- }
-
- #[test]
- fn push_front_adds_in_correct_order() -> unittest::Result<()> {
- let mut element1 = TestMember {
- value: 1,
- link: Link::new(),
- };
- let mut element2 = TestMember {
- value: 2,
- link: Link::new(),
- };
-
- let mut list = UnsafeList::<TestMember, TestAdapter>::new();
- unsafe { list.push_front_unchecked(&mut element2) };
- unsafe { list.push_front_unchecked(&mut element1) };
-
- unittest::assert_false!(unsafe { list.is_empty() });
-
- unsafe { validate_list(&list, &[1, 2]) }
- }
-
- #[test]
- fn unlink_removes_head_correctly() -> unittest::Result<()> {
- let mut element1 = TestMember {
- value: 1,
- link: Link::new(),
- };
- let mut element2 = TestMember {
- value: 2,
- link: Link::new(),
- };
- let mut element3 = TestMember {
- value: 3,
- link: Link::new(),
- };
-
- let mut list = UnsafeList::<TestMember, TestAdapter>::new();
- unsafe { list.push_front_unchecked(&mut element3) };
- unsafe { list.push_front_unchecked(&mut element2) };
- unsafe { list.push_front_unchecked(&mut element1) };
-
- unsafe { list.unlink_element(&element1) };
-
- unsafe { validate_list(&list, &[2, 3]) }
- }
-
- #[test]
- fn unlink_removes_tail_correctly() -> unittest::Result<()> {
- let mut element1 = TestMember {
- value: 1,
- link: Link::new(),
- };
- let mut element2 = TestMember {
- value: 2,
- link: Link::new(),
- };
- let mut element3 = TestMember {
- value: 3,
- link: Link::new(),
- };
-
- let mut list = UnsafeList::<TestMember, TestAdapter>::new();
- unsafe { list.push_front_unchecked(&mut element3) };
- unsafe { list.push_front_unchecked(&mut element2) };
- unsafe { list.push_front_unchecked(&mut element1) };
-
- unsafe { list.unlink_element(&element3) };
-
- unsafe { validate_list(&list, &[1, 2]) }
- }
-
- #[test]
- fn unlink_removes_middle_correctly() -> unittest::Result<()> {
- let mut element1 = TestMember {
- value: 1,
- link: Link::new(),
- };
- let mut element2 = TestMember {
- value: 2,
- link: Link::new(),
- };
- let mut element3 = TestMember {
- value: 3,
- link: Link::new(),
- };
-
- let mut list = UnsafeList::<TestMember, TestAdapter>::new();
- unsafe { list.push_front_unchecked(&mut element3) };
- unsafe { list.push_front_unchecked(&mut element2) };
- unsafe { list.push_front_unchecked(&mut element1) };
-
- unsafe { list.unlink_element(&element2) };
-
- unsafe { validate_list(&list, &[1, 3]) }
- }
-
- #[test]
- fn filter_removes_nothing_correctly() -> unittest::Result<()> {
- let mut element1 = TestMember {
- value: 1,
- link: Link::new(),
- };
- let mut element2 = TestMember {
- value: 2,
- link: Link::new(),
- };
- let mut element3 = TestMember {
- value: 3,
- link: Link::new(),
- };
-
- let mut list = UnsafeList::<TestMember, TestAdapter>::new();
- unsafe { list.push_front_unchecked(&mut element3) };
- unsafe { list.push_front_unchecked(&mut element2) };
- unsafe { list.push_front_unchecked(&mut element1) };
-
- unsafe { list.filter(|_| true) };
-
- unsafe { validate_list(&list, &[1, 2, 3]) }
- }
-
- #[test]
- fn filter_removes_everything_correctly() -> unittest::Result<()> {
- let mut element1 = TestMember {
- value: 1,
- link: Link::new(),
- };
- let mut element2 = TestMember {
- value: 2,
- link: Link::new(),
- };
- let mut element3 = TestMember {
- value: 3,
- link: Link::new(),
- };
-
- let mut list = UnsafeList::<TestMember, TestAdapter>::new();
- unsafe { list.push_front_unchecked(&mut element3) };
- unsafe { list.push_front_unchecked(&mut element2) };
- unsafe { list.push_front_unchecked(&mut element1) };
-
- unsafe { list.filter(|_| false) };
-
- unsafe { validate_list(&list, &[]) }
- }
-
- #[test]
- fn filter_removes_head_correctly() -> unittest::Result<()> {
- let mut element1 = TestMember {
- value: 1,
- link: Link::new(),
- };
- let mut element2 = TestMember {
- value: 2,
- link: Link::new(),
- };
- let mut element3 = TestMember {
- value: 3,
- link: Link::new(),
- };
-
- let mut list = UnsafeList::<TestMember, TestAdapter>::new();
- unsafe { list.push_front_unchecked(&mut element3) };
- unsafe { list.push_front_unchecked(&mut element2) };
- unsafe { list.push_front_unchecked(&mut element1) };
-
- unsafe { list.filter(|element| element.value != 1) };
-
- unsafe { validate_list(&list, &[2, 3]) }
- }
-
- #[test]
- fn filter_removes_middle_correctly() -> unittest::Result<()> {
- let mut element1 = TestMember {
- value: 1,
- link: Link::new(),
- };
- let mut element2 = TestMember {
- value: 2,
- link: Link::new(),
- };
- let mut element3 = TestMember {
- value: 3,
- link: Link::new(),
- };
-
- let mut list = UnsafeList::<TestMember, TestAdapter>::new();
- unsafe { list.push_front_unchecked(&mut element3) };
- unsafe { list.push_front_unchecked(&mut element2) };
- unsafe { list.push_front_unchecked(&mut element1) };
-
- unsafe { list.filter(|element| element.value != 2) };
-
- unsafe { validate_list(&list, &[1, 3]) }
- }
-
- #[test]
- fn filter_removes_tail_correctly() -> unittest::Result<()> {
- let mut element1 = TestMember {
- value: 1,
- link: Link::new(),
- };
- let mut element2 = TestMember {
- value: 2,
- link: Link::new(),
- };
- let mut element3 = TestMember {
- value: 3,
- link: Link::new(),
- };
-
- let mut list = UnsafeList::<TestMember, TestAdapter>::new();
- unsafe { list.push_front_unchecked(&mut element3) };
- unsafe { list.push_front_unchecked(&mut element2) };
- unsafe { list.push_front_unchecked(&mut element1) };
-
- unsafe { list.filter(|element| element.value != 3) };
-
- unsafe { validate_list(&list, &[1, 2]) }
- }
-}
diff --git a/lib/unittest/BUILD.bazel b/lib/unittest/BUILD.bazel
index 3f15abf..e9f4183 100644
--- a/lib/unittest/BUILD.bazel
+++ b/lib/unittest/BUILD.bazel
@@ -97,11 +97,12 @@
rust_test(
name = "unittest_test_test",
- crate = ":unittest_test",
+ srcs = ["tests/unittest_test_test.rs"],
use_libtest_harness = False,
visibility = ["//visibility:public"],
deps = [
":unittest",
+ ":unittest_test",
"//target:linker_script",
"@pigweed//pw_log/rust:pw_log",
"@rust_crates//:cortex-m-rt",
diff --git a/lib/unittest/unittest.rs b/lib/unittest/unittest.rs
index 2aaa9da..1ea9d5f 100644
--- a/lib/unittest/unittest.rs
+++ b/lib/unittest/unittest.rs
@@ -1,4 +1,19 @@
+// Copyright 2025 The Pigweed Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License"); you may not
+// use this file except in compliance with the License. You may obtain a copy of
+// the License at
+//
+// https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+// License for the specific language governing permissions and limitations under
+// the License.
+
#![no_std]
+
pub use unittest_core::*;
pub use unittest_proc_macro::*;
pub use unittest_runner::*;
diff --git a/lib/unittest/unittest_core.rs b/lib/unittest/unittest_core.rs
index 82415cc..ed22e28 100644
--- a/lib/unittest/unittest_core.rs
+++ b/lib/unittest/unittest_core.rs
@@ -1,3 +1,17 @@
+// Copyright 2025 The Pigweed Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License"); you may not
+// use this file except in compliance with the License. You may obtain a copy of
+// the License at
+//
+// https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+// License for the specific language governing permissions and limitations under
+// the License.
+
#![no_std]
use core::ptr::addr_of_mut;
diff --git a/lib/unittest/unittest_proc_macro.rs b/lib/unittest/unittest_proc_macro.rs
index a2ac9ea..bc838a8 100644
--- a/lib/unittest/unittest_proc_macro.rs
+++ b/lib/unittest/unittest_proc_macro.rs
@@ -1,3 +1,17 @@
+// Copyright 2025 The Pigweed Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License"); you may not
+// use this file except in compliance with the License. You may obtain a copy of
+// the License at
+//
+// https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+// License for the specific language governing permissions and limitations under
+// the License.
+
use proc_macro::TokenStream;
use quote::{format_ident, quote};
use syn::{parse_macro_input, ItemFn};
diff --git a/lib/unittest/unittest_test.rs b/lib/unittest/unittest_test.rs
index 9d83535..f78c778 100644
--- a/lib/unittest/unittest_test.rs
+++ b/lib/unittest/unittest_test.rs
@@ -1,18 +1,19 @@
+// Copyright 2025 The Pigweed Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License"); you may not
+// use this file except in compliance with the License. You may obtain a copy of
+// the License at
+//
+// https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+// License for the specific language governing permissions and limitations under
+// the License.
+
#![no_std]
-#![cfg_attr(test, no_main)]
pub fn add(a: u32, b: u32) -> u32 {
a + b
}
-
-#[cfg(test)]
-mod tests {
- use super::*;
- use unittest::test;
-
- #[test]
- fn test_add() -> unittest::Result<()> {
- unittest::assert_eq!(add(1, 2), 3);
- Ok(())
- }
-}