Browse Source

Unit test for #52

yhirose 7 years ago
parent
commit
9dc4e23082
2 changed files with 20 additions and 0 deletions
  1. 7 0
      httplib.h
  2. 13 0
      test/test.cc

+ 7 - 0
httplib.h

@@ -205,6 +205,8 @@ public:
     bool is_running() const;
     bool is_running() const;
     void stop();
     void stop();
 
 
+    bool is_handling_requests() const;
+
 protected:
 protected:
     bool process_request(Stream& strm, bool last_connection);
     bool process_request(Stream& strm, bool last_connection);
 
 
@@ -1482,6 +1484,11 @@ inline void Server::stop()
     svr_sock_ = -1;
     svr_sock_ = -1;
 }
 }
 
 
+inline bool Server::is_handling_requests() const
+{
+    return running_threads_ > 0;
+}
+
 inline bool Server::parse_request_line(const char* s, Request& req)
 inline bool Server::parse_request_line(const char* s, Request& req)
 {
 {
     static std::regex re("(GET|HEAD|POST) ([^?]+)(?:\\?(.+?))? (HTTP/1\\.[01])\r\n");
     static std::regex re("(GET|HEAD|POST) ([^?]+)(?:\\?(.+?))? (HTTP/1\\.[01])\r\n");

+ 13 - 0
test/test.cc

@@ -262,6 +262,10 @@ protected:
         svr_.get("/hi", [&](const Request& /*req*/, Response& res) {
         svr_.get("/hi", [&](const Request& /*req*/, Response& res) {
                 res.set_content("Hello World!", "text/plain");
                 res.set_content("Hello World!", "text/plain");
             })
             })
+            .get("/slow", [&](const Request& /*req*/, Response& res) {
+                msleep(3000);
+                res.set_content("slow", "text/plain");
+            })
             .get("/remote_addr", [&](const Request& req, Response& res) {
             .get("/remote_addr", [&](const Request& req, Response& res) {
                 auto remote_addr = req.headers.find("REMOTE_ADDR")->second;
                 auto remote_addr = req.headers.find("REMOTE_ADDR")->second;
                 res.set_content(remote_addr.c_str(), "text/plain");
                 res.set_content(remote_addr.c_str(), "text/plain");
@@ -358,6 +362,7 @@ protected:
     virtual void TearDown() {
     virtual void TearDown() {
         svr_.stop();
         svr_.stop();
         t_.join();
         t_.join();
+        EXPECT_EQ(false, svr_.is_handling_requests());
     }
     }
 
 
     map<string, string> persons_;
     map<string, string> persons_;
@@ -664,6 +669,14 @@ TEST_F(ServerTest, GetMethodRemoteAddr)
     EXPECT_TRUE(res->body == "::1" || res->body == "127.0.0.1");
     EXPECT_TRUE(res->body == "::1" || res->body == "127.0.0.1");
 }
 }
 
 
+TEST_F(ServerTest, SlowRequest)
+{
+    std::thread([=]() { auto res = cli_.get("/slow"); }).detach();
+    std::thread([=]() { auto res = cli_.get("/slow"); }).detach();
+    std::thread([=]() { auto res = cli_.get("/slow"); }).detach();
+    msleep(1000);
+}
+
 #ifdef CPPHTTPLIB_ZLIB_SUPPORT
 #ifdef CPPHTTPLIB_ZLIB_SUPPORT
 TEST_F(ServerTest, Gzip)
 TEST_F(ServerTest, Gzip)
 {
 {