dbcn.rs 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. //! Debug console extension test suite.
  2. use sbi::SbiRet;
  3. use sbi_spec::binary::Physical;
  4. /// Debug console extension test cases.
  5. #[derive(Clone, Debug)]
  6. pub enum Case {
  7. /// Can't proceed test for debug console extension does not exist.
  8. NotExist,
  9. /// Test begin.
  10. Begin,
  11. /// Test process for write a byte to console.
  12. WriteByte,
  13. /// Test failed for can't write byte.
  14. WritingByteFailed(SbiRet),
  15. /// Test process for write complete slice.
  16. WriteSlice,
  17. /// Test process for write partial slice.
  18. WritingPartialSlice(usize),
  19. /// Test failed for can't write slice.
  20. WritingSliceFailed(SbiRet),
  21. /// Test process for read some bytes from console.
  22. Read(usize),
  23. /// Test failed for can't read to buffer.
  24. ReadingFailed(SbiRet),
  25. /// All test cases on debug console extension has passed.
  26. Pass,
  27. }
  28. /// Test debug console extension.
  29. pub fn test(mut f: impl FnMut(Case)) {
  30. if sbi::probe_extension(sbi::Console).is_unavailable() {
  31. f(Case::NotExist);
  32. return;
  33. }
  34. f(Case::Begin);
  35. let ret = sbi::console_write_byte(b'H');
  36. if ret.is_ok() {
  37. f(Case::WriteByte);
  38. } else {
  39. f(Case::WritingByteFailed(ret));
  40. }
  41. let words = b"ello, world!\r\n";
  42. let ret = sbi::console_write(Physical::new(words.len(), words.as_ptr() as _, 0));
  43. if let Some(len) = ret.ok() {
  44. f(if len == words.len() {
  45. Case::WriteSlice
  46. } else {
  47. Case::WritingPartialSlice(len)
  48. });
  49. } else {
  50. f(Case::WritingSliceFailed(ret));
  51. }
  52. let mut buffer = [0u8; 16];
  53. let ret = sbi::console_read(Physical::new(buffer.len(), buffer.as_mut_ptr() as _, 0));
  54. if let Some(len) = ret.ok() {
  55. f(Case::Read(len));
  56. } else {
  57. f(Case::ReadingFailed(ret));
  58. }
  59. f(Case::Pass);
  60. }