blob: 79320f7e04ee6127b85aa62ad0dd88ef7746b722 [file] [log] [blame]
Nan Zhoud5c80ad2022-07-11 01:16:31 +00001#include "async_resp.hpp" // IWYU pragma: keep
Ed Tanous88a03c52022-03-14 10:16:07 -07002#include "http_request.hpp"
3#include "routing.hpp"
Nan Zhoudff2f9b2022-06-26 23:50:39 +00004#include "utility.hpp"
Ed Tanous88a03c52022-03-14 10:16:07 -07005
Nan Zhoud5c80ad2022-07-11 01:16:31 +00006#include <boost/beast/http/message.hpp> // IWYU pragma: keep
Nan Zhoudff2f9b2022-06-26 23:50:39 +00007#include <boost/beast/http/verb.hpp>
8
9#include <memory>
10#include <string>
11#include <string_view>
12#include <system_error>
13
Nan Zhoud5c80ad2022-07-11 01:16:31 +000014#include <gtest/gtest.h> // IWYU pragma: keep
15
16// IWYU pragma: no_include <boost/beast/http/impl/message.hpp>
17// IWYU pragma: no_include "gtest/gtest_pred_impl.h"
18// IWYU pragma: no_include <boost/intrusive/detail/list_iterator.hpp>
19// IWYU pragma: no_include <gtest/gtest-message.h>
20// IWYU pragma: no_include <gtest/gtest-test-part.h>
21// IWYU pragma: no_forward_declare bmcweb::AsyncResp
Ed Tanous88a03c52022-03-14 10:16:07 -070022
Nan Zhouef740262022-06-26 23:55:13 +000023namespace crow
24{
25namespace
26{
27
28using ::crow::black_magic::getParameterTag;
29
Ed Tanous88a03c52022-03-14 10:16:07 -070030TEST(Router, AllowHeader)
31{
32 // Callback handler that does nothing
Nan Zhouef740262022-06-26 23:55:13 +000033 auto nullCallback = [](const Request&,
Ed Tanous88a03c52022-03-14 10:16:07 -070034 const std::shared_ptr<bmcweb::AsyncResp>&) {};
35
Nan Zhouef740262022-06-26 23:55:13 +000036 Router router;
Ed Tanous88a03c52022-03-14 10:16:07 -070037 std::error_code ec;
38
Ed Tanous26ccae32023-02-16 10:28:44 -080039 constexpr std::string_view url = "/foo";
Ed Tanous88a03c52022-03-14 10:16:07 -070040
Nan Zhouef740262022-06-26 23:55:13 +000041 Request req{{boost::beast::http::verb::get, url, 11}, ec};
Ed Tanous88a03c52022-03-14 10:16:07 -070042
43 // No route should return no methods.
44 router.validate();
Ed Tanous44e45182022-07-26 16:47:23 -070045 EXPECT_EQ(router.findRoute(req).allowHeader, "");
46 EXPECT_EQ(router.findRoute(req).route.rule, nullptr);
Ed Tanous88a03c52022-03-14 10:16:07 -070047
Nan Zhouef740262022-06-26 23:55:13 +000048 router.newRuleTagged<getParameterTag(url)>(std::string(url))
Ed Tanous88a03c52022-03-14 10:16:07 -070049 .methods(boost::beast::http::verb::get)(nullCallback);
50 router.validate();
Ed Tanous44e45182022-07-26 16:47:23 -070051 EXPECT_EQ(router.findRoute(req).allowHeader, "GET");
52 EXPECT_NE(router.findRoute(req).route.rule, nullptr);
53
54 Request patchReq{{boost::beast::http::verb::patch, url, 11}, ec};
55 EXPECT_EQ(router.findRoute(patchReq).route.rule, nullptr);
Ed Tanous88a03c52022-03-14 10:16:07 -070056
Nan Zhouef740262022-06-26 23:55:13 +000057 router.newRuleTagged<getParameterTag(url)>(std::string(url))
Ed Tanous88a03c52022-03-14 10:16:07 -070058 .methods(boost::beast::http::verb::patch)(nullCallback);
59 router.validate();
Ed Tanous44e45182022-07-26 16:47:23 -070060 EXPECT_EQ(router.findRoute(req).allowHeader, "GET, PATCH");
61 EXPECT_NE(router.findRoute(req).route.rule, nullptr);
62 EXPECT_NE(router.findRoute(patchReq).route.rule, nullptr);
63}
64
65TEST(Router, 404)
66{
67 bool notFoundCalled = false;
68 // Callback handler that does nothing
69 auto nullCallback =
70 [&notFoundCalled](const Request&,
71 const std::shared_ptr<bmcweb::AsyncResp>&) {
72 notFoundCalled = true;
73 };
74
75 Router router;
76 std::error_code ec;
77
Ed Tanous26ccae32023-02-16 10:28:44 -080078 constexpr std::string_view url = "/foo/bar";
Ed Tanous44e45182022-07-26 16:47:23 -070079
80 Request req{{boost::beast::http::verb::get, url, 11}, ec};
81
82 router.newRuleTagged<getParameterTag(url)>("/foo/<path>")
83 .notFound()(nullCallback);
84 router.validate();
85 {
86 std::shared_ptr<bmcweb::AsyncResp> asyncResp =
87 std::make_shared<bmcweb::AsyncResp>();
88
89 router.handle(req, asyncResp);
90 }
91 EXPECT_TRUE(notFoundCalled);
Nan Zhouef740262022-06-26 23:55:13 +000092}
Ed Tanous759cf102022-07-31 16:36:52 -070093
94TEST(Router, 405)
95{
96 // Callback handler that does nothing
97 auto nullCallback = [](const Request&,
98 const std::shared_ptr<bmcweb::AsyncResp>&) {};
99 bool called = false;
100 auto notAllowedCallback =
101 [&called](const Request&, const std::shared_ptr<bmcweb::AsyncResp>&) {
102 called = true;
103 };
104
105 Router router;
106 std::error_code ec;
107
Ed Tanous26ccae32023-02-16 10:28:44 -0800108 constexpr std::string_view url = "/foo/bar";
Ed Tanous759cf102022-07-31 16:36:52 -0700109
110 Request req{{boost::beast::http::verb::patch, url, 11}, ec};
111
112 router.newRuleTagged<getParameterTag(url)>(std::string(url))
113 .methods(boost::beast::http::verb::get)(nullCallback);
114 router.newRuleTagged<getParameterTag(url)>("/foo/<path>")
115 .methodNotAllowed()(notAllowedCallback);
116 router.validate();
117 {
118 std::shared_ptr<bmcweb::AsyncResp> asyncResp =
119 std::make_shared<bmcweb::AsyncResp>();
120
121 router.handle(req, asyncResp);
122 }
123 EXPECT_TRUE(called);
124}
Nan Zhouef740262022-06-26 23:55:13 +0000125} // namespace
Ed Tanous44e45182022-07-26 16:47:23 -0700126} // namespace crow