Check IO errors in test using `raw_os_error()` instead of `kind()` 2021-07-fix-beta
authorMatt Corallo <git@bluematt.me>
Mon, 2 Aug 2021 15:04:40 +0000 (15:04 +0000)
committerMatt Corallo <git@bluematt.me>
Mon, 2 Aug 2021 18:50:00 +0000 (18:50 +0000)
std::io::ErrorKind is a `#[non_exhaustive]` enum as more specific
error types are to be added in the future. It was unclear in the
docs until very recently, however, that this is to be done by
re-defining `ErrorKind::Other` errors to new enum variants. Thus,
our tests which check explicitly for `ErrorKind::Other` as a
result of trying to access a directory as a file were incorrect.
Sadly, these generated no meaningful feedback from rustc at all,
except that they're suddenly failing in rustc beta!

After some back-and-forth, it seems rustc is moving forward
breaking existing code in future versions, so we move to the
"correct" check here, which is to check the raw IO error.

See rust-lang/rust#86442 and rust-lang/rust#85746 for more info.

lightning-block-sync/src/http.rs
lightning-persister/src/util.rs

index 89054a23ffb5a936ad7814bcdcde8a248f20f18a..0721babfde3d1b626051ba1ccccb7240d1f5a5a7 100644 (file)
@@ -636,7 +636,10 @@ pub(crate) mod client_tests {
        #[test]
        fn connect_to_unresolvable_host() {
                match HttpClient::connect(("example.invalid", 80)) {
-                       Err(e) => assert_eq!(e.kind(), std::io::ErrorKind::Other),
+                       Err(e) => {
+                               assert!(e.to_string().contains("failed to lookup address information") ||
+                                       e.to_string().contains("No such host"), "{:?}", e);
+                       },
                        Ok(_) => panic!("Expected error"),
                }
        }
index 1825980ad891fcb257cdaf956150a526ac5e326d..73b28985bfff6ae8b484e5f0d76c62e4091b3541 100644 (file)
@@ -135,7 +135,7 @@ mod tests {
                // Create the channel data file and make it a directory.
                fs::create_dir_all(get_full_filepath(path.clone(), filename.to_string())).unwrap();
                match write_to_file(path.clone(), filename.to_string(), &test_writeable) {
-                       Err(e) => assert_eq!(e.kind(), io::ErrorKind::Other),
+                       Err(e) => assert_eq!(e.raw_os_error(), Some(libc::EISDIR)),
                        _ => panic!("Unexpected Ok(())")
                }
                fs::remove_dir_all(path).unwrap();
@@ -178,7 +178,7 @@ mod tests {
                match write_to_file(path, filename, &test_writeable) {
                        Err(e) => {
                                #[cfg(not(target_os = "windows"))]
-                               assert_eq!(e.kind(), io::ErrorKind::Other);
+                               assert_eq!(e.raw_os_error(), Some(libc::EISDIR));
                                #[cfg(target_os = "windows")]
                                assert_eq!(e.kind(), io::ErrorKind::PermissionDenied);
                        }