From 2afde65cf8ed68752c9d154a04a61b7abdbfda36 Mon Sep 17 00:00:00 2001
From: Dominic <git@msrd0.de>
Date: Thu, 24 Jun 2021 01:29:40 +0200
Subject: [PATCH 01/13] add reqwest client

---
 CHANGELOG.md                                  |  4 +
 influxdb/Cargo.toml                           | 27 ++++---
 influxdb/src/client/mod.rs                    | 75 +++++++++++++------
 .../src/integrations/serde_integration/mod.rs | 39 +++++-----
 influxdb/src/lib.rs                           | 26 +++++--
 5 files changed, 113 insertions(+), 58 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 920eb58..dcfcc0b 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 
 ## [Unreleased]
 
+### Added
+
+- reqwest-based http client (enabled by default)
+
 ## [0.4.0] - 2021-03-08
 
 ### Fixed
diff --git a/influxdb/Cargo.toml b/influxdb/Cargo.toml
index 6ebbf5a..c07bf8f 100644
--- a/influxdb/Cargo.toml
+++ b/influxdb/Cargo.toml
@@ -18,24 +18,31 @@ travis-ci = { repository = "Empty2k12/influxdb-rust", branch = "master" }
 [dependencies]
 chrono = { version = "0.4.11", features = ["serde"] }
 futures = "0.3.4"
-lazy_static = "1.4.0"
+http = "0.2.4"
 influxdb_derive = { version = "0.4.0", optional = true }
+lazy_static = "1.4.0"
 regex = "1.3.5"
-surf = { version = "2.2.0", default-features = false }
+reqwest = { version = "0.11.4", default-features = false, optional = true }
+surf = { version = "2.2.0", default-features = false, optional = true }
 serde = { version = "1.0.104", features = ["derive"], optional = true }
 serde_json = { version = "1.0.48", optional = true }
 thiserror = "1.0"
 
 [features]
-use-serde = ["serde", "serde_json"]
-curl-client = ["surf/curl-client"]
-h1-client = ["surf/h1-client"]
-h1-client-rustls = ["surf/h1-client-rustls"]
-hyper-client = ["surf/hyper-client"]
-wasm-client = ["surf/wasm-client"]
-default = ["use-serde", "hyper-client"]
+default = ["use-serde", "reqwest-client-rustls"]
 derive = ["influxdb_derive"]
+use-serde = ["serde", "serde_json"]
+
+# http clients
+curl-client = ["surf", "surf/curl-client"]
+h1-client = ["surf", "surf/h1-client"]
+h1-client-rustls = ["surf", "surf/h1-client-rustls"]
+hyper-client = ["surf", "surf/hyper-client"]
+reqwest-client = ["reqwest", "reqwest/native-tls-alpn"]
+reqwest-client-rustls = ["reqwest", "reqwest/rustls-tls-webpki-roots"]
+wasm-client = ["surf", "surf/wasm-client"]
 
 [dev-dependencies]
 async-std = { version = "1.6.5", features = ["attributes"] }
-tokio = { version =  "0.2.22", features = ["rt-threaded", "macros"] }
\ No newline at end of file
+tokio02 = { package = "tokio", version = "0.2.22", features = ["rt-threaded", "macros"] }
+tokio = { version = "1.7", features = ["rt"] }
diff --git a/influxdb/src/client/mod.rs b/influxdb/src/client/mod.rs
index 468b0ae..41ac198 100644
--- a/influxdb/src/client/mod.rs
+++ b/influxdb/src/client/mod.rs
@@ -16,7 +16,11 @@
 //! ```
 
 use futures::prelude::*;
-use surf::{self, Client as SurfClient, StatusCode};
+use http::StatusCode;
+#[cfg(feature = "reqwest")]
+use reqwest::{Client as HttpClient, Response as HttpResponse};
+#[cfg(feature = "surf")]
+use surf::{Client as HttpClient, Response as HttpResponse};
 
 use crate::query::QueryType;
 use crate::Error;
@@ -29,7 +33,7 @@ use std::sync::Arc;
 pub struct Client {
     pub(crate) url: Arc<String>,
     pub(crate) parameters: Arc<HashMap<&'static str, String>>,
-    pub(crate) client: SurfClient,
+    pub(crate) client: HttpClient,
 }
 
 impl Client {
@@ -57,7 +61,7 @@ impl Client {
         Client {
             url: Arc::new(url.into()),
             parameters: Arc::new(parameters),
-            client: SurfClient::new(),
+            client: HttpClient::new(),
         }
     }
 
@@ -112,10 +116,25 @@ impl Client {
                 error: format!("{}", err),
             })?;
 
-        let build = res.header("X-Influxdb-Build").unwrap().as_str();
-        let version = res.header("X-Influxdb-Version").unwrap().as_str();
+        const BUILD_HEADER: &str = "X-Influxdb-Build";
+        const VERSION_HEADER: &str = "X-Influxdb-Version";
 
-        Ok((build.to_owned(), version.to_owned()))
+        #[cfg(feature = "reqwest")]
+        let (build, version) = {
+            let hdrs = res.headers();
+            (
+                hdrs.get(BUILD_HEADER).and_then(|value| value.to_str().ok()),
+                hdrs.get(VERSION_HEADER)
+                    .and_then(|value| value.to_str().ok()),
+            )
+        };
+
+        #[cfg(feature = "surf")]
+        let build = res.header(BUILD_HEADER).map(|value| value.as_str());
+        #[cfg(feature = "surf")]
+        let version = res.header(VERSION_HEADER).map(|value| value.as_str());
+
+        Ok((build.unwrap().to_owned(), version.unwrap().to_owned()))
     }
 
     /// Sends a [`ReadQuery`](crate::ReadQuery) or [`WriteQuery`](crate::WriteQuery) to the InfluxDB Server.
