in makemeta-tests, add tests to generate a .torrent file from a folder of randomly-generated files.
This commit is contained in:
parent
e40a7d5359
commit
99eda37b5e
|
@ -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;
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue