|
16 | 16 | // to Fake GCS Server (the emulated google cloud storage environment) |
17 | 17 |
|
18 | 18 | #[cfg(all(feature = "integration-testsuite", feature = "gcs"))] |
19 | | -#[tokio::test] |
20 | 19 | #[cfg_attr(not(feature = "ci-test"), ignore)] |
21 | | -async fn google_cloud_storage_test_suite() -> anyhow::Result<()> { |
| 20 | +mod gcp_storage_test_suite { |
22 | 21 | use std::str::FromStr; |
23 | 22 |
|
24 | 23 | use anyhow::Context; |
| 24 | + use quickwit_common::rand::append_random_suffix; |
| 25 | + use quickwit_common::setup_logging_for_tests; |
25 | 26 | use quickwit_common::uri::Uri; |
26 | | - use quickwit_storage::new_emulated_google_cloud_storage; |
27 | | - let _ = tracing_subscriber::fmt::try_init(); |
28 | | - |
29 | | - let mut object_storage = |
30 | | - new_emulated_google_cloud_storage(&Uri::from_str("gs://sample-bucket")?)?; |
31 | | - quickwit_storage::storage_test_suite(&mut object_storage).await?; |
32 | | - |
33 | | - let mut object_storage = new_emulated_google_cloud_storage(&Uri::from_str( |
34 | | - "gs://sample-bucket/integration-tests/test-azure-compatible-storage", |
35 | | - )?)?; |
36 | | - quickwit_storage::storage_test_single_part_upload(&mut object_storage) |
37 | | - .await |
38 | | - .context("test single-part upload failed")?; |
39 | | - |
40 | | - quickwit_storage::storage_test_multi_part_upload(&mut object_storage) |
41 | | - .await |
42 | | - .context("test multipart upload failed")?; |
43 | | - Ok(()) |
| 27 | + use quickwit_storage::test_config_helpers::{ |
| 28 | + DummyTokenLoader, LOCAL_GCP_EMULATOR_ENDPOINT, new_emulated_google_cloud_storage, |
| 29 | + }; |
| 30 | + use reqsign::GoogleTokenLoad; |
| 31 | + |
| 32 | + pub async fn sign_gcs_request(req: &mut reqwest::Request) -> anyhow::Result<()> { |
| 33 | + let client = reqwest::Client::new(); |
| 34 | + let token = DummyTokenLoader |
| 35 | + .load(client.clone()) |
| 36 | + .await? |
| 37 | + .ok_or_else(|| anyhow::anyhow!("Failed to obtain authentication token"))?; |
| 38 | + |
| 39 | + let signer = reqsign::GoogleSigner::new("storage"); |
| 40 | + signer.sign(req, &token)?; |
| 41 | + |
| 42 | + Ok(()) |
| 43 | + } |
| 44 | + |
| 45 | + async fn create_gcs_bucket(bucket_name: &str) -> anyhow::Result<()> { |
| 46 | + let client = reqwest::Client::new(); |
| 47 | + let url = format!("{LOCAL_GCP_EMULATOR_ENDPOINT}/storage/v1/b"); |
| 48 | + let mut request = client |
| 49 | + .post(url) |
| 50 | + .body(serde_json::to_vec(&serde_json::json!({ |
| 51 | + "name": bucket_name, |
| 52 | + }))?) |
| 53 | + .header(reqwest::header::CONTENT_TYPE, "application/json") |
| 54 | + .build()?; |
| 55 | + |
| 56 | + sign_gcs_request(&mut request).await?; |
| 57 | + |
| 58 | + let response = client.execute(request).await?; |
| 59 | + |
| 60 | + if !response.status().is_success() { |
| 61 | + let error_text = response.text().await?; |
| 62 | + anyhow::bail!("Failed to create bucket: {}", error_text); |
| 63 | + }; |
| 64 | + Ok(()) |
| 65 | + } |
| 66 | + |
| 67 | + #[tokio::test] |
| 68 | + async fn google_cloud_storage_test_suite() -> anyhow::Result<()> { |
| 69 | + setup_logging_for_tests(); |
| 70 | + |
| 71 | + let bucket_name = append_random_suffix("sample-bucket").to_lowercase(); |
| 72 | + create_gcs_bucket(bucket_name.as_str()) |
| 73 | + .await |
| 74 | + .context("Failed to create test GCS bucket")?; |
| 75 | + |
| 76 | + let mut object_storage = |
| 77 | + new_emulated_google_cloud_storage(&Uri::from_str(&format!("gs://{bucket_name}"))?)?; |
| 78 | + |
| 79 | + quickwit_storage::storage_test_suite(&mut object_storage).await?; |
| 80 | + |
| 81 | + let mut object_storage = new_emulated_google_cloud_storage(&Uri::from_str(&format!( |
| 82 | + "gs://{bucket_name}/integration-tests/test-gcs-storage" |
| 83 | + ))?)?; |
| 84 | + |
| 85 | + quickwit_storage::storage_test_single_part_upload(&mut object_storage) |
| 86 | + .await |
| 87 | + .context("test single-part upload failed")?; |
| 88 | + |
| 89 | + // TODO: Uncomment storage_test_multi_part_upload when the XML API is |
| 90 | + // supported in the emulated GCS server |
| 91 | + // (https://github.com/fsouza/fake-gcs-server/pull/1164) |
| 92 | + |
| 93 | + // object_storage.set_policy(MultiPartPolicy { |
| 94 | + // target_part_num_bytes: 5 * 1_024 * 1_024, |
| 95 | + // max_num_parts: 10_000, |
| 96 | + // multipart_threshold_num_bytes: 10_000_000, |
| 97 | + // max_object_num_bytes: 5_000_000_000_000, |
| 98 | + // max_concurrent_uploads: 100, |
| 99 | + // }); |
| 100 | + // quickwit_storage::storage_test_multi_part_upload(&mut object_storage) |
| 101 | + // .await |
| 102 | + // .context("test multipart upload failed")?; |
| 103 | + Ok(()) |
| 104 | + } |
44 | 105 | } |
0 commit comments