diff --git a/core/src/polling_monitor/ipfs_service.rs b/core/src/polling_monitor/ipfs_service.rs index 272e35a30e4..ccc74c88a1f 100644 --- a/core/src/polling_monitor/ipfs_service.rs +++ b/core/src/polling_monitor/ipfs_service.rs @@ -104,7 +104,6 @@ mod test { use std::time::Duration; use graph::components::link_resolver::ArweaveClient; - use graph::components::link_resolver::ArweaveResolver; use graph::data::value::Word; use graph::ipfs::test_utils::add_files_to_local_ipfs_node_for_testing; use graph::ipfs::{IpfsContext, IpfsMetrics, IpfsRpcClient, ServerAddress}; @@ -158,8 +157,9 @@ mod test { async fn arweave_get() { const ID: &str = "8APeQ5lW0-csTcBaGdPBDLAL2ci2AT9pTn2tppGPU_8"; - let cl = ArweaveClient::default(); - let body = cl.get(&Word::from(ID)).await.unwrap(); + let Some(body) = ArweaveClient::get_test(&Word::from(ID)).await else { + return; + }; let body = String::from_utf8(body).unwrap(); let expected = r#" diff --git a/graph/src/components/link_resolver/arweave.rs b/graph/src/components/link_resolver/arweave.rs index a9b66516dee..58ea7a4e1cc 100644 --- a/graph/src/components/link_resolver/arweave.rs +++ b/graph/src/components/link_resolver/arweave.rs @@ -56,6 +56,25 @@ impl ArweaveClient { client: Client::builder().gzip(false).build().unwrap(), } } + + /// Make a request to arweave.net to fetch the content of the file with + /// the given txid/filename. Returns `None` if `arweave.net` is not + /// reachable. + #[cfg(debug_assertions)] + pub async fn get_test(file: &Base64) -> Option> { + let client = Self::default(); + + match client.get(file).await { + Ok(resp) => Some(resp), + Err(ArweaveClientError::ServerUnavailable(_)) => { + eprintln!("arweave.net is not reachable, skipping arweave tests"); + None + } + Err(e) => { + panic!("Failed to fetch from arweave.net: {:?}", e); + } + } + } } #[async_trait] @@ -77,6 +96,13 @@ impl ArweaveResolver for ArweaveClient { .await .map_err(ArweaveClientError::from)?; + println!("Got response from arweave.net with status {}", rsp.status()); + if rsp.status() == reqwest::StatusCode::GATEWAY_TIMEOUT { + return Err(ArweaveClientError::ServerUnavailable( + self.base_url.to_string(), + )); + } + match (&limit, rsp.content_length()) { (_, None) => return Err(ArweaveClientError::UnableToCheckFileSize), (FileSizeLimit::MaxBytes(max), Some(cl)) if cl > *max => { @@ -114,16 +140,15 @@ pub enum ArweaveClientError { FileTooLarge { got: u64, max: u64 }, #[error("Unknown error")] Unknown(#[from] reqwest::Error), + #[error("Server {0} unavailable")] + ServerUnavailable(String), } #[cfg(test)] mod test { use serde_derive::Deserialize; - use crate::{ - components::link_resolver::{ArweaveClient, ArweaveResolver}, - data_source::offchain::Base64, - }; + use crate::{components::link_resolver::ArweaveClient, data_source::offchain::Base64}; // This test ensures that passing txid/filename works when the txid refers to manifest. // the actual data seems to have some binary header and footer so these ranges were found @@ -136,8 +161,11 @@ mod test { pub manifest: String, } - let client = ArweaveClient::default(); - let no_header = &client.get(&url).await.unwrap()[1295..320078]; + let Some(body) = ArweaveClient::get_test(&url).await else { + return; + }; + + let no_header = &body[1295..320078]; let content: Manifest = serde_json::from_slice(no_header).unwrap(); assert_eq!( content,