726 lines
28 KiB
C++
726 lines
28 KiB
C++
|
// Tencent is pleased to support the open source community by making RapidJSON available.
|
||
|
//
|
||
|
// (C) Copyright IBM Corporation 2021
|
||
|
//
|
||
|
// Licensed under the MIT License (the "License"); you may not use this file except
|
||
|
// in compliance with the License. You may obtain a copy of the License at
|
||
|
//
|
||
|
// http://opensource.org/licenses/MIT
|
||
|
//
|
||
|
// Unless required by applicable law or agreed to in writing, software distributed
|
||
|
// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
|
||
|
// CONDITIONS OF ANY KIND, either express or implied. See the License for the
|
||
|
// specific language governing permissions and limitations under the License.
|
||
|
|
||
|
#define RAPIDJSON_SCHEMA_VERBOSE 0
|
||
|
#define RAPIDJSON_HAS_STDSTRING 1
|
||
|
|
||
|
#include "unittest.h"
|
||
|
#include "rapidjson/document.h"
|
||
|
#include "rapidjson/uri.h"
|
||
|
|
||
|
#ifdef __clang__
|
||
|
RAPIDJSON_DIAG_PUSH
|
||
|
RAPIDJSON_DIAG_OFF(variadic-macros)
|
||
|
#elif defined(_MSC_VER)
|
||
|
RAPIDJSON_DIAG_PUSH
|
||
|
RAPIDJSON_DIAG_OFF(4822) // local class member function does not have a body
|
||
|
#endif
|
||
|
|
||
|
using namespace rapidjson;
|
||
|
|
||
|
TEST(Uri, DefaultConstructor) {
|
||
|
typedef GenericUri<Value> UriType;
|
||
|
UriType u;
|
||
|
EXPECT_TRUE(u.GetSchemeString() == 0);
|
||
|
EXPECT_TRUE(u.GetAuthString() == 0);
|
||
|
EXPECT_TRUE(u.GetPathString() == 0);
|
||
|
EXPECT_TRUE(u.GetBaseString() == 0);
|
||
|
EXPECT_TRUE(u.GetQueryString() == 0);
|
||
|
EXPECT_TRUE(u.GetFragString() == 0);
|
||
|
EXPECT_TRUE(u.GetString() == 0);
|
||
|
EXPECT_TRUE(u.GetSchemeStringLength() == 0);
|
||
|
EXPECT_TRUE(u.GetAuthStringLength() == 0);
|
||
|
EXPECT_TRUE(u.GetPathStringLength() == 0);
|
||
|
EXPECT_TRUE(u.GetBaseStringLength() == 0);
|
||
|
EXPECT_TRUE(u.GetQueryStringLength() == 0);
|
||
|
EXPECT_TRUE(u.GetFragStringLength() == 0);
|
||
|
EXPECT_TRUE(u.GetStringLength() == 0);
|
||
|
}
|
||
|
|
||
|
TEST(Uri, Parse) {
|
||
|
typedef GenericUri<Value, MemoryPoolAllocator<> > UriType;
|
||
|
MemoryPoolAllocator<CrtAllocator> allocator;
|
||
|
Value v;
|
||
|
Value w;
|
||
|
|
||
|
v.SetString("http://auth/path/xxx?query#frag", allocator);
|
||
|
UriType u = UriType(v, &allocator);
|
||
|
EXPECT_TRUE(StrCmp(u.GetSchemeString(), "http:") == 0);
|
||
|
EXPECT_TRUE(StrCmp(u.GetAuthString(), "//auth") == 0);
|
||
|
EXPECT_TRUE(StrCmp(u.GetPathString(), "/path/xxx") == 0);
|
||
|
EXPECT_TRUE(StrCmp(u.GetBaseString(), "http://auth/path/xxx?query") == 0);
|
||
|
EXPECT_TRUE(StrCmp(u.GetQueryString(), "?query") == 0);
|
||
|
EXPECT_TRUE(StrCmp(u.GetFragString(), "#frag") == 0);
|
||
|
u.Get(w, allocator);
|
||
|
EXPECT_TRUE(*w.GetString() == *v.GetString());
|
||
|
|
||
|
v.SetString("urn:uuid:ee564b8a-7a87-4125-8c96-e9f123d6766f", allocator);
|
||
|
u = UriType(v, &allocator);
|
||
|
EXPECT_TRUE(StrCmp(u.GetSchemeString(), "urn:") == 0);
|
||
|
EXPECT_TRUE(u.GetAuthStringLength() == 0);
|
||
|
EXPECT_TRUE(StrCmp(u.GetPathString(), "uuid:ee564b8a-7a87-4125-8c96-e9f123d6766f") == 0);
|
||
|
EXPECT_TRUE(StrCmp(u.GetBaseString(), "urn:uuid:ee564b8a-7a87-4125-8c96-e9f123d6766f") == 0);
|
||
|
EXPECT_TRUE(u.GetQueryStringLength() == 0);
|
||
|
EXPECT_TRUE(u.GetFragStringLength() == 0);
|
||
|
u.Get(w, allocator);
|
||
|
EXPECT_TRUE(*w.GetString() == *v.GetString());
|
||
|
|
||
|
v.SetString("", allocator);
|
||
|
u = UriType(v, &allocator);
|
||
|
EXPECT_TRUE(u.GetSchemeStringLength() == 0);
|
||
|
EXPECT_TRUE(u.GetAuthStringLength() == 0);
|
||
|
EXPECT_TRUE(u.GetPathStringLength() == 0);
|
||
|
EXPECT_TRUE(u.GetBaseStringLength() == 0);
|
||
|
EXPECT_TRUE(u.GetQueryStringLength() == 0);
|
||
|
EXPECT_TRUE(u.GetFragStringLength() == 0);
|
||
|
|
||
|
v.SetString("http://auth/", allocator);
|
||
|
u = UriType(v, &allocator);
|
||
|
EXPECT_TRUE(StrCmp(u.GetSchemeString(), "http:") == 0);
|
||
|
EXPECT_TRUE(StrCmp(u.GetAuthString(), "//auth") == 0);
|
||
|
EXPECT_TRUE(StrCmp(u.GetPathString(), "/") == 0);
|
||
|
EXPECT_TRUE(StrCmp(u.GetBaseString(), "http://auth/") == 0);
|
||
|
EXPECT_TRUE(u.GetQueryStringLength() == 0);
|
||
|
EXPECT_TRUE(u.GetFragStringLength() == 0);
|
||
|
|
||
|
u = UriType("/path/sub");
|
||
|
EXPECT_TRUE(u.GetSchemeStringLength() == 0);
|
||
|
EXPECT_TRUE(u.GetAuthStringLength() == 0);
|
||
|
EXPECT_TRUE(StrCmp(u.GetPathString(), "/path/sub") == 0);
|
||
|
EXPECT_TRUE(StrCmp(u.GetBaseString(), "/path/sub") == 0);
|
||
|
EXPECT_TRUE(u.GetQueryStringLength() == 0);
|
||
|
EXPECT_TRUE(u.GetFragStringLength() == 0);
|
||
|
|
||
|
// absolute path gets normalized
|
||
|
u = UriType("/path/../sub/");
|
||
|
EXPECT_TRUE(u.GetSchemeStringLength() == 0);
|
||
|
EXPECT_TRUE(u.GetAuthStringLength() == 0);
|
||
|
EXPECT_TRUE(StrCmp(u.GetPathString(), "/sub/") == 0);
|
||
|
EXPECT_TRUE(StrCmp(u.GetBaseString(), "/sub/") == 0);
|
||
|
EXPECT_TRUE(u.GetQueryStringLength() == 0);
|
||
|
EXPECT_TRUE(u.GetFragStringLength() == 0);
|
||
|
|
||
|
// relative path does not
|
||
|
u = UriType("path/../sub");
|
||
|
EXPECT_TRUE(u.GetSchemeStringLength() == 0);
|
||
|
EXPECT_TRUE(u.GetAuthStringLength() == 0);
|
||
|
EXPECT_TRUE(StrCmp(u.GetPathString(), "path/../sub") == 0);
|
||
|
EXPECT_TRUE(StrCmp(u.GetBaseString(), "path/../sub") == 0);
|
||
|
EXPECT_TRUE(u.GetQueryStringLength() == 0);
|
||
|
EXPECT_TRUE(u.GetFragStringLength() == 0);
|
||
|
|
||
|
u = UriType("http://auth#frag/stuff");
|
||
|
EXPECT_TRUE(StrCmp(u.GetSchemeString(), "http:") == 0);
|
||
|
EXPECT_TRUE(StrCmp(u.GetAuthString(), "//auth") == 0);
|
||
|
EXPECT_TRUE(u.GetPathStringLength() == 0);
|
||
|
EXPECT_TRUE(StrCmp(u.GetBaseString(), "http://auth") == 0);
|
||
|
EXPECT_TRUE(u.GetQueryStringLength() == 0);
|
||
|
EXPECT_TRUE(StrCmp(u.GetFragString(), "#frag/stuff") == 0);
|
||
|
EXPECT_TRUE(StrCmp(u.GetString(), "http://auth#frag/stuff") == 0);
|
||
|
|
||
|
const Value::Ch c[] = { '#', 'f', 'r', 'a', 'g', '/', 's', 't', 'u', 'f', 'f', '\0'};
|
||
|
SizeType len = internal::StrLen<Value::Ch>(c);
|
||
|
u = UriType(c, len);
|
||
|
EXPECT_TRUE(StrCmp(u.GetString(), "#frag/stuff") == 0);
|
||
|
EXPECT_TRUE(u.GetStringLength() == len);
|
||
|
EXPECT_TRUE(StrCmp(u.GetBaseString(), "") == 0);
|
||
|
EXPECT_TRUE(u.GetBaseStringLength() == 0);
|
||
|
EXPECT_TRUE(StrCmp(u.GetFragString(), "#frag/stuff") == 0);
|
||
|
EXPECT_TRUE(u.GetFragStringLength() == len);
|
||
|
|
||
|
u = UriType(c);
|
||
|
EXPECT_TRUE(StrCmp(u.GetString(), "#frag/stuff") == 0);
|
||
|
EXPECT_TRUE(u.GetStringLength() == len);
|
||
|
EXPECT_TRUE(StrCmp(u.GetBaseString(), "") == 0);
|
||
|
EXPECT_TRUE(u.GetBaseStringLength() == 0);
|
||
|
EXPECT_TRUE(StrCmp(u.GetFragString(), "#frag/stuff") == 0);
|
||
|
EXPECT_TRUE(u.GetFragStringLength() == len);
|
||
|
|
||
|
// Incomplete auth treated as path
|
||
|
u = UriType("http:/");
|
||
|
EXPECT_TRUE(StrCmp(u.GetSchemeString(), "http:") == 0);
|
||
|
EXPECT_TRUE(u.GetAuthStringLength() == 0);
|
||
|
EXPECT_TRUE(StrCmp(u.GetPathString(), "/") == 0);
|
||
|
EXPECT_TRUE(StrCmp(u.GetBaseString(), "http:/") == 0);
|
||
|
}
|
||
|
|
||
|
TEST(Uri, Parse_UTF16) {
|
||
|
typedef GenericValue<UTF16<> > Value16;
|
||
|
typedef GenericUri<Value16, MemoryPoolAllocator<> > UriType;
|
||
|
MemoryPoolAllocator<CrtAllocator> allocator;
|
||
|
Value16 v;
|
||
|
Value16 w;
|
||
|
|
||
|
v.SetString(L"http://auth/path/xxx?query#frag", allocator);
|
||
|
UriType u = UriType(v, &allocator);
|
||
|
EXPECT_TRUE(StrCmp(u.GetSchemeString(), L"http:") == 0);
|
||
|
EXPECT_TRUE(StrCmp(u.GetAuthString(), L"//auth") == 0);
|
||
|
EXPECT_TRUE(StrCmp(u.GetPathString(), L"/path/xxx") == 0);
|
||
|
EXPECT_TRUE(StrCmp(u.GetBaseString(), L"http://auth/path/xxx?query") == 0);
|
||
|
EXPECT_TRUE(StrCmp(u.GetQueryString(), L"?query") == 0);
|
||
|
EXPECT_TRUE(StrCmp(u.GetFragString(), L"#frag") == 0);
|
||
|
u.Get(w, allocator);
|
||
|
EXPECT_TRUE(*w.GetString() == *v.GetString());
|
||
|
|
||
|
v.SetString(L"urn:uuid:ee564b8a-7a87-4125-8c96-e9f123d6766f", allocator);
|
||
|
u = UriType(v, &allocator);
|
||
|
EXPECT_TRUE(StrCmp(u.GetSchemeString(), L"urn:") == 0);
|
||
|
EXPECT_TRUE(u.GetAuthStringLength() == 0);
|
||
|
EXPECT_TRUE(StrCmp(u.GetPathString(), L"uuid:ee564b8a-7a87-4125-8c96-e9f123d6766f") == 0);
|
||
|
EXPECT_TRUE(StrCmp(u.GetBaseString(), L"urn:uuid:ee564b8a-7a87-4125-8c96-e9f123d6766f") == 0);
|
||
|
EXPECT_TRUE(u.GetQueryStringLength() == 0);
|
||
|
EXPECT_TRUE(u.GetFragStringLength() == 0);
|
||
|
u.Get(w, allocator);
|
||
|
EXPECT_TRUE(*w.GetString() == *v.GetString());
|
||
|
|
||
|
v.SetString(L"", allocator);
|
||
|
u = UriType(v, &allocator);
|
||
|
EXPECT_TRUE(u.GetSchemeStringLength() == 0);
|
||
|
EXPECT_TRUE(u.GetAuthStringLength() == 0);
|
||
|
EXPECT_TRUE(u.GetPathStringLength() == 0);
|
||
|
EXPECT_TRUE(u.GetBaseStringLength() == 0);
|
||
|
EXPECT_TRUE(u.GetQueryStringLength() == 0);
|
||
|
EXPECT_TRUE(u.GetFragStringLength() == 0);
|
||
|
|
||
|
v.SetString(L"http://auth/", allocator);
|
||
|
u = UriType(v, &allocator);
|
||
|
EXPECT_TRUE(StrCmp(u.GetSchemeString(), L"http:") == 0);
|
||
|
EXPECT_TRUE(StrCmp(u.GetAuthString(), L"//auth") == 0);
|
||
|
EXPECT_TRUE(StrCmp(u.GetPathString(), L"/") == 0);
|
||
|
EXPECT_TRUE(StrCmp(u.GetBaseString(), L"http://auth/") == 0);
|
||
|
EXPECT_TRUE(u.GetQueryStringLength() == 0);
|
||
|
EXPECT_TRUE(u.GetFragStringLength() == 0);
|
||
|
|
||
|
u = UriType(L"/path/sub");
|
||
|
EXPECT_TRUE(u.GetSchemeStringLength() == 0);
|
||
|
EXPECT_TRUE(u.GetAuthStringLength() == 0);
|
||
|
EXPECT_TRUE(StrCmp(u.GetPathString(), L"/path/sub") == 0);
|
||
|
EXPECT_TRUE(StrCmp(u.GetBaseString(), L"/path/sub") == 0);
|
||
|
EXPECT_TRUE(u.GetQueryStringLength() == 0);
|
||
|
EXPECT_TRUE(u.GetFragStringLength() == 0);
|
||
|
|
||
|
// absolute path gets normalized
|
||
|
u = UriType(L"/path/../sub/");
|
||
|
EXPECT_TRUE(u.GetSchemeStringLength() == 0);
|
||
|
EXPECT_TRUE(u.GetAuthStringLength() == 0);
|
||
|
EXPECT_TRUE(StrCmp(u.GetPathString(), L"/sub/") == 0);
|
||
|
EXPECT_TRUE(StrCmp(u.GetBaseString(), L"/sub/") == 0);
|
||
|
EXPECT_TRUE(u.GetQueryStringLength() == 0);
|
||
|
EXPECT_TRUE(u.GetFragStringLength() == 0);
|
||
|
|
||
|
// relative path does not
|
||
|
u = UriType(L"path/../sub");
|
||
|
EXPECT_TRUE(u.GetSchemeStringLength() == 0);
|
||
|
EXPECT_TRUE(u.GetAuthStringLength() == 0);
|
||
|
EXPECT_TRUE(StrCmp(u.GetPathString(), L"path/../sub") == 0);
|
||
|
EXPECT_TRUE(StrCmp(u.GetBaseString(), L"path/../sub") == 0);
|
||
|
EXPECT_TRUE(u.GetQueryStringLength() == 0);
|
||
|
EXPECT_TRUE(u.GetFragStringLength() == 0);
|
||
|
|
||
|
u = UriType(L"http://auth#frag/stuff");
|
||
|
EXPECT_TRUE(StrCmp(u.GetSchemeString(), L"http:") == 0);
|
||
|
EXPECT_TRUE(StrCmp(u.GetAuthString(), L"//auth") == 0);
|
||
|
EXPECT_TRUE(u.GetPathStringLength() == 0);
|
||
|
EXPECT_TRUE(StrCmp(u.GetBaseString(), L"http://auth") == 0);
|
||
|
EXPECT_TRUE(u.GetQueryStringLength() == 0);
|
||
|
EXPECT_TRUE(StrCmp(u.GetFragString(), L"#frag/stuff") == 0);
|
||
|
EXPECT_TRUE(StrCmp(u.GetString(), L"http://auth#frag/stuff") == 0);
|
||
|
|
||
|
const Value16::Ch c[] = { '#', 'f', 'r', 'a', 'g', '/', 's', 't', 'u', 'f', 'f', '\0'};
|
||
|
SizeType len = internal::StrLen<Value16::Ch>(c);
|
||
|
u = UriType(c, len);
|
||
|
EXPECT_TRUE(StrCmp(u.GetString(), L"#frag/stuff") == 0);
|
||
|
EXPECT_TRUE(u.GetStringLength() == len);
|
||
|
EXPECT_TRUE(StrCmp(u.GetBaseString(), L"") == 0);
|
||
|
EXPECT_TRUE(u.GetBaseStringLength() == 0);
|
||
|
EXPECT_TRUE(StrCmp(u.GetFragString(), L"#frag/stuff") == 0);
|
||
|
EXPECT_TRUE(u.GetFragStringLength() == len);
|
||
|
|
||
|
u = UriType(c);
|
||
|
EXPECT_TRUE(StrCmp(u.GetString(), L"#frag/stuff") == 0);
|
||
|
EXPECT_TRUE(u.GetStringLength() == len);
|
||
|
EXPECT_TRUE(StrCmp(u.GetBaseString(), L"") == 0);
|
||
|
EXPECT_TRUE(u.GetBaseStringLength() == 0);
|
||
|
EXPECT_TRUE(StrCmp(u.GetFragString(), L"#frag/stuff") == 0);
|
||
|
EXPECT_TRUE(u.GetFragStringLength() == len);
|
||
|
|
||
|
// Incomplete auth treated as path
|
||
|
u = UriType(L"http:/");
|
||
|
EXPECT_TRUE(StrCmp(u.GetSchemeString(), L"http:") == 0);
|
||
|
EXPECT_TRUE(u.GetAuthStringLength() == 0);
|
||
|
EXPECT_TRUE(StrCmp(u.GetPathString(), L"/") == 0);
|
||
|
EXPECT_TRUE(StrCmp(u.GetBaseString(), L"http:/") == 0);
|
||
|
}
|
||
|
|
||
|
#if RAPIDJSON_HAS_STDSTRING
|
||
|
TEST(Uri, Parse_Std) {
|
||
|
typedef GenericUri<Value, MemoryPoolAllocator<> > UriType;
|
||
|
MemoryPoolAllocator<CrtAllocator> allocator;
|
||
|
typedef std::basic_string<Value::Ch> String;
|
||
|
|
||
|
String str = "http://auth/path/xxx?query#frag";
|
||
|
const UriType uri = UriType(str, &allocator);
|
||
|
EXPECT_TRUE(UriType::GetScheme(uri) == "http:");
|
||
|
EXPECT_TRUE(UriType::GetAuth(uri) == "//auth");
|
||
|
EXPECT_TRUE(UriType::GetPath(uri) == "/path/xxx");
|
||
|
EXPECT_TRUE(UriType::GetBase(uri) == "http://auth/path/xxx?query");
|
||
|
EXPECT_TRUE(UriType::GetQuery(uri) == "?query");
|
||
|
EXPECT_TRUE(UriType::GetFrag(uri) == "#frag");
|
||
|
EXPECT_TRUE(UriType::Get(uri) == str);
|
||
|
}
|
||
|
|
||
|
TEST(Uri, Parse_UTF16_Std) {
|
||
|
typedef GenericValue<UTF16<> > Value16;
|
||
|
typedef GenericUri<Value16, MemoryPoolAllocator<> > UriType;
|
||
|
MemoryPoolAllocator<CrtAllocator> allocator;
|
||
|
typedef std::basic_string<Value16::Ch> String;
|
||
|
|
||
|
String str = L"http://auth/path/xxx?query#frag";
|
||
|
const UriType uri = UriType(str, &allocator);
|
||
|
EXPECT_TRUE(UriType::GetScheme(uri) == L"http:");
|
||
|
EXPECT_TRUE(UriType::GetAuth(uri) == L"//auth");
|
||
|
EXPECT_TRUE(UriType::GetPath(uri) == L"/path/xxx");
|
||
|
EXPECT_TRUE(UriType::GetBase(uri) == L"http://auth/path/xxx?query");
|
||
|
EXPECT_TRUE(UriType::GetQuery(uri) == L"?query");
|
||
|
EXPECT_TRUE(UriType::GetFrag(uri) == L"#frag");
|
||
|
EXPECT_TRUE(UriType::Get(uri) == str);
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
TEST(Uri, CopyConstructor) {
|
||
|
typedef GenericUri<Value> UriType;
|
||
|
CrtAllocator allocator;
|
||
|
|
||
|
UriType u("http://auth/path/xxx?query#frag", &allocator);
|
||
|
UriType u2(u);
|
||
|
EXPECT_TRUE(u == u2);
|
||
|
EXPECT_NE(&u.GetAllocator(), &u2.GetAllocator());
|
||
|
}
|
||
|
|
||
|
TEST(Uri, Assignment) {
|
||
|
typedef GenericUri<Value> UriType;
|
||
|
CrtAllocator allocator;
|
||
|
|
||
|
UriType u("http://auth/path/xxx?query#frag", &allocator);
|
||
|
UriType u2;
|
||
|
u2 = u;
|
||
|
EXPECT_TRUE(u == u2);
|
||
|
EXPECT_NE(&u.GetAllocator(), &u2.GetAllocator());
|
||
|
}
|
||
|
|
||
|
TEST(Uri, Resolve) {
|
||
|
typedef GenericUri<Value> UriType;
|
||
|
CrtAllocator allocator;
|
||
|
|
||
|
// ref is full uri
|
||
|
UriType base = UriType("http://auth/path/#frag");
|
||
|
UriType ref = UriType("http://newauth/newpath#newfrag");
|
||
|
UriType res = ref.Resolve(base);
|
||
|
EXPECT_TRUE(StrCmp(res.GetString(), "http://newauth/newpath#newfrag") == 0);
|
||
|
|
||
|
base = UriType("/path/#frag", &allocator);
|
||
|
ref = UriType("http://newauth/newpath#newfrag", &allocator);
|
||
|
res = ref.Resolve(base, &allocator);
|
||
|
EXPECT_TRUE(StrCmp(res.GetString(), "http://newauth/newpath#newfrag") == 0);
|
||
|
|
||
|
// ref is alternate uri
|
||
|
base = UriType("http://auth/path/#frag");
|
||
|
ref = UriType("urn:uuid:ee564b8a-7a87-4125-8c96-e9f123d6766f");
|
||
|
res = ref.Resolve(base);
|
||
|
EXPECT_TRUE(StrCmp(res.GetString(), "urn:uuid:ee564b8a-7a87-4125-8c96-e9f123d6766f") == 0);
|
||
|
|
||
|
// ref is absolute path
|
||
|
base = UriType("http://auth/path/#");
|
||
|
ref = UriType("/newpath#newfrag");
|
||
|
res = ref.Resolve(base);
|
||
|
EXPECT_TRUE(StrCmp(res.GetString(), "http://auth/newpath#newfrag") == 0);
|
||
|
|
||
|
// ref is relative path
|
||
|
base = UriType("http://auth/path/file.json#frag");
|
||
|
ref = UriType("newfile.json#");
|
||
|
res = ref.Resolve(base);
|
||
|
EXPECT_TRUE(StrCmp(res.GetString(), "http://auth/path/newfile.json#") == 0);
|
||
|
|
||
|
base = UriType("http://auth/path/file.json#frag/stuff");
|
||
|
ref = UriType("newfile.json#newfrag/newstuff");
|
||
|
res = ref.Resolve(base);
|
||
|
EXPECT_TRUE(StrCmp(res.GetString(), "http://auth/path/newfile.json#newfrag/newstuff") == 0);
|
||
|
|
||
|
base = UriType("file.json", &allocator);
|
||
|
ref = UriType("newfile.json", &base.GetAllocator());
|
||
|
res = ref.Resolve(base, &ref.GetAllocator());
|
||
|
EXPECT_TRUE(StrCmp(res.GetString(), "newfile.json") == 0);
|
||
|
|
||
|
base = UriType("file.json", &allocator);
|
||
|
ref = UriType("./newfile.json", &allocator);
|
||
|
res = ref.Resolve(base, &allocator);
|
||
|
EXPECT_TRUE(StrCmp(res.GetString(), "newfile.json") == 0);
|
||
|
|
||
|
base = UriType("file.json");
|
||
|
ref = UriType("parent/../newfile.json");
|
||
|
res = ref.Resolve(base);
|
||
|
EXPECT_TRUE(StrCmp(res.GetString(), "newfile.json") == 0);
|
||
|
|
||
|
base = UriType("file.json");
|
||
|
ref = UriType("parent/./newfile.json");
|
||
|
res = ref.Resolve(base);
|
||
|
EXPECT_TRUE(StrCmp(res.GetString(), "parent/newfile.json") == 0);
|
||
|
|
||
|
base = UriType("file.json");
|
||
|
ref = UriType("../../parent/.././newfile.json");
|
||
|
res = ref.Resolve(base);
|
||
|
EXPECT_TRUE(StrCmp(res.GetString(), "newfile.json") == 0);
|
||
|
|
||
|
// This adds a joining slash so resolved length is base length + ref length + 1
|
||
|
base = UriType("http://auth");
|
||
|
ref = UriType("newfile.json");
|
||
|
res = ref.Resolve(base);
|
||
|
EXPECT_TRUE(StrCmp(res.GetString(), "http://auth/newfile.json") == 0);
|
||
|
|
||
|
// ref is fragment
|
||
|
base = UriType("#frag/stuff");
|
||
|
ref = UriType("#newfrag/newstuff");
|
||
|
res = ref.Resolve(base);
|
||
|
EXPECT_TRUE(StrCmp(res.GetString(), "#newfrag/newstuff") == 0);
|
||
|
|
||
|
// test ref fragment always wins
|
||
|
base = UriType("/path#frag");
|
||
|
ref = UriType("");
|
||
|
res = ref.Resolve(base);
|
||
|
EXPECT_TRUE(StrCmp(res.GetString(), "/path") == 0);
|
||
|
|
||
|
// Examples from RFC3896
|
||
|
base = UriType("http://a/b/c/d;p?q");
|
||
|
ref = UriType("g:h");
|
||
|
res = ref.Resolve(base);
|
||
|
EXPECT_TRUE(StrCmp(res.GetString(), "g:h") == 0);
|
||
|
ref = UriType("g");
|
||
|
res = ref.Resolve(base);
|
||
|
EXPECT_TRUE(StrCmp(res.GetString(), "http://a/b/c/g") == 0);
|
||
|
ref = UriType("./g");
|
||
|
res = ref.Resolve(base);
|
||
|
EXPECT_TRUE(StrCmp(res.GetString(), "http://a/b/c/g") == 0);
|
||
|
ref = UriType("g/");
|
||
|
res = ref.Resolve(base);
|
||
|
EXPECT_TRUE(StrCmp(res.GetString(), "http://a/b/c/g/") == 0);
|
||
|
ref = UriType("/g");
|
||
|
res = ref.Resolve(base);
|
||
|
EXPECT_TRUE(StrCmp(res.GetString(), "http://a/g") == 0);
|
||
|
ref = UriType("//g");
|
||
|
res = ref.Resolve(base);
|
||
|
EXPECT_TRUE(StrCmp(res.GetString(), "http://g") == 0);
|
||
|
ref = UriType("?y");
|
||
|
res = ref.Resolve(base);
|
||
|
EXPECT_TRUE(StrCmp(res.GetString(), "http://a/b/c/d;p?y") == 0);
|
||
|
ref = UriType("g?y");
|
||
|
res = ref.Resolve(base);
|
||
|
EXPECT_TRUE(StrCmp(res.GetString(), "http://a/b/c/g?y") == 0);
|
||
|
ref = UriType("#s");
|
||
|
res = ref.Resolve(base);
|
||
|
EXPECT_TRUE(StrCmp(res.GetString(), "http://a/b/c/d;p?q#s") == 0);
|
||
|
ref = UriType("g#s");
|
||
|
res = ref.Resolve(base);
|
||
|
EXPECT_TRUE(StrCmp(res.GetString(), "http://a/b/c/g#s") == 0);
|
||
|
ref = UriType("g?y#s");
|
||
|
res = ref.Resolve(base);
|
||
|
EXPECT_TRUE(StrCmp(res.GetString(), "http://a/b/c/g?y#s") == 0);
|
||
|
ref = UriType(";x");
|
||
|
res = ref.Resolve(base);
|
||
|
EXPECT_TRUE(StrCmp(res.GetString(), "http://a/b/c/;x") == 0);
|
||
|
ref = UriType("g;x");
|
||
|
res = ref.Resolve(base);
|
||
|
EXPECT_TRUE(StrCmp(res.GetString(), "http://a/b/c/g;x") == 0);
|
||
|
ref = UriType("g;x?y#s");
|
||
|
res = ref.Resolve(base);
|
||
|
EXPECT_TRUE(StrCmp(res.GetString(), "http://a/b/c/g;x?y#s") == 0);
|
||
|
ref = UriType("");
|
||
|
res = ref.Resolve(base);
|
||
|
EXPECT_TRUE(StrCmp(res.GetString(), "http://a/b/c/d;p?q") == 0);
|
||
|
ref = UriType(".");
|
||
|
res = ref.Resolve(base);
|
||
|
EXPECT_TRUE(StrCmp(res.GetString(), "http://a/b/c/") == 0);
|
||
|
ref = UriType("./");
|
||
|
res = ref.Resolve(base);
|
||
|
EXPECT_TRUE(StrCmp(res.GetString(), "http://a/b/c/") == 0);
|
||
|
ref = UriType("..");
|
||
|
res = ref.Resolve(base);
|
||
|
EXPECT_TRUE(StrCmp(res.GetString(), "http://a/b/") == 0);
|
||
|
ref = UriType("../");
|
||
|
res = ref.Resolve(base);
|
||
|
EXPECT_TRUE(StrCmp(res.GetString(), "http://a/b/") == 0);
|
||
|
ref = UriType("../g");
|
||
|
res = ref.Resolve(base);
|
||
|
EXPECT_TRUE(StrCmp(res.GetString(), "http://a/b/g") == 0);
|
||
|
ref = UriType("../..");
|
||
|
res = ref.Resolve(base);
|
||
|
EXPECT_TRUE(StrCmp(res.GetString(), "http://a/") == 0);
|
||
|
ref = UriType("../../");
|
||
|
res = ref.Resolve(base);
|
||
|
EXPECT_TRUE(StrCmp(res.GetString(), "http://a/") == 0);
|
||
|
ref = UriType("../../g");
|
||
|
res = ref.Resolve(base);
|
||
|
EXPECT_TRUE(StrCmp(res.GetString(), "http://a/g") == 0);
|
||
|
ref = UriType("../../../g");
|
||
|
res = ref.Resolve(base);
|
||
|
EXPECT_TRUE(StrCmp(res.GetString(), "http://a/g") == 0);
|
||
|
ref = UriType("../../../../g");
|
||
|
res = ref.Resolve(base);
|
||
|
EXPECT_TRUE(StrCmp(res.GetString(), "http://a/g") == 0);
|
||
|
ref = UriType("/./g");
|
||
|
res = ref.Resolve(base);
|
||
|
EXPECT_TRUE(StrCmp(res.GetString(), "http://a/g") == 0);
|
||
|
ref = UriType("/../g");
|
||
|
res = ref.Resolve(base);
|
||
|
EXPECT_TRUE(StrCmp(res.GetString(), "http://a/g") == 0);
|
||
|
ref = UriType("g.");
|
||
|
res = ref.Resolve(base);
|
||
|
EXPECT_TRUE(StrCmp(res.GetString(), "http://a/b/c/g.") == 0);
|
||
|
ref = UriType(".g");
|
||
|
res = ref.Resolve(base);
|
||
|
EXPECT_TRUE(StrCmp(res.GetString(), "http://a/b/c/.g") == 0);
|
||
|
ref = UriType("g..");
|
||
|
res = ref.Resolve(base);
|
||
|
EXPECT_TRUE(StrCmp(res.GetString(), "http://a/b/c/g..") == 0);
|
||
|
ref = UriType("..g");
|
||
|
res = ref.Resolve(base);
|
||
|
EXPECT_TRUE(StrCmp(res.GetString(), "http://a/b/c/..g") == 0);
|
||
|
ref = UriType("g#s/../x");
|
||
|
res = ref.Resolve(base);
|
||
|
EXPECT_TRUE(StrCmp(res.GetString(), "http://a/b/c/g#s/../x") == 0);
|
||
|
}
|
||
|
|
||
|
TEST(Uri, Resolve_UTF16) {
|
||
|
typedef GenericValue<UTF16<> > Value16;
|
||
|
typedef GenericUri<Value16> UriType;
|
||
|
CrtAllocator allocator;
|
||
|
|
||
|
// ref is full uri
|
||
|
UriType base = UriType(L"http://auth/path/#frag");
|
||
|
UriType ref = UriType(L"http://newauth/newpath#newfrag");
|
||
|
UriType res = ref.Resolve(base);
|
||
|
EXPECT_TRUE(StrCmp(res.GetString(), L"http://newauth/newpath#newfrag") == 0);
|
||
|
|
||
|
base = UriType(L"/path/#frag");
|
||
|
ref = UriType(L"http://newauth/newpath#newfrag");
|
||
|
res = ref.Resolve(base);
|
||
|
EXPECT_TRUE(StrCmp(res.GetString(), L"http://newauth/newpath#newfrag") == 0);
|
||
|
|
||
|
// ref is alternate uri
|
||
|
base = UriType(L"http://auth/path/#frag");
|
||
|
ref = UriType(L"urn:uuid:ee564b8a-7a87-4125-8c96-e9f123d6766f");
|
||
|
res = ref.Resolve(base);
|
||
|
EXPECT_TRUE(StrCmp(res.GetString(), L"urn:uuid:ee564b8a-7a87-4125-8c96-e9f123d6766f") == 0);
|
||
|
|
||
|
// ref is absolute path
|
||
|
base = UriType(L"http://auth/path/#");
|
||
|
ref = UriType(L"/newpath#newfrag");
|
||
|
res = ref.Resolve(base);
|
||
|
EXPECT_TRUE(StrCmp(res.GetString(), L"http://auth/newpath#newfrag") == 0);
|
||
|
|
||
|
// ref is relative path
|
||
|
base = UriType(L"http://auth/path/file.json#frag");
|
||
|
ref = UriType(L"newfile.json#");
|
||
|
res = ref.Resolve(base);
|
||
|
EXPECT_TRUE(StrCmp(res.GetString(), L"http://auth/path/newfile.json#") == 0);
|
||
|
|
||
|
base = UriType(L"http://auth/path/file.json#frag/stuff");
|
||
|
ref = UriType(L"newfile.json#newfrag/newstuff");
|
||
|
res = ref.Resolve(base);
|
||
|
EXPECT_TRUE(StrCmp(res.GetString(), L"http://auth/path/newfile.json#newfrag/newstuff") == 0);
|
||
|
|
||
|
base = UriType(L"file.json", &allocator);
|
||
|
ref = UriType(L"newfile.json", &base.GetAllocator());
|
||
|
res = ref.Resolve(base, &ref.GetAllocator());
|
||
|
EXPECT_TRUE(StrCmp(res.GetString(), L"newfile.json") == 0);
|
||
|
|
||
|
base = UriType(L"file.json", &allocator);
|
||
|
ref = UriType(L"./newfile.json", &allocator);
|
||
|
res = ref.Resolve(base, &allocator);
|
||
|
EXPECT_TRUE(StrCmp(res.GetString(), L"newfile.json") == 0);
|
||
|
|
||
|
base = UriType(L"file.json");
|
||
|
ref = UriType(L"parent/../newfile.json");
|
||
|
res = ref.Resolve(base);
|
||
|
EXPECT_TRUE(StrCmp(res.GetString(), L"newfile.json") == 0);
|
||
|
|
||
|
base = UriType(L"file.json");
|
||
|
ref = UriType(L"parent/./newfile.json");
|
||
|
res = ref.Resolve(base);
|
||
|
EXPECT_TRUE(StrCmp(res.GetString(), L"parent/newfile.json") == 0);
|
||
|
|
||
|
base = UriType(L"file.json");
|
||
|
ref = UriType(L"../../parent/.././newfile.json");
|
||
|
res = ref.Resolve(base);
|
||
|
EXPECT_TRUE(StrCmp(res.GetString(), L"newfile.json") == 0);
|
||
|
|
||
|
// This adds a joining slash so resolved length is base length + ref length + 1
|
||
|
base = UriType(L"http://auth");
|
||
|
ref = UriType(L"newfile.json");
|
||
|
res = ref.Resolve(base);
|
||
|
EXPECT_TRUE(StrCmp(res.GetString(), L"http://auth/newfile.json") == 0);
|
||
|
|
||
|
// ref is fragment
|
||
|
base = UriType(L"#frag/stuff");
|
||
|
ref = UriType(L"#newfrag/newstuff");
|
||
|
res = ref.Resolve(base);
|
||
|
EXPECT_TRUE(StrCmp(res.GetString(), L"#newfrag/newstuff") == 0);
|
||
|
|
||
|
// test ref fragment always wins
|
||
|
base = UriType(L"/path#frag");
|
||
|
ref = UriType(L"");
|
||
|
res = ref.Resolve(base);
|
||
|
EXPECT_TRUE(StrCmp(res.GetString(), L"/path") == 0);
|
||
|
|
||
|
// Examples from RFC3896
|
||
|
base = UriType(L"http://a/b/c/d;p?q");
|
||
|
ref = UriType(L"g:h");
|
||
|
res = ref.Resolve(base);
|
||
|
EXPECT_TRUE(StrCmp(res.GetString(), L"g:h") == 0);
|
||
|
ref = UriType(L"g");
|
||
|
res = ref.Resolve(base);
|
||
|
EXPECT_TRUE(StrCmp(res.GetString(), L"http://a/b/c/g") == 0);
|
||
|
ref = UriType(L"./g");
|
||
|
res = ref.Resolve(base);
|
||
|
EXPECT_TRUE(StrCmp(res.GetString(), L"http://a/b/c/g") == 0);
|
||
|
ref = UriType(L"g/");
|
||
|
res = ref.Resolve(base);
|
||
|
EXPECT_TRUE(StrCmp(res.GetString(), L"http://a/b/c/g/") == 0);
|
||
|
ref = UriType(L"/g");
|
||
|
res = ref.Resolve(base);
|
||
|
EXPECT_TRUE(StrCmp(res.GetString(), L"http://a/g") == 0);
|
||
|
ref = UriType(L"//g");
|
||
|
res = ref.Resolve(base);
|
||
|
EXPECT_TRUE(StrCmp(res.GetString(), L"http://g") == 0);
|
||
|
ref = UriType(L"?y");
|
||
|
res = ref.Resolve(base);
|
||
|
EXPECT_TRUE(StrCmp(res.GetString(), L"http://a/b/c/d;p?y") == 0);
|
||
|
ref = UriType(L"g?y");
|
||
|
res = ref.Resolve(base);
|
||
|
EXPECT_TRUE(StrCmp(res.GetString(), L"http://a/b/c/g?y") == 0);
|
||
|
ref = UriType(L"#s");
|
||
|
res = ref.Resolve(base);
|
||
|
EXPECT_TRUE(StrCmp(res.GetString(), L"http://a/b/c/d;p?q#s") == 0);
|
||
|
ref = UriType(L"g#s");
|
||
|
res = ref.Resolve(base);
|
||
|
EXPECT_TRUE(StrCmp(res.GetString(), L"http://a/b/c/g#s") == 0);
|
||
|
ref = UriType(L"g?y#s");
|
||
|
res = ref.Resolve(base);
|
||
|
EXPECT_TRUE(StrCmp(res.GetString(), L"http://a/b/c/g?y#s") == 0);
|
||
|
ref = UriType(L";x");
|
||
|
res = ref.Resolve(base);
|
||
|
EXPECT_TRUE(StrCmp(res.GetString(), L"http://a/b/c/;x") == 0);
|
||
|
ref = UriType(L"g;x");
|
||
|
res = ref.Resolve(base);
|
||
|
EXPECT_TRUE(StrCmp(res.GetString(), L"http://a/b/c/g;x") == 0);
|
||
|
ref = UriType(L"g;x?y#s");
|
||
|
res = ref.Resolve(base);
|
||
|
EXPECT_TRUE(StrCmp(res.GetString(), L"http://a/b/c/g;x?y#s") == 0);
|
||
|
ref = UriType(L"");
|
||
|
res = ref.Resolve(base);
|
||
|
EXPECT_TRUE(StrCmp(res.GetString(), L"http://a/b/c/d;p?q") == 0);
|
||
|
ref = UriType(L".");
|
||
|
res = ref.Resolve(base);
|
||
|
EXPECT_TRUE(StrCmp(res.GetString(), L"http://a/b/c/") == 0);
|
||
|
ref = UriType(L"./");
|
||
|
res = ref.Resolve(base);
|
||
|
EXPECT_TRUE(StrCmp(res.GetString(), L"http://a/b/c/") == 0);
|
||
|
ref = UriType(L"..");
|
||
|
res = ref.Resolve(base);
|
||
|
EXPECT_TRUE(StrCmp(res.GetString(), L"http://a/b/") == 0);
|
||
|
ref = UriType(L"../");
|
||
|
res = ref.Resolve(base);
|
||
|
EXPECT_TRUE(StrCmp(res.GetString(), L"http://a/b/") == 0);
|
||
|
ref = UriType(L"../g");
|
||
|
res = ref.Resolve(base);
|
||
|
EXPECT_TRUE(StrCmp(res.GetString(), L"http://a/b/g") == 0);
|
||
|
ref = UriType(L"../..");
|
||
|
res = ref.Resolve(base);
|
||
|
EXPECT_TRUE(StrCmp(res.GetString(), L"http://a/") == 0);
|
||
|
ref = UriType(L"../../");
|
||
|
res = ref.Resolve(base);
|
||
|
EXPECT_TRUE(StrCmp(res.GetString(), L"http://a/") == 0);
|
||
|
ref = UriType(L"../../g");
|
||
|
res = ref.Resolve(base);
|
||
|
EXPECT_TRUE(StrCmp(res.GetString(), L"http://a/g") == 0);
|
||
|
ref = UriType(L"../../../g");
|
||
|
res = ref.Resolve(base);
|
||
|
EXPECT_TRUE(StrCmp(res.GetString(), L"http://a/g") == 0);
|
||
|
ref = UriType(L"../../../../g");
|
||
|
res = ref.Resolve(base);
|
||
|
EXPECT_TRUE(StrCmp(res.GetString(), L"http://a/g") == 0);
|
||
|
ref = UriType(L"/./g");
|
||
|
res = ref.Resolve(base);
|
||
|
EXPECT_TRUE(StrCmp(res.GetString(), L"http://a/g") == 0);
|
||
|
ref = UriType(L"/../g");
|
||
|
res = ref.Resolve(base);
|
||
|
EXPECT_TRUE(StrCmp(res.GetString(), L"http://a/g") == 0);
|
||
|
ref = UriType(L"g.");
|
||
|
res = ref.Resolve(base);
|
||
|
EXPECT_TRUE(StrCmp(res.GetString(), L"http://a/b/c/g.") == 0);
|
||
|
ref = UriType(L".g");
|
||
|
res = ref.Resolve(base);
|
||
|
EXPECT_TRUE(StrCmp(res.GetString(), L"http://a/b/c/.g") == 0);
|
||
|
ref = UriType(L"g..");
|
||
|
res = ref.Resolve(base);
|
||
|
EXPECT_TRUE(StrCmp(res.GetString(), L"http://a/b/c/g..") == 0);
|
||
|
ref = UriType(L"..g");
|
||
|
res = ref.Resolve(base);
|
||
|
EXPECT_TRUE(StrCmp(res.GetString(), L"http://a/b/c/..g") == 0);
|
||
|
ref = UriType(L"g#s/../x");
|
||
|
res = ref.Resolve(base);
|
||
|
EXPECT_TRUE(StrCmp(res.GetString(), L"http://a/b/c/g#s/../x") == 0);
|
||
|
}
|
||
|
|
||
|
TEST(Uri, Equals) {
|
||
|
typedef GenericUri<Value> UriType;
|
||
|
|
||
|
UriType a = UriType("http://a/a#a");
|
||
|
UriType b = UriType("http://a/a#b");
|
||
|
UriType c = a;
|
||
|
|
||
|
EXPECT_TRUE(a == a);
|
||
|
EXPECT_TRUE(a == c);
|
||
|
EXPECT_TRUE(a != b);
|
||
|
}
|
||
|
|
||
|
TEST(Uri, Match) {
|
||
|
typedef GenericUri<Value> UriType;
|
||
|
|
||
|
UriType a = UriType("http://a/a#a");
|
||
|
UriType b = UriType("http://a/a#b");
|
||
|
UriType c = a;
|
||
|
UriType d;
|
||
|
|
||
|
EXPECT_TRUE(a.Match(a));
|
||
|
EXPECT_TRUE(a.Match(c));
|
||
|
EXPECT_FALSE(a.Match(b));
|
||
|
EXPECT_FALSE(a.Match(b, true));
|
||
|
EXPECT_TRUE(a.Match(b, false)); // Base Uri same
|
||
|
EXPECT_FALSE(a.Match(d));
|
||
|
EXPECT_FALSE(d.Match(a));
|
||
|
}
|
||
|
|
||
|
TEST(Uri, Issue1899) {
|
||
|
typedef GenericUri<Value, MemoryPoolAllocator<> > UriType;
|
||
|
|
||
|
UriType base = UriType("http://auth/path/#frag");
|
||
|
UriType ref = UriType("http://newauth/newpath#newfrag");
|
||
|
UriType res = ref.Resolve(base);
|
||
|
EXPECT_TRUE(StrCmp(res.GetString(), "http://newauth/newpath#newfrag") == 0);
|
||
|
}
|
||
|
|
||
|
#if defined(_MSC_VER) || defined(__clang__)
|
||
|
RAPIDJSON_DIAG_POP
|
||
|
#endif
|