@@ -61,6 +61,64 @@ pub enum Error {
61
61
PartialBuffer { expected : usize , completed : usize } ,
62
62
}
63
63
64
+ impl PartialEq for Error {
65
+ fn eq ( & self , other : & Self ) -> bool {
66
+ match ( self , other) {
67
+ // error.kind should be enough to assert equallity because each error
68
+ // has the kind field set and the OS error numbers can be converted
69
+ // to ErrorKind through `sys::decode_error_kind`.
70
+ ( Error :: IOError ( left) , Error :: IOError ( right) ) => left. kind ( ) == right. kind ( ) ,
71
+ (
72
+ Error :: OutOfBounds { addr : left_address } ,
73
+ Error :: OutOfBounds {
74
+ addr : right_address,
75
+ } ,
76
+ ) => left_address == right_address,
77
+ (
78
+ Error :: Overflow {
79
+ base : left_base,
80
+ offset : left_offset,
81
+ } ,
82
+ Error :: Overflow {
83
+ base : right_base,
84
+ offset : right_offset,
85
+ } ,
86
+ ) => left_offset == right_offset && left_base == right_base,
87
+ (
88
+ Error :: TooBig {
89
+ nelements : left_nelements,
90
+ size : left_size,
91
+ } ,
92
+ Error :: TooBig {
93
+ nelements : right_nelements,
94
+ size : right_size,
95
+ } ,
96
+ ) => left_nelements == right_nelements && left_size == right_size,
97
+ (
98
+ Error :: Misaligned {
99
+ addr : left_addr,
100
+ alignment : left_align,
101
+ } ,
102
+ Error :: Misaligned {
103
+ addr : right_addr,
104
+ alignment : right_align,
105
+ } ,
106
+ ) => left_addr == right_addr && left_align == right_align,
107
+ (
108
+ Error :: PartialBuffer {
109
+ expected : left_expected,
110
+ completed : left_completed,
111
+ } ,
112
+ Error :: PartialBuffer {
113
+ expected : right_expected,
114
+ completed : right_completed,
115
+ } ,
116
+ ) => left_expected == right_expected && left_completed == right_completed,
117
+ _ => false ,
118
+ }
119
+ }
120
+ }
121
+
64
122
impl fmt:: Display for Error {
65
123
fn fmt ( & self , f : & mut fmt:: Formatter ) -> fmt:: Result {
66
124
match self {
@@ -1527,7 +1585,10 @@ mod tests {
1527
1585
let a_ref =
1528
1586
unsafe { VolatileSlice :: new ( & mut a[ 0 ] as * mut usize as * mut u8 , size_of :: < usize > ( ) ) } ;
1529
1587
assert ! ( a_ref. get_atomic_ref:: <AtomicUsize >( 0 ) . is_ok( ) ) ;
1530
- assert ! ( a_ref. get_atomic_ref:: <AtomicUsize >( 1 ) . is_err( ) ) ;
1588
+ assert_eq ! (
1589
+ a_ref. get_atomic_ref:: <AtomicUsize >( 1 ) . unwrap_err( ) ,
1590
+ Error :: OutOfBounds { addr: 9 }
1591
+ ) ;
1531
1592
}
1532
1593
1533
1594
#[ test]
@@ -1628,20 +1689,46 @@ mod tests {
1628
1689
assert ! ( slice. write( & [ 1 ; 80 ] , 10 ) . is_ok( ) ) ;
1629
1690
1630
1691
assert ! ( slice. subslice( 0 , 0 ) . is_ok( ) ) ;
1631
- assert ! ( slice. subslice( 0 , 101 ) . is_err( ) ) ;
1692
+ assert_eq ! (
1693
+ slice. subslice( 0 , 101 ) . unwrap_err( ) ,
1694
+ Error :: OutOfBounds { addr: 101 }
1695
+ ) ;
1632
1696
1633
1697
assert ! ( slice. subslice( 99 , 0 ) . is_ok( ) ) ;
1634
1698
assert ! ( slice. subslice( 99 , 1 ) . is_ok( ) ) ;
1635
- assert ! ( slice. subslice( 99 , 2 ) . is_err( ) ) ;
1699
+ assert_eq ! (
1700
+ slice. subslice( 99 , 2 ) . unwrap_err( ) ,
1701
+ Error :: OutOfBounds { addr: 101 }
1702
+ ) ;
1636
1703
1637
1704
assert ! ( slice. subslice( 100 , 0 ) . is_ok( ) ) ;
1638
- assert ! ( slice. subslice( 100 , 1 ) . is_err( ) ) ;
1639
-
1640
- assert ! ( slice. subslice( 101 , 0 ) . is_err( ) ) ;
1641
- assert ! ( slice. subslice( 101 , 1 ) . is_err( ) ) ;
1705
+ assert_eq ! (
1706
+ slice. subslice( 100 , 1 ) . unwrap_err( ) ,
1707
+ Error :: OutOfBounds { addr: 101 }
1708
+ ) ;
1709
+ assert_eq ! (
1710
+ slice. subslice( 101 , 0 ) . unwrap_err( ) ,
1711
+ Error :: OutOfBounds { addr: 101 }
1712
+ ) ;
1713
+ assert_eq ! (
1714
+ slice. subslice( 101 , 1 ) . unwrap_err( ) ,
1715
+ Error :: OutOfBounds { addr: 102 }
1716
+ ) ;
1642
1717
1643
- assert ! ( slice. subslice( std:: usize :: MAX , 2 ) . is_err( ) ) ;
1644
- assert ! ( slice. subslice( 2 , std:: usize :: MAX ) . is_err( ) ) ;
1718
+ assert_eq ! (
1719
+ slice. subslice( std:: usize :: MAX , 2 ) . unwrap_err( ) ,
1720
+ Error :: Overflow {
1721
+ base: std:: usize :: MAX ,
1722
+ offset: 2
1723
+ }
1724
+ ) ;
1725
+ assert_eq ! (
1726
+ slice. subslice( 2 , std:: usize :: MAX ) . unwrap_err( ) ,
1727
+ Error :: Overflow {
1728
+ base: 2 ,
1729
+ offset: std:: usize :: MAX
1730
+ }
1731
+ ) ;
1645
1732
1646
1733
let maybe_offset_slice = slice. subslice ( 10 , 80 ) ;
1647
1734
assert ! ( maybe_offset_slice. is_ok( ) ) ;
@@ -1658,7 +1745,6 @@ mod tests {
1658
1745
let mem = VecMem :: new ( 100 ) ;
1659
1746
let slice = mem. get_slice ( 0 , 100 ) . unwrap ( ) ;
1660
1747
assert ! ( slice. write( & [ 1 ; 80 ] , 10 ) . is_ok( ) ) ;
1661
-
1662
1748
assert ! ( slice. offset( 101 ) . is_err( ) ) ;
1663
1749
1664
1750
let maybe_offset_slice = slice. offset ( 10 ) ;
@@ -1750,12 +1836,11 @@ mod tests {
1750
1836
fn slice_overflow_error ( ) {
1751
1837
use std:: usize:: MAX ;
1752
1838
let a = VecMem :: new ( 1 ) ;
1753
- let res = a. get_slice ( MAX , 1 ) . unwrap_err ( ) ;
1754
- assert_matches ! (
1755
- res,
1839
+ assert_eq ! (
1840
+ a. get_slice( MAX , 1 ) . unwrap_err( ) ,
1756
1841
Error :: Overflow {
1757
1842
base: MAX ,
1758
- offset: 1 ,
1843
+ offset: 1
1759
1844
}
1760
1845
) ;
1761
1846
}
@@ -1764,17 +1849,18 @@ mod tests {
1764
1849
fn slice_oob_error ( ) {
1765
1850
let a = VecMem :: new ( 100 ) ;
1766
1851
a. get_slice ( 50 , 50 ) . unwrap ( ) ;
1767
- let res = a. get_slice ( 55 , 50 ) . unwrap_err ( ) ;
1768
- assert_matches ! ( res, Error :: OutOfBounds { addr: 105 } ) ;
1852
+ assert_eq ! (
1853
+ a. get_slice( 55 , 50 ) . unwrap_err( ) ,
1854
+ Error :: OutOfBounds { addr: 105 }
1855
+ ) ;
1769
1856
}
1770
1857
1771
1858
#[ test]
1772
1859
fn ref_overflow_error ( ) {
1773
1860
use std:: usize:: MAX ;
1774
1861
let a = VecMem :: new ( 1 ) ;
1775
- let res = a. get_ref :: < u8 > ( MAX ) . unwrap_err ( ) ;
1776
- assert_matches ! (
1777
- res,
1862
+ assert_eq ! (
1863
+ a. get_ref:: <u8 >( MAX ) . unwrap_err( ) ,
1778
1864
Error :: Overflow {
1779
1865
base: MAX ,
1780
1866
offset: 1 ,
@@ -1786,15 +1872,19 @@ mod tests {
1786
1872
fn ref_oob_error ( ) {
1787
1873
let a = VecMem :: new ( 100 ) ;
1788
1874
a. get_ref :: < u8 > ( 99 ) . unwrap ( ) ;
1789
- let res = a. get_ref :: < u16 > ( 99 ) . unwrap_err ( ) ;
1790
- assert_matches ! ( res, Error :: OutOfBounds { addr: 101 } ) ;
1875
+ assert_eq ! (
1876
+ a. get_ref:: <u16 >( 99 ) . unwrap_err( ) ,
1877
+ Error :: OutOfBounds { addr: 101 }
1878
+ ) ;
1791
1879
}
1792
1880
1793
1881
#[ test]
1794
1882
fn ref_oob_too_large ( ) {
1795
1883
let a = VecMem :: new ( 3 ) ;
1796
- let res = a. get_ref :: < u32 > ( 0 ) . unwrap_err ( ) ;
1797
- assert_matches ! ( res, Error :: OutOfBounds { addr: 4 } ) ;
1884
+ assert_eq ! (
1885
+ a. get_ref:: <u32 >( 0 ) . unwrap_err( ) ,
1886
+ Error :: OutOfBounds { addr: 4 }
1887
+ ) ;
1798
1888
}
1799
1889
1800
1890
#[ test]
@@ -1820,10 +1910,16 @@ mod tests {
1820
1910
let a = VecMem :: new ( 5 ) ;
1821
1911
let s = a. as_volatile_slice ( ) ;
1822
1912
let sample_buf = [ 1 , 2 , 3 ] ;
1823
- assert ! ( s. write( & sample_buf, 5 ) . is_err( ) ) ;
1913
+ assert_eq ! (
1914
+ s. write( & sample_buf, 5 ) . unwrap_err( ) ,
1915
+ Error :: OutOfBounds { addr: 5 }
1916
+ ) ;
1824
1917
assert ! ( s. write( & sample_buf, 2 ) . is_ok( ) ) ;
1825
1918
let mut buf = [ 0u8 ; 3 ] ;
1826
- assert ! ( s. read( & mut buf, 5 ) . is_err( ) ) ;
1919
+ assert_eq ! (
1920
+ s. read( & mut buf, 5 ) . unwrap_err( ) ,
1921
+ Error :: OutOfBounds { addr: 5 }
1922
+ ) ;
1827
1923
assert ! ( s. read_slice( & mut buf, 2 ) . is_ok( ) ) ;
1828
1924
assert_eq ! ( buf, sample_buf) ;
1829
1925
@@ -1843,12 +1939,28 @@ mod tests {
1843
1939
fn obj_read_and_write ( ) {
1844
1940
let a = VecMem :: new ( 5 ) ;
1845
1941
let s = a. as_volatile_slice ( ) ;
1846
- assert ! ( s. write_obj( 55u16 , 4 ) . is_err( ) ) ;
1847
- assert ! ( s. write_obj( 55u16 , core:: usize :: MAX ) . is_err( ) ) ;
1942
+ assert_eq ! (
1943
+ s. write_obj( 55u16 , 4 ) . unwrap_err( ) ,
1944
+ Error :: PartialBuffer {
1945
+ expected: 2 ,
1946
+ completed: 1
1947
+ }
1948
+ ) ;
1848
1949
assert ! ( s. write_obj( 55u16 , 2 ) . is_ok( ) ) ;
1849
1950
assert_eq ! ( s. read_obj:: <u16 >( 2 ) . unwrap( ) , 55u16 ) ;
1850
- assert ! ( s. read_obj:: <u16 >( 4 ) . is_err( ) ) ;
1851
- assert ! ( s. read_obj:: <u16 >( core:: usize :: MAX ) . is_err( ) ) ;
1951
+ assert_eq ! (
1952
+ s. read_obj:: <u16 >( 4 ) . unwrap_err( ) ,
1953
+ Error :: PartialBuffer {
1954
+ expected: 2 ,
1955
+ completed: 1
1956
+ }
1957
+ ) ;
1958
+ assert_eq ! (
1959
+ s. read_obj:: <u16 >( core:: usize :: MAX ) . unwrap_err( ) ,
1960
+ Error :: OutOfBounds {
1961
+ addr: core:: usize :: MAX
1962
+ }
1963
+ ) ;
1852
1964
}
1853
1965
1854
1966
#[ test]
@@ -1861,15 +1973,30 @@ mod tests {
1861
1973
} else {
1862
1974
File :: open ( Path :: new ( "c:\\ Windows\\ system32\\ ntoskrnl.exe" ) ) . unwrap ( )
1863
1975
} ;
1864
- assert ! ( s. read_exact_from( 2 , & mut file, size_of:: <u32 >( ) ) . is_err( ) ) ;
1865
- assert ! ( s
1866
- . read_exact_from( core:: usize :: MAX , & mut file, size_of:: <u32 >( ) )
1867
- . is_err( ) ) ;
1976
+ assert_eq ! (
1977
+ s. read_exact_from( 2 , & mut file, size_of:: <u32 >( ) )
1978
+ . unwrap_err( ) ,
1979
+ Error :: OutOfBounds { addr: 6 }
1980
+ ) ;
1981
+ assert_eq ! (
1982
+ s. read_exact_from( core:: usize :: MAX , & mut file, size_of:: <u32 >( ) )
1983
+ . unwrap_err( ) ,
1984
+ Error :: Overflow {
1985
+ base: core:: usize :: MAX ,
1986
+ offset: 4
1987
+ }
1988
+ ) ;
1868
1989
1869
1990
assert ! ( s. read_exact_from( 1 , & mut file, size_of:: <u32 >( ) ) . is_ok( ) ) ;
1870
1991
1871
1992
let mut f = TempFile :: new ( ) . unwrap ( ) . into_file ( ) ;
1872
- assert ! ( s. read_exact_from( 1 , & mut f, size_of:: <u32 >( ) ) . is_err( ) ) ;
1993
+ assert_eq ! (
1994
+ s. read_exact_from( 1 , & mut f, size_of:: <u32 >( ) ) . unwrap_err( ) ,
1995
+ Error :: IOError ( std:: io:: Error :: new(
1996
+ std:: io:: ErrorKind :: UnexpectedEof ,
1997
+ "failed to fill the whole buffer"
1998
+ ) )
1999
+ ) ;
1873
2000
format ! ( "{:?}" , s. read_exact_from( 1 , & mut f, size_of:: <u32 >( ) ) ) ;
1874
2001
1875
2002
let value = s. read_obj :: < u32 > ( 1 ) . unwrap ( ) ;
@@ -1881,10 +2008,18 @@ mod tests {
1881
2008
1882
2009
let mut sink = Vec :: new ( ) ;
1883
2010
assert ! ( s. write_all_to( 1 , & mut sink, size_of:: <u32 >( ) ) . is_ok( ) ) ;
1884
- assert ! ( s. write_all_to( 2 , & mut sink, size_of:: <u32 >( ) ) . is_err( ) ) ;
1885
- assert ! ( s
1886
- . write_all_to( core:: usize :: MAX , & mut sink, size_of:: <u32 >( ) )
1887
- . is_err( ) ) ;
2011
+ assert_eq ! (
2012
+ s. write_all_to( 2 , & mut sink, size_of:: <u32 >( ) ) . unwrap_err( ) ,
2013
+ Error :: OutOfBounds { addr: 6 }
2014
+ ) ;
2015
+ assert_eq ! (
2016
+ s. write_all_to( core:: usize :: MAX , & mut sink, size_of:: <u32 >( ) )
2017
+ . unwrap_err( ) ,
2018
+ Error :: Overflow {
2019
+ base: core:: usize :: MAX ,
2020
+ offset: 4
2021
+ }
2022
+ ) ;
1888
2023
format ! ( "{:?}" , s. write_all_to( 2 , & mut sink, size_of:: <u32 >( ) ) ) ;
1889
2024
if cfg ! ( unix) {
1890
2025
assert_eq ! ( sink, vec![ 0 ; size_of:: <u32 >( ) ] ) ;
@@ -1959,9 +2094,8 @@ mod tests {
1959
2094
fn ref_array_overflow ( ) {
1960
2095
let mut a = [ 0 , 0 , 2 , 3 , 10 ] ;
1961
2096
let a_ref = & mut a[ ..] ;
1962
- let res = a_ref. get_array_ref :: < u32 > ( 4 , usize:: MAX ) . unwrap_err ( ) ;
1963
- assert_matches ! (
1964
- res,
2097
+ assert_eq ! (
2098
+ a_ref. get_array_ref:: <u32 >( 4 , usize :: MAX ) . unwrap_err( ) ,
1965
2099
Error :: TooBig {
1966
2100
nelements: usize :: MAX ,
1967
2101
size: 4 ,
0 commit comments