Bladeren bron

[Monitoring] Tests added

Slava Barinov 2 jaren geleden
bovenliggende
commit
85f8a4b025
5 gewijzigde bestanden met toevoegingen van 108 en 10 verwijderingen
  1. 2 2
      .drone.yml
  2. 2 2
      .github/workflows/rust.yml
  3. 1 0
      Cargo.lock
  4. 3 0
      Cargo.toml
  5. 100 6
      src/monitoring.rs

+ 2 - 2
.drone.yml

@@ -7,8 +7,8 @@ steps:
   image: rust:1.73
   commands:
   - rustup default nightly
-  - cargo build --verbose --all
-  - cargo test --verbose --all
+  - cargo build --verbose --all --features docker
+  - cargo test --verbose --all --features docker
 
 - name: build docker image
   image: plugins/docker

+ 2 - 2
.github/workflows/rust.yml

@@ -51,7 +51,7 @@ jobs:
         uses: actions-rs/cargo@v1
         with:
           command: test
-          args: --release
+          args: --release --features monitoring
 
       - name: Collect test coverage
         uses: actions-rs/tarpaulin@v0.1
@@ -60,7 +60,7 @@ jobs:
           version: '0.16.0'
           out-type: Xml
           run-types: 'Tests'
-          args: '--force-clean -- --test-threads 1'
+          args: '--force-clean --features monitoring -- --test-threads 1 '
 
       - name: Upload to codecov.io
         uses: codecov/codecov-action@v1.0.2

+ 1 - 0
Cargo.lock

@@ -1426,6 +1426,7 @@ dependencies = [
  "qif_generator",
  "radix_trie",
  "rand",
+ "reqwest",
  "rustyline",
  "rustyline-derive",
  "serde",

+ 3 - 0
Cargo.toml

@@ -36,6 +36,9 @@ rand = { version = "0.8", optional = true }
 cc = { version = "1.0", optional = true }
 pkg-config = { version = "0.3", optional = true }
 
+[dev-dependencies]
+reqwest = "0.11"
+
 [features]
 default = [ "telegram" ]
 tv = [ "cc", "pkg-config" ]

+ 100 - 6
src/monitoring.rs

@@ -1,6 +1,7 @@
 use lazy_static::lazy_static;
 use prometheus::{IntCounter, Registry};
 use std::result::Result;
+use std::sync::atomic::{AtomicBool, Ordering};
 use warp::{Filter, Rejection, Reply};
 
 lazy_static! {
@@ -9,6 +10,32 @@ lazy_static! {
     pub static ref REGISTRY: Registry = Registry::new();
 }
 
+#[cfg(test)]
+lazy_static! {
+    static ref METRICS_REGISTERED: AtomicBool = AtomicBool::new(false);
+}
+
+#[cfg(test)]
+fn register_custom_metrics() {
+    if METRICS_REGISTERED
+        .compare_exchange(false, true, Ordering::SeqCst, Ordering::SeqCst)
+        .is_ok()
+    {
+        REGISTRY
+            .register(Box::new(INCOMING_REQUESTS.clone()))
+            .expect("collector can be registered");
+        // Add more metrics here as needed
+    }
+}
+
+#[cfg(not(test))]
+fn register_custom_metrics() {
+    REGISTRY
+        .register(Box::new(INCOMING_REQUESTS.clone()))
+        .expect("collector can be registered");
+    // Add more metrics here as needed
+}
+
 pub async fn web_main() {
     register_custom_metrics();
 
@@ -20,12 +47,6 @@ pub async fn web_main() {
         .await;
 }
 
-fn register_custom_metrics() {
-    REGISTRY
-        .register(Box::new(INCOMING_REQUESTS.clone()))
-        .expect("collector can be registered");
-}
-
 async fn status_handler() -> Result<impl Reply, Rejection> {
     Ok("ok")
 }
@@ -63,3 +84,76 @@ async fn metrics_handler() -> Result<impl Reply, Rejection> {
     res.push_str(&res_custom);
     Ok(res)
 }
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+    use reqwest::{Client, StatusCode};
+    use warp::Filter;
+
+    // Start a Warp server for testing
+    async fn setup() -> String {
+        register_custom_metrics();
+
+        let metrics_route = warp::path!("metrics").and_then(metrics_handler);
+        let status_route = warp::path!("status").and_then(status_handler);
+
+        let routes = metrics_route.or(status_route);
+        let (addr, server) = warp::serve(routes).bind_ephemeral(([127, 0, 0, 1], 0)); // Bind to a random port
+
+        tokio::spawn(async move {
+            server.await;
+        }); // Spawn the server in a background task
+
+        format!("http://{}", addr) // Return the address
+    }
+
+    #[tokio::test]
+    async fn test_status_handler() {
+        let base_url = setup().await;
+        println!("{}", base_url);
+        let client = Client::builder().no_proxy().build().unwrap();
+
+        let response = client
+            .get(format!("{}/status", base_url))
+            .send()
+            .await
+            .unwrap();
+
+        assert_eq!(response.status(), StatusCode::OK);
+        assert_eq!(response.text().await.unwrap(), "ok");
+    }
+
+    #[tokio::test]
+    async fn test_metrics_handler() {
+        let base_url = setup().await;
+        let client = Client::builder().no_proxy().build().unwrap();
+
+        let response = client
+            .get(format!("{}/metrics", base_url))
+            .send()
+            .await
+            .unwrap();
+
+        assert_eq!(response.status(), StatusCode::OK);
+
+        assert!(response
+            .text()
+            .await
+            .unwrap()
+            .contains("incoming_requests 0"));
+
+        INCOMING_REQUESTS.inc();
+        let response = client
+            .get(format!("{}/metrics", base_url))
+            .send()
+            .await
+            .unwrap();
+
+        assert!(response
+            .text()
+            .await
+            .unwrap()
+            .contains("incoming_requests 1"));
+    }
+}