1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_stoc.hxx" 26 27 #include "com/sun/star/lang/XComponent.hpp" 28 #include "com/sun/star/lang/XMultiComponentFactory.hpp" 29 #include "com/sun/star/uno/Reference.hxx" 30 #include "com/sun/star/uno/XComponentContext.hpp" 31 #include "com/sun/star/uri/ExternalUriReferenceTranslator.hpp" 32 #include "com/sun/star/uri/UriReferenceFactory.hpp" 33 #include "com/sun/star/uri/VndSunStarPkgUrlReferenceFactory.hpp" 34 #include "com/sun/star/uri/XExternalUriReferenceTranslator.hpp" 35 #include "com/sun/star/uri/XUriReference.hpp" 36 #include "com/sun/star/uri/XUriReferenceFactory.hpp" 37 #include "com/sun/star/uri/XVndSunStarExpandUrlReference.hpp" 38 #include "com/sun/star/uri/XVndSunStarPkgUrlReferenceFactory.hpp" 39 #include "com/sun/star/uri/XVndSunStarScriptUrlReference.hpp" 40 #include "com/sun/star/util/XMacroExpander.hpp" 41 #include "cppuhelper/bootstrap.hxx" 42 #include "gtest/gtest.h" 43 #include "osl/diagnose.h" 44 #include "osl/process.h" 45 #include "rtl/string.h" 46 #include "rtl/string.hxx" 47 #include "rtl/textenc.h" 48 #include "rtl/ustrbuf.hxx" 49 #include "rtl/ustring.hxx" 50 #include "sal/types.h" 51 52 #include <cstdlib> 53 54 namespace css = com::sun::star; 55 56 namespace { 57 58 #define TEST_ASSERT_EQUAL(token1, token2, token3, expected, actual) \ 59 ASSERT_TRUE( \ 60 (actual) == (expected)) << \ 61 createTestAssertEqualMessage( \ 62 token1, token2, token3, #expected, #actual, expected, actual). \ 63 getStr() 64 65 template< typename T > void append( 66 rtl::OUStringBuffer & buffer, T const & value) 67 { 68 buffer.append(value); 69 } 70 71 template<> void append(rtl::OUStringBuffer & buffer, bool const & value) { 72 buffer.append(static_cast< sal_Bool >(value)); 73 } 74 75 template<> void append(rtl::OUStringBuffer & buffer, std::size_t const & value) 76 { 77 buffer.append(static_cast< sal_Int32 >(value)); 78 } 79 80 template<> void append(rtl::OUStringBuffer & buffer, char const * const & value) 81 { 82 buffer.appendAscii(value); 83 } 84 85 template< typename T1, typename T2, typename T3, typename T4 > 86 rtl::OString createTestAssertEqualMessage( 87 char const * token1, T1 const & token2, T2 const & token3, 88 char const * expectedExpr, char const * actualExpr, T3 const & expected, 89 T4 const & actual) 90 { 91 rtl::OUStringBuffer buf; 92 buf.appendAscii(token1); 93 buf.append(static_cast< sal_Unicode >('|')); 94 append(buf, token2); 95 buf.append(static_cast< sal_Unicode >('|')); 96 append(buf, token3); 97 buf.appendAscii(RTL_CONSTASCII_STRINGPARAM(": TEST_ASSERT_EQUAL(")); 98 buf.appendAscii(expectedExpr); 99 buf.appendAscii(RTL_CONSTASCII_STRINGPARAM(", ")); 100 buf.appendAscii(actualExpr); 101 buf.appendAscii(RTL_CONSTASCII_STRINGPARAM("): <")); 102 append(buf, expected); 103 buf.appendAscii(RTL_CONSTASCII_STRINGPARAM("> != <")); 104 append(buf, actual); 105 buf.append(static_cast< sal_Unicode >('>')); 106 return rtl::OUStringToOString( 107 buf.makeStringAndClear(), RTL_TEXTENCODING_ASCII_US); 108 } 109 110 class Test: public ::testing::Test { 111 public: 112 virtual void SetUp(); 113 114 virtual void TearDown(); 115 116 protected: 117 css::uno::Reference< css::uno::XComponentContext > m_context; 118 css::uno::Reference< css::uri::XUriReferenceFactory > m_uriFactory; 119 }; 120 121 void Test::SetUp() { 122 m_context = cppu::defaultBootstrap_InitialComponentContext(); 123 m_uriFactory = css::uri::UriReferenceFactory::create(m_context); 124 } 125 126 void Test::TearDown() { 127 m_uriFactory.clear(); 128 css::uno::Reference< css::lang::XComponent >( 129 m_context, css::uno::UNO_QUERY_THROW)->dispose(); 130 } 131 132 TEST_F(Test, testParse) { 133 struct Data { 134 char const * uriReference; 135 char const * scheme; 136 char const * schemeSpecificPart; 137 bool isHierarchical; 138 char const * authority; 139 char const * path; 140 bool hasRelativePath; 141 sal_Int32 pathSegmentCount; 142 char const * pathSegment0; 143 char const * pathSegment1; 144 char const * pathSegment2; 145 char const * pathSegment3; 146 char const * pathSegment4; 147 char const * query; 148 char const * fragment; 149 }; 150 Data data[] = { 151 { "", 0, "", true, 0, 152 "", true, 0, "", "", "", "", "", 0, 0 }, 153 { "scheme:", 0, 0, false, 0, 154 0, false, 0, 0, 0, 0, 0, 0, 0, 0 }, 155 { "scheme:/", "scheme", "/", true, 0, 156 "/", false, 1, "", "", "", "", "", 0, 0 }, 157 { "scheme://", "scheme", "//", true, "", 158 "", false, 0, "", "", "", "", "", 0, 0 }, 159 { "scheme:///", "scheme", "///", true, "", 160 "/", false, 1, "", "", "", "", "", 0, 0 }, 161 { "scheme:////", "scheme", "////", true, "", 162 "//", false, 2, "", "", "", "", "", 0, 0 }, 163 { "scheme:////", "scheme", "////", true, "", 164 "//", false, 2, "", "", "", "", "", 0, 0 }, 165 { "scheme:#", 0, 0, false, 0, 166 0, false, 0, 0, 0, 0, 0, 0, 0, 0 }, 167 { "scheme:?", "scheme", "?", false, 0, 168 "?", false, 0, "", "", "", "", "", 0, 0 }, 169 { "/", 0, "/", true, 0, 170 "/", false, 1, "", "", "", "", "", 0, 0 }, 171 { "//", 0, "//", true, "", 172 "", false, 0, "", "", "", "", "", 0, 0 }, 173 { "///", 0, "///", true, "", 174 "/", false, 1, "", "", "", "", "", 0, 0 }, 175 { "////", 0, "////", true, "", 176 "//", false, 2, "", "", "", "", "", 0, 0 } }; 177 for (std::size_t i = 0; i < sizeof data / sizeof data[0]; ++i) { 178 css::uno::Reference< css::uri::XUriReference > uriRef( 179 m_uriFactory->parse( 180 rtl::OUString::createFromAscii(data[i].uriReference))); 181 ASSERT_TRUE(uriRef.is() == (data[i].schemeSpecificPart != 0)); 182 if (uriRef.is()) { 183 TEST_ASSERT_EQUAL( 184 "testParse", i, data[i].uriReference, 185 rtl::OUString::createFromAscii(data[i].uriReference), 186 uriRef->getUriReference()); 187 TEST_ASSERT_EQUAL( 188 "testParse", i, data[i].uriReference, 189 data[i].scheme != 0, uriRef->isAbsolute()); 190 TEST_ASSERT_EQUAL( 191 "testParse", i, data[i].uriReference, 192 rtl::OUString::createFromAscii( 193 data[i].scheme == 0 ? "" : data[i].scheme), 194 uriRef->getScheme()); 195 TEST_ASSERT_EQUAL( 196 "testParse", i, data[i].uriReference, 197 rtl::OUString::createFromAscii(data[i].schemeSpecificPart), 198 uriRef->getSchemeSpecificPart()); 199 TEST_ASSERT_EQUAL( 200 "testParse", i, data[i].uriReference, 201 data[i].isHierarchical, 202 static_cast< bool >(uriRef->isHierarchical())); 203 TEST_ASSERT_EQUAL( 204 "testParse", i, data[i].uriReference, 205 data[i].authority != 0, uriRef->hasAuthority()); 206 TEST_ASSERT_EQUAL( 207 "testParse", i, data[i].uriReference, 208 rtl::OUString::createFromAscii( 209 data[i].authority == 0 ? "" : data[i].authority), 210 uriRef->getAuthority()); 211 TEST_ASSERT_EQUAL( 212 "testParse", i, data[i].uriReference, 213 rtl::OUString::createFromAscii(data[i].path), 214 uriRef->getPath()); 215 TEST_ASSERT_EQUAL( 216 "testParse", i, data[i].uriReference, 217 data[i].hasRelativePath, 218 static_cast< bool >(uriRef->hasRelativePath())); 219 TEST_ASSERT_EQUAL( 220 "testParse", i, data[i].uriReference, 221 data[i].pathSegmentCount, uriRef->getPathSegmentCount()); 222 TEST_ASSERT_EQUAL( 223 "testParse", i, data[i].uriReference, 224 rtl::OUString::createFromAscii(""), uriRef->getPathSegment(-1)); 225 TEST_ASSERT_EQUAL( 226 "testParse", i, data[i].uriReference, 227 rtl::OUString::createFromAscii(data[i].pathSegment0), 228 uriRef->getPathSegment(0)); 229 TEST_ASSERT_EQUAL( 230 "testParse", i, data[i].uriReference, 231 rtl::OUString::createFromAscii(data[i].pathSegment1), 232 uriRef->getPathSegment(1)); 233 TEST_ASSERT_EQUAL( 234 "testParse", i, data[i].uriReference, 235 rtl::OUString::createFromAscii(data[i].pathSegment2), 236 uriRef->getPathSegment(2)); 237 TEST_ASSERT_EQUAL( 238 "testParse", i, data[i].uriReference, 239 rtl::OUString::createFromAscii(data[i].pathSegment3), 240 uriRef->getPathSegment(3)); 241 TEST_ASSERT_EQUAL( 242 "testParse", i, data[i].uriReference, 243 rtl::OUString::createFromAscii(data[i].pathSegment4), 244 uriRef->getPathSegment(4)); 245 TEST_ASSERT_EQUAL( 246 "testParse", i, data[i].uriReference, 247 rtl::OUString::createFromAscii(""), uriRef->getPathSegment(5)); 248 TEST_ASSERT_EQUAL( 249 "testParse", i, data[i].uriReference, 250 data[i].query != 0, uriRef->hasQuery()); 251 TEST_ASSERT_EQUAL( 252 "testParse", i, data[i].uriReference, 253 rtl::OUString::createFromAscii( 254 data[i].query == 0 ? "" : data[i].query), 255 uriRef->getQuery()); 256 TEST_ASSERT_EQUAL( 257 "testParse", i, data[i].uriReference, 258 data[i].fragment != 0, uriRef->hasFragment()); 259 TEST_ASSERT_EQUAL( 260 "testParse", i, data[i].uriReference, 261 rtl::OUString::createFromAscii( 262 data[i].fragment == 0 ? "" : data[i].fragment), 263 uriRef->getFragment()); 264 } 265 } 266 } 267 268 TEST_F(Test, testMakeAbsolute) { 269 struct Data { 270 char const * baseUriReference; 271 char const * uriReference; 272 bool processSpecialBaseSegments; 273 css::uri::RelativeUriExcessParentSegments excessParentSegments; 274 char const * absolute; 275 }; 276 Data data[] = { 277 // The following tests are taken from RFC 2396, Appendix C: 278 { "http://a/b/c/d;p?q", "g:h", true, 279 css::uri::RelativeUriExcessParentSegments_ERROR, "g:h" }, 280 { "http://a/b/c/d;p?q", "g", true, 281 css::uri::RelativeUriExcessParentSegments_ERROR, "http://a/b/c/g" }, 282 { "http://a/b/c/d;p?q", "./g", true, 283 css::uri::RelativeUriExcessParentSegments_ERROR, "http://a/b/c/g" }, 284 { "http://a/b/c/d;p?q", "g/", true, 285 css::uri::RelativeUriExcessParentSegments_ERROR, "http://a/b/c/g/" }, 286 { "http://a/b/c/d;p?q", "//g", true, 287 css::uri::RelativeUriExcessParentSegments_ERROR, "http://g" }, 288 { "http://a/b/c/d;p?q", "?y", true, 289 css::uri::RelativeUriExcessParentSegments_ERROR, "http://a/b/c/?y" }, 290 { "http://a/b/c/d;p?q", "g?y", true, 291 css::uri::RelativeUriExcessParentSegments_ERROR, 292 "http://a/b/c/g?y" }, 293 { "http://a/b/c/d;p?q", "#s", true, 294 css::uri::RelativeUriExcessParentSegments_ERROR, 295 "http://a/b/c/d;p?q#s" }, 296 { "http://a/b/c/d;p?q", "g#s", true, 297 css::uri::RelativeUriExcessParentSegments_ERROR, 298 "http://a/b/c/g#s" }, 299 { "http://a/b/c/d;p?q", "g?y#s", true, 300 css::uri::RelativeUriExcessParentSegments_ERROR, 301 "http://a/b/c/g?y#s" }, 302 { "http://a/b/c/d;p?q", ";x", true, 303 css::uri::RelativeUriExcessParentSegments_ERROR, "http://a/b/c/;x" }, 304 { "http://a/b/c/d;p?q", "g;x", true, 305 css::uri::RelativeUriExcessParentSegments_ERROR, 306 "http://a/b/c/g;x" }, 307 { "http://a/b/c/d;p?q", "g;x?y#s", true, 308 css::uri::RelativeUriExcessParentSegments_ERROR, 309 "http://a/b/c/g;x?y#s" }, 310 { "http://a/b/c/d;p?q", ".", true, 311 css::uri::RelativeUriExcessParentSegments_ERROR, "http://a/b/c/" }, 312 { "http://a/b/c/d;p?q", "./", true, 313 css::uri::RelativeUriExcessParentSegments_ERROR, "http://a/b/c/" }, 314 { "http://a/b/c/d;p?q", "..", true, 315 css::uri::RelativeUriExcessParentSegments_ERROR, "http://a/b/" }, 316 { "http://a/b/c/d;p?q", "../", true, 317 css::uri::RelativeUriExcessParentSegments_ERROR, "http://a/b/" }, 318 { "http://a/b/c/d;p?q", "../g", true, 319 css::uri::RelativeUriExcessParentSegments_ERROR, "http://a/b/g" }, 320 { "http://a/b/c/d;p?q", "../..", true, 321 css::uri::RelativeUriExcessParentSegments_ERROR, "http://a/" }, 322 { "http://a/b/c/d;p?q", "../../", true, 323 css::uri::RelativeUriExcessParentSegments_ERROR, "http://a/" }, 324 { "http://a/b/c/d;p?q", "../../g", true, 325 css::uri::RelativeUriExcessParentSegments_ERROR, "http://a/g" }, 326 { "http://a/b/c/d;p?q", "", true, 327 css::uri::RelativeUriExcessParentSegments_ERROR, 328 "http://a/b/c/d;p?q" }, 329 { "http://a/b/c/d;p?q", "../../../g", true, 330 css::uri::RelativeUriExcessParentSegments_ERROR, 0 }, 331 { "http://a/b/c/d;p?q", "../../../g", true, 332 css::uri::RelativeUriExcessParentSegments_RETAIN, "http://a/../g" }, 333 { "http://a/b/c/d;p?q", "../../../g", true, 334 css::uri::RelativeUriExcessParentSegments_REMOVE, "http://a/g" }, 335 { "http://a/b/c/d;p?q", "../../../../g", true, 336 css::uri::RelativeUriExcessParentSegments_ERROR, 0 }, 337 { "http://a/b/c/d;p?q", "../../../../g", true, 338 css::uri::RelativeUriExcessParentSegments_RETAIN, 339 "http://a/../../g" }, 340 { "http://a/b/c/d;p?q", "../../../../g", true, 341 css::uri::RelativeUriExcessParentSegments_REMOVE, "http://a/g" }, 342 { "http://a/b/c/d;p?q", "/./g", true, 343 css::uri::RelativeUriExcessParentSegments_ERROR, "http://a/./g" }, 344 { "http://a/b/c/d;p?q", "/../g", true, 345 css::uri::RelativeUriExcessParentSegments_ERROR, "http://a/../g" }, 346 { "http://a/b/c/d;p?q", "g.", true, 347 css::uri::RelativeUriExcessParentSegments_ERROR, "http://a/b/c/g." }, 348 { "http://a/b/c/d;p?q", ".g", true, 349 css::uri::RelativeUriExcessParentSegments_ERROR, "http://a/b/c/.g" }, 350 { "http://a/b/c/d;p?q", "g..", true, 351 css::uri::RelativeUriExcessParentSegments_ERROR, 352 "http://a/b/c/g.." }, 353 { "http://a/b/c/d;p?q", "..g", true, 354 css::uri::RelativeUriExcessParentSegments_ERROR, 355 "http://a/b/c/..g" }, 356 { "http://a/b/c/d;p?q", "./../g", true, 357 css::uri::RelativeUriExcessParentSegments_ERROR, "http://a/b/g" }, 358 { "http://a/b/c/d;p?q", "./g/.", true, 359 css::uri::RelativeUriExcessParentSegments_ERROR, "http://a/b/c/g/" }, 360 { "http://a/b/c/d;p?q", "g/./h", true, 361 css::uri::RelativeUriExcessParentSegments_ERROR, 362 "http://a/b/c/g/h" }, 363 { "http://a/b/c/d;p?q", "g/../h", true, 364 css::uri::RelativeUriExcessParentSegments_ERROR, "http://a/b/c/h" }, 365 { "http://a/b/c/d;p?q", "g;x=1/./y", true, 366 css::uri::RelativeUriExcessParentSegments_ERROR, 367 "http://a/b/c/g;x=1/y" }, 368 { "http://a/b/c/d;p?q", "g;x=1/../y", true, 369 css::uri::RelativeUriExcessParentSegments_ERROR, "http://a/b/c/y" }, 370 { "http://a/b/c/d;p?q", "g?y/./x", true, 371 css::uri::RelativeUriExcessParentSegments_ERROR, 372 "http://a/b/c/g?y/./x" }, 373 { "http://a/b/c/d;p?q", "g?y/../x", true, 374 css::uri::RelativeUriExcessParentSegments_ERROR, 375 "http://a/b/c/g?y/../x" }, 376 { "http://a/b/c/d;p?q", "g#s/./x", true, 377 css::uri::RelativeUriExcessParentSegments_ERROR, 378 "http://a/b/c/g#s/./x" }, 379 { "http://a/b/c/d;p?q", "g#s/../x", true, 380 css::uri::RelativeUriExcessParentSegments_ERROR, 381 "http://a/b/c/g#s/../x" }, 382 { "http.://a/b/c/d;p?q", "http.:g", true, 383 css::uri::RelativeUriExcessParentSegments_ERROR, "http.:g" }, 384 385 { "scheme://a", "", true, 386 css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a" }, 387 { "scheme://a", ".", true, 388 css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a" }, 389 { "scheme://a", "./", true, 390 css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a" }, 391 { "scheme://a", "./.", true, 392 css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a" }, 393 { "scheme://a", "././", true, 394 css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a" }, 395 { "scheme://a", "././.", true, 396 css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a" }, 397 { "scheme://a", "x/..", true, 398 css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a" }, 399 { "scheme://a", "x/../", true, 400 css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a" }, 401 { "scheme://a", "x/../.", true, 402 css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a" }, 403 { "scheme://a", "x/.././", true, 404 css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a" }, 405 { "scheme://a", "x/.././.", true, 406 css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a" }, 407 { "scheme://a", "x/../././", true, 408 css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a" }, 409 { "scheme://a", "x/../././.", true, 410 css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a" }, 411 { "scheme://a", "./x/..", true, 412 css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a" }, 413 { "scheme://a", "././x/..", true, 414 css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a" }, 415 { "scheme://a", "./././x/..", true, 416 css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a" }, 417 { "scheme://a", "./x/../.", true, 418 css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a" }, 419 { "scheme://a", "./x/.././", true, 420 css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a" }, 421 { "scheme://a", "././x/.././.", true, 422 css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a" }, 423 { "scheme://a", "././x/../././", true, 424 css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a" }, 425 { "scheme://a", "./././x/../././.", true, 426 css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a" }, 427 428 { "scheme://a/", "", true, 429 css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/" }, 430 { "scheme://a/", ".", true, 431 css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/" }, 432 { "scheme://a/", "./", true, 433 css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/" }, 434 { "scheme://a/", "./.", true, 435 css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/" }, 436 { "scheme://a/", "././", true, 437 css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/" }, 438 { "scheme://a/", "././.", true, 439 css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/" }, 440 { "scheme://a/", "x/..", true, 441 css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/" }, 442 { "scheme://a/", "x/../", true, 443 css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/" }, 444 { "scheme://a/", "x/../.", true, 445 css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/" }, 446 { "scheme://a/", "x/.././", true, 447 css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/" }, 448 { "scheme://a/", "x/.././.", true, 449 css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/" }, 450 { "scheme://a/", "x/../././", true, 451 css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/" }, 452 { "scheme://a/", "x/../././.", true, 453 css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/" }, 454 { "scheme://a/", "./x/..", true, 455 css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/" }, 456 { "scheme://a/", "././x/..", true, 457 css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/" }, 458 { "scheme://a/", "./././x/..", true, 459 css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/" }, 460 { "scheme://a/", "./x/../.", true, 461 css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/" }, 462 { "scheme://a/", "./x/.././", true, 463 css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/" }, 464 { "scheme://a/", "././x/.././.", true, 465 css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/" }, 466 { "scheme://a/", "././x/../././", true, 467 css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/" }, 468 { "scheme://a/", "./././x/../././.", true, 469 css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/" }, 470 471 { "scheme://a/b", "", true, 472 css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/b" }, 473 { "scheme://a/b", ".", true, 474 css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/" }, 475 { "scheme://a/b", "./", true, 476 css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/" }, 477 { "scheme://a/b", "./.", true, 478 css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/" }, 479 { "scheme://a/b", "././", true, 480 css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/" }, 481 { "scheme://a/b", "././.", true, 482 css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/" }, 483 { "scheme://a/b", "x/..", true, 484 css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/" }, 485 { "scheme://a/b", "x/../", true, 486 css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/" }, 487 { "scheme://a/b", "x/../.", true, 488 css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/" }, 489 { "scheme://a/b", "x/.././", true, 490 css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/" }, 491 { "scheme://a/b", "x/.././.", true, 492 css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/" }, 493 { "scheme://a/b", "x/../././", true, 494 css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/" }, 495 { "scheme://a/b", "x/../././.", true, 496 css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/" }, 497 { "scheme://a/b", "./x/..", true, 498 css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/" }, 499 { "scheme://a/b", "././x/..", true, 500 css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/" }, 501 { "scheme://a/b", "./././x/..", true, 502 css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/" }, 503 { "scheme://a/b", "./x/../.", true, 504 css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/" }, 505 { "scheme://a/b", "./x/.././", true, 506 css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/" }, 507 { "scheme://a/b", "././x/.././.", true, 508 css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/" }, 509 { "scheme://a/b", "././x/../././", true, 510 css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/" }, 511 { "scheme://a/b", "./././x/../././.", true, 512 css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/" }, 513 514 { "scheme://a/b/", "", true, 515 css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/b/" }, 516 { "scheme://a/b/", ".", true, 517 css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/b/" }, 518 { "scheme://a/b/", "./", true, 519 css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/b/" }, 520 { "scheme://a/b/", "./.", true, 521 css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/b/" }, 522 { "scheme://a/b/", "././", true, 523 css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/b/" }, 524 { "scheme://a/b/", "././.", true, 525 css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/b/" }, 526 { "scheme://a/b/", "x/..", true, 527 css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/b/" }, 528 { "scheme://a/b/", "x/../", true, 529 css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/b/" }, 530 { "scheme://a/b/", "x/../.", true, 531 css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/b/" }, 532 { "scheme://a/b/", "x/.././", true, 533 css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/b/" }, 534 { "scheme://a/b/", "x/.././.", true, 535 css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/b/" }, 536 { "scheme://a/b/", "x/../././", true, 537 css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/b/" }, 538 { "scheme://a/b/", "x/../././.", true, 539 css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/b/" }, 540 { "scheme://a/b/", "./x/..", true, 541 css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/b/" }, 542 { "scheme://a/b/", "././x/..", true, 543 css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/b/" }, 544 { "scheme://a/b/", "./././x/..", true, 545 css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/b/" }, 546 { "scheme://a/b/", "./x/../.", true, 547 css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/b/" }, 548 { "scheme://a/b/", "./x/.././", true, 549 css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/b/" }, 550 { "scheme://a/b/", "././x/.././.", true, 551 css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/b/" }, 552 { "scheme://a/b/", "././x/../././", true, 553 css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/b/" }, 554 { "scheme://a/b/", "./././x/../././.", true, 555 css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/b/" }, 556 557 { "scheme://a#s", "", true, 558 css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a" }, 559 { "scheme://a", "?q", true, 560 css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a?q" }, 561 { "scheme://a#s", "?q", true, 562 css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a?q" }, 563 { "scheme://a", "#s", true, 564 css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a#s" }, 565 { "scheme://a#s1", "#s2", true, 566 css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a#s2" } }; 567 for (std::size_t i = 0; i < sizeof data / sizeof data[0]; ++i) { 568 css::uno::Reference< css::uri::XUriReference > baseUriRef( 569 m_uriFactory->parse( 570 rtl::OUString::createFromAscii(data[i].baseUriReference))); 571 ASSERT_TRUE(baseUriRef.is()); 572 css::uno::Reference< css::uri::XUriReference > uriRef( 573 m_uriFactory->parse( 574 rtl::OUString::createFromAscii(data[i].uriReference))); 575 ASSERT_TRUE(uriRef.is()); 576 css::uno::Reference< css::uri::XUriReference > absolute( 577 m_uriFactory->makeAbsolute( 578 baseUriRef, uriRef, data[i].processSpecialBaseSegments, 579 data[i].excessParentSegments)); 580 TEST_ASSERT_EQUAL( 581 "testMakeAbsolute", i, data[i].uriReference, 582 data[i].absolute != 0, absolute.is()); 583 if (absolute.is()) { 584 TEST_ASSERT_EQUAL( 585 "testMakeAbsolute", i, data[i].uriReference, 586 rtl::OUString::createFromAscii(data[i].absolute), 587 absolute->getUriReference()); 588 } 589 } 590 } 591 592 TEST_F(Test, testMakeRelative) { 593 struct Data { 594 char const * baseUriReference; 595 char const * uriReference; 596 bool preferAuthorityOverRelativePath; 597 bool preferAbsoluteOverRelativePath; 598 bool encodeRetainedSpecialSegments; 599 char const * relative; 600 char const * absolute; 601 }; 602 Data data[] = { 603 { "scheme1://a/b/c", "scheme2://a/b/c?q#s", true, true, false, 604 "scheme2://a/b/c?q#s", 0 }, 605 { "scheme://a/b/c", "scheme:a/b/c?q#s", true, true, false, 606 "scheme:a/b/c?q#s", 0 }, 607 { "scheme://a/b/c", "", true, true, false, "", "scheme://a/b/c" }, 608 { "scheme://a/b/c", "//d/e/f", true, true, false, "//d/e/f", 609 "scheme://d/e/f" }, 610 { "scheme://a/b/c", "./e?q#s", true, true, false, "./e?q#s", 611 "scheme://a/b/e?q#s" }, 612 { "scheme://a/b", "scheme://a?q", true, true, false, "/?q", 613 "scheme://a/?q" }, 614 { "scheme://a/b", "scheme://a?q", true, false, false, "?q", 615 "scheme://a/?q" }, 616 { "scheme://a", "scheme://a?q", true, true, false, "?q", 0 }, 617 { "scheme://a/", "scheme://a?q", true, true, false, "?q", 618 "scheme://a/?q" }, 619 { "scheme://a", "scheme://a/?q", true, true, false, "?q", 620 "scheme://a?q" }, 621 { "scheme://a/", "scheme://a/?q", true, true, false, "?q", 622 "scheme://a/?q" }, 623 { "scheme://a?q", "scheme://a?q", true, true, false, "", 0 }, 624 { "scheme://a/?q", "scheme://a?q", true, true, false, "", 625 "scheme://a/?q" }, 626 { "scheme://a?q", "scheme://a/?q", true, true, false, "", 627 "scheme://a?q" }, 628 { "scheme://a/?q", "scheme://a/?q", true, true, false, "", 0 }, 629 { "scheme://a/b/c/d", "scheme://a//", true, true, false, "//a//", 0 }, 630 { "scheme://a/b/c/d", "scheme://a//", false, true, false, "../..//", 631 0 }, 632 { "scheme://a/b/c/d", "scheme://a//", true, false, false, "../..//", 633 0 }, 634 { "scheme://a/b/c/d", "scheme://a//", false, false, false, "../..//", 635 0 }, 636 { "scheme://a/b/c/d", "scheme://a/e", true, true, false, "/e", 0 }, 637 { "scheme://a/b/c/d", "scheme://a/e", true, false, false, "../../e", 638 0 }, 639 { "scheme://a/b/c/d/e", "scheme://a/b/f", true, true, false, "../../f", 640 0 }, 641 { "scheme://a/b/c/d/e", "scheme://a/b", true, true, false, "/b", 0 }, 642 { "scheme://a/b/c/d/e", "scheme://a/b", true, false, false, 643 "../../../b", 0 }, 644 { "scheme://a/b/c/d/e", "scheme://a/b/", true, true, false, "../..", 645 0 }, 646 { "scheme://a/b/c/d/e", "scheme://a/b/c", true, true, false, "../../c", 647 0 }, 648 { "scheme://a/b/c/d/e", "scheme://a/b/c/", true, true, false, "..", 0 }, 649 { "scheme://a/b/", "scheme://a/b/c/d", true, true, false, "c/d", 0 }, 650 { "scheme://a/b/", "scheme://a/b/c/d/", true, true, false, "c/d/", 0 }, 651 { "scheme://a/b/c", "scheme://a/b//", true, true, false, ".//", 0 }, 652 { "scheme://a/b/c", "scheme://a/b//d", true, true, false, ".//d", 0 }, 653 { "scheme://a/b/c", "scheme://a/b//d//", true, true, false, ".//d//", 654 0 }, 655 { "scheme://a/b/c", "scheme://a/b/d+:", true, true, false, "./d+:", 0 }, 656 { "scheme://a/b/c", "scheme://a/b/+d:", true, true, false, "+d:", 0 }, 657 { "scheme://a/b/c", "scheme://a/b/d#e:f", true, true, false, "d#e:f", 658 0 }, 659 { "scheme://a/b/c/", "scheme://a/b/../d/.e/.", true, true, false, 660 "../../d/.e/.", 661 "scheme://a/d/.e/" }, 662 { "scheme://a/b/c/", "scheme://a/b/../d/.e/.", true, true, true, 663 "../%2E%2E/d/.e/%2E", "scheme://a/b/%2E%2E/d/.e/%2E" }, 664 { "scheme://auth/a/b", "scheme://auth//c/d", true, true, false, 665 "//auth//c/d", 0 }, 666 { "scheme://auth/a/b", "scheme://auth//c/d", false, true, false, 667 "..//c/d", 0 }, 668 { "scheme://auth/a/b", "scheme://auth/c/d", true, true, false, "/c/d", 669 0 }, 670 { "scheme://auth/a/b", "scheme://auth/c/d", true, false, false, 671 "../c/d", 0 } }; 672 for (std::size_t i = 0; i < sizeof data / sizeof data[0]; ++i) { 673 css::uno::Reference< css::uri::XUriReference > baseUriRef( 674 m_uriFactory->parse( 675 rtl::OUString::createFromAscii(data[i].baseUriReference))); 676 ASSERT_TRUE(baseUriRef.is()); 677 css::uno::Reference< css::uri::XUriReference > uriRef( 678 m_uriFactory->parse( 679 rtl::OUString::createFromAscii(data[i].uriReference))); 680 ASSERT_TRUE(uriRef.is()); 681 css::uno::Reference< css::uri::XUriReference > relative( 682 m_uriFactory->makeRelative( 683 baseUriRef, uriRef, data[i].preferAuthorityOverRelativePath, 684 data[i].preferAbsoluteOverRelativePath, 685 data[i].encodeRetainedSpecialSegments)); 686 TEST_ASSERT_EQUAL( 687 "testMakeRelative", i, data[i].uriReference, 688 data[i].relative != 0, relative.is()); 689 if (relative.is()) { 690 TEST_ASSERT_EQUAL( 691 "testMakeRelative", i, data[i].uriReference, 692 rtl::OUString::createFromAscii(data[i].relative), 693 relative->getUriReference()); 694 css::uno::Reference< css::uri::XUriReference > absolute( 695 m_uriFactory->makeAbsolute( 696 baseUriRef, relative, true, 697 css::uri::RelativeUriExcessParentSegments_ERROR)); 698 ASSERT_TRUE(absolute.is()); 699 TEST_ASSERT_EQUAL( 700 "testMakeRelative", i, data[i].uriReference, 701 rtl::OUString::createFromAscii( 702 data[i].absolute == 0 703 ? data[i].uriReference : data[i].absolute), 704 absolute->getUriReference()); 705 } 706 } 707 } 708 709 TEST_F(Test, testVndSunStarExpand) { 710 struct Data { 711 char const * uriReference; 712 char const * expanded; 713 }; 714 Data data[] = { 715 { "vnd.sun.star.expand:", "" }, // liberally accepted 716 { "vnd.sun.star.expand:/", "/" }, // liberally accepted 717 { "vnd.sun.star.expand:%80", 0 }, 718 { "vnd.sun.star.expand:%5C$%5C%24%5C%5C", "$$\\" } }; 719 css::uno::Reference< css::util::XMacroExpander > expander( 720 m_context->getValueByName( 721 rtl::OUString( 722 RTL_CONSTASCII_USTRINGPARAM( 723 "/singletons/com.sun.star.util.theMacroExpander"))), 724 css::uno::UNO_QUERY_THROW); 725 for (std::size_t i = 0; i < sizeof data / sizeof data[0]; ++i) { 726 css::uno::Reference< css::uri::XUriReference > uriRef( 727 m_uriFactory->parse( 728 rtl::OUString::createFromAscii(data[i].uriReference))); 729 TEST_ASSERT_EQUAL( 730 "testVndSunStarExpand", i, data[i].uriReference, 731 data[i].expanded != 0, uriRef.is()); 732 if (uriRef.is()) { 733 css::uno::Reference< css::uri::XVndSunStarExpandUrlReference > 734 expandUrl(uriRef, css::uno::UNO_QUERY_THROW); 735 TEST_ASSERT_EQUAL( 736 "testVndSunStarExpand", i, data[i].uriReference, 737 rtl::OUString::createFromAscii(data[i].expanded), 738 expandUrl->expand(expander)); 739 } 740 } 741 } 742 743 TEST_F(Test, testVndSunStarScript) { 744 struct Parameter { 745 char const * key; 746 char const * value; 747 }; 748 std::size_t const parameterCount = 3; 749 struct Data { 750 char const * uriReference; 751 char const * name; 752 const bool normalized; 753 Parameter parameters[parameterCount]; 754 }; 755 Data data[] = { 756 { "vnd.sun.star.script:", 0, false, {} }, 757 { "vnd.sun.star.script:/", 0, false, {} }, 758 { "vnd.sun.star.script:/abc/def?ghi=jkl&mno=pqr", 0, false, {} }, 759 { "vnd.sun.star.script:abc%3fdef/ghi", "abc?def/ghi", false, {} }, 760 { "vnd.sun.star.script:name?a", 0, false, {} }, 761 { "vnd.sun.star.script:name?a=", "name", true, { { "a", "" }, { "A", 0 } } }, 762 { "vnd.sun.star.script:name?a=&", 0, true, {} }, 763 { "vnd.sun.star.script:name?key1=&%26=%3D&key1=hello", "name", true, 764 { { "key1", "" }, { "key2", 0 }, { "&", "=" } } } }; 765 for (std::size_t i = 0; i < sizeof data / sizeof data[0]; ++i) { 766 css::uno::Reference< css::uri::XUriReference > uriRef( 767 m_uriFactory->parse( 768 rtl::OUString::createFromAscii(data[i].uriReference))); 769 TEST_ASSERT_EQUAL( 770 "testVndSunStarScript", i, data[i].uriReference, data[i].name != 0, 771 uriRef.is()); 772 if (uriRef.is()) { 773 css::uno::Reference< css::uri::XVndSunStarScriptUrlReference > 774 scriptUrl(uriRef, css::uno::UNO_QUERY_THROW); 775 TEST_ASSERT_EQUAL( 776 "testVndSunStarScript", i, data[i].uriReference, 777 rtl::OUString::createFromAscii(data[i].uriReference), 778 scriptUrl->getUriReference()); 779 TEST_ASSERT_EQUAL( 780 "testVndSunStarScript", i, data[i].uriReference, 781 rtl::OUString::createFromAscii(data[i].name), 782 scriptUrl->getName()); 783 rtl::OUString originalReference(uriRef->getUriReference()); 784 for (std::size_t j = 0; j < parameterCount; ++j) { 785 if (data[i].parameters[j].key != 0) { 786 TEST_ASSERT_EQUAL( 787 "testVndSunStarScript", 788 static_cast< double >(i) 789 + static_cast< double >(j) / 10.0, 790 data[i].uriReference, 791 data[i].parameters[j].value != 0, 792 scriptUrl->hasParameter( 793 rtl::OUString::createFromAscii( 794 data[i].parameters[j].key))); 795 TEST_ASSERT_EQUAL( 796 "testVndSunStarScript", 797 static_cast< double >(i) 798 + static_cast< double >(j) / 10.0, 799 data[i].uriReference, 800 rtl::OUString::createFromAscii( 801 data[i].parameters[j].value), 802 scriptUrl->getParameter( 803 rtl::OUString::createFromAscii( 804 data[i].parameters[j].key))); 805 806 // setting the parameter to its original value should not change 807 // the overall uri reference (provided it was normalized before) 808 if ( data[i].normalized ) { 809 if ( scriptUrl->hasParameter(rtl::OUString::createFromAscii( 810 data[i].parameters[j].key)) ) { 811 scriptUrl->setParameter( 812 rtl::OUString::createFromAscii( 813 data[i].parameters[j].key), 814 scriptUrl->getParameter( 815 rtl::OUString::createFromAscii( 816 data[i].parameters[j].key))); 817 TEST_ASSERT_EQUAL( 818 "testVndSunStarScript", 819 static_cast< double >(i) 820 + static_cast< double >(j) / 10.0, 821 ::rtl::OUString::createFromAscii("setParameter"), 822 originalReference, 823 uriRef->getUriReference()); 824 } 825 } 826 } 827 } 828 if ( data[i].normalized ) { 829 scriptUrl->setName(scriptUrl->getName()); 830 TEST_ASSERT_EQUAL( 831 "testVndSunStarScript", 832 i, 833 ::rtl::OUString::createFromAscii("setName"), 834 originalReference, 835 uriRef->getUriReference()); 836 } 837 } 838 } 839 840 css::uno::Reference< css::uri::XUriReference > uriRef( 841 m_uriFactory->parse( 842 rtl::OUString( 843 RTL_CONSTASCII_USTRINGPARAM( 844 "vnd.sun.star.script:Hello?location=Library.Module"))), 845 css::uno::UNO_SET_THROW); 846 css::uno::Reference< css::uri::XVndSunStarScriptUrlReference > 847 scriptUrl(uriRef, css::uno::UNO_QUERY_THROW); 848 849 scriptUrl->setParameter( 850 ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "location")), 851 ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "foo"))); 852 TEST_ASSERT_EQUAL( 853 "testVndSunStarScript", (sal_Int32)10, (sal_Int32)1, 854 uriRef->getUriReference(), 855 ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "vnd.sun.star.script:Hello?location=foo"))); 856 857 scriptUrl->setParameter( 858 ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "language")), 859 ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "StarBasic"))); 860 TEST_ASSERT_EQUAL( 861 "testVndSunStarScript", (sal_Int32)10, (sal_Int32)2, 862 uriRef->getUriReference(), 863 ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "vnd.sun.star.script:Hello?location=foo&language=StarBasic"))); 864 865 866 bool caughtExpected = false; 867 try { 868 scriptUrl->setName(::rtl::OUString()); 869 } 870 catch( const css::lang::IllegalArgumentException& ) { 871 caughtExpected = true; 872 } 873 TEST_ASSERT_EQUAL( 874 "testVndSunStarScript", 875 ::rtl::OUString::createFromAscii("illegal arguments"), 876 ::rtl::OUString::createFromAscii("name"), 877 caughtExpected, 878 true); 879 880 caughtExpected = false; 881 try { 882 scriptUrl->setParameter( 883 ::rtl::OUString(), 884 ::rtl::OUString::createFromAscii("non-empty")); 885 } 886 catch( const css::lang::IllegalArgumentException& ) { 887 caughtExpected = true; 888 } 889 TEST_ASSERT_EQUAL( 890 "testVndSunStarScript", 891 ::rtl::OUString::createFromAscii("illegal arguments"), 892 ::rtl::OUString::createFromAscii("parameter"), 893 caughtExpected, 894 true); 895 } 896 897 TEST_F(Test, testTranslator) { 898 struct Data { 899 char const * externalUriReference; 900 char const * internalUriReference; 901 bool toInternal; 902 }; 903 Data data[] = { 904 { "", "", true }, 905 { "#fragment", "#fragment", true }, 906 { "segment/segment?query#fragment", "segment/segment?query#fragment", 907 true }, 908 { "/segment/segment?query#fragment", "/segment/segment?query#fragment", 909 true }, 910 { "//authority/segment?query#fragment", 911 "//authority/segment?query#fragment", true }, 912 { "foo:bar#fragment", "foo:bar#fragment", true }, 913 { "file:///abc/def", "file:///abc/def", true }, 914 { "file:///abc/%FEef", "file:///abc/%feef", false }, 915 { "file:///abc/%80%80ef", "file:///abc/%80%80ef", false }, 916 { "file:///abc/%ED%A0%80%ED%B0%80ef", 917 "file:///abc/%ED%A0%80%ED%B0%80ef", false }, 918 { "file:///abc/%25.ef", "file:///abc/%.ef", false }, 919 { "file:///abc/%25ef", "file:///abc/%25ef", true } }; 920 css::uno::Reference< css::uri::XExternalUriReferenceTranslator > 921 translator(css::uri::ExternalUriReferenceTranslator::create(m_context)); 922 for (std::size_t i = 0; i < sizeof data / sizeof data[0]; ++i) { 923 if (data[i].toInternal) { 924 TEST_ASSERT_EQUAL( 925 "testTranslator, translateToInternal", i, 926 data[i].externalUriReference, 927 rtl::OUString::createFromAscii(data[i].internalUriReference), 928 translator->translateToInternal( 929 rtl::OUString::createFromAscii( 930 data[i].externalUriReference))); 931 } 932 TEST_ASSERT_EQUAL( 933 "testTranslator, translateToExternal", i, 934 data[i].internalUriReference, 935 rtl::OUString::createFromAscii(data[i].externalUriReference), 936 translator->translateToExternal( 937 rtl::OUString::createFromAscii(data[i].internalUriReference))); 938 } 939 } 940 941 TEST_F(Test, testPkgUrlFactory) { 942 struct Data { 943 char const * authority; 944 char const * result; 945 }; 946 Data data[] = { 947 { "a/b/c", 0 }, 948 { "file:///#foo", 0 }, 949 { "file:///a%25b%2fc/d~e&f@g?h", 950 "vnd.sun.star.pkg://file:%2F%2F%2Fa%2525b%252fc%2Fd~e&f@g%3Fh" } }; 951 css::uno::Reference< css::uri::XVndSunStarPkgUrlReferenceFactory > factory( 952 css::uri::VndSunStarPkgUrlReferenceFactory::create(m_context)); 953 for (std::size_t i = 0; i < sizeof data / sizeof data[0]; ++i) { 954 css::uno::Reference< css::uri::XUriReference > url( 955 factory->createVndSunStarPkgUrlReference( 956 m_uriFactory->parse( 957 rtl::OUString::createFromAscii(data[i].authority)))); 958 TEST_ASSERT_EQUAL( 959 "testVndSunStarPkgFactory", i, data[i].authority, 960 data[i].result != 0, static_cast< bool >(url.is())); 961 if (data[i].result != 0) { 962 TEST_ASSERT_EQUAL( 963 "testVndSunStarPkgFactory", i, data[i].authority, 964 rtl::OUString::createFromAscii(data[i].result), 965 url->getUriReference()); 966 } 967 } 968 } 969 970 971 } 972 973 int main(int argc, char **argv) 974 { 975 osl_setCommandArgs(argc, argv); 976 ::testing::InitGoogleTest(&argc, argv); 977 return RUN_ALL_TESTS(); 978 } 979