tor-browser

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

testPrinter.cpp (3198B)


      1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
      2 * vim: set ts=8 sts=2 et sw=2 tw=80:
      3 */
      4 /* This Source Code Form is subject to the terms of the Mozilla Public
      5 * License, v. 2.0. If a copy of the MPL was not distributed with this
      6 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
      7 
      8 #include "js/Printer.h"  // FixedBufferPrinter
      9 
     10 #include "jsapi-tests/tests.h"
     11 
     12 using namespace js;
     13 
     14 struct TestBuffer {
     15  const char ASCII_ACK = (char)6;
     16 
     17  char* buffer;
     18  size_t size;
     19 
     20  // len is the buffer size, including terminating null
     21  explicit TestBuffer(const size_t len) : buffer(new char[len + 3]), size(len) {
     22    buffer[size] = ASCII_ACK;  // to detect overflow
     23    buffer[size + 1] = ASCII_ACK;
     24    buffer[size + 2] = ASCII_ACK;
     25  }
     26 
     27  ~TestBuffer() { delete[] buffer; }
     28 
     29  // test has written past the end of the buffer
     30  bool hasOverflowed() {
     31    return buffer[size] != ASCII_ACK || buffer[size + 1] != ASCII_ACK ||
     32           buffer[size + 2] != ASCII_ACK;
     33  }
     34 
     35  bool matches(const char* expected) { return strcmp(buffer, expected) == 0; }
     36 };
     37 
     38 BEGIN_TEST(testFixedBufferPrinter) {
     39  // empty buffer
     40  {
     41    TestBuffer actual(0);
     42    FixedBufferPrinter fbp(actual.buffer, 0);
     43    fbp.put("will not fit");
     44    CHECK(!actual.hasOverflowed());
     45  }
     46  // buffer is initially null-terminated
     47  {
     48    TestBuffer actual(10);
     49    // make sure the buffer is not null-terminated
     50    memset(actual.buffer, '!', actual.size);
     51    FixedBufferPrinter fbp(actual.buffer, 10);
     52    CHECK(!actual.hasOverflowed());
     53    CHECK(actual.matches(""));
     54  }
     55  // one put that fits
     56  {
     57    TestBuffer actual(50);
     58    FixedBufferPrinter fbp(actual.buffer, actual.size);
     59    const char* expected = "expected string fits";
     60    fbp.put(expected);
     61    CHECK(!actual.hasOverflowed());
     62    CHECK(actual.matches(expected));
     63  }
     64  // unterminated string in put
     65  {
     66    TestBuffer actual(50);
     67    FixedBufferPrinter fbp(actual.buffer, actual.size);
     68    const char* expected = "okBAD";
     69    fbp.put(expected, 2);
     70    CHECK(!actual.hasOverflowed());
     71    CHECK(actual.matches("ok"));
     72  }
     73  // one put that more than fills the buffer
     74  {
     75    TestBuffer actual(16);
     76    FixedBufferPrinter fbp(actual.buffer, actual.size);
     77    const char* expected = "expected string overflow";
     78    fbp.put(expected);
     79    CHECK(!actual.hasOverflowed());
     80    CHECK(actual.matches("expected string"));
     81  }
     82  // maintains position over multiple puts that fit
     83  {
     84    TestBuffer actual(16);
     85    FixedBufferPrinter fbp(actual.buffer, actual.size);
     86    fbp.put("expected ");
     87    fbp.put("string");
     88    CHECK(actual.matches("expected string"));
     89  }
     90  // multiple puts, last one more than fills the buffer
     91  {
     92    TestBuffer actual(9);
     93    FixedBufferPrinter fbp(actual.buffer, actual.size);
     94    fbp.put("expected");
     95    fbp.put("overflow");
     96    CHECK(!actual.hasOverflowed());
     97    CHECK(actual.matches("expected"));
     98  }
     99  // put after buffer is full doesn't overflow
    100  {
    101    TestBuffer actual(2);
    102    FixedBufferPrinter fbp(actual.buffer, actual.size);
    103    fbp.put("exp");
    104    fbp.put("overflow");
    105    CHECK(!actual.hasOverflowed());
    106    CHECK(actual.matches("e"));
    107  }
    108 
    109  return true;
    110 }
    111 END_TEST(testFixedBufferPrinter)