CommonLibs/UtilsTest.cpp

142 lines
3.7 KiB
C++

#include <string>
#include <stdio.h>
#include "Configuration.h"
#include "Utils.h"
ConfigurationTable gConfig; // Needed for logger.
using namespace std;
struct foo : public RefCntBase {
string id;
foo(string wid) : id(wid) { printf("create foo %s %p\n",id.c_str(),this); }
~foo() { printf("delete foo %s %p\n",id.c_str(),this); }
};
typedef RefCntPointer<foo> fooref;
RefCntPointer<foo> refize(foo*f)
{
fooref ref(f);
return ref;
}
void test1() // Basic test.
{
foo *b = new foo("b");
fooref bref(b);
bref.free(); // Should free b.
}
void test2() // assignment
{
foo *c = new foo("c");
fooref cref = refize(c);
foo *d = new foo("d");
fooref dref = d;
fooref dref2 = d;
dref = c;
printf("here\n");
// d and c deleted when test2 returns.
}
void test3() // assignment
{
foo *c = new foo("c");
fooref cref = refize(c);
foo *d = new foo("d");
fooref dref = d;
dref = c;
printf("here\n");
// d and c deleted when test2 returns.
}
void refcntpointertest()
{
test1();
test2();
test3();
}
// Throw spaces into the string.
string messup(string in)
{
string result;
for (string::iterator it = in.begin(); it != in.end(); it++) {
if (rand() & 1) result.push_back(' ');
result.push_back(*it);
}
return result;
}
void asciiEncoderTest(bool verbose)
{
char tbuf[102]; // binary data to try encoding and then decoding.
int numtests = 0;
printf("asciiEncoderTest...\n");
for (unsigned len = 0; len < 100; len++) { // Length of binary data.
for (unsigned testno = 0; testno < 100; testno++) {
numtests++;
for (unsigned charno = 0; charno < len; charno++) {
tbuf[charno] = rand();
}
string binaryinput = string(tbuf,len);
for (unsigned type = 0; type < 2; type++) {
const char *method = type ? "base64" : "hex";
string errorMessage;
string encoded = encodeToString(tbuf,len,method,errorMessage);
if (testno & 1) encoded = messup(encoded);
string decoded = decodeToString(encoded.data(),encoded.size(),method,errorMessage);
// Check our results.
if (decoded.size() != len) { printf("FAIL %s len=%d size=%d encoded=%s\n",method,len,decoded.size(),encoded.c_str()); }
if (binaryinput != decoded) { printf("FAIL %s testno=%d len=%d encoded=%s\n",method,testno,len,encoded.c_str()); }
// Paranoid double check manually:
for (unsigned j = 0; j < len; j++) {
if (tbuf[j] != decoded[j]) { printf("FAIL %s len=%d j=%d\n",method,len,j); }
}
if (errorMessage.size()) {
printf("%s error message=%s\n",method,errorMessage.c_str());
}
if (verbose) printf("TEST %s len=%d test=%d encoded=%s\n",method,len,testno,encoded.c_str());
}
/****
{ // Hex encoder/decoder tests.
string errorMessage = "";
string hexencoded = encodeToString(tbuf,len,"hex",errorMessage);
if (hexencoded.size() != 2 * len) {
printf("FAIL hex encoded size=%d expected=%d\n",hexencoded.size(),2*len);
}
string hexdecoded = decodeToString(hexencoded.data(),hexencoded.size(),"hex",errorMessage);
//printf("input size=%d hexencoded size=%d hexdecoded size=%d %s\n",len,hexencoded.size(),hexdecoded.size(),hexencoded.c_str());
string e2 = encodeToString(hexdecoded.data(),hexdecoded.size(),"hex",errorMessage);
//printf("in=%s out=%s\n",hexencoded.c_str(),e2.c_str());
if (e2 != hexencoded) {
printf("FAIL hex here\n");
}
if (binaryinput != hexdecoded) { printf("FAIL hex testno=%d len=%d\n",testno,len); }
if (errorMessage.size()) {
printf("base64 error message=%s\n",errorMessage.c_str());
}
}
****/
}
}
printf("PASS %d tests\n",numtests);
}
int main(int argc, char **argv)
{
bool verbose = argc > 1;
printf("Utils Test starting.\n");
refcntpointertest();
asciiEncoderTest(verbose);
}