e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt/*
6c2a76b3e2ccd32c35814b6e0f54da00190749d7Evan Hunt * Copyright (C) 2014-2016 Internet Systems Consortium, Inc. ("ISC")
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt *
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * This Source Code Form is subject to the terms of the Mozilla Public
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * License, v. 2.0. If a copy of the MPL was not distributed with this
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * file, You can obtain one at http://mozilla.org/MPL/2.0/.
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt */
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt#include <config.h>
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt#include <stdlib.h>
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt#include <unistd.h>
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt#include <fcntl.h>
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt#include <atf-c.h>
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt#include "isctest.h"
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt#include <isc/buffer.h>
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt#include <isc/result.h>
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt
e32d354f754a5d7847a0862bcd6302827ea225bfEvan HuntATF_TC(isc_buffer_reserve);
e32d354f754a5d7847a0862bcd6302827ea225bfEvan HuntATF_TC_HEAD(isc_buffer_reserve, tc) {
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt atf_tc_set_md_var(tc, "descr", "reserve space in dynamic buffers");
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt}
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt
e32d354f754a5d7847a0862bcd6302827ea225bfEvan HuntATF_TC_BODY(isc_buffer_reserve, tc) {
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt isc_result_t result;
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt isc_buffer_t *b;
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt result = isc_test_begin(NULL, ISC_TRUE);
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt b = NULL;
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt result = isc_buffer_allocate(mctx, &b, 1024);
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt ATF_CHECK_EQ(result, ISC_R_SUCCESS);
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt ATF_CHECK_EQ(b->length, 1024);
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt /*
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt * 1024 bytes should already be available, so this call does
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt * nothing.
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt */
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt result = isc_buffer_reserve(&b, 1024);
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt ATF_CHECK_EQ(result, ISC_R_SUCCESS);
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt ATF_CHECK(ISC_BUFFER_VALID(b));
2a12984ce69f7f49dc3aeef1b216e0c7c93373acMark Andrews ATF_REQUIRE(b != NULL);
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt ATF_CHECK_EQ(b->length, 1024);
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt /*
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt * This call should grow it to 2048 bytes as only 1024 bytes are
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt * available in the buffer.
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt */
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt result = isc_buffer_reserve(&b, 1025);
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt ATF_CHECK_EQ(result, ISC_R_SUCCESS);
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt ATF_CHECK(ISC_BUFFER_VALID(b));
2a12984ce69f7f49dc3aeef1b216e0c7c93373acMark Andrews ATF_REQUIRE(b != NULL);
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt ATF_CHECK_EQ(b->length, 2048);
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt /*
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt * 2048 bytes should already be available, so this call does
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt * nothing.
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt */
907e01d6f391eb00f9f923eab1df401ce59278f4Evan Hunt result = isc_buffer_reserve(&b, 2000);
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt ATF_CHECK_EQ(result, ISC_R_SUCCESS);
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt ATF_CHECK(ISC_BUFFER_VALID(b));
2a12984ce69f7f49dc3aeef1b216e0c7c93373acMark Andrews ATF_REQUIRE(b != NULL);
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt ATF_CHECK_EQ(b->length, 2048);
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt /*
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt * This call should grow it to 4096 bytes as only 2048 bytes are
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt * available in the buffer.
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt */
907e01d6f391eb00f9f923eab1df401ce59278f4Evan Hunt result = isc_buffer_reserve(&b, 3000);
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt ATF_CHECK_EQ(result, ISC_R_SUCCESS);
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt ATF_CHECK(ISC_BUFFER_VALID(b));
2a12984ce69f7f49dc3aeef1b216e0c7c93373acMark Andrews ATF_REQUIRE(b != NULL);
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt ATF_CHECK_EQ(b->length, 4096);
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt /* Consume some of the buffer so we can run the next test. */
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt isc_buffer_add(b, 4096);
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt /*
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt * This call should fail and leave buffer untouched.
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt */
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt result = isc_buffer_reserve(&b, UINT_MAX);
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt ATF_CHECK_EQ(result, ISC_R_NOMEMORY);
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt ATF_CHECK(ISC_BUFFER_VALID(b));
2a12984ce69f7f49dc3aeef1b216e0c7c93373acMark Andrews ATF_REQUIRE(b != NULL);
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt ATF_CHECK_EQ(b->length, 4096);
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt isc_buffer_free(&b);
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt isc_test_end();
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt}
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt
e32d354f754a5d7847a0862bcd6302827ea225bfEvan HuntATF_TC(isc_buffer_reallocate);
e32d354f754a5d7847a0862bcd6302827ea225bfEvan HuntATF_TC_HEAD(isc_buffer_reallocate, tc) {
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt atf_tc_set_md_var(tc, "descr", "reallocate dynamic buffers");
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt}
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt
e32d354f754a5d7847a0862bcd6302827ea225bfEvan HuntATF_TC_BODY(isc_buffer_reallocate, tc) {
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt isc_result_t result;
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt isc_buffer_t *b;
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt result = isc_test_begin(NULL, ISC_TRUE);
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt b = NULL;
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt result = isc_buffer_allocate(mctx, &b, 1024);
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt ATF_CHECK_EQ(result, ISC_R_SUCCESS);
2a12984ce69f7f49dc3aeef1b216e0c7c93373acMark Andrews ATF_REQUIRE(b != NULL);
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt ATF_CHECK_EQ(b->length, 1024);
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt result = isc_buffer_reallocate(&b, 512);
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt ATF_CHECK_EQ(result, ISC_R_NOSPACE);
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt ATF_CHECK(ISC_BUFFER_VALID(b));
2a12984ce69f7f49dc3aeef1b216e0c7c93373acMark Andrews ATF_REQUIRE(b != NULL);
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt ATF_CHECK_EQ(b->length, 1024);
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt result = isc_buffer_reallocate(&b, 1536);
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt ATF_CHECK_EQ(result, ISC_R_SUCCESS);
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt ATF_CHECK(ISC_BUFFER_VALID(b));
2a12984ce69f7f49dc3aeef1b216e0c7c93373acMark Andrews ATF_REQUIRE(b != NULL);
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt ATF_CHECK_EQ(b->length, 1536);
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt isc_buffer_free(&b);
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt isc_test_end();
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt}
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt
7a00d69909ace5dc11bcff9c1e07c311f92a7f8eWitold KrecickiATF_TC(isc_buffer_dynamic);
7a00d69909ace5dc11bcff9c1e07c311f92a7f8eWitold KrecickiATF_TC_HEAD(isc_buffer_dynamic, tc) {
7a00d69909ace5dc11bcff9c1e07c311f92a7f8eWitold Krecicki atf_tc_set_md_var(tc, "descr", "dynamic buffer automatic reallocation");
7a00d69909ace5dc11bcff9c1e07c311f92a7f8eWitold Krecicki}
7a00d69909ace5dc11bcff9c1e07c311f92a7f8eWitold Krecicki
7a00d69909ace5dc11bcff9c1e07c311f92a7f8eWitold KrecickiATF_TC_BODY(isc_buffer_dynamic, tc) {
7a00d69909ace5dc11bcff9c1e07c311f92a7f8eWitold Krecicki isc_result_t result;
7a00d69909ace5dc11bcff9c1e07c311f92a7f8eWitold Krecicki isc_buffer_t *b;
7a00d69909ace5dc11bcff9c1e07c311f92a7f8eWitold Krecicki size_t last_length = 10;
7a00d69909ace5dc11bcff9c1e07c311f92a7f8eWitold Krecicki int i;
7a00d69909ace5dc11bcff9c1e07c311f92a7f8eWitold Krecicki
7a00d69909ace5dc11bcff9c1e07c311f92a7f8eWitold Krecicki result = isc_test_begin(NULL, ISC_TRUE);
7a00d69909ace5dc11bcff9c1e07c311f92a7f8eWitold Krecicki ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
7a00d69909ace5dc11bcff9c1e07c311f92a7f8eWitold Krecicki
7a00d69909ace5dc11bcff9c1e07c311f92a7f8eWitold Krecicki b = NULL;
7a00d69909ace5dc11bcff9c1e07c311f92a7f8eWitold Krecicki result = isc_buffer_allocate(mctx, &b, last_length);
7a00d69909ace5dc11bcff9c1e07c311f92a7f8eWitold Krecicki ATF_CHECK_EQ(result, ISC_R_SUCCESS);
7a00d69909ace5dc11bcff9c1e07c311f92a7f8eWitold Krecicki ATF_REQUIRE(b != NULL);
7a00d69909ace5dc11bcff9c1e07c311f92a7f8eWitold Krecicki ATF_CHECK_EQ(b->length, last_length);
7a00d69909ace5dc11bcff9c1e07c311f92a7f8eWitold Krecicki
7a00d69909ace5dc11bcff9c1e07c311f92a7f8eWitold Krecicki isc_buffer_setautorealloc(b, ISC_TRUE);
7a00d69909ace5dc11bcff9c1e07c311f92a7f8eWitold Krecicki
7a00d69909ace5dc11bcff9c1e07c311f92a7f8eWitold Krecicki isc_buffer_putuint8(b, 1);
7a00d69909ace5dc11bcff9c1e07c311f92a7f8eWitold Krecicki
7a00d69909ace5dc11bcff9c1e07c311f92a7f8eWitold Krecicki for (i = 0; i < 1000; i++) {
7a00d69909ace5dc11bcff9c1e07c311f92a7f8eWitold Krecicki isc_buffer_putstr(b, "thisisa24charslongstring");
7a00d69909ace5dc11bcff9c1e07c311f92a7f8eWitold Krecicki }
7a00d69909ace5dc11bcff9c1e07c311f92a7f8eWitold Krecicki ATF_CHECK(b->length-last_length >= 1000*24);
7a00d69909ace5dc11bcff9c1e07c311f92a7f8eWitold Krecicki last_length+=1000*24;
7a00d69909ace5dc11bcff9c1e07c311f92a7f8eWitold Krecicki
7a00d69909ace5dc11bcff9c1e07c311f92a7f8eWitold Krecicki for (i = 0; i < 10000; i++) {
7a00d69909ace5dc11bcff9c1e07c311f92a7f8eWitold Krecicki isc_buffer_putuint8(b, 1);
7a00d69909ace5dc11bcff9c1e07c311f92a7f8eWitold Krecicki }
7a00d69909ace5dc11bcff9c1e07c311f92a7f8eWitold Krecicki
7a00d69909ace5dc11bcff9c1e07c311f92a7f8eWitold Krecicki ATF_CHECK(b->length-last_length >= 10000*1);
7a00d69909ace5dc11bcff9c1e07c311f92a7f8eWitold Krecicki last_length += 10000*1;
7a00d69909ace5dc11bcff9c1e07c311f92a7f8eWitold Krecicki
7a00d69909ace5dc11bcff9c1e07c311f92a7f8eWitold Krecicki for (i = 0; i < 10000; i++) {
7a00d69909ace5dc11bcff9c1e07c311f92a7f8eWitold Krecicki isc_buffer_putuint16(b, 1);
7a00d69909ace5dc11bcff9c1e07c311f92a7f8eWitold Krecicki }
7a00d69909ace5dc11bcff9c1e07c311f92a7f8eWitold Krecicki
7a00d69909ace5dc11bcff9c1e07c311f92a7f8eWitold Krecicki ATF_CHECK(b->length-last_length >= 10000*2);
7a00d69909ace5dc11bcff9c1e07c311f92a7f8eWitold Krecicki
7a00d69909ace5dc11bcff9c1e07c311f92a7f8eWitold Krecicki last_length += 10000*2;
7a00d69909ace5dc11bcff9c1e07c311f92a7f8eWitold Krecicki for (i = 0; i < 10000; i++) {
7a00d69909ace5dc11bcff9c1e07c311f92a7f8eWitold Krecicki isc_buffer_putuint24(b, 1);
7a00d69909ace5dc11bcff9c1e07c311f92a7f8eWitold Krecicki }
7a00d69909ace5dc11bcff9c1e07c311f92a7f8eWitold Krecicki ATF_CHECK(b->length-last_length >= 10000*3);
7a00d69909ace5dc11bcff9c1e07c311f92a7f8eWitold Krecicki
7a00d69909ace5dc11bcff9c1e07c311f92a7f8eWitold Krecicki last_length+=10000*3;
7a00d69909ace5dc11bcff9c1e07c311f92a7f8eWitold Krecicki
7a00d69909ace5dc11bcff9c1e07c311f92a7f8eWitold Krecicki for (i = 0; i < 10000; i++) {
7a00d69909ace5dc11bcff9c1e07c311f92a7f8eWitold Krecicki isc_buffer_putuint32(b, 1);
7a00d69909ace5dc11bcff9c1e07c311f92a7f8eWitold Krecicki }
7a00d69909ace5dc11bcff9c1e07c311f92a7f8eWitold Krecicki ATF_CHECK(b->length-last_length >= 10000*4);
7a00d69909ace5dc11bcff9c1e07c311f92a7f8eWitold Krecicki
7a00d69909ace5dc11bcff9c1e07c311f92a7f8eWitold Krecicki
7a00d69909ace5dc11bcff9c1e07c311f92a7f8eWitold Krecicki isc_buffer_free(&b);
7a00d69909ace5dc11bcff9c1e07c311f92a7f8eWitold Krecicki
7a00d69909ace5dc11bcff9c1e07c311f92a7f8eWitold Krecicki isc_test_end();
7a00d69909ace5dc11bcff9c1e07c311f92a7f8eWitold Krecicki}
7a00d69909ace5dc11bcff9c1e07c311f92a7f8eWitold Krecicki
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt/*
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt * Main
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt */
e32d354f754a5d7847a0862bcd6302827ea225bfEvan HuntATF_TP_ADD_TCS(tp) {
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt ATF_TP_ADD_TC(tp, isc_buffer_reserve);
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt ATF_TP_ADD_TC(tp, isc_buffer_reallocate);
7a00d69909ace5dc11bcff9c1e07c311f92a7f8eWitold Krecicki ATF_TP_ADD_TC(tp, isc_buffer_dynamic);
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt return (atf_no_error());
e32d354f754a5d7847a0862bcd6302827ea225bfEvan Hunt}