tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

utf8_unittest.cc (5655B)


      1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
      2 /* vim: set ts=2 et sw=2 tw=80: */
      3 /* This Source Code Form is subject to the terms of the Mozilla Public
      4 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
      5 * You can obtain one at http://mozilla.org/MPL/2.0/. */
      6 
      7 #include "gtest/gtest.h"
      8 
      9 #include "nss.h"
     10 #include "base.h"
     11 #include "secerr.h"
     12 
     13 namespace nss_test {
     14 
     15 class Utf8Test : public ::testing::Test {};
     16 
     17 // Tests nssUTF8_Length rejects overlong forms, surrogates, etc.
     18 TEST_F(Utf8Test, Utf8Length) {
     19  PRStatus status;
     20 
     21  EXPECT_EQ(0u, nssUTF8_Length("", &status));
     22  EXPECT_EQ(PR_SUCCESS, status);
     23 
     24  // U+0000..U+007F
     25  EXPECT_EQ(1u, nssUTF8_Length("\x01", &status));
     26  EXPECT_EQ(PR_SUCCESS, status);
     27  EXPECT_EQ(1u, nssUTF8_Length("\x7F", &status));
     28  EXPECT_EQ(PR_SUCCESS, status);
     29 
     30  // lone trailing byte
     31  EXPECT_EQ(0u, nssUTF8_Length("\x80", &status));
     32  EXPECT_EQ(PR_FAILURE, status);
     33  EXPECT_EQ(NSS_ERROR_INVALID_STRING, NSS_GetError());
     34  EXPECT_EQ(0u, nssUTF8_Length("\xBF", &status));
     35  EXPECT_EQ(PR_FAILURE, status);
     36  EXPECT_EQ(NSS_ERROR_INVALID_STRING, NSS_GetError());
     37 
     38  // overlong U+0000..U+007F
     39  EXPECT_EQ(0u, nssUTF8_Length("\xC0\x80", &status));
     40  EXPECT_EQ(PR_FAILURE, status);
     41  EXPECT_EQ(NSS_ERROR_INVALID_STRING, NSS_GetError());
     42  EXPECT_EQ(0u, nssUTF8_Length("\xC1\xBF", &status));
     43  EXPECT_EQ(PR_FAILURE, status);
     44  EXPECT_EQ(NSS_ERROR_INVALID_STRING, NSS_GetError());
     45 
     46  // U+0080..U+07FF
     47  EXPECT_EQ(2u, nssUTF8_Length("\xC2\x80", &status));
     48  EXPECT_EQ(PR_SUCCESS, status);
     49  EXPECT_EQ(2u, nssUTF8_Length("\xDF\xBF", &status));
     50  EXPECT_EQ(PR_SUCCESS, status);
     51 
     52  // overlong U+0000..U+07FF
     53  EXPECT_EQ(0u, nssUTF8_Length("\xE0\x80\x80", &status));
     54  EXPECT_EQ(PR_FAILURE, status);
     55  EXPECT_EQ(NSS_ERROR_INVALID_STRING, NSS_GetError());
     56  EXPECT_EQ(0u, nssUTF8_Length("\xE0\x9F\xBF", &status));
     57  EXPECT_EQ(PR_FAILURE, status);
     58  EXPECT_EQ(NSS_ERROR_INVALID_STRING, NSS_GetError());
     59 
     60  // U+0800..U+D7FF
     61  EXPECT_EQ(3u, nssUTF8_Length("\xE0\xA0\x80", &status));
     62  EXPECT_EQ(PR_SUCCESS, status);
     63  EXPECT_EQ(3u, nssUTF8_Length("\xE0\xBF\xBF", &status));
     64  EXPECT_EQ(PR_SUCCESS, status);
     65  EXPECT_EQ(3u, nssUTF8_Length("\xE1\x80\x80", &status));
     66  EXPECT_EQ(PR_SUCCESS, status);
     67  EXPECT_EQ(3u, nssUTF8_Length("\xEC\xBF\xBF", &status));
     68  EXPECT_EQ(PR_SUCCESS, status);
     69  EXPECT_EQ(3u, nssUTF8_Length("\xED\x80\x80", &status));
     70  EXPECT_EQ(PR_SUCCESS, status);
     71  EXPECT_EQ(3u, nssUTF8_Length("\xED\x9F\xBF", &status));
     72  EXPECT_EQ(PR_SUCCESS, status);
     73 
     74  // lone surrogate
     75  EXPECT_EQ(0u, nssUTF8_Length("\xED\xA0\x80", &status));
     76  EXPECT_EQ(PR_FAILURE, status);
     77  EXPECT_EQ(NSS_ERROR_INVALID_STRING, NSS_GetError());
     78  EXPECT_EQ(0u, nssUTF8_Length("\xED\xBF\xBF", &status));
     79  EXPECT_EQ(PR_FAILURE, status);
     80  EXPECT_EQ(NSS_ERROR_INVALID_STRING, NSS_GetError());
     81 
     82  // U+E000..U+FFFF
     83  EXPECT_EQ(3u, nssUTF8_Length("\xEE\x80\x80", &status));
     84  EXPECT_EQ(PR_SUCCESS, status);
     85  EXPECT_EQ(3u, nssUTF8_Length("\xEF\xBF\xBF", &status));
     86  EXPECT_EQ(PR_SUCCESS, status);
     87 
     88  // overlong U+0000..U+FFFF
     89  EXPECT_EQ(0u, nssUTF8_Length("\xF0\x80\x80\x80", &status));
     90  EXPECT_EQ(PR_FAILURE, status);
     91  EXPECT_EQ(NSS_ERROR_INVALID_STRING, NSS_GetError());
     92  EXPECT_EQ(0u, nssUTF8_Length("\xF0\x8F\xBF\xBF", &status));
     93  EXPECT_EQ(PR_FAILURE, status);
     94  EXPECT_EQ(NSS_ERROR_INVALID_STRING, NSS_GetError());
     95 
     96  // U+10000..U+10FFFF
     97  EXPECT_EQ(4u, nssUTF8_Length("\xF0\x90\x80\x80", &status));
     98  EXPECT_EQ(PR_SUCCESS, status);
     99  EXPECT_EQ(4u, nssUTF8_Length("\xF0\xBF\xBF\xBF", &status));
    100  EXPECT_EQ(PR_SUCCESS, status);
    101  EXPECT_EQ(4u, nssUTF8_Length("\xF1\x80\x80\x80", &status));
    102  EXPECT_EQ(PR_SUCCESS, status);
    103  EXPECT_EQ(4u, nssUTF8_Length("\xF3\xBF\xBF\xBF", &status));
    104  EXPECT_EQ(PR_SUCCESS, status);
    105  EXPECT_EQ(4u, nssUTF8_Length("\xF4\x80\x80\x80", &status));
    106  EXPECT_EQ(PR_SUCCESS, status);
    107  EXPECT_EQ(4u, nssUTF8_Length("\xF4\x8F\xBF\xBF", &status));
    108  EXPECT_EQ(PR_SUCCESS, status);
    109 
    110  // out of Unicode range
    111  EXPECT_EQ(0u, nssUTF8_Length("\xF4\x90\x80\x80", &status));
    112  EXPECT_EQ(PR_FAILURE, status);
    113  EXPECT_EQ(NSS_ERROR_INVALID_STRING, NSS_GetError());
    114  EXPECT_EQ(0u, nssUTF8_Length("\xF4\xBF\xBF\xBF", &status));
    115  EXPECT_EQ(PR_FAILURE, status);
    116  EXPECT_EQ(NSS_ERROR_INVALID_STRING, NSS_GetError());
    117  EXPECT_EQ(0u, nssUTF8_Length("\xF5\x80\x80\x80", &status));
    118  EXPECT_EQ(PR_FAILURE, status);
    119  EXPECT_EQ(NSS_ERROR_INVALID_STRING, NSS_GetError());
    120  EXPECT_EQ(0u, nssUTF8_Length("\xF7\xBF\xBF\xBF", &status));
    121  EXPECT_EQ(PR_FAILURE, status);
    122  EXPECT_EQ(NSS_ERROR_INVALID_STRING, NSS_GetError());
    123 
    124  // former 5-byte sequence
    125  EXPECT_EQ(0u, nssUTF8_Length("\xF8\x80\x80\x80\x80", &status));
    126  EXPECT_EQ(PR_FAILURE, status);
    127  EXPECT_EQ(NSS_ERROR_INVALID_STRING, NSS_GetError());
    128  EXPECT_EQ(0u, nssUTF8_Length("\xFB\xBF\xBF\xBF\xBF", &status));
    129  EXPECT_EQ(PR_FAILURE, status);
    130  EXPECT_EQ(NSS_ERROR_INVALID_STRING, NSS_GetError());
    131 
    132  // former 6-byte sequence
    133  EXPECT_EQ(0u, nssUTF8_Length("\xFC\x80\x80\x80\x80\x80", &status));
    134  EXPECT_EQ(PR_FAILURE, status);
    135  EXPECT_EQ(NSS_ERROR_INVALID_STRING, NSS_GetError());
    136  EXPECT_EQ(0u, nssUTF8_Length("\xFD\xBF\xBF\xBF\xBF\xBF", &status));
    137  EXPECT_EQ(PR_FAILURE, status);
    138  EXPECT_EQ(NSS_ERROR_INVALID_STRING, NSS_GetError());
    139 
    140  // invalid lead byte
    141  EXPECT_EQ(0u, nssUTF8_Length("\xFE", &status));
    142  EXPECT_EQ(PR_FAILURE, status);
    143  EXPECT_EQ(NSS_ERROR_INVALID_STRING, NSS_GetError());
    144  EXPECT_EQ(0u, nssUTF8_Length("\xFF", &status));
    145  EXPECT_EQ(PR_FAILURE, status);
    146  EXPECT_EQ(NSS_ERROR_INVALID_STRING, NSS_GetError());
    147 
    148  nss_DestroyErrorStack();
    149 }
    150 }  // namespace nss_test