@@ -61,6 +61,61 @@ 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 :: IOError ( left) , Error :: IOError ( right) ) => left. kind ( ) == right. kind ( ) ,
68
+ (
69
+ Error :: OutOfBounds { addr : left_address } ,
70
+ Error :: OutOfBounds {
71
+ addr : right_address,
72
+ } ,
73
+ ) => left_address == right_address,
74
+ (
75
+ Error :: Overflow {
76
+ base : left_base,
77
+ offset : left_offset,
78
+ } ,
79
+ Error :: Overflow {
80
+ base : right_base,
81
+ offset : right_offset,
82
+ } ,
83
+ ) => left_offset == right_offset && left_base == right_base,
84
+ (
85
+ Error :: TooBig {
86
+ nelements : left_nelements,
87
+ size : left_size,
88
+ } ,
89
+ Error :: TooBig {
90
+ nelements : right_nelements,
91
+ size : right_size,
92
+ } ,
93
+ ) => left_nelements == right_nelements && left_size == right_size,
94
+ (
95
+ Error :: Misaligned {
96
+ addr : left_addr,
97
+ alignment : left_align,
98
+ } ,
99
+ Error :: Misaligned {
100
+ addr : right_addr,
101
+ alignment : right_align,
102
+ } ,
103
+ ) => left_addr == right_addr && left_align == right_align,
104
+ (
105
+ Error :: PartialBuffer {
106
+ expected : left_expected,
107
+ completed : left_completed,
108
+ } ,
109
+ Error :: PartialBuffer {
110
+ expected : right_expected,
111
+ completed : right_completed,
112
+ } ,
113
+ ) => left_expected == right_expected && left_completed == right_completed,
114
+ _ => false ,
115
+ }
116
+ }
117
+ }
118
+
64
119
impl fmt:: Display for Error {
65
120
fn fmt ( & self , f : & mut fmt:: Formatter ) -> fmt:: Result {
66
121
match self {
@@ -1508,7 +1563,10 @@ mod tests {
1508
1563
let a_ref =
1509
1564
unsafe { VolatileSlice :: new ( & mut a[ 0 ] as * mut usize as * mut u8 , size_of :: < usize > ( ) ) } ;
1510
1565
assert ! ( a_ref. get_atomic_ref:: <AtomicUsize >( 0 ) . is_ok( ) ) ;
1511
- assert ! ( a_ref. get_atomic_ref:: <AtomicUsize >( 1 ) . is_err( ) ) ;
1566
+ assert_eq ! (
1567
+ a_ref. get_atomic_ref:: <AtomicUsize >( 1 ) . unwrap_err( ) ,
1568
+ Error :: OutOfBounds { addr: 9 }
1569
+ ) ;
1512
1570
}
1513
1571
1514
1572
#[ test]
@@ -1625,20 +1683,46 @@ mod tests {
1625
1683
assert ! ( slice. write( & [ 1 ; 80 ] , 10 ) . is_ok( ) ) ;
1626
1684
1627
1685
assert ! ( slice. subslice( 0 , 0 ) . is_ok( ) ) ;
1628
- assert ! ( slice. subslice( 0 , 101 ) . is_err( ) ) ;
1686
+ assert_eq ! (
1687
+ slice. subslice( 0 , 101 ) . unwrap_err( ) ,
1688
+ Error :: OutOfBounds { addr: 101 }
1689
+ ) ;
1629
1690
1630
1691
assert ! ( slice. subslice( 99 , 0 ) . is_ok( ) ) ;
1631
1692
assert ! ( slice. subslice( 99 , 1 ) . is_ok( ) ) ;
1632
- assert ! ( slice. subslice( 99 , 2 ) . is_err( ) ) ;
1693
+ assert_eq ! (
1694
+ slice. subslice( 99 , 2 ) . unwrap_err( ) ,
1695
+ Error :: OutOfBounds { addr: 101 }
1696
+ ) ;
1633
1697
1634
1698
assert ! ( slice. subslice( 100 , 0 ) . is_ok( ) ) ;
1635
- assert ! ( slice. subslice( 100 , 1 ) . is_err( ) ) ;
1636
-
1637
- assert ! ( slice. subslice( 101 , 0 ) . is_err( ) ) ;
1638
- assert ! ( slice. subslice( 101 , 1 ) . is_err( ) ) ;
1699
+ assert_eq ! (
1700
+ slice. subslice( 100 , 1 ) . unwrap_err( ) ,
1701
+ Error :: OutOfBounds { addr: 101 }
1702
+ ) ;
1703
+ assert_eq ! (
1704
+ slice. subslice( 101 , 0 ) . unwrap_err( ) ,
1705
+ Error :: OutOfBounds { addr: 101 }
1706
+ ) ;
1707
+ assert_eq ! (
1708
+ slice. subslice( 101 , 1 ) . unwrap_err( ) ,
1709
+ Error :: OutOfBounds { addr: 102 }
1710
+ ) ;
1639
1711
1640
- assert ! ( slice. subslice( std:: usize :: MAX , 2 ) . is_err( ) ) ;
1641
- assert ! ( slice. subslice( 2 , std:: usize :: MAX ) . is_err( ) ) ;
1712
+ assert_eq ! (
1713
+ slice. subslice( std:: usize :: MAX , 2 ) . unwrap_err( ) ,
1714
+ Error :: Overflow {
1715
+ base: std:: usize :: MAX ,
1716
+ offset: 2
1717
+ }
1718
+ ) ;
1719
+ assert_eq ! (
1720
+ slice. subslice( 2 , std:: usize :: MAX ) . unwrap_err( ) ,
1721
+ Error :: Overflow {
1722
+ base: 2 ,
1723
+ offset: std:: usize :: MAX
1724
+ }
1725
+ ) ;
1642
1726
1643
1727
let maybe_offset_slice = slice. subslice ( 10 , 80 ) ;
1644
1728
assert ! ( maybe_offset_slice. is_ok( ) ) ;
@@ -1655,7 +1739,6 @@ mod tests {
1655
1739
let mem = VecMem :: new ( 100 ) ;
1656
1740
let slice = mem. get_slice ( 0 , 100 ) . unwrap ( ) ;
1657
1741
assert ! ( slice. write( & [ 1 ; 80 ] , 10 ) . is_ok( ) ) ;
1658
-
1659
1742
assert ! ( slice. offset( 101 ) . is_err( ) ) ;
1660
1743
1661
1744
let maybe_offset_slice = slice. offset ( 10 ) ;
@@ -1747,12 +1830,11 @@ mod tests {
1747
1830
fn slice_overflow_error ( ) {
1748
1831
use std:: usize:: MAX ;
1749
1832
let a = VecMem :: new ( 1 ) ;
1750
- let res = a. get_slice ( MAX , 1 ) . unwrap_err ( ) ;
1751
- assert_matches ! (
1752
- res,
1833
+ assert_eq ! (
1834
+ a. get_slice( MAX , 1 ) . unwrap_err( ) ,
1753
1835
Error :: Overflow {
1754
1836
base: MAX ,
1755
- offset: 1 ,
1837
+ offset: 1
1756
1838
}
1757
1839
) ;
1758
1840
}
@@ -1761,17 +1843,18 @@ mod tests {
1761
1843
fn slice_oob_error ( ) {
1762
1844
let a = VecMem :: new ( 100 ) ;
1763
1845
a. get_slice ( 50 , 50 ) . unwrap ( ) ;
1764
- let res = a. get_slice ( 55 , 50 ) . unwrap_err ( ) ;
1765
- assert_matches ! ( res, Error :: OutOfBounds { addr: 105 } ) ;
1846
+ assert_eq ! (
1847
+ a. get_slice( 55 , 50 ) . unwrap_err( ) ,
1848
+ Error :: OutOfBounds { addr: 105 }
1849
+ ) ;
1766
1850
}
1767
1851
1768
1852
#[ test]
1769
1853
fn ref_overflow_error ( ) {
1770
1854
use std:: usize:: MAX ;
1771
1855
let a = VecMem :: new ( 1 ) ;
1772
- let res = a. get_ref :: < u8 > ( MAX ) . unwrap_err ( ) ;
1773
- assert_matches ! (
1774
- res,
1856
+ assert_eq ! (
1857
+ a. get_ref:: <u8 >( MAX ) . unwrap_err( ) ,
1775
1858
Error :: Overflow {
1776
1859
base: MAX ,
1777
1860
offset: 1 ,
@@ -1783,15 +1866,19 @@ mod tests {
1783
1866
fn ref_oob_error ( ) {
1784
1867
let a = VecMem :: new ( 100 ) ;
1785
1868
a. get_ref :: < u8 > ( 99 ) . unwrap ( ) ;
1786
- let res = a. get_ref :: < u16 > ( 99 ) . unwrap_err ( ) ;
1787
- assert_matches ! ( res, Error :: OutOfBounds { addr: 101 } ) ;
1869
+ assert_eq ! (
1870
+ a. get_ref:: <u16 >( 99 ) . unwrap_err( ) ,
1871
+ Error :: OutOfBounds { addr: 101 }
1872
+ ) ;
1788
1873
}
1789
1874
1790
1875
#[ test]
1791
1876
fn ref_oob_too_large ( ) {
1792
1877
let a = VecMem :: new ( 3 ) ;
1793
- let res = a. get_ref :: < u32 > ( 0 ) . unwrap_err ( ) ;
1794
- assert_matches ! ( res, Error :: OutOfBounds { addr: 4 } ) ;
1878
+ assert_eq ! (
1879
+ a. get_ref:: <u32 >( 0 ) . unwrap_err( ) ,
1880
+ Error :: OutOfBounds { addr: 4 }
1881
+ ) ;
1795
1882
}
1796
1883
1797
1884
#[ test]
@@ -1817,10 +1904,16 @@ mod tests {
1817
1904
let a = VecMem :: new ( 5 ) ;
1818
1905
let s = a. as_volatile_slice ( ) ;
1819
1906
let sample_buf = [ 1 , 2 , 3 ] ;
1820
- assert ! ( s. write( & sample_buf, 5 ) . is_err( ) ) ;
1907
+ assert_eq ! (
1908
+ s. write( & sample_buf, 5 ) . unwrap_err( ) ,
1909
+ Error :: OutOfBounds { addr: 5 }
1910
+ ) ;
1821
1911
assert ! ( s. write( & sample_buf, 2 ) . is_ok( ) ) ;
1822
1912
let mut buf = [ 0u8 ; 3 ] ;
1823
- assert ! ( s. read( & mut buf, 5 ) . is_err( ) ) ;
1913
+ assert_eq ! (
1914
+ s. read( & mut buf, 5 ) . unwrap_err( ) ,
1915
+ Error :: OutOfBounds { addr: 5 }
1916
+ ) ;
1824
1917
assert ! ( s. read_slice( & mut buf, 2 ) . is_ok( ) ) ;
1825
1918
assert_eq ! ( buf, sample_buf) ;
1826
1919
}
@@ -1829,12 +1922,28 @@ mod tests {
1829
1922
fn obj_read_and_write ( ) {
1830
1923
let a = VecMem :: new ( 5 ) ;
1831
1924
let s = a. as_volatile_slice ( ) ;
1832
- assert ! ( s. write_obj( 55u16 , 4 ) . is_err( ) ) ;
1833
- assert ! ( s. write_obj( 55u16 , core:: usize :: MAX ) . is_err( ) ) ;
1925
+ assert_eq ! (
1926
+ s. write_obj( 55u16 , 4 ) . unwrap_err( ) ,
1927
+ Error :: PartialBuffer {
1928
+ expected: 2 ,
1929
+ completed: 1
1930
+ }
1931
+ ) ;
1834
1932
assert ! ( s. write_obj( 55u16 , 2 ) . is_ok( ) ) ;
1835
1933
assert_eq ! ( s. read_obj:: <u16 >( 2 ) . unwrap( ) , 55u16 ) ;
1836
- assert ! ( s. read_obj:: <u16 >( 4 ) . is_err( ) ) ;
1837
- assert ! ( s. read_obj:: <u16 >( core:: usize :: MAX ) . is_err( ) ) ;
1934
+ assert_eq ! (
1935
+ s. read_obj:: <u16 >( 4 ) . unwrap_err( ) ,
1936
+ Error :: PartialBuffer {
1937
+ expected: 2 ,
1938
+ completed: 1
1939
+ }
1940
+ ) ;
1941
+ assert_eq ! (
1942
+ s. read_obj:: <u16 >( core:: usize :: MAX ) . unwrap_err( ) ,
1943
+ Error :: OutOfBounds {
1944
+ addr: core:: usize :: MAX
1945
+ }
1946
+ ) ;
1838
1947
}
1839
1948
1840
1949
#[ test]
@@ -1847,15 +1956,30 @@ mod tests {
1847
1956
} else {
1848
1957
File :: open ( Path :: new ( "c:\\ Windows\\ system32\\ ntoskrnl.exe" ) ) . unwrap ( )
1849
1958
} ;
1850
- assert ! ( s. read_exact_from( 2 , & mut file, size_of:: <u32 >( ) ) . is_err( ) ) ;
1851
- assert ! ( s
1852
- . read_exact_from( core:: usize :: MAX , & mut file, size_of:: <u32 >( ) )
1853
- . is_err( ) ) ;
1959
+ assert_eq ! (
1960
+ s. read_exact_from( 2 , & mut file, size_of:: <u32 >( ) )
1961
+ . unwrap_err( ) ,
1962
+ Error :: OutOfBounds { addr: 6 }
1963
+ ) ;
1964
+ assert_eq ! (
1965
+ s. read_exact_from( core:: usize :: MAX , & mut file, size_of:: <u32 >( ) )
1966
+ . unwrap_err( ) ,
1967
+ Error :: Overflow {
1968
+ base: core:: usize :: MAX ,
1969
+ offset: 4
1970
+ }
1971
+ ) ;
1854
1972
1855
1973
assert ! ( s. read_exact_from( 1 , & mut file, size_of:: <u32 >( ) ) . is_ok( ) ) ;
1856
1974
1857
1975
let mut f = TempFile :: new ( ) . unwrap ( ) . into_file ( ) ;
1858
- assert ! ( s. read_exact_from( 1 , & mut f, size_of:: <u32 >( ) ) . is_err( ) ) ;
1976
+ assert_eq ! (
1977
+ s. read_exact_from( 1 , & mut f, size_of:: <u32 >( ) ) . unwrap_err( ) ,
1978
+ Error :: IOError ( std:: io:: Error :: new(
1979
+ std:: io:: ErrorKind :: UnexpectedEof ,
1980
+ "failed to fill the whole buffer"
1981
+ ) )
1982
+ ) ;
1859
1983
format ! ( "{:?}" , s. read_exact_from( 1 , & mut f, size_of:: <u32 >( ) ) ) ;
1860
1984
1861
1985
let value = s. read_obj :: < u32 > ( 1 ) . unwrap ( ) ;
@@ -1867,10 +1991,18 @@ mod tests {
1867
1991
1868
1992
let mut sink = Vec :: new ( ) ;
1869
1993
assert ! ( s. write_all_to( 1 , & mut sink, size_of:: <u32 >( ) ) . is_ok( ) ) ;
1870
- assert ! ( s. write_all_to( 2 , & mut sink, size_of:: <u32 >( ) ) . is_err( ) ) ;
1871
- assert ! ( s
1872
- . write_all_to( core:: usize :: MAX , & mut sink, size_of:: <u32 >( ) )
1873
- . is_err( ) ) ;
1994
+ assert_eq ! (
1995
+ s. write_all_to( 2 , & mut sink, size_of:: <u32 >( ) ) . unwrap_err( ) ,
1996
+ Error :: OutOfBounds { addr: 6 }
1997
+ ) ;
1998
+ assert_eq ! (
1999
+ s. write_all_to( core:: usize :: MAX , & mut sink, size_of:: <u32 >( ) )
2000
+ . unwrap_err( ) ,
2001
+ Error :: Overflow {
2002
+ base: core:: usize :: MAX ,
2003
+ offset: 4
2004
+ }
2005
+ ) ;
1874
2006
format ! ( "{:?}" , s. write_all_to( 2 , & mut sink, size_of:: <u32 >( ) ) ) ;
1875
2007
if cfg ! ( unix) {
1876
2008
assert_eq ! ( sink, vec![ 0 ; size_of:: <u32 >( ) ] ) ;
@@ -1945,9 +2077,8 @@ mod tests {
1945
2077
fn ref_array_overflow ( ) {
1946
2078
let mut a = [ 0 , 0 , 2 , 3 , 10 ] ;
1947
2079
let a_ref = & mut a[ ..] ;
1948
- let res = a_ref. get_array_ref :: < u32 > ( 4 , usize:: MAX ) . unwrap_err ( ) ;
1949
- assert_matches ! (
1950
- res,
2080
+ assert_eq ! (
2081
+ a_ref. get_array_ref:: <u32 >( 4 , usize :: MAX ) . unwrap_err( ) ,
1951
2082
Error :: TooBig {
1952
2083
nelements: usize :: MAX ,
1953
2084
size: 4 ,
0 commit comments