in makemeta-tests, add tests to generate a .torrent file from a folder of randomly-generated files.

This commit is contained in:
Jordan Lee 2014-06-08 22:21:27 +00:00
parent e40a7d5359
commit 99eda37b5e
3 changed files with 188 additions and 7 deletions

View File

@ -489,7 +489,7 @@ libtest_create_tmpfile_with_contents (char* tmpl, const void* payload, size_t n)
const ssize_t n = write (fd, payload, n_left);
if (n == -1)
{
fprintf (stderr, "Error writing '%s': %s", tmpl, tr_strerror(errno));
fprintf (stderr, "Error writing '%s': %s\n", tmpl, tr_strerror(errno));
break;
}
n_left -= n;

View File

@ -10,8 +10,11 @@
#include "libtransmission-test.h"
#include "transmission.h"
#include "crypto.h"
#include "makemeta.h"
#include <unistd.h> /* sync() */
#include <stdlib.h> /* mktemp() */
#include <string.h> /* strlen() */
@ -44,7 +47,7 @@ test_single_file_impl (const tr_tracker_info * trackers,
check_streq (input_file, builder->files[0].filename);
check_int_eq (payloadSize, builder->files[0].size);
check_int_eq (payloadSize, builder->totalSize);
check (builder->isSingleFile);
check (!builder->isFolder);
check (!builder->abortFlag);
/* have tr_makeMetaInfo() build the .torrent file */
@ -59,6 +62,7 @@ test_single_file_impl (const tr_tracker_info * trackers,
/* now let's check our work: parse the .torrent file */
ctor = tr_ctorNew (NULL);
sync ();
tr_ctorSetMetainfoFromFile (ctor, torrent_file);
parse_result = tr_torrentParse (ctor, &inf);
check_int_eq (TR_PARSE_OK, parse_result);
@ -71,7 +75,7 @@ test_single_file_impl (const tr_tracker_info * trackers,
check_streq (comment, inf.comment);
check_int_eq (1, inf.fileCount);
check_int_eq (isPrivate, inf.isPrivate);
check (!inf.isMultifile);
check (!inf.isFolder);
check_int_eq (trackerCount, inf.trackerCount);
/* cleanup */
@ -111,11 +115,188 @@ test_single_file (void)
return 0;
}
static int
test_single_directory_impl (const tr_tracker_info * trackers,
const size_t trackerCount,
const void ** payloads,
const size_t * payloadSizes,
const size_t payloadCount,
const char * comment,
const bool isPrivate)
{
char* sandbox;
char* torrent_file;
tr_metainfo_builder* builder;
tr_ctor * ctor;
tr_parse_result parse_result;
tr_info inf;
char * top;
char ** files;
size_t totalSize;
size_t i;
char* tmpstr;
/* set up our local test sandbox */
sandbox = libtest_sandbox_create();
/* create the top temp directory */
top = tr_buildPath (sandbox, "folder.XXXXXX", NULL);
tr_mkdtemp (top);
/* build the payload files that go into the top temp directory */
files = tr_new (char*, payloadCount);
totalSize = 0;
for (i=0; i<payloadCount; i++)
{
char tmpl[16];
tr_snprintf (tmpl, sizeof(tmpl), "file.%04zu%s", i, "XXXXXX");
files[i] = tr_buildPath (top, tmpl, NULL);
libtest_create_tmpfile_with_contents (files[i], payloads[i], payloadSizes[i]);
totalSize += payloadSizes[i];
}
sync ();
/* init the builder */
builder = tr_metaInfoBuilderCreate (top);
check (!builder->abortFlag);
check_streq (top, builder->top);
check_int_eq (payloadCount, builder->fileCount);
check_int_eq (totalSize, builder->totalSize);
check (builder->isFolder);
for (i=0; i<builder->fileCount; i++)
{
check_streq (files[i], builder->files[i].filename);
check_int_eq (payloadSizes[i], builder->files[i].size);
}
/* call tr_makeMetaInfo() to build the .torrent file */
torrent_file = tr_strdup_printf ("%s.torrent", top);
tr_makeMetaInfo (builder, torrent_file, trackers, trackerCount, comment, isPrivate);
check (isPrivate == builder->isPrivate);
check_streq (torrent_file, builder->outputFile);
check_streq (comment, builder->comment);
check_int_eq (trackerCount, builder->trackerCount);
while (!builder->isDone)
tr_wait_msec (100);
/* now let's check our work: parse the .torrent file */
ctor = tr_ctorNew (NULL);
sync ();
tr_ctorSetMetainfoFromFile (ctor, torrent_file);
parse_result = tr_torrentParse (ctor, &inf);
check_int_eq (TR_PARSE_OK, parse_result);
/* quick check of some of the parsed metainfo */
check_int_eq (totalSize, inf.totalSize);
tmpstr = tr_basename(top);
check_streq (tmpstr, inf.name);
tr_free (tmpstr);
check_streq (comment, inf.comment);
check_int_eq (payloadCount, inf.fileCount);
check_int_eq (isPrivate, inf.isPrivate);
check_int_eq (builder->isFolder, inf.isFolder);
check_int_eq (trackerCount, inf.trackerCount);
/* cleanup */
tr_free (torrent_file);
tr_ctorFree (ctor);
tr_metainfoFree (&inf);
tr_metaInfoBuilderFree (builder);
for (i=0; i<payloadCount; i++)
tr_free (files[i]);
tr_free (files);
libtest_sandbox_destroy (sandbox);
tr_free (sandbox);
tr_free (top);
return 0;
}
static int
test_single_directory_random_payload_impl (const tr_tracker_info * trackers,
const size_t trackerCount,
const size_t maxFileCount,
const size_t maxFileSize,
const char * comment,
const bool isPrivate)
{
size_t i;
void ** payloads;
size_t * payloadSizes;
size_t payloadCount;
/* build random payloads */
payloadCount = 1 + tr_cryptoWeakRandInt (maxFileCount);
payloads = tr_new0 (void*, payloadCount);
payloadSizes = tr_new0 (size_t, payloadCount);
for (i=0; i<payloadCount; i++)
{
const size_t n = 1 + tr_cryptoWeakRandInt (maxFileSize);
payloads[i] = tr_new (char, n);
tr_cryptoRandBuf (payloads[i], n);
payloadSizes[i] = n;
}
/* run the test */
test_single_directory_impl (trackers,
trackerCount,
(const void**) payloads,
payloadSizes,
payloadCount,
comment,
isPrivate);
/* cleanup */
for (i=0; i<payloadCount; i++)
tr_free (payloads[i]);
tr_free (payloads);
tr_free (payloadSizes);
return 0;
}
#define DEFAULT_MAX_FILE_COUNT 16
#define DEFAULT_MAX_FILE_SIZE 1024
static int
test_single_directory_random_payload (void)
{
tr_tracker_info trackers[16];
size_t trackerCount;
bool isPrivate;
const char * comment;
size_t i;
trackerCount = 0;
trackers[trackerCount].tier = trackerCount;
trackers[trackerCount].announce = (char*) "udp://tracker.openbittorrent.com:80";
++trackerCount;
trackers[trackerCount].tier = trackerCount;
trackers[trackerCount].announce = (char*) "udp://tracker.publicbt.com:80";
++trackerCount;
comment = "This is the comment";
isPrivate = false;
for (i=0; i<10; i++)
{
test_single_directory_random_payload_impl (trackers,
trackerCount,
DEFAULT_MAX_FILE_COUNT,
DEFAULT_MAX_FILE_SIZE,
comment,
isPrivate);
}
return 0;
}
int
main (void)
{
const testFunc tests[] = { test_single_file };
const testFunc tests[] = { test_single_file,
test_single_directory_random_payload };
return runTests (tests, NUM_TESTS (tests));
}

View File

@ -146,7 +146,7 @@ parseFiles (tr_info * inf, tr_variant * files, const tr_variant * length)
buf = evbuffer_new ();
result = NULL;
inf->isMultifile = 1;
inf->isFolder = true;
inf->fileCount = tr_variantListSize (files);
inf->files = tr_new0 (tr_file, inf->fileCount);
@ -193,7 +193,7 @@ parseFiles (tr_info * inf, tr_variant * files, const tr_variant * length)
if (path_component_is_suspicious (inf->name))
return "path";
inf->isMultifile = 0;
inf->isFolder = false;
inf->fileCount = 1;
inf->files = tr_new0 (tr_file, 1);
inf->files[0].name = tr_strdup (inf->name);