osrm-backend/unit_tests/server/parameters_parser.cpp

333 lines
15 KiB
C++
Raw Normal View History

2016-02-12 22:23:59 -05:00
#include "server/api/parameters_parser.hpp"
2016-01-28 10:28:44 -05:00
#include "engine/api/base_parameters.hpp"
2016-04-06 10:47:16 -04:00
#include "engine/api/match_parameters.hpp"
#include "engine/api/nearest_parameters.hpp"
#include "engine/api/route_parameters.hpp"
#include "engine/api/table_parameters.hpp"
2016-03-04 17:17:57 -05:00
#include "engine/api/tile_parameters.hpp"
2016-04-06 10:47:16 -04:00
#include "engine/api/trip_parameters.hpp"
2016-01-28 10:28:44 -05:00
#include <fstream>
namespace osrm
{
namespace engine
{
namespace api
{
std::ostream &operator<<(std::ostream &out, api::RouteParameters::GeometriesType geometries)
{
switch (geometries)
{
case api::RouteParameters::GeometriesType::GeoJSON:
out << "GeoJSON";
break;
case api::RouteParameters::GeometriesType::Polyline:
out << "Polyline";
break;
default:
BOOST_ASSERT_MSG(false, "GeometriesType not fully captured");
}
return out;
}
std::ostream &operator<<(std::ostream &out, api::RouteParameters::OverviewType overview)
{
switch (overview)
{
case api::RouteParameters::OverviewType::False:
out << "False";
break;
case api::RouteParameters::OverviewType::Full:
out << "Full";
break;
case api::RouteParameters::OverviewType::Simplified:
out << "Simplified";
break;
default:
BOOST_ASSERT_MSG(false, "OverviewType not fully captured");
}
return out;
}
2016-03-04 17:17:57 -05:00
}
std::ostream &operator<<(std::ostream &out, Bearing bearing)
2016-01-28 10:28:44 -05:00
{
out << bearing.bearing << "," << bearing.range;
return out;
}
}
}
#include <boost/optional/optional_io.hpp>
2016-04-06 10:47:16 -04:00
#include <boost/test/test_tools.hpp>
#include <boost/test/unit_test.hpp>
2016-01-28 10:28:44 -05:00
#define CHECK_EQUAL_RANGE(R1, R2) \
BOOST_CHECK_EQUAL_COLLECTIONS(R1.begin(), R1.end(), R2.begin(), R2.end());
2016-02-12 22:23:59 -05:00
BOOST_AUTO_TEST_SUITE(api_parameters_parser)
2016-01-28 10:28:44 -05:00
using namespace osrm;
using namespace osrm::server;
// returns distance to front
2016-02-12 22:23:59 -05:00
template <typename ParameterT> std::size_t testInvalidOptions(std::string options)
2016-01-28 10:28:44 -05:00
{
auto iter = options.begin();
2016-02-12 22:23:59 -05:00
auto result = api::parseParameters<ParameterT>(iter, options.end());
2016-01-28 10:28:44 -05:00
BOOST_CHECK(!result);
return std::distance(options.begin(), iter);
}
2016-02-12 22:23:59 -05:00
BOOST_AUTO_TEST_CASE(invalid_route_urls)
2016-01-28 10:28:44 -05:00
{
2016-03-03 08:26:13 -05:00
BOOST_CHECK_EQUAL(
testInvalidOptions<engine::api::RouteParameters>("1,2;3,4?overview=false&bla=foo"), 22UL);
BOOST_CHECK_EQUAL(
testInvalidOptions<engine::api::RouteParameters>("1,2;3,4?overview=false&bearings=foo"),
32UL);
BOOST_CHECK_EQUAL(
2016-04-12 12:47:00 -04:00
testInvalidOptions<engine::api::RouteParameters>("1,2;3,4?overview=false&continue_straight=foo"),
41UL);
2016-03-03 08:26:13 -05:00
BOOST_CHECK_EQUAL(
testInvalidOptions<engine::api::RouteParameters>("1,2;3,4?overview=false&radiuses=foo"),
32UL);
BOOST_CHECK_EQUAL(
testInvalidOptions<engine::api::RouteParameters>("1,2;3,4?overview=false&hints=foo"), 29UL);
2016-03-03 08:26:13 -05:00
BOOST_CHECK_EQUAL(
testInvalidOptions<engine::api::RouteParameters>("1,2;3,4?overview=false&geometries=foo"),
22UL);
BOOST_CHECK_EQUAL(
testInvalidOptions<engine::api::RouteParameters>("1,2;3,4?overview=false&overview=foo"),
22L);
BOOST_CHECK_EQUAL(
2016-03-08 16:58:17 -05:00
testInvalidOptions<engine::api::RouteParameters>("1,2;3,4?overview=false&alternatives=foo"),
36UL);
2016-01-28 10:28:44 -05:00
}
2016-02-12 22:23:59 -05:00
BOOST_AUTO_TEST_CASE(invalid_table_urls)
{
2016-03-03 08:26:13 -05:00
BOOST_CHECK_EQUAL(testInvalidOptions<engine::api::TableParameters>("1,2;3,4?sources=1&bla=foo"),
17UL);
BOOST_CHECK_EQUAL(
testInvalidOptions<engine::api::TableParameters>("1,2;3,4?destinations=1&bla=foo"), 22UL);
BOOST_CHECK_EQUAL(testInvalidOptions<engine::api::TableParameters>(
"1,2;3,4?sources=1&destinations=1&bla=foo"),
32UL);
BOOST_CHECK_EQUAL(testInvalidOptions<engine::api::TableParameters>("1,2;3,4?sources=foo"),
16UL);
2016-03-03 08:26:13 -05:00
BOOST_CHECK_EQUAL(testInvalidOptions<engine::api::TableParameters>("1,2;3,4?destinations=foo"),
21UL);
2016-02-12 22:23:59 -05:00
}
BOOST_AUTO_TEST_CASE(valid_route_urls)
2016-01-28 10:28:44 -05:00
{
2016-03-03 08:26:13 -05:00
std::vector<util::Coordinate> coords_1 = {{util::FloatLongitude(1), util::FloatLatitude(2)},
{util::FloatLongitude(3), util::FloatLatitude(4)}};
2016-03-02 19:48:30 -05:00
2016-01-28 10:28:44 -05:00
engine::api::RouteParameters reference_1{};
2016-03-02 19:48:30 -05:00
reference_1.coordinates = coords_1;
auto result_1 = api::parseParameters<engine::api::RouteParameters>("1,2;3,4");
2016-01-28 10:28:44 -05:00
BOOST_CHECK(result_1);
BOOST_CHECK_EQUAL(reference_1.steps, result_1->steps);
2016-03-08 16:58:17 -05:00
BOOST_CHECK_EQUAL(reference_1.alternatives, result_1->alternatives);
2016-01-28 10:28:44 -05:00
BOOST_CHECK_EQUAL(reference_1.geometries, result_1->geometries);
BOOST_CHECK_EQUAL(reference_1.overview, result_1->overview);
2016-04-12 12:47:00 -04:00
BOOST_CHECK_EQUAL(reference_1.continue_straight, result_1->continue_straight);
2016-01-28 10:28:44 -05:00
CHECK_EQUAL_RANGE(reference_1.bearings, result_1->bearings);
CHECK_EQUAL_RANGE(reference_1.radiuses, result_1->radiuses);
CHECK_EQUAL_RANGE(reference_1.coordinates, result_1->coordinates);
engine::api::RouteParameters reference_2{};
reference_2.alternatives = true;
reference_2.steps = true;
2016-03-02 19:48:30 -05:00
reference_2.coordinates = coords_1;
2016-02-12 22:23:59 -05:00
auto result_2 = api::parseParameters<engine::api::RouteParameters>(
2016-03-08 16:58:17 -05:00
"1,2;3,4?steps=true&alternatives=true&geometries=polyline&overview=simplified");
2016-01-28 10:28:44 -05:00
BOOST_CHECK(result_2);
BOOST_CHECK_EQUAL(reference_2.steps, result_2->steps);
2016-03-08 16:58:17 -05:00
BOOST_CHECK_EQUAL(reference_2.alternatives, result_2->alternatives);
2016-01-28 10:28:44 -05:00
BOOST_CHECK_EQUAL(reference_2.geometries, result_2->geometries);
BOOST_CHECK_EQUAL(reference_2.overview, result_2->overview);
2016-04-12 12:47:00 -04:00
BOOST_CHECK_EQUAL(reference_2.continue_straight, result_2->continue_straight);
2016-01-28 10:28:44 -05:00
CHECK_EQUAL_RANGE(reference_2.bearings, result_2->bearings);
CHECK_EQUAL_RANGE(reference_2.radiuses, result_2->radiuses);
CHECK_EQUAL_RANGE(reference_2.coordinates, result_2->coordinates);
2016-04-06 10:47:16 -04:00
engine::api::RouteParameters reference_3{
false, false, engine::api::RouteParameters::GeometriesType::GeoJSON,
engine::api::RouteParameters::OverviewType::False, true};
2016-03-02 19:48:30 -05:00
reference_3.coordinates = coords_1;
2016-02-12 22:23:59 -05:00
auto result_3 = api::parseParameters<engine::api::RouteParameters>(
2016-04-12 12:47:00 -04:00
"1,2;3,4?steps=false&alternatives=false&geometries=geojson&overview=false&continue_straight=true");
2016-01-28 10:28:44 -05:00
BOOST_CHECK(result_3);
BOOST_CHECK_EQUAL(reference_3.steps, result_3->steps);
2016-03-08 16:58:17 -05:00
BOOST_CHECK_EQUAL(reference_3.alternatives, result_3->alternatives);
2016-01-28 10:28:44 -05:00
BOOST_CHECK_EQUAL(reference_3.geometries, result_3->geometries);
BOOST_CHECK_EQUAL(reference_3.overview, result_3->overview);
2016-04-12 12:47:00 -04:00
BOOST_CHECK_EQUAL(reference_3.continue_straight, result_3->continue_straight);
2016-01-28 10:28:44 -05:00
CHECK_EQUAL_RANGE(reference_3.bearings, result_3->bearings);
CHECK_EQUAL_RANGE(reference_3.radiuses, result_3->radiuses);
CHECK_EQUAL_RANGE(reference_3.coordinates, result_3->coordinates);
std::vector<boost::optional<engine::Hint>> hints_4 = {
2016-04-06 10:47:16 -04:00
engine::Hint::FromBase64("DAIAgP___"
"38AAAAAAAAAAAIAAAAAAAAAEAAAAOgDAAD0AwAAGwAAAOUacQBQP5sCshpxAB0_"
"mwIAAAEBl-Umfg=="),
engine::Hint::FromBase64("cgAAgP___"
"39jAAAADgAAACIAAABeAAAAkQAAANoDAABOAgAAGwAAAFVGcQCiRJsCR0VxAOZFmw"
"IFAAEBl-Umfg=="),
engine::Hint::FromBase64("3gAAgP___"
"39KAAAAHgAAACEAAAAAAAAAGAAAAE0BAABOAQAAGwAAAIAzcQBkUJsC1zNxAHBQmw"
"IAAAEBl-Umfg==")};
2016-03-04 17:17:57 -05:00
engine::api::RouteParameters reference_4{false,
false,
2016-03-04 17:17:57 -05:00
engine::api::RouteParameters::GeometriesType::Polyline,
engine::api::RouteParameters::OverviewType::Simplified,
boost::optional<bool>{},
2016-03-04 17:17:57 -05:00
coords_1,
hints_4,
std::vector<boost::optional<double>>{},
std::vector<boost::optional<engine::Bearing>>{}};
2016-02-12 22:23:59 -05:00
auto result_4 = api::parseParameters<engine::api::RouteParameters>(
2016-03-03 08:26:13 -05:00
"1,2;3,4?steps=false&hints="
2016-04-06 10:47:16 -04:00
"DAIAgP___38AAAAAAAAAAAIAAAAAAAAAEAAAAOgDAAD0AwAAGwAAAOUacQBQP5sCshpxAB0_mwIAAAEBl-Umfg==;"
"cgAAgP___39jAAAADgAAACIAAABeAAAAkQAAANoDAABOAgAAGwAAAFVGcQCiRJsCR0VxAOZFmwIFAAEBl-Umfg==;"
"3gAAgP___39KAAAAHgAAACEAAAAAAAAAGAAAAE0BAABOAQAAGwAAAIAzcQBkUJsC1zNxAHBQmwIAAAEBl-Umfg==");
2016-02-16 14:09:12 -05:00
BOOST_CHECK(result_4);
2016-01-28 10:28:44 -05:00
BOOST_CHECK_EQUAL(reference_4.steps, result_4->steps);
2016-03-08 16:58:17 -05:00
BOOST_CHECK_EQUAL(reference_4.alternatives, result_4->alternatives);
2016-01-28 10:28:44 -05:00
BOOST_CHECK_EQUAL(reference_4.geometries, result_4->geometries);
BOOST_CHECK_EQUAL(reference_4.overview, result_4->overview);
2016-04-12 12:47:00 -04:00
BOOST_CHECK_EQUAL(reference_4.continue_straight, result_4->continue_straight);
2016-01-28 10:28:44 -05:00
CHECK_EQUAL_RANGE(reference_4.bearings, result_4->bearings);
CHECK_EQUAL_RANGE(reference_4.radiuses, result_4->radiuses);
CHECK_EQUAL_RANGE(reference_4.coordinates, result_4->coordinates);
2016-02-16 14:09:12 -05:00
2016-03-04 17:17:57 -05:00
std::vector<boost::optional<engine::Bearing>> bearings_4 = {
boost::none, engine::Bearing{200, 10}, engine::Bearing{100, 5},
2016-02-16 14:09:12 -05:00
};
2016-03-03 08:26:13 -05:00
engine::api::RouteParameters reference_5{false,
false,
2016-03-03 08:26:13 -05:00
engine::api::RouteParameters::GeometriesType::Polyline,
engine::api::RouteParameters::OverviewType::Simplified,
boost::optional<bool>{},
2016-03-03 08:26:13 -05:00
coords_1,
std::vector<boost::optional<engine::Hint>>{},
std::vector<boost::optional<double>>{},
bearings_4};
2016-02-16 14:09:12 -05:00
auto result_5 = api::parseParameters<engine::api::RouteParameters>(
2016-03-02 19:48:30 -05:00
"1,2;3,4?steps=false&bearings=;200,10;100,5");
2016-02-16 14:09:12 -05:00
BOOST_CHECK(result_5);
BOOST_CHECK_EQUAL(reference_5.steps, result_5->steps);
2016-03-08 16:58:17 -05:00
BOOST_CHECK_EQUAL(reference_5.alternatives, result_5->alternatives);
2016-02-16 14:09:12 -05:00
BOOST_CHECK_EQUAL(reference_5.geometries, result_5->geometries);
BOOST_CHECK_EQUAL(reference_5.overview, result_5->overview);
2016-04-12 12:47:00 -04:00
BOOST_CHECK_EQUAL(reference_5.continue_straight, result_5->continue_straight);
2016-02-16 14:09:12 -05:00
CHECK_EQUAL_RANGE(reference_5.bearings, result_5->bearings);
CHECK_EQUAL_RANGE(reference_5.radiuses, result_5->radiuses);
CHECK_EQUAL_RANGE(reference_5.coordinates, result_5->coordinates);
2016-03-02 19:48:30 -05:00
2016-03-03 08:26:13 -05:00
std::vector<util::Coordinate> coords_2 = {{util::FloatLongitude(0), util::FloatLatitude(1)},
{util::FloatLongitude(2), util::FloatLatitude(3)},
{util::FloatLongitude(4), util::FloatLatitude(5)}};
2016-03-02 19:48:30 -05:00
engine::api::RouteParameters reference_6{};
reference_6.coordinates = coords_2;
2016-03-03 08:26:13 -05:00
auto result_6 =
api::parseParameters<engine::api::RouteParameters>("polyline(_ibE?_seK_seK_seK_seK)");
2016-03-02 19:48:30 -05:00
BOOST_CHECK(result_6);
2016-03-03 08:26:13 -05:00
BOOST_CHECK_EQUAL(reference_6.steps, result_6->steps);
2016-03-08 16:58:17 -05:00
BOOST_CHECK_EQUAL(reference_6.alternatives, result_6->alternatives);
2016-03-03 08:26:13 -05:00
BOOST_CHECK_EQUAL(reference_6.geometries, result_6->geometries);
BOOST_CHECK_EQUAL(reference_6.overview, result_6->overview);
2016-04-12 12:47:00 -04:00
BOOST_CHECK_EQUAL(reference_6.continue_straight, result_6->continue_straight);
2016-03-03 08:26:13 -05:00
CHECK_EQUAL_RANGE(reference_6.bearings, result_6->bearings);
CHECK_EQUAL_RANGE(reference_6.radiuses, result_6->radiuses);
2016-03-02 19:48:30 -05:00
CHECK_EQUAL_RANGE(reference_6.coordinates, result_6->coordinates);
2016-01-28 10:28:44 -05:00
}
2016-02-12 22:23:59 -05:00
BOOST_AUTO_TEST_CASE(valid_table_urls)
{
2016-03-03 08:26:13 -05:00
std::vector<util::Coordinate> coords_1 = {{util::FloatLongitude(1), util::FloatLatitude(2)},
{util::FloatLongitude(3), util::FloatLatitude(4)}};
2016-03-02 19:48:30 -05:00
2016-02-12 22:23:59 -05:00
engine::api::TableParameters reference_1{};
2016-03-02 19:48:30 -05:00
reference_1.coordinates = coords_1;
auto result_1 = api::parseParameters<engine::api::TableParameters>("1,2;3,4");
2016-02-12 22:23:59 -05:00
BOOST_CHECK(result_1);
CHECK_EQUAL_RANGE(reference_1.sources, result_1->sources);
CHECK_EQUAL_RANGE(reference_1.destinations, result_1->destinations);
CHECK_EQUAL_RANGE(reference_1.bearings, result_1->bearings);
CHECK_EQUAL_RANGE(reference_1.radiuses, result_1->radiuses);
CHECK_EQUAL_RANGE(reference_1.coordinates, result_1->coordinates);
std::vector<std::size_t> sources_2 = {1, 2, 3};
std::vector<std::size_t> destinations_2 = {4, 5};
engine::api::TableParameters reference_2{sources_2, destinations_2};
2016-03-02 19:48:30 -05:00
reference_2.coordinates = coords_1;
2016-03-03 08:26:13 -05:00
auto result_2 = api::parseParameters<engine::api::TableParameters>(
"1,2;3,4?sources=1;2;3&destinations=4;5");
2016-02-12 22:23:59 -05:00
BOOST_CHECK(result_2);
2016-03-03 08:26:13 -05:00
CHECK_EQUAL_RANGE(reference_2.sources, result_2->sources);
2016-02-12 22:23:59 -05:00
CHECK_EQUAL_RANGE(reference_2.destinations, result_2->destinations);
2016-03-03 08:26:13 -05:00
CHECK_EQUAL_RANGE(reference_2.bearings, result_2->bearings);
CHECK_EQUAL_RANGE(reference_2.radiuses, result_2->radiuses);
CHECK_EQUAL_RANGE(reference_2.coordinates, result_2->coordinates);
2016-02-12 22:23:59 -05:00
}
2016-03-02 19:48:30 -05:00
BOOST_AUTO_TEST_CASE(valid_match_urls)
{
2016-03-03 08:26:13 -05:00
std::vector<util::Coordinate> coords_1 = {{util::FloatLongitude(1), util::FloatLatitude(2)},
{util::FloatLongitude(3), util::FloatLatitude(4)}};
2016-03-02 19:48:30 -05:00
engine::api::MatchParameters reference_1{};
reference_1.coordinates = coords_1;
auto result_1 = api::parseParameters<engine::api::MatchParameters>("1,2;3,4");
BOOST_CHECK(result_1);
CHECK_EQUAL_RANGE(reference_1.timestamps, result_1->timestamps);
CHECK_EQUAL_RANGE(reference_1.bearings, result_1->bearings);
CHECK_EQUAL_RANGE(reference_1.radiuses, result_1->radiuses);
CHECK_EQUAL_RANGE(reference_1.coordinates, result_1->coordinates);
}
BOOST_AUTO_TEST_CASE(valid_nearest_urls)
{
std::vector<util::Coordinate> coords_1 = {{util::FloatLongitude(1), util::FloatLatitude(2)}};
engine::api::NearestParameters reference_1{};
reference_1.coordinates = coords_1;
auto result_1 = api::parseParameters<engine::api::NearestParameters>("1,2");
BOOST_CHECK(result_1);
BOOST_CHECK_EQUAL(reference_1.number_of_results, result_1->number_of_results);
CHECK_EQUAL_RANGE(reference_1.bearings, result_1->bearings);
CHECK_EQUAL_RANGE(reference_1.radiuses, result_1->radiuses);
CHECK_EQUAL_RANGE(reference_1.coordinates, result_1->coordinates);
}
BOOST_AUTO_TEST_CASE(valid_tile_urls)
{
engine::api::TileParameters reference_1{1, 2, 3};
auto result_1 = api::parseParameters<engine::api::TileParameters>("tile(1,2,3).mvt");
BOOST_CHECK(result_1);
BOOST_CHECK_EQUAL(reference_1.x, result_1->x);
BOOST_CHECK_EQUAL(reference_1.y, result_1->y);
BOOST_CHECK_EQUAL(reference_1.z, result_1->z);
}
BOOST_AUTO_TEST_CASE(valid_trip_urls)
{
2016-03-03 08:26:13 -05:00
std::vector<util::Coordinate> coords_1 = {{util::FloatLongitude(1), util::FloatLatitude(2)},
{util::FloatLongitude(3), util::FloatLatitude(4)}};
2016-03-02 19:48:30 -05:00
engine::api::TripParameters reference_1{};
reference_1.coordinates = coords_1;
auto result_1 = api::parseParameters<engine::api::TripParameters>("1,2;3,4");
BOOST_CHECK(result_1);
CHECK_EQUAL_RANGE(reference_1.bearings, result_1->bearings);
CHECK_EQUAL_RANGE(reference_1.radiuses, result_1->radiuses);
CHECK_EQUAL_RANGE(reference_1.coordinates, result_1->coordinates);
}
2016-01-28 10:28:44 -05:00
BOOST_AUTO_TEST_SUITE_END()