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(())
-    }
-}