PageRenderTime 32ms CodeModel.GetById 25ms RepoModel.GetById 0ms app.codeStats 0ms

/mordor/tests/http_servlet_dispatcher.cpp

http://github.com/mozy/mordor
C++ | 118 lines | 90 code | 18 blank | 10 comment | 0 complexity | cda4434a5d006ab8b199bd3c50ecaa7c MD5 | raw file
Possible License(s): BSD-3-Clause
  1. // Copyright (c) 2010 - Mozy, Inc.
  2. #include "mordor/http/servlet.h"
  3. #include "mordor/test/test.h"
  4. using namespace Mordor;
  5. using namespace Mordor::HTTP;
  6. namespace {
  7. class DummyServlet : public Servlet
  8. {
  9. public:
  10. void request(boost::shared_ptr<ServerRequest> request) {}
  11. };
  12. }
  13. MORDOR_UNITTEST(ServletDispatcher, basic)
  14. {
  15. ServletDispatcher dispatcher;
  16. Servlet::ptr root(new DummyServlet), ab(new DummyServlet),
  17. ca(new DummyServlet), ma(new DummyServlet), wl(new DummyServlet);
  18. // non registered, can't find any
  19. MORDOR_TEST_ASSERT(!dispatcher.getServlet("/d/e/f"));
  20. dispatcher.registerServlet("/a/b", ab);
  21. dispatcher.registerServlet("/c/a", ca);
  22. dispatcher.registerServlet("/m/a/", ma);
  23. dispatcher.registerServlet("/w/*/l/", wl);
  24. // some servlets registered, still can't find it
  25. MORDOR_TEST_ASSERT(!dispatcher.getServlet("/d/e/f"));
  26. dispatcher.registerServlet("/", root);
  27. MORDOR_TEST_ASSERT_EQUAL(dispatcher.getServlet("/d/e/f"), root);
  28. MORDOR_TEST_ASSERT_EQUAL(dispatcher.getServlet("/a/b") , ab);
  29. MORDOR_TEST_ASSERT_EQUAL(dispatcher.getServlet("/a/b/") , ab);
  30. MORDOR_TEST_ASSERT_EQUAL(dispatcher.getServlet("/a/b/c") , ab);
  31. MORDOR_TEST_ASSERT_EQUAL(dispatcher.getServlet("/a/b/c/d") , ab);
  32. MORDOR_TEST_ASSERT_EQUAL(dispatcher.getServlet("/A/B") , root);
  33. MORDOR_TEST_ASSERT_EQUAL(dispatcher.getServlet("/a") , root);
  34. MORDOR_TEST_ASSERT_EQUAL(dispatcher.getServlet("/a/bc") , root);
  35. MORDOR_TEST_ASSERT_EQUAL(dispatcher.getServlet("/m/a/b/c") , ma);
  36. MORDOR_TEST_ASSERT_EQUAL(dispatcher.getServlet("/m/a/") , ma);
  37. MORDOR_TEST_ASSERT_EQUAL(dispatcher.getServlet("/m/a") , root);
  38. MORDOR_TEST_ASSERT_EQUAL(dispatcher.getServlet("/w/*/l/") , wl);
  39. // can only match the root
  40. MORDOR_TEST_ASSERT_EQUAL(dispatcher.getServlet("/w/a/l/") , root);
  41. // Dispatcher does URI normalization
  42. MORDOR_TEST_ASSERT_EQUAL(dispatcher.getServlet("/a/b/../../c/a"), ca);
  43. }
  44. MORDOR_UNITTEST(ServletDispatcher, vhosts)
  45. {
  46. ServletDispatcher dispatcher;
  47. Servlet::ptr root(new DummyServlet), trogdor(new DummyServlet),
  48. mordor(new DummyServlet);
  49. dispatcher.registerServlet("http://trogdor/", trogdor);
  50. dispatcher.registerServlet("//mordor/", mordor);
  51. MORDOR_TEST_ASSERT(!dispatcher.getServlet("/"));
  52. MORDOR_TEST_ASSERT(!dispatcher.getServlet("//triton/"));
  53. MORDOR_TEST_ASSERT_EQUAL(dispatcher.getServlet("//trogdor/a/b") , trogdor);
  54. MORDOR_TEST_ASSERT_EQUAL(dispatcher.getServlet("//mordor/a/b") , mordor);
  55. MORDOR_TEST_ASSERT_EQUAL(dispatcher.getServlet("http://trogdor/a/b") , trogdor);
  56. MORDOR_TEST_ASSERT_EQUAL(dispatcher.getServlet("http://mordor/a/b") , mordor);
  57. dispatcher.registerServlet("/", root);
  58. MORDOR_TEST_ASSERT_EQUAL(dispatcher.getServlet("/") , root);
  59. MORDOR_TEST_ASSERT_EQUAL(dispatcher.getServlet("//triton/") , root);
  60. MORDOR_TEST_ASSERT_EQUAL(dispatcher.getServlet("//trogdor/a/b") , trogdor);
  61. MORDOR_TEST_ASSERT_EQUAL(dispatcher.getServlet("//mordor/a/b") , mordor);
  62. }
  63. MORDOR_UNITTEST(ServletDispatcher, wildcardBasic)
  64. {
  65. ServletDispatcher dispatcher(true);
  66. Servlet::ptr axb(new DummyServlet), cxdx(new DummyServlet);
  67. dispatcher.registerServlet("/a/*/b", axb);
  68. dispatcher.registerServlet("/c/*/d/*/", cxdx);
  69. MORDOR_TEST_ASSERT_EQUAL(dispatcher.getServlet("/a/b/b"), axb);
  70. MORDOR_TEST_ASSERT_EQUAL(dispatcher.getServlet("/a/cc/b"), axb);
  71. MORDOR_TEST_ASSERT_EQUAL(dispatcher.getServlet("/a/cc/b/d"), axb);
  72. MORDOR_TEST_ASSERT_EQUAL(dispatcher.getServlet("/c/y/d/m/n"), cxdx);
  73. MORDOR_TEST_ASSERT_EQUAL(dispatcher.getServlet("/a/b/b/b"), axb);
  74. // not match
  75. MORDOR_TEST_ASSERT(!dispatcher.getServlet("/a/b/c"));
  76. MORDOR_TEST_ASSERT(!dispatcher.getServlet("/b/*/b"));
  77. }
  78. MORDOR_UNITTEST(ServletDispatcher, wildcardLowerPriority)
  79. {
  80. ServletDispatcher dispatcher(true);
  81. Servlet::ptr axb(new DummyServlet), abb(new DummyServlet);
  82. dispatcher.registerServlet("/a/*/b", axb);
  83. dispatcher.registerServlet("/a/b/b", abb);
  84. // both match, wildcard has lower priority
  85. MORDOR_TEST_ASSERT_EQUAL(dispatcher.getServlet("/a/b/b/c"), abb);
  86. MORDOR_TEST_ASSERT_EQUAL(dispatcher.getServlet("/a/c/b/c"), axb);
  87. }
  88. MORDOR_UNITTEST(ServletDispatcher, wildcardMatchSeqOrder)
  89. {
  90. ServletDispatcher dispatcher(true);
  91. Servlet::ptr axb(new DummyServlet), acx(new DummyServlet);
  92. dispatcher.registerServlet("/a/*/b", axb);
  93. dispatcher.registerServlet("/a/c/*", acx);
  94. // only axb match
  95. MORDOR_TEST_ASSERT_EQUAL(dispatcher.getServlet("/a/x/b/c"), axb);
  96. // only acx match
  97. MORDOR_TEST_ASSERT_EQUAL(dispatcher.getServlet("/a/c/x/c"), acx);
  98. // both match, the one who has the wildcard in the most right win
  99. MORDOR_TEST_ASSERT_EQUAL(dispatcher.getServlet("/a/c/b/d"), acx);
  100. }