📄 stream-test.c
字号:
/* * stream-test.c -- test the stream functions * * ==================================================================== * Copyright (c) 2000-2004 CollabNet. All rights reserved. * * This software is licensed as described in the file COPYING, which * you should have received as part of this distribution. The terms * are also available at http://subversion.tigris.org/license-1.html. * If newer versions of this license are posted there, you may use a * newer version instead, at your option. * * This software consists of voluntary contributions made by many * individuals. For exact contribution history, see the revision * history and logs, available at http://subversion.tigris.org/. * ==================================================================== */#include <stdio.h>#include "svn_pools.h"#include "svn_io.h"#include <apr_general.h>#include "../svn_test.h"static svn_error_t *test_stream_from_string(const char **msg, svn_boolean_t msg_only, svn_test_opts_t *opts, apr_pool_t *pool){ int i; apr_pool_t *subpool = svn_pool_create(pool);#define NUM_TEST_STRINGS 4#define TEST_BUF_SIZE 10 static const char * const strings[NUM_TEST_STRINGS] = { /* 0 */ "", /* 1 */ "This is a string.", /* 2 */ "This is, by comparison to the previous string, a much longer string.", /* 3 */ "And if you thought that last string was long, you just wait until " "I'm finished here. I mean, how can a string really claim to be long " "when it fits on a single line of 80-columns? Give me a break. " "Now, I'm not saying that I'm the longest string out there--far from " "it--but I feel that it is safe to assume that I'm far longer than my " "peers. And that demands some amount of respect, wouldn't you say?" }; *msg = "test svn_stream_from_string"; if (msg_only) return SVN_NO_ERROR; /* Test svn_stream_from_stringbuf() as a readable stream. */ for (i = 0; i < NUM_TEST_STRINGS; i++) { svn_stream_t *stream; char buffer[TEST_BUF_SIZE]; svn_stringbuf_t *inbuf, *outbuf; apr_size_t len; inbuf = svn_stringbuf_create(strings[i], subpool); outbuf = svn_stringbuf_create("", subpool); stream = svn_stream_from_stringbuf(inbuf, subpool); len = TEST_BUF_SIZE; while (len == TEST_BUF_SIZE) { /* Read a chunk ... */ SVN_ERR(svn_stream_read(stream, buffer, &len)); /* ... and append the chunk to the stringbuf. */ svn_stringbuf_appendbytes(outbuf, buffer, len); } if (! svn_stringbuf_compare(inbuf, outbuf)) return svn_error_create(SVN_ERR_TEST_FAILED, NULL, "Got unexpected result."); svn_pool_clear(subpool); } /* Test svn_stream_from_stringbuf() as a writable stream. */ for (i = 0; i < NUM_TEST_STRINGS; i++) { svn_stream_t *stream; svn_stringbuf_t *inbuf, *outbuf; apr_size_t amt_read, len; inbuf = svn_stringbuf_create(strings[i], subpool); outbuf = svn_stringbuf_create("", subpool); stream = svn_stream_from_stringbuf(outbuf, subpool); amt_read = 0; while (amt_read < inbuf->len) { /* Write a chunk ... */ len = TEST_BUF_SIZE < (inbuf->len - amt_read) ? TEST_BUF_SIZE : inbuf->len - amt_read; SVN_ERR(svn_stream_write(stream, inbuf->data + amt_read, &len)); amt_read += len; } if (! svn_stringbuf_compare(inbuf, outbuf)) return svn_error_create(SVN_ERR_TEST_FAILED, NULL, "Got unexpected result."); svn_pool_clear(subpool); }#undef NUM_TEST_STRINGS#undef TEST_BUF_SIZE svn_pool_destroy(subpool); return SVN_NO_ERROR;}/* generate some poorly compressable data */static svn_stringbuf_t *generate_test_bytes(int num_bytes, apr_pool_t *pool){ svn_stringbuf_t *buffer = svn_stringbuf_create("", pool); int total, repeat, repeat_iter; char c; for (total = 0, repeat = repeat_iter = 1, c = 0; total < num_bytes; total++) { svn_stringbuf_appendbytes(buffer, &c, 1); repeat_iter--; if (repeat_iter == 0) { if (c == 127) repeat++; c = (c + 1) % 127; repeat_iter = repeat; } } return buffer;}static svn_error_t *test_stream_compressed(const char **msg, svn_boolean_t msg_only, svn_test_opts_t *opts, apr_pool_t *pool){#define NUM_TEST_STRINGS 5#define TEST_BUF_SIZE 10#define GENERATED_SIZE 20000 int i; svn_stringbuf_t *bufs[NUM_TEST_STRINGS]; apr_pool_t *subpool = svn_pool_create(pool); static const char * const strings[NUM_TEST_STRINGS - 1] = { /* 0 */ "", /* 1 */ "This is a string.", /* 2 */ "This is, by comparison to the previous string, a much longer string.", /* 3 */ "And if you thought that last string was long, you just wait until " "I'm finished here. I mean, how can a string really claim to be long " "when it fits on a single line of 80-columns? Give me a break. " "Now, I'm not saying that I'm the longest string out there--far from " "it--but I feel that it is safe to assume that I'm far longer than my " "peers. And that demands some amount of respect, wouldn't you say?" }; *msg = "test compressed streams"; if (msg_only) return SVN_NO_ERROR; for (i = 0; i < (NUM_TEST_STRINGS - 1); i++) bufs[i] = svn_stringbuf_create(strings[i], pool); /* the last buffer is for the generated data */ bufs[NUM_TEST_STRINGS - 1] = generate_test_bytes(GENERATED_SIZE, pool); for (i = 0; i < NUM_TEST_STRINGS; i++) { svn_stream_t *stream; svn_stringbuf_t *origbuf, *inbuf, *outbuf; char buf[TEST_BUF_SIZE]; apr_size_t len; origbuf = bufs[i]; inbuf = svn_stringbuf_create("", subpool); outbuf = svn_stringbuf_create("", subpool); stream = svn_stream_compressed(svn_stream_from_stringbuf(outbuf, subpool), subpool); len = origbuf->len; SVN_ERR(svn_stream_write(stream, origbuf->data, &len)); SVN_ERR(svn_stream_close(stream)); stream = svn_stream_compressed(svn_stream_from_stringbuf(outbuf, subpool), subpool); len = TEST_BUF_SIZE; while (len >= TEST_BUF_SIZE) { len = TEST_BUF_SIZE; SVN_ERR(svn_stream_read(stream, buf, &len)); if (len > 0) svn_stringbuf_appendbytes(inbuf, buf, len); } if (! svn_stringbuf_compare(inbuf, origbuf)) return svn_error_create(SVN_ERR_TEST_FAILED, NULL, "Got unexpected result."); SVN_ERR(svn_stream_close(stream)); svn_pool_clear(subpool); } #undef NUM_TEST_STRINGS#undef TEST_BUF_SIZE#undef GENEREATED_SIZE svn_pool_destroy(subpool); return SVN_NO_ERROR;}/* The test table. */struct svn_test_descriptor_t test_funcs[] = { SVN_TEST_NULL, SVN_TEST_PASS(test_stream_from_string), SVN_TEST_PASS(test_stream_compressed), SVN_TEST_NULL };
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -