#include "config.h"
#include <gtest/gtest.h>
#include <libcouchbase/couchbase.h>
#include <strcodecs/strcodecs.h>
class UrlEncoding : public ::testing::Test
{
};
using lcb::strcodecs::urlencode;
using lcb::strcodecs::urldecode;
TEST_F(UrlEncoding, plainTextTests)
{
std::string input("abcdef");
std::string exp("abcdef");
std::string out;
ASSERT_TRUE(urlencode(input.begin(), input.end(), out));
ASSERT_EQ(exp, out);
}
TEST_F(UrlEncoding, plainTextWithSlashTests)
{
std::string input("a/b/c/d/e/f/g/h/i/j");
std::string out;
ASSERT_TRUE(urlencode(input.begin(), input.end(), out));
ASSERT_EQ(input, out);
}
TEST_F(UrlEncoding, plainTextWithSpaceTests)
{
std::string out;
std::string input("a b c d e f g");
std::string exp("a%20b%20c%20d%20e%20f%20g");
ASSERT_TRUE(urlencode(input.begin(), input.end(), out));
ASSERT_EQ(exp, out);
}
TEST_F(UrlEncoding, encodedTextWithPlusAsApaceTests)
{
std::string input("a+b+c+d+e+g+h");
std::string out;
ASSERT_TRUE(urlencode(input.begin(), input.end(), out));
ASSERT_EQ(input, out);
}
TEST_F(UrlEncoding, encodedTextWithPlusAndHexAsApaceTests)
{
std::string input("a+b%20c%20d+e+g+h");
std::string out;
ASSERT_TRUE(urlencode(input.begin(), input.end(), out));
ASSERT_EQ(input, out);
}
TEST_F(UrlEncoding, mixedLegalTextTests)
{
std::string input("a/b/c/d/e f g+32%20");
std::string exp("a/b/c/d/e%20f%20g+32%20");
std::string out;
ASSERT_TRUE(urlencode(input.begin(), input.end(), out));
ASSERT_EQ(exp, out);
}
TEST_F(UrlEncoding, mixedIllegalEncodingTextTests)
{
std::string input("a+ ");
std::string out;
ASSERT_FALSE(urlencode(input.begin(), input.end(), out));
}
TEST_F(UrlEncoding, internationalTest)
{
std::string input("_design/beer/_view/all?startkey=\"\xc3\xb8l\"");
std::string exp("_design/beer/_view/all?startkey=%22%C3%B8l%22");
std::string out;
ASSERT_TRUE(urlencode(input.begin(), input.end(), out));
ASSERT_EQ(exp, out);
}
TEST_F(UrlEncoding, internationalEncodedTest)
{
std::string input("_design/beer/_view/all?startkey=%22%C3%B8l%22");
std::string exp("_design/beer/_view/all?startkey=%22%C3%B8l%22");
std::string out;
ASSERT_TRUE(urlencode(input.begin(), input.end(), out));
ASSERT_EQ(exp, out);
}
TEST_F(UrlEncoding, testDecode)
{
char obuf[4096];
ASSERT_TRUE(urldecode("%22", obuf)) << "Single character";
ASSERT_STREQ("\x22", obuf);
ASSERT_TRUE(urldecode("Hello World", obuf)) << "No pct encode";
ASSERT_STREQ("Hello World", obuf);
ASSERT_TRUE(urldecode("Hello%20World", obuf));
ASSERT_STREQ("Hello World", obuf);
ASSERT_TRUE(urldecode("%2Ffoo%2Fbar%2Fbaz%2F", obuf));
ASSERT_STREQ("/foo/bar/baz/", obuf);
ASSERT_TRUE(urldecode("%01%02%03%04", obuf)) << "Multiple octets";
ASSERT_STREQ("\x01\x02\x03\x04", obuf);
ASSERT_TRUE(urldecode("%FFFF", obuf)) << "Recognize only first two hex digits";
ASSERT_STREQ("\xff" "FF", obuf);
ASSERT_FALSE(urldecode("%", obuf));
ASSERT_FALSE(urldecode("%RR", obuf)) << "Invalid hex digits";
}