mirror of
https://github.com/pgbackrest/pgbackrest.git
synced 2025-03-05 15:05:48 +02:00
Allow arbitrary multiplier and flush character in IoTestFilterMultiply.
This allows for more complex test filter chains. Rename from IoTestFilterDouble to reflect the new functionality.
This commit is contained in:
parent
3e254f4cff
commit
838cfa44b7
@ -103,6 +103,10 @@
|
|||||||
<p>New test containers with static test certificates.</p>
|
<p>New test containers with static test certificates.</p>
|
||||||
</release-item>
|
</release-item>
|
||||||
|
|
||||||
|
<release-item>
|
||||||
|
<p>Allow arbitrary multiplier and flush character in <code>IoTestFilterMultiply</code>.</p>
|
||||||
|
</release-item>
|
||||||
|
|
||||||
<release-item>
|
<release-item>
|
||||||
<p>Add <code>testRepoPath()</code> to let C unit tests know where the code repository is located.</p>
|
<p>Add <code>testRepoPath()</code> to let C unit tests know where the code repository is located.</p>
|
||||||
</release-item>
|
</release-item>
|
||||||
|
@ -116,19 +116,21 @@ ioTestFilterSizeNew(const char *type)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/***********************************************************************************************************************************
|
/***********************************************************************************************************************************
|
||||||
Test filter to double input to the output. It can also flush out a variable number of bytes at the end.
|
Test filter to multiply input to the output. It can also flush out a variable number of bytes at the end.
|
||||||
***********************************************************************************************************************************/
|
***********************************************************************************************************************************/
|
||||||
typedef struct IoTestFilterDouble
|
typedef struct IoTestFilterMultiply
|
||||||
{
|
{
|
||||||
MemContext *memContext;
|
MemContext *memContext;
|
||||||
unsigned int flushTotal;
|
unsigned int flushTotal;
|
||||||
Buffer *doubleBuffer;
|
char flushChar;
|
||||||
|
Buffer *multiplyBuffer;
|
||||||
|
unsigned int multiplier;
|
||||||
IoFilter *bufferFilter;
|
IoFilter *bufferFilter;
|
||||||
IoFilter *filter;
|
IoFilter *filter;
|
||||||
} IoTestFilterDouble;
|
} IoTestFilterMultiply;
|
||||||
|
|
||||||
static void
|
static void
|
||||||
ioTestFilterDoubleProcess(IoTestFilterDouble *this, const Buffer *input, Buffer *output)
|
ioTestFilterMultiplyProcess(IoTestFilterMultiply *this, const Buffer *input, Buffer *output)
|
||||||
{
|
{
|
||||||
FUNCTION_DEBUG_BEGIN(logLevelTrace);
|
FUNCTION_DEBUG_BEGIN(logLevelTrace);
|
||||||
FUNCTION_DEBUG_PARAM(VOIDP, this);
|
FUNCTION_DEBUG_PARAM(VOIDP, this);
|
||||||
@ -141,63 +143,66 @@ ioTestFilterDoubleProcess(IoTestFilterDouble *this, const Buffer *input, Buffer
|
|||||||
|
|
||||||
if (input == NULL)
|
if (input == NULL)
|
||||||
{
|
{
|
||||||
bufCat(output, bufNewC(1, "X"));
|
char flushZ[] = {this->flushChar, 0};
|
||||||
|
bufCat(output, bufNewC(1, flushZ));
|
||||||
this->flushTotal--;
|
this->flushTotal--;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (this->doubleBuffer == NULL)
|
if (this->multiplyBuffer == NULL)
|
||||||
{
|
{
|
||||||
this->doubleBuffer = bufNew(bufUsed(input) * 2);
|
this->multiplyBuffer = bufNew(bufUsed(input) * this->multiplier);
|
||||||
unsigned char *inputPtr = bufPtr(input);
|
unsigned char *inputPtr = bufPtr(input);
|
||||||
unsigned char *bufferPtr = bufPtr(this->doubleBuffer);
|
unsigned char *bufferPtr = bufPtr(this->multiplyBuffer);
|
||||||
|
|
||||||
for (unsigned int charIdx = 0; charIdx < bufUsed(input); charIdx++)
|
for (unsigned int charIdx = 0; charIdx < bufUsed(input); charIdx++)
|
||||||
{
|
{
|
||||||
bufferPtr[charIdx * 2] = inputPtr[charIdx];
|
for (unsigned int multiplierIdx = 0; multiplierIdx < this->multiplier; multiplierIdx++)
|
||||||
bufferPtr[charIdx * 2 + 1] = inputPtr[charIdx];
|
bufferPtr[charIdx * this->multiplier + multiplierIdx] = inputPtr[charIdx];
|
||||||
}
|
}
|
||||||
|
|
||||||
bufUsedSet(this->doubleBuffer, bufSize(this->doubleBuffer));
|
bufUsedSet(this->multiplyBuffer, bufSize(this->multiplyBuffer));
|
||||||
}
|
}
|
||||||
|
|
||||||
ioFilterProcessInOut(this->bufferFilter, this->doubleBuffer, output);
|
ioFilterProcessInOut(this->bufferFilter, this->multiplyBuffer, output);
|
||||||
|
|
||||||
if (!ioFilterInputSame(this->bufferFilter))
|
if (!ioFilterInputSame(this->bufferFilter))
|
||||||
this->doubleBuffer = NULL;
|
this->multiplyBuffer = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
FUNCTION_DEBUG_RESULT_VOID();
|
FUNCTION_DEBUG_RESULT_VOID();
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
ioTestFilterDoubleDone(IoTestFilterDouble *this)
|
ioTestFilterMultiplyDone(IoTestFilterMultiply *this)
|
||||||
{
|
{
|
||||||
return this->flushTotal == 0;
|
return this->flushTotal == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
ioTestFilterDoubleInputSame(IoTestFilterDouble *this)
|
ioTestFilterMultiplyInputSame(IoTestFilterMultiply *this)
|
||||||
{
|
{
|
||||||
return ioFilterInputSame(this->bufferFilter);
|
return ioFilterInputSame(this->bufferFilter);
|
||||||
}
|
}
|
||||||
|
|
||||||
static IoTestFilterDouble *
|
static IoTestFilterMultiply *
|
||||||
ioTestFilterDoubleNew(const char *type, unsigned int flushTotal)
|
ioTestFilterMultiplyNew(const char *type, unsigned int multiplier, unsigned int flushTotal, char flushChar)
|
||||||
{
|
{
|
||||||
IoTestFilterDouble *this = NULL;
|
IoTestFilterMultiply *this = NULL;
|
||||||
|
|
||||||
MEM_CONTEXT_NEW_BEGIN("IoTestFilterDouble")
|
MEM_CONTEXT_NEW_BEGIN("IoTestFilterMultiply")
|
||||||
{
|
{
|
||||||
this = memNew(sizeof(IoTestFilterDouble));
|
this = memNew(sizeof(IoTestFilterMultiply));
|
||||||
this->memContext = MEM_CONTEXT_NEW();
|
this->memContext = MEM_CONTEXT_NEW();
|
||||||
this->bufferFilter = ioBufferFilter(ioBufferNew());
|
this->bufferFilter = ioBufferFilter(ioBufferNew());
|
||||||
|
this->multiplier = multiplier;
|
||||||
this->flushTotal = flushTotal;
|
this->flushTotal = flushTotal;
|
||||||
|
this->flushChar = flushChar;
|
||||||
|
|
||||||
this->filter = ioFilterNewP(
|
this->filter = ioFilterNewP(
|
||||||
strNew(type), this, .done = (IoFilterInterfaceDone)ioTestFilterDoubleDone,
|
strNew(type), this, .done = (IoFilterInterfaceDone)ioTestFilterMultiplyDone,
|
||||||
.inOut = (IoFilterInterfaceProcessInOut)ioTestFilterDoubleProcess,
|
.inOut = (IoFilterInterfaceProcessInOut)ioTestFilterMultiplyProcess,
|
||||||
.inputSame = (IoFilterInterfaceInputSame)ioTestFilterDoubleInputSame);
|
.inputSame = (IoFilterInterfaceInputSame)ioTestFilterMultiplyInputSame);
|
||||||
}
|
}
|
||||||
MEM_CONTEXT_NEW_END();
|
MEM_CONTEXT_NEW_END();
|
||||||
|
|
||||||
@ -269,7 +274,7 @@ testRun(void)
|
|||||||
IoSize *sizeFilter = ioSizeNew();
|
IoSize *sizeFilter = ioSizeNew();
|
||||||
TEST_RESULT_PTR(ioFilterGroupAdd(filterGroup, ioSizeFilter(sizeFilter)), filterGroup, " add filter to filter group");
|
TEST_RESULT_PTR(ioFilterGroupAdd(filterGroup, ioSizeFilter(sizeFilter)), filterGroup, " add filter to filter group");
|
||||||
TEST_RESULT_VOID(
|
TEST_RESULT_VOID(
|
||||||
ioFilterGroupAdd(filterGroup, ioTestFilterDoubleNew("double", 1)->filter), " add filter to filter group");
|
ioFilterGroupAdd(filterGroup, ioTestFilterMultiplyNew("double", 2, 1, 'X')->filter), " add filter to filter group");
|
||||||
TEST_RESULT_VOID(ioFilterGroupAdd(filterGroup, ioSizeFilter(ioSizeNew())), " add filter to filter group");
|
TEST_RESULT_VOID(ioFilterGroupAdd(filterGroup, ioSizeFilter(ioSizeNew())), " add filter to filter group");
|
||||||
IoBuffer *bufferFilter = ioBufferNew();
|
IoBuffer *bufferFilter = ioBufferNew();
|
||||||
TEST_RESULT_VOID(ioFilterGroupAdd(filterGroup, ioBufferFilter(bufferFilter)), " add filter to filter group");
|
TEST_RESULT_VOID(ioFilterGroupAdd(filterGroup, ioBufferFilter(bufferFilter)), " add filter to filter group");
|
||||||
@ -410,7 +415,7 @@ testRun(void)
|
|||||||
IoSize *sizeFilter = ioSizeNew();
|
IoSize *sizeFilter = ioSizeNew();
|
||||||
TEST_RESULT_VOID(ioFilterGroupAdd(filterGroup, ioSizeFilter(sizeFilter)), " add filter to filter group");
|
TEST_RESULT_VOID(ioFilterGroupAdd(filterGroup, ioSizeFilter(sizeFilter)), " add filter to filter group");
|
||||||
TEST_RESULT_VOID(
|
TEST_RESULT_VOID(
|
||||||
ioFilterGroupAdd(filterGroup, ioTestFilterDoubleNew("double", 3)->filter), " add filter to filter group");
|
ioFilterGroupAdd(filterGroup, ioTestFilterMultiplyNew("double", 2, 3, 'X')->filter), " add filter to filter group");
|
||||||
TEST_RESULT_VOID(ioFilterGroupAdd(filterGroup, ioTestFilterSizeNew("size2")->filter), " add filter to filter group");
|
TEST_RESULT_VOID(ioFilterGroupAdd(filterGroup, ioTestFilterSizeNew("size2")->filter), " add filter to filter group");
|
||||||
TEST_RESULT_VOID(ioWriteFilterGroupSet(ioBufferWriteIo(bufferWrite), filterGroup), " add filter group to write io");
|
TEST_RESULT_VOID(ioWriteFilterGroupSet(ioBufferWriteIo(bufferWrite), filterGroup), " add filter group to write io");
|
||||||
|
|
||||||
@ -427,7 +432,7 @@ testRun(void)
|
|||||||
TEST_RESULT_VOID(ioWriteFlush(ioBufferWriteIo(bufferWrite)), " flush again (nothing to flush)");
|
TEST_RESULT_VOID(ioWriteFlush(ioBufferWriteIo(bufferWrite)), " flush again (nothing to flush)");
|
||||||
TEST_RESULT_STR(strPtr(strNewBuf(buffer)), "AABB\n\nZZ", " check output is unchanged");
|
TEST_RESULT_STR(strPtr(strNewBuf(buffer)), "AABB\n\nZZ", " check output is unchanged");
|
||||||
|
|
||||||
TEST_RESULT_VOID(ioWrite(ioBufferWriteIo(bufferWrite), bufNewZ("12345")), " write 4 bytes");
|
TEST_RESULT_VOID(ioWrite(ioBufferWriteIo(bufferWrite), bufNewZ("12345")), " write bytes");
|
||||||
TEST_RESULT_STR(strPtr(strNewBuf(buffer)), "AABB\n\nZZ112233445", " check write");
|
TEST_RESULT_STR(strPtr(strNewBuf(buffer)), "AABB\n\nZZ112233445", " check write");
|
||||||
|
|
||||||
TEST_RESULT_VOID(ioWriteClose(ioBufferWriteIo(bufferWrite)), " close buffer write object");
|
TEST_RESULT_VOID(ioWriteClose(ioBufferWriteIo(bufferWrite)), " close buffer write object");
|
||||||
|
Loading…
x
Reference in New Issue
Block a user