Squashed 'test/compatibility/C/uWebSockets/' content from commit 03681cc
git-subtree-dir: test/compatibility/C/uWebSockets git-subtree-split: 03681ccbe630eb4db6322557e6bfe8cda8f41526
This commit is contained in:
		
							
								
								
									
										247
									
								
								tests/HttpRouter.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										247
									
								
								tests/HttpRouter.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,247 @@
 | 
			
		||||
#include "../src/HttpRouter.h"
 | 
			
		||||
 | 
			
		||||
#include <cassert>
 | 
			
		||||
#include <iostream>
 | 
			
		||||
 | 
			
		||||
void testMethodPriority() {
 | 
			
		||||
    std::cout << "TestMethodPriority" << std::endl;
 | 
			
		||||
    uWS::HttpRouter<int> r;
 | 
			
		||||
    std::string result;
 | 
			
		||||
 | 
			
		||||
    r.add(r.methods, "/static/route", [&result](auto *) {
 | 
			
		||||
        std::cout << "ANY static route" << std::endl;
 | 
			
		||||
        result += "AS";
 | 
			
		||||
        return true;
 | 
			
		||||
    }, r.LOW_PRIORITY);
 | 
			
		||||
 | 
			
		||||
    r.add({"patch"}, "/static/route", [&result](auto *) {
 | 
			
		||||
        std::cout << "PATCH static route" << std::endl;
 | 
			
		||||
        result += "PS";
 | 
			
		||||
        return false;
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    r.add({"get"}, "/static/route", [&result](auto *) {
 | 
			
		||||
        std::cout << "GET static route" << std::endl;
 | 
			
		||||
        result += "GS";
 | 
			
		||||
        return true;
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    assert(r.route("nonsense", "/static/route") == false);
 | 
			
		||||
    assert(r.route("get", "/static") == false);
 | 
			
		||||
    assert(result == "");
 | 
			
		||||
 | 
			
		||||
    /* Should end up directly in ANY handler */
 | 
			
		||||
    result.clear();
 | 
			
		||||
    assert(r.route("post", "/static/route"));
 | 
			
		||||
    assert(result == "AS");
 | 
			
		||||
 | 
			
		||||
    /* Should up directly in GET handler */
 | 
			
		||||
    result.clear();
 | 
			
		||||
    assert(r.route("get", "/static/route"));
 | 
			
		||||
    assert(result == "GS");
 | 
			
		||||
 | 
			
		||||
    /* Should end up in PATCH then in ANY handler */
 | 
			
		||||
    result.clear();
 | 
			
		||||
    assert(r.route("patch", "/static/route"));
 | 
			
		||||
    assert(result == "PSAS");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void testPatternPriority() {
 | 
			
		||||
    std::cout << "TestPatternPriority" << std::endl;
 | 
			
		||||
    uWS::HttpRouter<int> r;
 | 
			
		||||
    std::string result;
 | 
			
		||||
 | 
			
		||||
    r.add(r.methods, "/a/b/c", [&result](auto *) {
 | 
			
		||||
        std::cout << "ANY static route" << std::endl;
 | 
			
		||||
        result += "AS";
 | 
			
		||||
        return false;
 | 
			
		||||
    }, r.LOW_PRIORITY);
 | 
			
		||||
 | 
			
		||||
    r.add({"get"}, "/a/:b/c", [&result](auto *) {
 | 
			
		||||
        std::cout << "GET parameter route" << std::endl;
 | 
			
		||||
        result += "GP";
 | 
			
		||||
        return false;
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    r.add({"get"}, "/a/*", [&result](auto *) {
 | 
			
		||||
        std::cout << "GET wildcard route" << std::endl;
 | 
			
		||||
        result += "GW";
 | 
			
		||||
        return false;
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    r.add({"get"}, "/a/b/c", [&result](auto *) {
 | 
			
		||||
        std::cout << "GET static route" << std::endl;
 | 
			
		||||
        result += "GS";
 | 
			
		||||
        return false;
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    r.add({"post"}, "/a/:b/c", [&result](auto *) {
 | 
			
		||||
        std::cout << "POST parameter route" << std::endl;
 | 
			
		||||
        result += "PP";
 | 
			
		||||
        return false;
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    r.add(r.methods, "/a/:b/c", [&result](auto *) {
 | 
			
		||||
        std::cout << "ANY parameter route" << std::endl;
 | 
			
		||||
        result += "AP";
 | 
			
		||||
        return false;
 | 
			
		||||
    }, r.LOW_PRIORITY);
 | 
			
		||||
 | 
			
		||||
    assert(r.route("post", "/a/b/c") == false);
 | 
			
		||||
    assert(result == "ASPPAP");
 | 
			
		||||
 | 
			
		||||
    result.clear();
 | 
			
		||||
    assert(r.route("get", "/a/b/c") == false);
 | 
			
		||||
    assert(result == "GSASGPAPGW");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void testUpgrade() {
 | 
			
		||||
    std::cout << "TestUpgrade" << std::endl;
 | 
			
		||||
    uWS::HttpRouter<int> r;
 | 
			
		||||
    std::string result;
 | 
			
		||||
 | 
			
		||||
    /* HTTP on / */
 | 
			
		||||
    r.add({"get"}, "/something", [&result](auto *) {
 | 
			
		||||
        result += "GS";
 | 
			
		||||
        return true;
 | 
			
		||||
    }, r.MEDIUM_PRIORITY);
 | 
			
		||||
 | 
			
		||||
    /* HTTP on /* */
 | 
			
		||||
    r.add({"get"}, "/*", [&result](auto *) {
 | 
			
		||||
        result += "GW";
 | 
			
		||||
        return false;
 | 
			
		||||
    }, r.MEDIUM_PRIORITY);
 | 
			
		||||
 | 
			
		||||
    /* WebSockets on /* */
 | 
			
		||||
    r.add({"get"}, "/*", [&result](auto *) {
 | 
			
		||||
        result += "WW";
 | 
			
		||||
        return false;
 | 
			
		||||
    }, r.HIGH_PRIORITY);
 | 
			
		||||
 | 
			
		||||
    assert(r.route("get", "/something"));
 | 
			
		||||
    assert(result == "GS");
 | 
			
		||||
    result.clear();
 | 
			
		||||
 | 
			
		||||
    assert(r.route("get", "/") == false);
 | 
			
		||||
    assert(result == "WWGW");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void testBugReports() {
 | 
			
		||||
    std::cout << "TestBugReports" << std::endl;
 | 
			
		||||
    {
 | 
			
		||||
        uWS::HttpRouter<int> r;
 | 
			
		||||
        std::string result;
 | 
			
		||||
 | 
			
		||||
        /* WS on /* */
 | 
			
		||||
        r.add({"get"}, "/*", [&result](auto *) {
 | 
			
		||||
            result += "WW";
 | 
			
		||||
            return false;
 | 
			
		||||
        }, r.HIGH_PRIORITY);
 | 
			
		||||
 | 
			
		||||
        /* HTTP on /ok */
 | 
			
		||||
        r.add({"get"}, "/ok", [&result](auto *) {
 | 
			
		||||
            result += "GS";
 | 
			
		||||
            return false;
 | 
			
		||||
        }, r.MEDIUM_PRIORITY);
 | 
			
		||||
 | 
			
		||||
        r.add({"get"}, "/*", [&result](auto *) {
 | 
			
		||||
            result += "GW";
 | 
			
		||||
            return false;
 | 
			
		||||
        }, r.MEDIUM_PRIORITY);
 | 
			
		||||
 | 
			
		||||
        r.route("get", "/ok");
 | 
			
		||||
        assert(result == "GSWWGW");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    {
 | 
			
		||||
        uWS::HttpRouter<int> r;
 | 
			
		||||
        std::string result;
 | 
			
		||||
 | 
			
		||||
        /* WS on / */
 | 
			
		||||
        r.add({"get"}, "/", [&result](auto *) {
 | 
			
		||||
            result += "WS";
 | 
			
		||||
            return false;
 | 
			
		||||
        }, r.HIGH_PRIORITY);
 | 
			
		||||
 | 
			
		||||
        /* HTTP on / */
 | 
			
		||||
        r.add({"get"}, "/", [&result](auto *) {
 | 
			
		||||
            result += "GS";
 | 
			
		||||
            return false;
 | 
			
		||||
        }, r.MEDIUM_PRIORITY);
 | 
			
		||||
 | 
			
		||||
        r.route("get", "/");
 | 
			
		||||
        assert(result == "WSGS");
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void testParameters() {
 | 
			
		||||
    std::cout << "TestParameters" << std::endl;
 | 
			
		||||
    uWS::HttpRouter<int> r;
 | 
			
		||||
    std::string result;
 | 
			
		||||
 | 
			
		||||
    r.add({"get"}, "/candy/:kind/*", [&result](auto *h) {
 | 
			
		||||
        auto [paramsTop, params] = h->getParameters();
 | 
			
		||||
 | 
			
		||||
        assert(paramsTop == 0);
 | 
			
		||||
        assert(params[0] == "lollipop");
 | 
			
		||||
 | 
			
		||||
        result += "GPW";
 | 
			
		||||
        return false;
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    r.add({"get"}, "/candy/lollipop/*", [&result](auto *h) {
 | 
			
		||||
        auto [paramsTop, params] = h->getParameters();
 | 
			
		||||
 | 
			
		||||
        assert(paramsTop == -1);
 | 
			
		||||
 | 
			
		||||
        result += "GLW";
 | 
			
		||||
        return false;
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    r.add({"get"}, "/candy/:kind/:action", [&result](auto *h) {
 | 
			
		||||
        auto [paramsTop, params] = h->getParameters();
 | 
			
		||||
 | 
			
		||||
        assert(paramsTop == 1);
 | 
			
		||||
        assert(params[0] == "lollipop");
 | 
			
		||||
        assert(params[1] == "eat");
 | 
			
		||||
 | 
			
		||||
        result += "GPP";
 | 
			
		||||
        return false;
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    r.add({"get"}, "/candy/lollipop/:action", [&result](auto *h) {
 | 
			
		||||
        auto [paramsTop, params] = h->getParameters();
 | 
			
		||||
 | 
			
		||||
        assert(params[0] == "eat");
 | 
			
		||||
        assert(paramsTop == 0);
 | 
			
		||||
 | 
			
		||||
        result += "GLP";
 | 
			
		||||
        return false;
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    r.add({"get"}, "/candy/lollipop/eat", [&result](auto *h) {
 | 
			
		||||
        auto [paramsTop, params] = h->getParameters();
 | 
			
		||||
 | 
			
		||||
        assert(paramsTop == -1);
 | 
			
		||||
 | 
			
		||||
        result += "GLS";
 | 
			
		||||
        return false;
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    r.route("get", "/candy/lollipop/eat");
 | 
			
		||||
    assert(result == "GLSGLPGLWGPPGPW");
 | 
			
		||||
    result.clear();
 | 
			
		||||
 | 
			
		||||
    r.route("get", "/candy/lollipop/");
 | 
			
		||||
    r.route("get", "/candy/lollipop");
 | 
			
		||||
    r.route("get", "/candy/");
 | 
			
		||||
    assert(result == "");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int main() {
 | 
			
		||||
    testPatternPriority();
 | 
			
		||||
    testMethodPriority();
 | 
			
		||||
    testUpgrade();
 | 
			
		||||
    testBugReports();
 | 
			
		||||
    testParameters();
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										3
									
								
								tests/Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								tests/Makefile
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,3 @@
 | 
			
		||||
default:
 | 
			
		||||
	$(CXX) -std=c++17 HttpRouter.cpp -o HttpRouter
 | 
			
		||||
	./HttpRouter
 | 
			
		||||
		Reference in New Issue
	
	Block a user