1#ifndef lint 2static char *rcsid = "$Id: api.tsy,v 1.1 2003/06/04 00:26:50 marka Exp $"; 3#endif 4 5/* 6 * Copyright (c) 2002 Japan Network Information Center. 7 * All rights reserved. 8 * 9 * By using this file, you agree to the terms and conditions set forth bellow. 10 * 11 * LICENSE TERMS AND CONDITIONS 12 * 13 * The following License Terms and Conditions apply, unless a different 14 * license is obtained from Japan Network Information Center ("JPNIC"), 15 * a Japanese association, Kokusai-Kougyou-Kanda Bldg 6F, 2-3-4 Uchi-Kanda, 16 * Chiyoda-ku, Tokyo 101-0047, Japan. 17 * 18 * 1. Use, Modification and Redistribution (including distribution of any 19 * modified or derived work) in source and/or binary forms is permitted 20 * under this License Terms and Conditions. 21 * 22 * 2. Redistribution of source code must retain the copyright notices as they 23 * appear in each source code file, this License Terms and Conditions. 24 * 25 * 3. Redistribution in binary form must reproduce the Copyright Notice, 26 * this License Terms and Conditions, in the documentation and/or other 27 * materials provided with the distribution. For the purposes of binary 28 * distribution the "Copyright Notice" refers to the following language: 29 * "Copyright (c) 2000-2002 Japan Network Information Center. All rights reserved." 30 * 31 * 4. The name of JPNIC may not be used to endorse or promote products 32 * derived from this Software without specific prior written approval of 33 * JPNIC. 34 * 35 * 5. Disclaimer/Limitation of Liability: THIS SOFTWARE IS PROVIDED BY JPNIC 36 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 37 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A 38 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JPNIC BE LIABLE 39 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 40 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 41 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 42 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 43 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 44 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 45 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 46 */ 47 48#include <stddef.h> 49#include <stdio.h> 50#include <stdlib.h> 51#include <string.h> 52#include <idn/api.h> 53#include <idn/log.h> 54 55#include "codeset.h" 56#include "setenv.h" 57 58#ifndef EUCJP_ENCODING_NAME 59#define EUCJP_ENCODING_NAME "eucJP" 60#endif 61 62/* 63 * U+304B: hiragana letter KA 64 * U+3099: combining katakana-hiragana voiced sound mark 65 * 66 * map("U+304B U+3099") -> "U+304C" 67 * 68 * U+304C: hiragana letter GA 69 */ 70#define UTF8_NAME "A<U+304B><U+3099>" 71#define UTF8_REVNAME "a<U+304C>" 72 73/* 74 * A4AC: hiragana letter GA (in EUC-JP) 75 */ 76#define EUCJP_NAME "\xa4\xac" 77#define EUCJP_REVNAME "\xa4\xac" 78 79/* 80 * Conversion result of "U+304B U+3099 A" 81 */ 82#define PUNYCODE_NAME "xn--a-i8t" 83 84/* 85 * Conversion result of "A U+304B U+3099" (in EUC-JP). 86 */ 87#define AUX_EUCJP_NAME "xn--a-i\xa3\xb8t" 88 89 90//-------------------------------------------------------------------- 91// Setups and Teardowns. 92//-------------------------------------------------------------------- 93 94//# SETUP 95// group: generic-conversion 96//-- 97// Initialize the `api' module. 98// Set local encoding to `UTF-8'. 99{ 100 char to[256]; 101 idn_result_t r; 102 103 setenv("IDN_LOCAL_CODESET", "UTF-8", 1); 104 unsetenv("IDN_DISABLE"); 105 idn_nameinit(0); 106} 107 108//# SETUP 109// group: quiet 110//-- 111// Set log level to `fatal' to supress log messages. 112{ 113 int saved_log_level; 114 115 saved_log_level = idn_log_getlevel(); 116 idn_log_setlevel(idn_log_level_fatal); 117} 118 119//# TEARDOWN 120// group: quiet 121//-- 122// Restore log level. 123{ 124 idn_log_setlevel(saved_log_level); 125} 126 127//-------------------------------------------------------------------- 128// Testcases. 129//-------------------------------------------------------------------- 130 131//# TESTCASE 132// title: basic conversion by encodename() 133// group: generic-conversion 134{ 135 r = idn_encodename(IDN_ENCODE_APP, UTF8_NAME, to, sizeof(to)); 136 ASSERT_RESULT(r, idn_success); 137 ASSERT_STRING(to, PUNYCODE_NAME); 138} 139 140//# TESTCASE 141// title: basic conversion by decodename() 142// group: generic-conversion 143{ 144 r = idn_decodename(IDN_DECODE_APP, PUNYCODE_NAME, to, sizeof(to)); 145 ASSERT_RESULT(r, idn_success); 146 ASSERT_STRING(to, UTF8_REVNAME); 147} 148 149//# TESTCASE 150// title: basic conversion by decodename2() 151// group: generic-conversion 152{ 153 r = idn_decodename2(IDN_DECODE_APP, AUX_EUCJP_NAME, to, sizeof(to), 154 EUCJP_ENCODING_NAME); 155#ifdef WITHOUT_ICONV 156 ASSERT_RESULT(r, idn_failure); 157#else 158 ASSERT_RESULT(r, idn_success); 159 ASSERT_STRING(to, UTF8_REVNAME); 160#endif 161} 162 163//# TESTCASE 164// title: call decodename2() with auxencoding=NULL 165// group: generic-conversion 166{ 167#ifdef WITHOUT_ICONV 168 SKIP_TESTCASE; 169#else 170 r = idn_decodename2(IDN_DECODE_APP, PUNYCODE_NAME, to, sizeof(to), 171 NULL); 172 ASSERT_RESULT(r, idn_success); 173 ASSERT_STRING(to, UTF8_REVNAME); 174#endif 175} 176 177//# TESTCASE 178// title: call encodename() with actions=0 179// group: generic-conversion 180{ 181 r = idn_encodename(0, UTF8_NAME, to, sizeof(to)); 182 ASSERT_RESULT(r, idn_success); 183 ASSERT_STRING(to, UTF8_NAME); 184} 185 186//# TESTCASE 187// title: call decodename() with actions=0 188// group: generic-conversion 189{ 190 r = idn_decodename(0, PUNYCODE_NAME, to, sizeof(to)); 191 ASSERT_RESULT(r, idn_success); 192 ASSERT_STRING(to, PUNYCODE_NAME); 193} 194 195//# TESTCASE 196// title: call decodename2() with actions=0 197// group: generic-conversion 198{ 199#ifdef WITHOUT_ICONV 200 SKIP_TESTCASE; 201#else 202 r = idn_decodename2(0, AUX_EUCJP_NAME, to, sizeof(to), 203 EUCJP_ENCODING_NAME); 204 ASSERT_RESULT(r, idn_success); 205 ASSERT_STRING(to, AUX_EUCJP_NAME); 206#endif 207} 208 209//# TESTCASE 210// title: call encodename() with actions=rtcheck 211// group: generic-conversion quiet 212{ 213 r = idn_encodename(IDN_RTCHECK, EUCJP_NAME, to, sizeof(to)); 214 ASSERT_RESULT(r, idn_invalid_action); 215} 216 217//# TESTCASE 218// title: call encodename() with actions=decode-query 219// group: generic-conversion quiet 220{ 221 r = idn_encodename(IDN_DECODE_QUERY, EUCJP_NAME, to, sizeof(to)); 222 ASSERT_RESULT(r, idn_invalid_action); 223} 224 225//# TESTCASE 226// title: call encodename() with actions=decode-app 227// group: generic-conversion quiet 228{ 229 r = idn_encodename(IDN_DECODE_APP, EUCJP_NAME, to, sizeof(to)); 230 ASSERT_RESULT(r, idn_invalid_action); 231} 232 233//# TESTCASE 234// title: call encodename() with actions=decode-stored 235// group: generic-conversion quiet 236{ 237 r = idn_encodename(IDN_DECODE_STORED, EUCJP_NAME, to, sizeof(to)); 238 ASSERT_RESULT(r, idn_invalid_action); 239} 240 241//# TESTCASE 242// title: call encodename() with actions=(1<<31) 243// group: generic-conversion quiet 244{ 245 r = idn_encodename(1 << 31, EUCJP_NAME, to, sizeof(to)); 246 ASSERT_RESULT(r, idn_invalid_action); 247} 248 249//# TESTCASE 250// title: call decodename() with actions=localmap 251// group: generic-conversion quiet 252{ 253 r = idn_decodename(IDN_LOCALMAP, PUNYCODE_NAME, to, sizeof(to)); 254 ASSERT_RESULT(r, idn_invalid_action); 255} 256 257//# TESTCASE 258// title: call decodename2() with actions=localmap 259// group: generic-conversion quiet 260{ 261#ifdef WITHOUT_ICONV 262 SKIP_TESTCASE; 263#else 264 r = idn_decodename2(IDN_LOCALMAP, AUX_EUCJP_NAME, to, sizeof(to), 265 EUCJP_ENCODING_NAME); 266 ASSERT_RESULT(r, idn_invalid_action); 267#endif 268} 269 270//# TESTCASE 271// title: call decodename() with actions=lencheck 272// group: generic-conversion quiet 273{ 274 r = idn_decodename(IDN_LENCHECK, PUNYCODE_NAME, to, sizeof(to)); 275 ASSERT_RESULT(r, idn_invalid_action); 276} 277 278//# TESTCASE 279// title: call decodename2() with actions=lencheck 280// group: generic-conversion quiet 281{ 282#ifdef WITHOUT_ICONV 283 SKIP_TESTCASE; 284#else 285 r = idn_decodename2(IDN_LENCHECK, AUX_EUCJP_NAME, to, sizeof(to), 286 EUCJP_ENCODING_NAME); 287 ASSERT_RESULT(r, idn_invalid_action); 288#endif 289} 290 291//# TESTCASE 292// title: call decodename() with actions=encode-query 293// group: generic-conversion quiet 294{ 295 r = idn_decodename(IDN_ENCODE_QUERY, PUNYCODE_NAME, to, sizeof(to)); 296 ASSERT_RESULT(r, idn_invalid_action); 297} 298 299//# TESTCASE 300// title: call decodename2() with actions=encode-query 301// group: generic-conversion quiet 302{ 303#ifdef WITHOUT_ICONV 304 SKIP_TESTCASE; 305#else 306 r = idn_decodename2(IDN_ENCODE_QUERY, AUX_EUCJP_NAME, to, sizeof(to), 307 EUCJP_ENCODING_NAME); 308 ASSERT_RESULT(r, idn_invalid_action); 309#endif 310} 311 312//# TESTCASE 313// title: call decodename() with actions=encode-app 314// group: generic-conversion quiet 315{ 316 r = idn_decodename(IDN_ENCODE_APP, PUNYCODE_NAME, to, sizeof(to)); 317 ASSERT_RESULT(r, idn_invalid_action); 318} 319 320//# TESTCASE 321// title: call decodename2() with actions=encode-app 322// group: generic-conversion quiet 323{ 324#ifdef WITHOUT_ICONV 325 SKIP_TESTCASE; 326#else 327 r = idn_decodename2(IDN_ENCODE_APP, AUX_EUCJP_NAME, to, sizeof(to), 328 EUCJP_ENCODING_NAME); 329 ASSERT_RESULT(r, idn_invalid_action); 330#endif 331} 332 333//# TESTCASE 334// title: call decodename() with actions=encode-stored 335// group: generic-conversion quiet 336{ 337 r = idn_decodename(IDN_ENCODE_STORED, PUNYCODE_NAME, to, sizeof(to)); 338 ASSERT_RESULT(r, idn_invalid_action); 339} 340 341//# TESTCASE 342// title: call decodename2() with actions=encode-stored 343// group: generic-conversion quiet 344{ 345#ifdef WITHOUT_ICONV 346 SKIP_TESTCASE; 347#else 348 r = idn_decodename2(IDN_ENCODE_STORED, AUX_EUCJP_NAME, to, sizeof(to), 349 EUCJP_ENCODING_NAME); 350 ASSERT_RESULT(r, idn_invalid_action); 351#endif 352} 353 354//# TESTCASE 355// title: call decodename() with actions=(1<<31) 356// group: generic-conversion quiet 357{ 358 r = idn_decodename(1 << 31, PUNYCODE_NAME, to, sizeof(to)); 359 ASSERT_RESULT(r, idn_invalid_action); 360} 361 362//# TESTCASE 363// title: call decodename2() with actions=(1<<31) 364// group: generic-conversion quiet 365{ 366#ifdef WITHOUT_ICONV 367 SKIP_TESTCASE; 368#else 369 r = idn_decodename2(1 << 31, AUX_EUCJP_NAME, to, sizeof(to), 370 EUCJP_ENCODING_NAME); 371 ASSERT_RESULT(r, idn_invalid_action); 372#endif 373} 374 375//# TESTCASE 376// title: call encodename() with actions=localconv 377// group: generic-conversion quiet 378{ 379#ifndef WITHOUT_ICONV 380 SKIP_TESTCASE; 381#else 382 r = idn_encodename(IDN_LOCALCONV, UTF8_NAME, to, sizeof(to)); 383 ASSERT_RESULT(r, idn_invalid_action); 384#endif 385} 386 387//# TESTCASE 388// title: call decodename() with actions=localconv 389// group: generic-conversion quiet 390{ 391#ifndef WITHOUT_ICONV 392 SKIP_TESTCASE; 393#else 394 r = idn_decodename(IDN_LOCALCONV, PUNYCODE_NAME, to, sizeof(to)); 395 ASSERT_RESULT(r, idn_invalid_action); 396#endif 397} 398 399//# TESTCASE 400// title: call decodename2() with actions=localconv 401// group: generic-conversion 402{ 403#ifndef WITHOUT_ICONV 404 SKIP_TESTCASE; 405#else 406 r = idn_decodename2(IDN_LOCALCONV, AUX_EUCJP_NAME, to, sizeof(to), 407 EUCJP_ENCODING_NAME); 408 ASSERT_RESULT(r, idn_failure); 409#endif 410} 411 412//# TESTCASE 413// title: call enable(0) and then encodename() 414// group: generic-conversion 415{ 416 idn_enable(0); 417 r = idn_encodename(IDN_ENCODE_APP, UTF8_NAME, to, sizeof(to)); 418 ASSERT_RESULT(r, idn_success); 419 ASSERT_STRING(to, UTF8_NAME); 420} 421 422//# TESTCASE 423// title: call decodename() when IDN_DISABLE is defined 424// group: generic-conversion 425{ 426 idn_enable(0); 427 r = idn_decodename(IDN_DECODE_APP, PUNYCODE_NAME, to, sizeof(to)); 428 ASSERT_RESULT(r, idn_success); 429 ASSERT_STRING(to, PUNYCODE_NAME); 430} 431 432//# TESTCASE 433// title: call decodename() when IDN_DISABLE is defined 434// group: generic-conversion 435{ 436#ifdef WITHOUT_ICONV 437 SKIP_TESTCASE; 438#else 439 idn_enable(0); 440 r = idn_decodename2(IDN_DECODE_APP, AUX_EUCJP_NAME, to, sizeof(to), 441 EUCJP_ENCODING_NAME); 442 ASSERT_RESULT(r, idn_success); 443 ASSERT_STRING(to, AUX_EUCJP_NAME); 444#endif 445} 446 447//# TESTCASE 448// title: call enable(0) and then encodename() 449// group: generic-conversion 450{ 451 idn_enable(0); 452 r = idn_encodename(IDN_ENCODE_APP, UTF8_NAME, to, sizeof(to)); 453 ASSERT_RESULT(r, idn_success); 454 ASSERT_STRING(to, UTF8_NAME); 455} 456 457//# TESTCASE 458// title: call enable(0) and then decodename() 459// group: generic-conversion 460{ 461 idn_enable(0); 462 r = idn_decodename(IDN_DECODE_APP, PUNYCODE_NAME, to, sizeof(to)); 463 ASSERT_RESULT(r, idn_success); 464 ASSERT_STRING(to, PUNYCODE_NAME); 465} 466 467//# TESTCASE 468// title: call enable(0) and then decodename2() 469// group: generic-conversion 470{ 471#ifdef WITHOUT_ICONV 472 SKIP_TESTCASE; 473#else 474 idn_enable(0); 475 r = idn_decodename2(IDN_DECODE_APP, AUX_EUCJP_NAME, to, sizeof(to), 476 EUCJP_ENCODING_NAME); 477 ASSERT_RESULT(r, idn_success); 478 ASSERT_STRING(to, AUX_EUCJP_NAME); 479#endif 480} 481 482//# TESTCASE 483// title: set IDN_DISABLE and call encodename() 484// group: generic-conversion 485{ 486 setenv("IDN_DISABLE", "1", 1); 487 r = idn_encodename(IDN_ENCODE_APP, UTF8_NAME, to, sizeof(to)); 488 ASSERT_RESULT(r, idn_success); 489 ASSERT_STRING(to, UTF8_NAME); 490} 491 492//# TESTCASE 493// title: set IDN_DISABLE and call decodename() 494// group: generic-conversion 495{ 496 setenv("IDN_DISABLE", "1", 1); 497 r = idn_decodename(IDN_DECODE_APP, PUNYCODE_NAME, to, sizeof(to)); 498 ASSERT_RESULT(r, idn_success); 499 ASSERT_STRING(to, PUNYCODE_NAME); 500} 501 502//# TESTCASE 503// title: set IDN_DISABLE and call decodename2() 504// group: generic-conversion 505{ 506#ifdef WITHOUT_ICONV 507 SKIP_TESTCASE; 508#else 509 setenv("IDN_DISABLE", "1", 1); 510 r = idn_decodename2(IDN_DECODE_APP, AUX_EUCJP_NAME, to, sizeof(to), 511 EUCJP_ENCODING_NAME); 512 ASSERT_RESULT(r, idn_success); 513 ASSERT_STRING(to, AUX_EUCJP_NAME); 514#endif 515} 516 517//# TESTCASE 518// title: set IDN_DISABLE, and then call enable(1) and encodename() 519// group: generic-conversion 520{ 521 setenv("IDN_DISABLE", "1", 1); 522 idn_enable(1); 523 r = idn_encodename(IDN_ENCODE_APP, UTF8_NAME, to, sizeof(to)); 524 ASSERT_RESULT(r, idn_success); 525 ASSERT_STRING(to, PUNYCODE_NAME); 526} 527 528//# TESTCASE 529// title: set IDN_DISABLE, and then call enable(1) and decodename() 530// group: generic-conversion 531{ 532 setenv("IDN_DISABLE", "1", 1); 533 idn_enable(1); 534 r = idn_decodename(IDN_DECODE_APP, PUNYCODE_NAME, to, sizeof(to)); 535 ASSERT_RESULT(r, idn_success); 536 ASSERT_STRING(to, UTF8_REVNAME); 537} 538 539//# TESTCASE 540// title: set IDN_DISABLE, and then call enable(1) and decodename2() 541// group: generic-conversion 542{ 543#ifdef WITHOUT_ICONV 544 SKIP_TESTCASE; 545#else 546 setenv("IDN_DISABLE", "1", 1); 547 idn_enable(1); 548 r = idn_decodename2(IDN_DECODE_APP, AUX_EUCJP_NAME, to, sizeof(to), 549 EUCJP_ENCODING_NAME); 550 ASSERT_RESULT(r, idn_success); 551 ASSERT_STRING(to, UTF8_REVNAME); 552#endif 553} 554 555//# TESTCASE 556// title: overrun test for arg `to' of encodename() 557// group: generic-conversion 558{ 559 /* Normal case */ 560 r = idn_encodename(IDN_ENCODE_APP, UTF8_NAME, to, 561 strlen(PUNYCODE_NAME) + 1); 562 ASSERT_RESULT(r, idn_success); 563 ASSERT_STRING(to, PUNYCODE_NAME); 564 565 r = idn_encodename(IDN_ENCODE_APP, UTF8_NAME, to, 566 strlen(PUNYCODE_NAME)); 567 ASSERT_RESULT(r, idn_buffer_overflow); 568 569 /* enable(0) case */ 570 idn_enable(0); 571 r = idn_encodename(IDN_ENCODE_APP, UTF8_NAME, to, 572 strlen(UTF8_NAME) + 1); 573 ASSERT_RESULT(r, idn_success); 574 ASSERT_STRING(to, UTF8_NAME); 575 576 r = idn_encodename(IDN_ENCODE_APP, UTF8_NAME, to, 577 strlen(UTF8_NAME)); 578 ASSERT_RESULT(r, idn_buffer_overflow); 579 580 /* actions=0 case */ 581 idn_enable(1); 582 r = idn_encodename(0, UTF8_NAME, to, strlen(UTF8_NAME) + 1); 583 ASSERT_RESULT(r, idn_success); 584 ASSERT_STRING(to, UTF8_NAME); 585 586 r = idn_encodename(0, UTF8_NAME, to, strlen(UTF8_NAME)); 587 ASSERT_RESULT(r, idn_buffer_overflow); 588} 589 590//# TESTCASE 591// title: overrun test for arg `to' of decodename() 592// group: generic-conversion 593{ 594 /* Normal case */ 595 r = idn_decodename(IDN_DECODE_APP, PUNYCODE_NAME, to, 596 strlen(UTF8_REVNAME) + 1); 597 ASSERT_RESULT(r, idn_success); 598 ASSERT_STRING(to, UTF8_REVNAME); 599 600 r = idn_decodename(IDN_DECODE_APP, PUNYCODE_NAME, to, 601 strlen(UTF8_REVNAME)); 602 ASSERT_RESULT(r, idn_buffer_overflow); 603 604 /* idn_enable(0) case */ 605 idn_enable(0); 606 r = idn_decodename(IDN_DECODE_APP, PUNYCODE_NAME, to, 607 strlen(PUNYCODE_NAME) + 1); 608 ASSERT_RESULT(r, idn_success); 609 ASSERT_STRING(to, PUNYCODE_NAME); 610 611 r = idn_decodename(IDN_DECODE_APP, PUNYCODE_NAME, to, 612 strlen(PUNYCODE_NAME)); 613 ASSERT_RESULT(r, idn_buffer_overflow); 614 615 /* actions=0 case */ 616 idn_enable(1); 617 r = idn_decodename(0, PUNYCODE_NAME, to, strlen(PUNYCODE_NAME) + 1); 618 ASSERT_RESULT(r, idn_success); 619 ASSERT_STRING(to, PUNYCODE_NAME); 620 621 r = idn_decodename(0, PUNYCODE_NAME, to, strlen(PUNYCODE_NAME)); 622 ASSERT_RESULT(r, idn_buffer_overflow); 623} 624 625//# TESTCASE 626// title: overrun test for arg `to' of decodename2() 627// group: generic-conversion 628{ 629#ifdef WITHOUT_ICONV 630 SKIP_TESTCASE; 631#else 632 /* Normal case */ 633 r = idn_decodename2(IDN_DECODE_APP, AUX_EUCJP_NAME, to, 634 strlen(UTF8_REVNAME) + 1, EUCJP_ENCODING_NAME); 635 ASSERT_RESULT(r, idn_success); 636 ASSERT_STRING(to, UTF8_REVNAME); 637 638 r = idn_decodename2(IDN_DECODE_APP, AUX_EUCJP_NAME, to, 639 strlen(UTF8_REVNAME), EUCJP_ENCODING_NAME); 640 ASSERT_RESULT(r, idn_buffer_overflow); 641 642 /* idn_enable(0) case */ 643 idn_enable(0); 644 r = idn_decodename2(IDN_DECODE_APP, AUX_EUCJP_NAME, to, 645 strlen(AUX_EUCJP_NAME) + 1, EUCJP_ENCODING_NAME); 646 ASSERT_RESULT(r, idn_success); 647 ASSERT_STRING(to, AUX_EUCJP_NAME); 648 649 r = idn_decodename2(IDN_DECODE_APP, AUX_EUCJP_NAME, to, 650 strlen(AUX_EUCJP_NAME), EUCJP_ENCODING_NAME); 651 ASSERT_RESULT(r, idn_buffer_overflow); 652 653 /* actions=0 case */ 654 idn_enable(1); 655 r = idn_decodename2(0, AUX_EUCJP_NAME, to, strlen(AUX_EUCJP_NAME) + 1, 656 EUCJP_ENCODING_NAME); 657 ASSERT_RESULT(r, idn_success); 658 ASSERT_STRING(to, AUX_EUCJP_NAME); 659 660 r = idn_decodename2(0, AUX_EUCJP_NAME, to, strlen(AUX_EUCJP_NAME), 661 EUCJP_ENCODING_NAME); 662 ASSERT_RESULT(r, idn_buffer_overflow); 663 664#endif 665} 666 667//# TESTCASE 668// title: call encodename() with tolen=0 669// group: generic-conversion 670{ 671 r = idn_encodename(IDN_ENCODE_APP, UTF8_NAME, to, 0); 672 ASSERT_RESULT(r, idn_buffer_overflow); 673} 674 675//# TESTCASE 676// title: call decodename() with tolen=0 677// group: generic-conversion 678{ 679 r = idn_decodename(IDN_DECODE_APP, PUNYCODE_NAME, to, 0); 680 ASSERT_RESULT(r, idn_buffer_overflow); 681} 682 683//# TESTCASE 684// title: call decodename2() with tolen=0 685// group: generic-conversion 686{ 687#ifdef WITHOUT_ICONV 688 SKIP_TESTCASE; 689#else 690 r = idn_decodename2(IDN_DECODE_APP, AUX_EUCJP_NAME, to, 0, 691 EUCJP_ENCODING_NAME); 692 ASSERT_RESULT(r, idn_buffer_overflow); 693#endif 694} 695 696//# TESTCASE 697// title: convert an empty string using encodename() 698// group: generic-conversion 699{ 700 r = idn_encodename(IDN_ENCODE_APP, "", to, sizeof(to)); 701 ASSERT_RESULT(r, idn_success); 702 ASSERT_STRING(to, ""); 703} 704 705//# TESTCASE 706// title: convert an empty string using decodename() 707// group: generic-conversion 708{ 709 r = idn_decodename(IDN_DECODE_APP, "", to, sizeof(to)); 710 ASSERT_RESULT(r, idn_success); 711 ASSERT_STRING(to, ""); 712} 713 714//# TESTCASE 715// title: convert an empty string using decodename2() 716// group: generic-conversion 717{ 718#ifdef WITHOUT_ICONV 719 SKIP_TESTCASE; 720#else 721 r = idn_decodename2(IDN_DECODE_APP, "", to, sizeof(to), 722 EUCJP_ENCODING_NAME); 723 ASSERT_RESULT(r, idn_success); 724 ASSERT_STRING(to, ""); 725#endif 726} 727 728//# TESTCASE 729// title: prohcheck by encodename() 730// group: generic-conversion 731{ 732 /* U+1680: prohibited character */ 733 r = idn_encodename(IDN_PROHCHECK, "<U+1680>", to, sizeof(to)); 734 ASSERT_RESULT(r, idn_prohibited); 735} 736 737//# TESTCASE 738// title: unascheck by encodename() 739// group: generic-conversion 740{ 741 /* U+0221: unassigned codepoint */ 742 r = idn_encodename(IDN_UNASCHECK, "<U+0221>", to, sizeof(to)); 743 ASSERT_RESULT(r, idn_prohibited); 744} 745 746//# TESTCASE 747// title: bidicheck by encodename() 748// group: generic-conversion 749{ 750 /* U+05D0: bidirectional property is "R" */ 751 /* `a': bidirectional property is "L" */ 752 /* `0', `-': bidirectional property is "N" */ 753 r = idn_encodename(IDN_BIDICHECK, "<U+05D0>", to, sizeof(to)); 754 ASSERT_RESULT(r, idn_success); 755 756 r = idn_encodename(IDN_BIDICHECK, "<U+05D0><U+05D0>", 757 to, sizeof(to)); 758 ASSERT_RESULT(r, idn_success); 759 760 r = idn_encodename(IDN_BIDICHECK, "<U+05D0><U+05D0>-a", 761 to, sizeof(to)); 762 ASSERT_RESULT(r, idn_prohibited); 763 764 r = idn_encodename(IDN_BIDICHECK, "<U+05D0>-a-<U+05D0>", 765 to, sizeof(to)); 766 ASSERT_RESULT(r, idn_prohibited); 767 768 r = idn_encodename(IDN_BIDICHECK, "a-<U+05D0><U+05D0>", 769 to, sizeof(to)); 770 ASSERT_RESULT(r, idn_prohibited); 771 772 r = idn_encodename(IDN_BIDICHECK, "<U+05D0><U+05D0>-0", 773 to, sizeof(to)); 774 ASSERT_RESULT(r, idn_prohibited); 775 776 r = idn_encodename(IDN_BIDICHECK, "<U+05D0>-0-<U+05D0>", 777 to, sizeof(to)); 778 ASSERT_RESULT(r, idn_success); 779 780 r = idn_encodename(IDN_BIDICHECK, "0-<U+05D0><U+05D0>", 781 to, sizeof(to)); 782 ASSERT_RESULT(r, idn_prohibited); 783} 784 785//# TESTCASE 786// title: asccheck by encodename() 787// group: generic-conversion 788{ 789 r = idn_encodename(IDN_ASCCHECK, "-name", to, sizeof(to)); 790 ASSERT_RESULT(r, idn_prohibited); 791 792 r = idn_encodename(IDN_ASCCHECK, "name-", to, sizeof(to)); 793 ASSERT_RESULT(r, idn_prohibited); 794 795 r = idn_encodename(IDN_ASCCHECK, "n ame", to, sizeof(to)); 796 ASSERT_RESULT(r, idn_prohibited); 797} 798 799//# TESTCASE 800// title: lencheck by encodename() 801// group: generic-conversion 802{ 803 r = idn_encodename(IDN_LENCHECK, 804 "123456789-123456789-123456789-123456789-" 805 "123456789-123456789-123", to, sizeof(to)); 806 ASSERT_RESULT(r, idn_success); 807 808 r = idn_encodename(IDN_LENCHECK, 809 "123456789-123456789-123456789-123456789-" 810 "123456789-123456789-1234", to, sizeof(to)); 811 ASSERT_RESULT(r, idn_invalid_length); 812 813 r = idn_encodename(IDN_LENCHECK, "a..b", to, sizeof(to)); 814 ASSERT_RESULT(r, idn_invalid_length); 815} 816 817//# TESTCASE 818// title: rtcheck non-prohchecked label by decodename() 819// group: generic-conversion 820{ 821 /* "xn--6ue" -> "U+1680" (prohibited character) */ 822 r = idn_decodename(IDN_RTCHECK, "xn--6ue", to, sizeof(to)); 823 ASSERT_RESULT(r, idn_success); 824 ASSERT_STRING(to, "xn--6ue"); 825} 826 827//# TESTCASE 828// title: rtcheck non-unaschecked label by decodename() 829// group: generic-conversion 830{ 831 /* "xn--6la" -> "U+0221" (unassigned codepoint) */ 832 r = idn_decodename(IDN_IDNCONV | IDN_RTCHECK | IDN_UNASCHECK, 833 "xn--6la", to, sizeof(to)); 834 ASSERT_RESULT(r, idn_success); 835 ASSERT_STRING(to, "xn--6la"); 836} 837 838//# TESTCASE 839// title: rtcheck non-ascchecked label by decodename() 840// group: generic-conversion 841{ 842 /* "xn----x7t" -> "- U+3042" */ 843 r = idn_decodename(IDN_IDNCONV | IDN_RTCHECK | IDN_ASCCHECK, 844 "xn----x7t", to, sizeof(to)); 845 ASSERT_RESULT(r, idn_success); 846 ASSERT_STRING(to, "xn----x7t"); 847 848 /* "xn----w7t" -> "U+3042 -" */ 849 r = idn_decodename(IDN_IDNCONV | IDN_RTCHECK | IDN_ASCCHECK, 850 "xn----w7t", to, sizeof(to)); 851 ASSERT_RESULT(r, idn_success); 852 ASSERT_STRING(to, "xn----w7t"); 853} 854 855//# TESTCASE 856// title: rtcheck non-lenchecked label by decodename() 857// group: generic-conversion 858{ 859 /* `s1' has 63 characters */ 860 const char *s1 = 861 "xn--l8jaa5522a8sj38bzugvvblo3y90fjzgvxlmxscifws3d43odzaq6aj340b"; 862 863 const char *s1rev = 864 "<U+9752><U+68EE><U+5CA9><U+624B><U+5BAE><U+57CE><U+79CB><U+7530>" 865 "<U+5C71><U+5F62><U+798F><U+5CF6><U+6771><U+4EAC><U+795E><U+5948>" 866 "<U+5DDD><U+3042><U+3042><U+3042>"; 867 868 /* `s2' has 64 characters */ 869 const char *s2 = 870 "xn--a-w7ta6522a8sj38bzugvvblo3y90fjzgvxlmxscifws3d43odzaq6aj340b"; 871 872 /* `s3' has an empty label */ 873 const char *s3 = "a..b"; 874 875 r = idn_decodename(IDN_IDNCONV | IDN_RTCHECK, s1, to, sizeof(to)); 876 ASSERT_RESULT(r, idn_success); 877 ASSERT_STRING(to, s1rev); 878 879 r = idn_decodename(IDN_IDNCONV | IDN_RTCHECK, s2, to, sizeof(to)); 880 ASSERT_RESULT(r, idn_success); 881 ASSERT_STRING(to, s2); 882 883 r = idn_decodename(IDN_IDNCONV | IDN_RTCHECK, s3, to, sizeof(to)); 884 ASSERT_RESULT(r, idn_success); 885 ASSERT_STRING(to, s3); 886} 887 888//# TESTCASE 889// title: rtcheck non-prohchecked label by decodename2() 890// group: generic-conversion 891{ 892#ifdef WITHOUT_ICONV 893 SKIP_TESTCASE; 894#else 895 /* "xn--6ue" -> "U+1680" (prohibited character) */ 896 r = idn_decodename2(IDN_RTCHECK, "xn--6ue", to, sizeof(to), 897 EUCJP_ENCODING_NAME); 898 ASSERT_RESULT(r, idn_success); 899 ASSERT_STRING(to, "xn--6ue"); 900#endif 901} 902 903//# TESTCASE 904// title: rtcheck non-unaschecked label by decodename2() 905// group: generic-conversion 906{ 907#ifdef WITHOUT_ICONV 908 SKIP_TESTCASE; 909#else 910 /* "xn--6la" -> "U+0221" (unassigned codepoint) */ 911 r = idn_decodename2(IDN_IDNCONV | IDN_RTCHECK | IDN_UNASCHECK, 912 "xn--6la", to, sizeof(to), EUCJP_ENCODING_NAME); 913 ASSERT_RESULT(r, idn_success); 914 ASSERT_STRING(to, "xn--6la"); 915#endif 916} 917 918//# TESTCASE 919// title: rtcheck non-ascchecked label by decodename2() 920// group: generic-conversion 921{ 922#ifdef WITHOUT_ICONV 923 SKIP_TESTCASE; 924#else 925 /* "xn----x7t" -> "- U+3042" */ 926 r = idn_decodename2(IDN_IDNCONV | IDN_RTCHECK | IDN_ASCCHECK, 927 "xn----x7t", to, sizeof(to), EUCJP_ENCODING_NAME); 928 929 ASSERT_RESULT(r, idn_success); 930 ASSERT_STRING(to, "xn----x7t"); 931 932 /* "xn----w7t" -> "U+3042 -" */ 933 r = idn_decodename2(IDN_IDNCONV | IDN_RTCHECK | IDN_ASCCHECK, 934 "xn----w7t", to, sizeof(to), EUCJP_ENCODING_NAME); 935 ASSERT_RESULT(r, idn_success); 936 ASSERT_STRING(to, "xn----w7t"); 937#endif 938} 939 940//# TESTCASE 941// title: rtcheck non-lenchecked label by decodename2() 942// group: generic-conversion 943{ 944#ifdef WITHOUT_ICONV 945 SKIP_TESTCASE; 946#else 947 /* `s1' has 63 characters */ 948 const char *s1 = 949 "xn--l8jaa5522a8sj38bzugvvblo3y90fjzgvxlmxscifws3d43odzaq6aj340b"; 950 951 const char *s1rev = 952 "<U+9752><U+68EE><U+5CA9><U+624B><U+5BAE><U+57CE><U+79CB><U+7530>" 953 "<U+5C71><U+5F62><U+798F><U+5CF6><U+6771><U+4EAC><U+795E><U+5948>" 954 "<U+5DDD><U+3042><U+3042><U+3042>"; 955 956 /* `s2' has 64 characters */ 957 const char *s2 = 958 "xn--a-w7ta6522a8sj38bzugvvblo3y90fjzgvxlmxscifws3d43odzaq6aj340b"; 959 960 /* `s3' has an empty label */ 961 const char *s3 = "a..b"; 962 963 r = idn_decodename2(IDN_IDNCONV | IDN_RTCHECK, s1, to, sizeof(to), 964 EUCJP_ENCODING_NAME); 965 ASSERT_RESULT(r, idn_success); 966 ASSERT_STRING(to, s1rev); 967 968 r = idn_decodename2(IDN_IDNCONV | IDN_RTCHECK, s2, to, sizeof(to), 969 EUCJP_ENCODING_NAME); 970 ASSERT_RESULT(r, idn_success); 971 ASSERT_STRING(to, s2); 972 973 r = idn_decodename(IDN_IDNCONV | IDN_RTCHECK, s3, to, sizeof(to)); 974 ASSERT_RESULT(r, idn_success); 975 ASSERT_STRING(to, s3); 976#endif 977} 978 979//# TESTCASE 980// title: pass broken string as `from' to encodename() 981// group: generic-conversion quiet 982{ 983 /* "\xe3\x21" is not valid UTF-8 string */ 984 r = idn_encodename(IDN_ENCODE_APP, "\xe3\x21", to, sizeof(to)); 985 ASSERT_RESULT(r, idn_invalid_encoding); 986} 987 988//# TESTCASE 989// title: pass broken string as `from' to decodename() 990// group: generic-conversion quiet 991{ 992 /* "\xe3\x21" is not valid UTF-8 string */ 993 r = idn_decodename(IDN_DECODE_APP, "\xe3\x21", to, sizeof(to)); 994 ASSERT_RESULT(r, idn_invalid_encoding); 995} 996 997//# TESTCASE 998// title: pass broken string as `from' to decodename2() 999// group: generic-conversion quiet 1000{ 1001#ifdef WITHOUT_ICONV 1002 SKIP_TESTCASE; 1003#else 1004 /* "\xa4\x21" is not valid EUC-JP string */ 1005 r = idn_decodename2(IDN_DECODE_APP, "\xa4\x21", to, sizeof(to), 1006 EUCJP_ENCODING_NAME); 1007 ASSERT_RESULT(r, idn_invalid_encoding); 1008#endif 1009} 1010