@@ -184,32 +203,31 @@ impl Client {
 
                 self.client.post(url).body(query.get()).query(&parameters)
             }
-        }
-        .map_err(|err| Error::UrlConstructionError {
+        };
+
+        #[cfg(feature = "surf")]
+        let request_builder = request_builder.map_err(|err| Error::UrlConstructionError {
             error: err.to_string(),
         })?;
 
-        let request = request_builder.build();
-        let mut res = self
-            .client
-            .send(request)
+        let res = request_builder
+            .send()
             .map_err(|err| Error::ConnectionError {
                 error: err.to_string(),
             })
             .await?;
+        check_status(&res)?;
 
-        match res.status() {
-            StatusCode::Unauthorized => return Err(Error::AuthorizationError),
-            StatusCode::Forbidden => return Err(Error::AuthenticationError),
-            _ => {}
-        }
+        #[cfg(feature = "reqwest")]
+        let body = res.text();
+        #[cfg(feature = "surf")]
+        let mut res = res;
+        #[cfg(feature = "surf")]
+        let body = res.body_string();
 
-        let s = res
-            .body_string()
-            .await
-            .map_err(|_| Error::DeserializationError {
-                error: "response could not be converted to UTF-8".to_string(),
-            })?;
+        let s = body.await.map_err(|_| Error::DeserializationError {
+            error: "response could not be converted to UTF-8".to_string(),
+        })?;
 
         // todo: improve error parsing without serde
         if s.contains("\"error\"") {
@@ -222,6 +240,17 @@ impl Client {
     }
 }
 
+pub(crate) fn check_status(res: &HttpResponse) -> Result<(), Error> {
+    let status = res.status();
+    if status == StatusCode::UNAUTHORIZED.as_u16() {
+        Err(Error::AuthorizationError)
+    } else if status == StatusCode::FORBIDDEN.as_u16() {
+        Err(Error::AuthenticationError)
+    } else {
+        Ok(())
+    }
+}
+
 #[cfg(test)]
 mod tests {
     use super::Client;
diff --git a/influxdb/src/integrations/serde_integration/mod.rs b/influxdb/src/integrations/serde_integration/mod.rs
index 3a734af..00390b6 100644
--- a/influxdb/src/integrations/serde_integration/mod.rs
+++ b/influxdb/src/integrations/serde_integration/mod.rs
@@ -48,11 +48,9 @@
 
 mod de;
 
-use surf::StatusCode;
-
 use serde::{de::DeserializeOwned, Deserialize};
 
-use crate::{Client, Error, Query, ReadQuery};
+use crate::{Client, Error, Query, ReadQuery, client::check_status};
 
 #[derive(Deserialize)]
 #[doc(hidden)]
@@ -143,30 +141,31 @@ impl Client {
         let url = &format!("{}/query", &self.url);
         let mut parameters = self.parameters.as_ref().clone();
         parameters.insert("q", read_query);
-        let request = self
+        let request_builder = self
             .client
             .get(url)
-            .query(&parameters)
-            .map_err(|err| Error::UrlConstructionError {
-                error: err.to_string(),
-            })?
-            .build();
+            .query(&parameters);
 
-        let mut res = self
-            .client
-            .send(request)
+        #[cfg(feature = "surf")]
+        let request_builder = request_builder.map_err(|err| Error::UrlConstructionError {
+            error: err.to_string(),
+        })?;
+
+        let res = request_builder.send()
             .await
             .map_err(|err| Error::ConnectionError {
                 error: err.to_string(),
             })?;
-
-        match res.status() {
-            StatusCode::Unauthorized => return Err(Error::AuthorizationError),
-            StatusCode::Forbidden => return Err(Error::AuthenticationError),
-            _ => {}
-        }
-
-        let body = res.body_bytes().await.map_err(|err| Error::ProtocolError {
+        check_status(&res)?;
+
+        #[cfg(feature = "reqwest")]
+        let body = res.bytes();
+        #[cfg(feature = "surf")]
+        let mut res = res;
+        #[cfg(feature = "surf")]
+        let body = res.body_bytes();
+        
+        let body = body.await.map_err(|err| Error::ProtocolError {
             error: err.to_string(),
         })?;
 
diff --git a/influxdb/src/lib.rs b/influxdb/src/lib.rs
index 117f07f..bfd207d 100644
--- a/influxdb/src/lib.rs
+++ b/influxdb/src/lib.rs
@@ -30,8 +30,8 @@
 //! use influxdb::InfluxDbWriteable;
 //! use chrono::{DateTime, Utc};
 //!
-//! #[async_std::main]
-//! // or #[tokio::main] if you prefer
+//! #[tokio::main]
+//! // or #[async_std::main] if you prefer
 //! async fn main() {
 //!     // Connect to db `test` on `http://localhost:8086`
 //!     let client = Client::new("http://localhost:8086", "test");
@@ -69,11 +69,21 @@
 //!
 //! # Choice of HTTP backend
 //!
-//! To communicate with InfluxDB, you can choose the HTTP backend to be used configuring the appropriate feature:
+//! To communicate with InfluxDB, you can choose the HTTP backend to be used configuring the appropriate feature. We recommend sticking with the default reqwest-based client, unless you really need async-std compatibility.
 //!
-//! - **[hyper](https://github.com/hyperium/hyper)** (used by default)
+//! - **[hyper](https://github.com/hyperium/hyper)** (through reqwest, used by default), with [rustls](https://github.com/ctz/rustls)
+//!   ```toml
+//!   influxdb = { version = "0.4.0", features = ["derive"] }
+//!   ```
+//!
+//! - **[hyper](https://github.com/hyperium/hyper)** (through reqwest), with native TLS (OpenSSL)
+//!   ```toml
+//!   influxdb = { version = "0.4.0", default-features = false, features = ["derive", "use-serde", "reqwest-client"] }
+//!   ```
+//!
+//! - **[hyper](https://github.com/hyperium/hyper)** (through surf), use this if you need tokio 0.2 compatibility
 //!    ```toml
-//!    influxdb = { version = "0.4.0", features = ["derive"] }
+//!    influxdb = { version = "0.4.0", default-features = false, features = ["derive", "use-serde", "curl-client"] }
 //!    ```
 //! - **[curl](https://github.com/alexcrichton/curl-rust)**, using [libcurl](https://curl.se/libcurl/)
 //!    ```toml
@@ -99,6 +109,12 @@
 #![allow(clippy::needless_doctest_main)]
 #![allow(clippy::needless_lifetimes)] // False positive in client/mod.rs query fn
 
+#[cfg(all(feature = "reqwest", feature = "surf"))]
+compile_error!("You need to choose between reqwest and surf; enabling both is not supported");
+
+#[cfg(not(any(feature = "reqwest", feature = "surf")))]
+compile_error!("You need to choose an http client; consider not disabling default features");
+
 mod client;
 mod error;
 mod query;

From 01b4c876d8a3ae3262b217cff9adb8ff9d30e982 Mon Sep 17 00:00:00 2001
From: Dominic <git@msrd0.de>
Date: Thu, 24 Jun 2021 01:35:00 +0200
Subject: [PATCH 02/13] ci: add reqwest clients

---
 .github/workflows/rust.yml | 2 +-
 influxdb/Cargo.toml        | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml
index 209fcae..76d5c40 100644
--- a/.github/workflows/rust.yml
+++ b/.github/workflows/rust.yml
@@ -50,7 +50,7 @@ jobs:
         runs-on: ubuntu-latest
         strategy:
             matrix:
-                http-backend: [curl-client, h1-client, h1-client-rustls, hyper-client]
+                http-backend: [curl-client, h1-client, h1-client-rustls, hyper-client, reqwest-client, reqwest-client-rustls]
         services:
             influxdb:
                 image: influxdb:1.8
diff --git a/influxdb/Cargo.toml b/influxdb/Cargo.toml
index c07bf8f..8aee7f4 100644
--- a/influxdb/Cargo.toml
+++ b/influxdb/Cargo.toml
@@ -45,4 +45,4 @@ wasm-client = ["surf", "surf/wasm-client"]
 [dev-dependencies]
 async-std = { version = "1.6.5", features = ["attributes"] }
 tokio02 = { package = "tokio", version = "0.2.22", features = ["rt-threaded", "macros"] }
-tokio = { version = "1.7", features = ["rt"] }
+tokio = { version = "1.7", features = ["macros", "rt"] }

From 147416f0502ccc4f57e65c7721d080a1343e1050 Mon Sep 17 00:00:00 2001
From: Dominic <git@msrd0.de>
Date: Thu, 24 Jun 2021 01:36:01 +0200
Subject: [PATCH 03/13] ci: temporarily disable branch restriction

---
 .github/workflows/rust.yml | 1 -
 1 file changed, 1 deletion(-)

diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml
index 76d5c40..284c13b 100644
--- a/.github/workflows/rust.yml
+++ b/.github/workflows/rust.yml
@@ -3,7 +3,6 @@ name: Rust
 on:
   push:
     branches:
-      - master
   pull_request:
 
 jobs:

From ce2ddc99fe16cbfbc607626cabc9d166f40035fa Mon Sep 17 00:00:00 2001
From: Dominic <git@msrd0.de>
Date: Thu, 24 Jun 2021 01:39:13 +0200
Subject: [PATCH 04/13] my nightly rustfmt was bugged

---
 influxdb/src/integrations/serde_integration/mod.rs | 12 +++++-------
 1 file changed, 5 insertions(+), 7 deletions(-)

diff --git a/influxdb/src/integrations/serde_integration/mod.rs b/influxdb/src/integrations/serde_integration/mod.rs
index 00390b6..e0b6508 100644
--- a/influxdb/src/integrations/serde_integration/mod.rs
+++ b/influxdb/src/integrations/serde_integration/mod.rs
@@ -50,7 +50,7 @@ mod de;
 
 use serde::{de::DeserializeOwned, Deserialize};
 
-use crate::{Client, Error, Query, ReadQuery, client::check_status};
+use crate::{client::check_status, Client, Error, Query, ReadQuery};
 
 #[derive(Deserialize)]
 #[doc(hidden)]
@@ -141,17 +141,15 @@ impl Client {
         let url = &format!("{}/query", &self.url);
         let mut parameters = self.parameters.as_ref().clone();
         parameters.insert("q", read_query);
-        let request_builder = self
-            .client
-            .get(url)
-            .query(&parameters);
+        let request_builder = self.client.get(url).query(&parameters);
 
         #[cfg(feature = "surf")]
         let request_builder = request_builder.map_err(|err| Error::UrlConstructionError {
             error: err.to_string(),
         })?;
 
-        let res = request_builder.send()
+        let res = request_builder
+            .send()
             .await
             .map_err(|err| Error::ConnectionError {
                 error: err.to_string(),
@@ -164,7 +162,7 @@ impl Client {
         let mut res = res;
         #[cfg(feature = "surf")]
         let body = res.body_bytes();
-        
+
         let body = body.await.map_err(|err| Error::ProtocolError {
             error: err.to_string(),
         })?;

From c40b8a11021899f073b291cdc05671d2eaa19fef Mon Sep 17 00:00:00 2001
From: Dominic <git@msrd0.de>
Date: Thu, 24 Jun 2021 01:41:59 +0200
Subject: [PATCH 05/13] bump msrv to 1.46: socket2 crate uses match in const fn

---
 .github/workflows/rust.yml | 2 +-
 README.tpl                 | 6 +++---
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml
index 284c13b..ba09ab8 100644
--- a/.github/workflows/rust.yml
+++ b/.github/workflows/rust.yml
@@ -33,7 +33,7 @@ jobs:
         runs-on: ${{ matrix.os }}
         strategy:
             matrix:
-                rust_release: [1.45, stable, nightly]
+                rust_release: [1.46, stable, nightly]
                 os: [ubuntu-latest, windows-latest, macOS-latest]
 
         steps:
diff --git a/README.tpl b/README.tpl
index 0647cd3..4814b9c 100644
--- a/README.tpl
+++ b/README.tpl
@@ -25,11 +25,11 @@
     <a href="https://www.rust-lang.org/en-US/">
         <img src="https://img.shields.io/badge/Made%20with-Rust-orange.svg" alt='Build with Rust' />
     </a>
-    <a href="https://blog.rust-lang.org/2020/03/12/Rust-1.45.html">
-        <img src="https://img.shields.io/badge/rustc-1.45+-yellow.svg" alt='Minimum Rust Version' />
+    <a href="https://blog.rust-lang.org/2020/08/27/Rust-1.46.0.html">
+        <img src="https://img.shields.io/badge/rustc-1.46+-yellow.svg" alt='Minimum Rust Version' />
     </a>
 </p>
 
 {{readme}}
 
-@ 2020 Gero Gerke and [contributors](https://github.com/Empty2k12/influxdb-rust/graphs/contributors).
\ No newline at end of file
+@ 2020 Gero Gerke and [contributors](https://github.com/Empty2k12/influxdb-rust/graphs/contributors).

From c2e134070501589074bfb3ccb7200503e0a1be73 Mon Sep 17 00:00:00 2001
From: Dominic <git@msrd0.de>
Date: Thu, 24 Jun 2021 01:50:30 +0200
Subject: [PATCH 06/13] ci: do not use --all-features

---
 .github/workflows/rust.yml | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml
index ba09ab8..da37e83 100644
--- a/.github/workflows/rust.yml
+++ b/.github/workflows/rust.yml
@@ -25,8 +25,10 @@ jobs:
                   components: "rustfmt,clippy"
             - name: Check code formatting
               run: cargo fmt --all -- --check
-            - name: Check Clippy lints
-              run: cargo clippy --all-targets --all-features -- -D warnings
+            - name: Check Clippy lints (reqwest)
+              run: cargo clippy --all-targets --no-default-features --features use-serde,derive,reqwest-client -- -D warnings
+            - name: Check Clippy lints (surf)
+              run: cargo clippy --all-targets --no-default-features --features use-serde,derive,hyper-client -- -D warnings
 
     compile:
         name: Compile (${{ matrix.rust_release }}/${{ matrix.os }})
@@ -121,7 +123,7 @@ jobs:
               cargo tarpaulin -v \
                 --target-dir target/tarpaulin \
                 --workspace \
-                --all-features \
+                --features use-serde,derive \
                 --exclude-files 'derive/*' \
                 --exclude-files 'target/*' \
                 --ignore-panics --ignore-tests \

From c9ad6c71e6274681fdfbffeb398d7cb9a9a961fb Mon Sep 17 00:00:00 2001
From: Dominic <git@msrd0.de>
Date: Thu, 24 Jun 2021 01:51:38 +0200
Subject: [PATCH 07/13] update readme

---
 README.md | 24 +++++++++++++++++-------
 1 file changed, 17 insertions(+), 7 deletions(-)

diff --git a/README.md b/README.md
index 96b4aa1..908f17d 100644
--- a/README.md
+++ b/README.md
@@ -25,8 +25,8 @@
     <a href="https://www.rust-lang.org/en-US/">
         <img src="https://img.shields.io/badge/Made%20with-Rust-orange.svg" alt='Build with Rust' />
     </a>
-    <a href="https://blog.rust-lang.org/2020/03/12/Rust-1.45.html">
-        <img src="https://img.shields.io/badge/rustc-1.45+-yellow.svg" alt='Minimum Rust Version' />
+    <a href="https://blog.rust-lang.org/2020/08/27/Rust-1.46.0.html">
+        <img src="https://img.shields.io/badge/rustc-1.46+-yellow.svg" alt='Minimum Rust Version' />
     </a>
 </p>
 
@@ -62,8 +62,8 @@ use influxdb::{Client, Query, Timestamp};
 use influxdb::InfluxDbWriteable;
 use chrono::{DateTime, Utc};
 
-#[async_std::main]
-// or #[tokio::main] if you prefer
+#[tokio::main]
+// or #[async_std::main] if you prefer
 async fn main() {
     // Connect to db `test` on `http://localhost:8086`
     let client = Client::new("http://localhost:8086", "test");
@@ -101,11 +101,21 @@ in the repository.
 
 ## Choice of HTTP backend
 
-To communicate with InfluxDB, you can choose the HTTP backend to be used configuring the appropriate feature:
+To communicate with InfluxDB, you can choose the HTTP backend to be used configuring the appropriate feature. We recommend sticking with the default reqwest-based client, unless you really need async-std compatibility.
 
-- **[hyper](https://github.com/hyperium/hyper)** (used by default)
+- **[hyper](https://github.com/hyperium/hyper)** (through reqwest, used by default), with [rustls](https://github.com/ctz/rustls)
+  ```toml
+  influxdb = { version = "0.4.0", features = ["derive"] }
+  ```
+
+- **[hyper](https://github.com/hyperium/hyper)** (through reqwest), with native TLS (OpenSSL)
+  ```toml
+  influxdb = { version = "0.4.0", default-features = false, features = ["derive", "use-serde", "reqwest-client"] }
+  ```
+
+- **[hyper](https://github.com/hyperium/hyper)** (through surf), use this if you need tokio 0.2 compatibility
    ```toml
-   influxdb = { version = "0.4.0", features = ["derive"] }
+   influxdb = { version = "0.4.0", default-features = false, features = ["derive", "use-serde", "curl-client"] }
    ```
 - **[curl](https://github.com/alexcrichton/curl-rust)**, using [libcurl](https://curl.se/libcurl/)
    ```toml

From cebc42eb930e136c5f0ceacd0645428b6f5014d2 Mon Sep 17 00:00:00 2001
From: Dominic <git@msrd0.de>
Date: Thu, 24 Jun 2021 01:54:41 +0200
Subject: [PATCH 08/13] use the correct tokio rt feature

---
 influxdb/Cargo.toml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/influxdb/Cargo.toml b/influxdb/Cargo.toml
index 8aee7f4..0f2ba6f 100644
--- a/influxdb/Cargo.toml
+++ b/influxdb/Cargo.toml
@@ -45,4 +45,4 @@ wasm-client = ["surf", "surf/wasm-client"]
 [dev-dependencies]
 async-std = { version = "1.6.5", features = ["attributes"] }
 tokio02 = { package = "tokio", version = "0.2.22", features = ["rt-threaded", "macros"] }
-tokio = { version = "1.7", features = ["macros", "rt"] }
+tokio = { version = "1.7", features = ["macros", "rt-multi-thread"] }

From dd8b574b6b14431dc43ae63d1aaa356237b8d207 Mon Sep 17 00:00:00 2001
From: Dominic <git@msrd0.de>
Date: Thu, 24 Jun 2021 02:03:47 +0200
Subject: [PATCH 09/13] test with tokio by default

---
 influxdb/tests/derive_integration_tests.rs |  6 ++--
 influxdb/tests/integration_tests.rs        | 41 ++++++++++++++--------
 2 files changed, 30 insertions(+), 17 deletions(-)

diff --git a/influxdb/tests/derive_integration_tests.rs b/influxdb/tests/derive_integration_tests.rs
index 463fed9..d7c738f 100644
--- a/influxdb/tests/derive_integration_tests.rs
+++ b/influxdb/tests/derive_integration_tests.rs
@@ -51,7 +51,8 @@ fn test_build_query() {
 /// INTEGRATION TEST
 ///
 /// This integration tests that writing data and retrieving the data again is working
-#[async_std::test]
+#[cfg_attr(feature = "surf", tokio02::test)]
+#[cfg_attr(feature = "reqwest", tokio::test)]
 #[cfg(not(tarpaulin_include))]
 async fn test_derive_simple_write() {
     const TEST_NAME: &str = "test_derive_simple_write";
@@ -82,7 +83,8 @@ async fn test_derive_simple_write() {
 /// This integration tests that writing data and retrieving the data again is working
 #[cfg(feature = "derive")]
 #[cfg(feature = "use-serde")]
-#[async_std::test]
+#[cfg_attr(feature = "surf", tokio02::test)]
+#[cfg_attr(feature = "reqwest", tokio::test)]
 #[cfg(not(tarpaulin_include))]
 async fn test_write_and_read_option() {
     const TEST_NAME: &str = "test_write_and_read_option";
diff --git a/influxdb/tests/integration_tests.rs b/influxdb/tests/integration_tests.rs
index d92f405..27ec9c7 100644
--- a/influxdb/tests/integration_tests.rs
+++ b/influxdb/tests/integration_tests.rs
@@ -13,7 +13,7 @@ use influxdb::{Client, Error, Query, Timestamp};
 ///
 /// This test case tests whether the InfluxDB server can be connected to and gathers info about it - tested with async_std
 #[async_std::test]
-#[cfg(not(tarpaulin_include))]
+#[cfg(not(any(tarpaulin_include, feature = "reqwest")))]
 async fn test_ping_influx_db_async_std() {
     let client = create_client("notusedhere");
     let result = client.ping().await;
@@ -29,7 +29,8 @@ async fn test_ping_influx_db_async_std() {
 /// INTEGRATION TEST
 ///
 /// This test case tests whether the InfluxDB server can be connected to and gathers info about it * tested with tokio
-#[tokio::test]
+#[cfg_attr(feature = "surf", tokio02::test)]
+#[cfg_attr(feature = "reqwest", tokio::test)]
 #[cfg(not(tarpaulin_include))]
 async fn test_ping_influx_db_tokio() {
     let client = create_client("notusedhere");
@@ -46,7 +47,8 @@ async fn test_ping_influx_db_tokio() {
 /// INTEGRATION TEST
 ///
 /// This test case tests connection error
-#[async_std::test]
+#[cfg_attr(feature = "surf", tokio02::test)]
+#[cfg_attr(feature = "reqwest", tokio::test)]
 #[cfg(not(tarpaulin_include))]
 async fn test_connection_error() {
     let test_name = "test_connection_error";
@@ -67,7 +69,8 @@ async fn test_connection_error() {
 /// INTEGRATION TEST
 ///
 /// This test case tests the Authentication
-#[async_std::test]
+#[cfg_attr(feature = "surf", tokio02::test)]
+#[cfg_attr(feature = "reqwest", tokio::test)]
 #[cfg(not(tarpaulin_include))]
 async fn test_authed_write_and_read() {
     const TEST_NAME: &str = "test_authed_write_and_read";
@@ -115,7 +118,8 @@ async fn test_authed_write_and_read() {
 /// INTEGRATION TEST
 ///
 /// This test case tests the Authentication
-#[async_std::test]
+#[cfg_attr(feature = "surf", tokio02::test)]
+#[cfg_attr(feature = "reqwest", tokio::test)]
 #[cfg(not(tarpaulin_include))]
 async fn test_wrong_authed_write_and_read() {
     const TEST_NAME: &str = "test_wrong_authed_write_and_read";
@@ -185,7 +189,8 @@ async fn test_wrong_authed_write_and_read() {
 /// INTEGRATION TEST
 ///
 /// This test case tests the Authentication
-#[async_std::test]
+#[cfg_attr(feature = "surf", tokio02::test)]
+#[cfg_attr(feature = "reqwest", tokio::test)]
 #[cfg(not(tarpaulin_include))]
 async fn test_non_authed_write_and_read() {
     const TEST_NAME: &str = "test_non_authed_write_and_read";
@@ -240,7 +245,8 @@ async fn test_non_authed_write_and_read() {
 /// INTEGRATION TEST
 ///
 /// This integration tests that writing data and retrieving the data again is working
-#[async_std::test]
+#[cfg_attr(feature = "surf", tokio02::test)]
+#[cfg_attr(feature = "reqwest", tokio::test)]
 #[cfg(not(tarpaulin_include))]
 async fn test_write_and_read_field() {
     const TEST_NAME: &str = "test_write_field";
@@ -273,7 +279,8 @@ async fn test_write_and_read_field() {
 /// INTEGRATION TEST
 ///
 /// This integration tests that writing data and retrieving the data again is working
-#[async_std::test]
+#[cfg_attr(feature = "surf", tokio02::test)]
+#[cfg_attr(feature = "reqwest", tokio::test)]
 #[cfg(feature = "use-serde")]
 #[cfg(not(tarpaulin_include))]
 async fn test_write_and_read_option() {
@@ -335,7 +342,8 @@ async fn test_write_and_read_option() {
 ///
 /// This test case tests whether JSON can be decoded from a InfluxDB response and whether that JSON
 /// is equal to the data which was written to the database
-#[async_std::test]
+#[cfg_attr(feature = "surf", tokio02::test)]
+#[cfg_attr(feature = "reqwest", tokio::test)]
 #[cfg(feature = "use-serde")]
 #[cfg(not(tarpaulin_include))]
 async fn test_json_query() {
@@ -386,8 +394,9 @@ async fn test_json_query() {
 /// INTEGRATION TEST
 ///
 /// This test case tests whether the response to a GROUP BY can be parsed by
-// deserialize_next_tagged into a tags struct
-#[async_std::test]
+/// deserialize_next_tagged into a tags struct
+#[cfg_attr(feature = "surf", tokio02::test)]
+#[cfg_attr(feature = "reqwest", tokio::test)]
 #[cfg(feature = "use-serde")]
 #[cfg(not(tarpaulin_include))]
 async fn test_json_query_tagged() {
@@ -451,8 +460,8 @@ async fn test_json_query_tagged() {
 ///
 /// This test case tests whether JSON can be decoded from a InfluxDB response and wether that JSON
 /// is equal to the data which was written to the database
-/// (tested with tokio)
-#[tokio::test]
+#[cfg_attr(feature = "surf", tokio02::test)]
+#[cfg_attr(feature = "reqwest", tokio::test)]
 #[cfg(feature = "use-serde")]
 #[cfg(not(tarpaulin_include))]
 async fn test_json_query_vec() {
@@ -503,7 +512,8 @@ async fn test_json_query_vec() {
 /// INTEGRATION TEST
 ///
 /// This integration test tests whether using the wrong query method fails building the query
-#[async_std::test]
+#[cfg_attr(feature = "surf", tokio02::test)]
+#[cfg_attr(feature = "reqwest", tokio::test)]
 #[cfg(feature = "use-serde")]
 #[cfg(not(tarpaulin_include))]
 async fn test_serde_multi_query() {
@@ -580,7 +590,8 @@ async fn test_serde_multi_query() {
 /// INTEGRATION TEST
 ///
 /// This integration test tests whether using the wrong query method fails building the query
-#[async_std::test]
+#[cfg_attr(feature = "surf", tokio02::test)]
+#[cfg_attr(feature = "reqwest", tokio::test)]
 #[cfg(feature = "use-serde")]
 #[cfg(not(tarpaulin_include))]
 async fn test_wrong_query_errors() {

From a7ffaadd2a0c8f647d2b4795e6140d7f7cb7b12e Mon Sep 17 00:00:00 2001
From: Dominic <git@msrd0.de>
Date: Thu, 24 Jun 2021 02:10:14 +0200
Subject: [PATCH 10/13] Revert "test with tokio by default"

This reverts commit dd8b574b6b14431dc43ae63d1aaa356237b8d207.
---
 influxdb/tests/derive_integration_tests.rs |  6 ++--
 influxdb/tests/integration_tests.rs        | 39 ++++++++--------------
 2 files changed, 16 insertions(+), 29 deletions(-)

diff --git a/influxdb/tests/derive_integration_tests.rs b/influxdb/tests/derive_integration_tests.rs
index d7c738f..463fed9 100644
--- a/influxdb/tests/derive_integration_tests.rs
+++ b/influxdb/tests/derive_integration_tests.rs
@@ -51,8 +51,7 @@ fn test_build_query() {
 /// INTEGRATION TEST
 ///
 /// This integration tests that writing data and retrieving the data again is working
-#[cfg_attr(feature = "surf", tokio02::test)]
-#[cfg_attr(feature = "reqwest", tokio::test)]
+#[async_std::test]
 #[cfg(not(tarpaulin_include))]
 async fn test_derive_simple_write() {
     const TEST_NAME: &str = "test_derive_simple_write";
@@ -83,8 +82,7 @@ async fn test_derive_simple_write() {
 /// This integration tests that writing data and retrieving the data again is working
 #[cfg(feature = "derive")]
 #[cfg(feature = "use-serde")]
-#[cfg_attr(feature = "surf", tokio02::test)]
-#[cfg_attr(feature = "reqwest", tokio::test)]
+#[async_std::test]
 #[cfg(not(tarpaulin_include))]
 async fn test_write_and_read_option() {
     const TEST_NAME: &str = "test_write_and_read_option";
diff --git a/influxdb/tests/integration_tests.rs b/influxdb/tests/integration_tests.rs
index 27ec9c7..4167588 100644
--- a/influxdb/tests/integration_tests.rs
+++ b/influxdb/tests/integration_tests.rs
@@ -13,7 +13,7 @@ use influxdb::{Client, Error, Query, Timestamp};
 ///
 /// This test case tests whether the InfluxDB server can be connected to and gathers info about it - tested with async_std
 #[async_std::test]
-#[cfg(not(any(tarpaulin_include, feature = "reqwest")))]
+#[cfg(not(tarpaulin_include))]
 async fn test_ping_influx_db_async_std() {
     let client = create_client("notusedhere");
     let result = client.ping().await;
@@ -29,8 +29,7 @@ async fn test_ping_influx_db_async_std() {
 /// INTEGRATION TEST
 ///
 /// This test case tests whether the InfluxDB server can be connected to and gathers info about it * tested with tokio
-#[cfg_attr(feature = "surf", tokio02::test)]
-#[cfg_attr(feature = "reqwest", tokio::test)]
+#[tokio::test]
 #[cfg(not(tarpaulin_include))]
 async fn test_ping_influx_db_tokio() {
     let client = create_client("notusedhere");
@@ -47,8 +46,7 @@ async fn test_ping_influx_db_tokio() {
 /// INTEGRATION TEST
 ///
 /// This test case tests connection error
-#[cfg_attr(feature = "surf", tokio02::test)]
-#[cfg_attr(feature = "reqwest", tokio::test)]
+#[async_std::test]
 #[cfg(not(tarpaulin_include))]
 async fn test_connection_error() {
     let test_name = "test_connection_error";
@@ -69,8 +67,7 @@ async fn test_connection_error() {
 /// INTEGRATION TEST
 ///
 /// This test case tests the Authentication
-#[cfg_attr(feature = "surf", tokio02::test)]
-#[cfg_attr(feature = "reqwest", tokio::test)]
+#[async_std::test]
 #[cfg(not(tarpaulin_include))]
 async fn test_authed_write_and_read() {
     const TEST_NAME: &str = "test_authed_write_and_read";
@@ -118,8 +115,7 @@ async fn test_authed_write_and_read() {
 /// INTEGRATION TEST
 ///
 /// This test case tests the Authentication
-#[cfg_attr(feature = "surf", tokio02::test)]
-#[cfg_attr(feature = "reqwest", tokio::test)]
+#[async_std::test]
 #[cfg(not(tarpaulin_include))]
 async fn test_wrong_authed_write_and_read() {
     const TEST_NAME: &str = "test_wrong_authed_write_and_read";
@@ -189,8 +185,7 @@ async fn test_wrong_authed_write_and_read() {
 /// INTEGRATION TEST
 ///
 /// This test case tests the Authentication
-#[cfg_attr(feature = "surf", tokio02::test)]
-#[cfg_attr(feature = "reqwest", tokio::test)]
+#[async_std::test]
 #[cfg(not(tarpaulin_include))]
 async fn test_non_authed_write_and_read() {
     const TEST_NAME: &str = "test_non_authed_write_and_read";
@@ -245,8 +240,7 @@ async fn test_non_authed_write_and_read() {
 /// INTEGRATION TEST
 ///
 /// This integration tests that writing data and retrieving the data again is working
-#[cfg_attr(feature = "surf", tokio02::test)]
-#[cfg_attr(feature = "reqwest", tokio::test)]
+#[async_std::test]
 #[cfg(not(tarpaulin_include))]
 async fn test_write_and_read_field() {
     const TEST_NAME: &str = "test_write_field";
@@ -279,8 +273,7 @@ async fn test_write_and_read_field() {
 /// INTEGRATION TEST
 ///
 /// This integration tests that writing data and retrieving the data again is working
-#[cfg_attr(feature = "surf", tokio02::test)]
-#[cfg_attr(feature = "reqwest", tokio::test)]
+#[async_std::test]
 #[cfg(feature = "use-serde")]
 #[cfg(not(tarpaulin_include))]
 async fn test_write_and_read_option() {
@@ -342,8 +335,7 @@ async fn test_write_and_read_option() {
 ///
 /// This test case tests whether JSON can be decoded from a InfluxDB response and whether that JSON
 /// is equal to the data which was written to the database
-#[cfg_attr(feature = "surf", tokio02::test)]
-#[cfg_attr(feature = "reqwest", tokio::test)]
+#[async_std::test]
 #[cfg(feature = "use-serde")]
 #[cfg(not(tarpaulin_include))]
 async fn test_json_query() {
@@ -395,8 +387,7 @@ async fn test_json_query() {
 ///
 /// This test case tests whether the response to a GROUP BY can be parsed by
 /// deserialize_next_tagged into a tags struct
-#[cfg_attr(feature = "surf", tokio02::test)]
-#[cfg_attr(feature = "reqwest", tokio::test)]
+#[async_std::test]
 #[cfg(feature = "use-serde")]
 #[cfg(not(tarpaulin_include))]
 async fn test_json_query_tagged() {
@@ -460,8 +451,8 @@ async fn test_json_query_tagged() {
 ///
 /// This test case tests whether JSON can be decoded from a InfluxDB response and wether that JSON
 /// is equal to the data which was written to the database
-#[cfg_attr(feature = "surf", tokio02::test)]
-#[cfg_attr(feature = "reqwest", tokio::test)]
+/// (tested with tokio)
+#[tokio::test]
 #[cfg(feature = "use-serde")]
 #[cfg(not(tarpaulin_include))]
 async fn test_json_query_vec() {
@@ -512,8 +503,7 @@ async fn test_json_query_vec() {
 /// INTEGRATION TEST
 ///
 /// This integration test tests whether using the wrong query method fails building the query
-#[cfg_attr(feature = "surf", tokio02::test)]
-#[cfg_attr(feature = "reqwest", tokio::test)]
+#[async_std::test]
 #[cfg(feature = "use-serde")]
 #[cfg(not(tarpaulin_include))]
 async fn test_serde_multi_query() {
@@ -590,8 +580,7 @@ async fn test_serde_multi_query() {
 /// INTEGRATION TEST
 ///
 /// This integration test tests whether using the wrong query method fails building the query
-#[cfg_attr(feature = "surf", tokio02::test)]
-#[cfg_attr(feature = "reqwest", tokio::test)]
+#[async_std::test]
 #[cfg(feature = "use-serde")]
 #[cfg(not(tarpaulin_include))]
 async fn test_wrong_query_errors() {

From aa321fae7ea2b89476a0c6d6805689478ef070f4 Mon Sep 17 00:00:00 2001
From: Dominic <git@msrd0.de>
Date: Thu, 24 Jun 2021 02:12:43 +0200
Subject: [PATCH 11/13] enable async-std/tokio compatibility layer

---
 influxdb/Cargo.toml                 | 3 +--
 influxdb/tests/integration_tests.rs | 4 ++--
 2 files changed, 3 insertions(+), 4 deletions(-)

diff --git a/influxdb/Cargo.toml b/influxdb/Cargo.toml
index 0f2ba6f..b493399 100644
--- a/influxdb/Cargo.toml
+++ b/influxdb/Cargo.toml
@@ -43,6 +43,5 @@ reqwest-client-rustls = ["reqwest", "reqwest/rustls-tls-webpki-roots"]
 wasm-client = ["surf", "surf/wasm-client"]
 
 [dev-dependencies]
-async-std = { version = "1.6.5", features = ["attributes"] }
-tokio02 = { package = "tokio", version = "0.2.22", features = ["rt-threaded", "macros"] }
+async-std = { version = "1.6.5", features = ["attributes", "tokio02", "tokio1"] }
 tokio = { version = "1.7", features = ["macros", "rt-multi-thread"] }
diff --git a/influxdb/tests/integration_tests.rs b/influxdb/tests/integration_tests.rs
index 4167588..c7efe6a 100644
--- a/influxdb/tests/integration_tests.rs
+++ b/influxdb/tests/integration_tests.rs
@@ -28,9 +28,9 @@ async fn test_ping_influx_db_async_std() {
 
 /// INTEGRATION TEST
 ///
-/// This test case tests whether the InfluxDB server can be connected to and gathers info about it * tested with tokio
+/// This test case tests whether the InfluxDB server can be connected to and gathers info about it - tested with tokio 1.0
 #[tokio::test]
-#[cfg(not(tarpaulin_include))]
+#[cfg(not(any(tarpaulin_include, feature = "hyper-client")))]
 async fn test_ping_influx_db_tokio() {
     let client = create_client("notusedhere");
     let result = client.ping().await;

From 51a039e5302d2a554bca3f81659fd0c5e0599f60 Mon Sep 17 00:00:00 2001
From: Dominic <git@msrd0.de>
Date: Thu, 24 Jun 2021 02:17:21 +0200
Subject: [PATCH 12/13] there's another tokio test

---
 influxdb/tests/integration_tests.rs | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/influxdb/tests/integration_tests.rs b/influxdb/tests/integration_tests.rs
index c7efe6a..631023b 100644
--- a/influxdb/tests/integration_tests.rs
+++ b/influxdb/tests/integration_tests.rs
@@ -453,8 +453,10 @@ async fn test_json_query_tagged() {
 /// is equal to the data which was written to the database
 /// (tested with tokio)
 #[tokio::test]
-#[cfg(feature = "use-serde")]
-#[cfg(not(tarpaulin_include))]
+#[cfg(all(
+    feature = "use-serde",
+    not(any(tarpaulin_include, feature = "hyper-client"))
+))]
 async fn test_json_query_vec() {
     use serde::Deserialize;
 

From f9ccb0a8ca5c5325c9e600912be6db1a6b877094 Mon Sep 17 00:00:00 2001
From: Dominic <git@msrd0.de>
Date: Thu, 24 Jun 2021 02:23:20 +0200
Subject: [PATCH 13/13] Revert "ci: temporarily disable branch restriction"

This reverts commit 147416f0502ccc4f57e65c7721d080a1343e1050.
---
 .github/workflows/rust.yml | 1 +
 1 file changed, 1 insertion(+)

diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml
index da37e83..9654f39 100644
--- a/.github/workflows/rust.yml
+++ b/.github/workflows/rust.yml
@@ -3,6 +3,7 @@ name: Rust
 on:
   push:
     branches:
+      - master
   pull_request:
 
 jobs: