mirror of
https://github.com/fafhrd91/actix-web
synced 2024-11-27 17:52:56 +01:00
Allow to gracefully stop test server via TestServer::stop()
This commit is contained in:
parent
1c75e6876b
commit
7882f545e5
@ -6,6 +6,8 @@
|
|||||||
|
|
||||||
* Rename `HttpServer::start()` to `HttpServer::run()`
|
* Rename `HttpServer::start()` to `HttpServer::run()`
|
||||||
|
|
||||||
|
* Allow to gracefully stop test server via `TestServer::stop()`
|
||||||
|
|
||||||
|
|
||||||
## [2.0.0-rc] - 2019-12-20
|
## [2.0.0-rc] - 2019-12-20
|
||||||
|
|
||||||
|
46
src/data.rs
46
src/data.rs
@ -136,10 +136,11 @@ impl<T: 'static> DataFactory for Data<T> {
|
|||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use actix_service::Service;
|
use actix_service::Service;
|
||||||
|
use std::sync::atomic::{AtomicUsize, Ordering};
|
||||||
|
|
||||||
use super::*;
|
use super::*;
|
||||||
use crate::http::StatusCode;
|
use crate::http::StatusCode;
|
||||||
use crate::test::{init_service, TestRequest};
|
use crate::test::{self, init_service, TestRequest};
|
||||||
use crate::{web, App, HttpResponse};
|
use crate::{web, App, HttpResponse};
|
||||||
|
|
||||||
#[actix_rt::test]
|
#[actix_rt::test]
|
||||||
@ -234,4 +235,47 @@ mod tests {
|
|||||||
let resp = srv.call(req).await.unwrap();
|
let resp = srv.call(req).await.unwrap();
|
||||||
assert_eq!(resp.status(), StatusCode::OK);
|
assert_eq!(resp.status(), StatusCode::OK);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[actix_rt::test]
|
||||||
|
async fn test_data_drop() {
|
||||||
|
struct TestData(Arc<AtomicUsize>);
|
||||||
|
|
||||||
|
impl TestData {
|
||||||
|
fn new(inner: Arc<AtomicUsize>) -> Self {
|
||||||
|
let _ = inner.fetch_add(1, Ordering::SeqCst);
|
||||||
|
Self(inner)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Clone for TestData {
|
||||||
|
fn clone(&self) -> Self {
|
||||||
|
let inner = self.0.clone();
|
||||||
|
let _ = inner.fetch_add(1, Ordering::SeqCst);
|
||||||
|
Self(inner)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Drop for TestData {
|
||||||
|
fn drop(&mut self) {
|
||||||
|
let _ = self.0.fetch_sub(1, Ordering::SeqCst);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let num = Arc::new(AtomicUsize::new(0));
|
||||||
|
let data = TestData::new(num.clone());
|
||||||
|
assert_eq!(num.load(Ordering::SeqCst), 1);
|
||||||
|
|
||||||
|
let srv = test::start(move || {
|
||||||
|
let data = data.clone();
|
||||||
|
|
||||||
|
App::new()
|
||||||
|
.data(data)
|
||||||
|
.service(web::resource("/").to(|_data: Data<TestData>| async { "ok" }))
|
||||||
|
});
|
||||||
|
|
||||||
|
assert!(srv.get("/").send().await.unwrap().status().is_success());
|
||||||
|
srv.stop().await;
|
||||||
|
|
||||||
|
assert_eq!(num.load(Ordering::SeqCst), 0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
21
src/test.rs
21
src/test.rs
@ -11,8 +11,7 @@ use actix_http::http::{Error as HttpError, Method, StatusCode, Uri, Version};
|
|||||||
use actix_http::test::TestRequest as HttpTestRequest;
|
use actix_http::test::TestRequest as HttpTestRequest;
|
||||||
use actix_http::{cookie::Cookie, ws, Extensions, HttpService, Request};
|
use actix_http::{cookie::Cookie, ws, Extensions, HttpService, Request};
|
||||||
use actix_router::{Path, ResourceDef, Url};
|
use actix_router::{Path, ResourceDef, Url};
|
||||||
use actix_rt::System;
|
use actix_rt::{time::delay_for, System};
|
||||||
use actix_server::Server;
|
|
||||||
use actix_service::{
|
use actix_service::{
|
||||||
map_config, IntoService, IntoServiceFactory, Service, ServiceFactory,
|
map_config, IntoService, IntoServiceFactory, Service, ServiceFactory,
|
||||||
};
|
};
|
||||||
@ -30,7 +29,7 @@ pub use actix_http::test::TestBuffer;
|
|||||||
|
|
||||||
use crate::config::AppConfig;
|
use crate::config::AppConfig;
|
||||||
use crate::data::Data;
|
use crate::data::Data;
|
||||||
use crate::dev::{Body, MessageBody, Payload};
|
use crate::dev::{Body, MessageBody, Payload, Server};
|
||||||
use crate::request::HttpRequestPool;
|
use crate::request::HttpRequestPool;
|
||||||
use crate::rmap::ResourceMap;
|
use crate::rmap::ResourceMap;
|
||||||
use crate::service::{ServiceRequest, ServiceResponse};
|
use crate::service::{ServiceRequest, ServiceResponse};
|
||||||
@ -627,7 +626,7 @@ where
|
|||||||
let ctimeout = cfg.client_timeout;
|
let ctimeout = cfg.client_timeout;
|
||||||
let builder = Server::build().workers(1).disable_signals();
|
let builder = Server::build().workers(1).disable_signals();
|
||||||
|
|
||||||
match cfg.stream {
|
let srv = match cfg.stream {
|
||||||
StreamType::Tcp => match cfg.tp {
|
StreamType::Tcp => match cfg.tp {
|
||||||
HttpVer::Http1 => builder.listen("test", tcp, move || {
|
HttpVer::Http1 => builder.listen("test", tcp, move || {
|
||||||
let cfg =
|
let cfg =
|
||||||
@ -712,11 +711,11 @@ where
|
|||||||
.unwrap()
|
.unwrap()
|
||||||
.start();
|
.start();
|
||||||
|
|
||||||
tx.send((System::current(), local_addr)).unwrap();
|
tx.send((System::current(), srv, local_addr)).unwrap();
|
||||||
sys.run()
|
sys.run()
|
||||||
});
|
});
|
||||||
|
|
||||||
let (system, addr) = rx.recv().unwrap();
|
let (system, server, addr) = rx.recv().unwrap();
|
||||||
|
|
||||||
let client = {
|
let client = {
|
||||||
let connector = {
|
let connector = {
|
||||||
@ -752,6 +751,7 @@ where
|
|||||||
addr,
|
addr,
|
||||||
client,
|
client,
|
||||||
system,
|
system,
|
||||||
|
server,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -848,6 +848,7 @@ pub struct TestServer {
|
|||||||
client: awc::Client,
|
client: awc::Client,
|
||||||
system: actix_rt::System,
|
system: actix_rt::System,
|
||||||
ssl: bool,
|
ssl: bool,
|
||||||
|
server: Server,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl TestServer {
|
impl TestServer {
|
||||||
@ -936,15 +937,17 @@ impl TestServer {
|
|||||||
self.ws_at("/").await
|
self.ws_at("/").await
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Stop http server
|
/// Gracefully stop http server
|
||||||
fn stop(&mut self) {
|
pub async fn stop(self) {
|
||||||
|
self.server.stop(true).await;
|
||||||
self.system.stop();
|
self.system.stop();
|
||||||
|
delay_for(time::Duration::from_millis(100)).await;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Drop for TestServer {
|
impl Drop for TestServer {
|
||||||
fn drop(&mut self) {
|
fn drop(&mut self) {
|
||||||
self.stop()
|
self.system.stop()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user