304 lines
9.2 KiB
C
304 lines
9.2 KiB
C
/*
|
|
* This file Copyright (C) 2013-2014 Mnemosyne LLC
|
|
*
|
|
* It may be used under the GNU GPL versions 2 or 3
|
|
* or any future license endorsed by Mnemosyne LLC.
|
|
*
|
|
* $Id: utils-test.c 14266 2014-04-27 23:10:01Z jordan $
|
|
*/
|
|
|
|
#include "libtransmission-test.h"
|
|
|
|
#include "transmission.h"
|
|
#include "crypto.h"
|
|
#include "file.h"
|
|
#include "makemeta.h"
|
|
|
|
#include <unistd.h> /* sync() */
|
|
|
|
#include <stdlib.h> /* mktemp() */
|
|
#include <string.h> /* strlen() */
|
|
|
|
static int
|
|
test_single_file_impl (const tr_tracker_info * trackers,
|
|
const size_t trackerCount,
|
|
const void * payload,
|
|
const size_t payloadSize,
|
|
const char * comment,
|
|
bool isPrivate)
|
|
{
|
|
char* sandbox;
|
|
char* input_file;
|
|
char* torrent_file;
|
|
tr_metainfo_builder* builder;
|
|
tr_ctor * ctor;
|
|
tr_parse_result parse_result;
|
|
tr_info inf;
|
|
char * tmpstr;
|
|
|
|
/* set up our local test sandbox */
|
|
sandbox = libtest_sandbox_create();
|
|
|
|
/* create a single input file */
|
|
input_file = tr_buildPath (sandbox, "test.XXXXXX", NULL);
|
|
libtest_create_tmpfile_with_contents (input_file, payload, payloadSize);
|
|
builder = tr_metaInfoBuilderCreate (input_file);
|
|
check_streq (input_file, builder->top);
|
|
check_int_eq (1, builder->fileCount);
|
|
check_streq (input_file, builder->files[0].filename);
|
|
check_int_eq (payloadSize, builder->files[0].size);
|
|
check_int_eq (payloadSize, builder->totalSize);
|
|
check (!builder->isFolder);
|
|
check (!builder->abortFlag);
|
|
|
|
/* have tr_makeMetaInfo() build the .torrent file */
|
|
torrent_file = tr_strdup_printf ("%s.torrent", input_file);
|
|
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 (payloadSize, inf.totalSize);
|
|
tmpstr = tr_sys_path_basename (input_file, NULL);
|
|
check_streq (tmpstr, inf.name);
|
|
tr_free (tmpstr);
|
|
check_streq (comment, inf.comment);
|
|
check_int_eq (1, inf.fileCount);
|
|
check_int_eq (isPrivate, inf.isPrivate);
|
|
check (!inf.isFolder);
|
|
check_int_eq (trackerCount, inf.trackerCount);
|
|
|
|
/* cleanup */
|
|
tr_free (torrent_file);
|
|
tr_free (input_file);
|
|
tr_ctorFree (ctor);
|
|
tr_metainfoFree (&inf);
|
|
tr_metaInfoBuilderFree (builder);
|
|
libtest_sandbox_destroy (sandbox);
|
|
tr_free (sandbox);
|
|
return 0;
|
|
}
|
|
|
|
static int
|
|
test_single_file (void)
|
|
{
|
|
tr_tracker_info trackers[16];
|
|
size_t trackerCount;
|
|
bool isPrivate;
|
|
const char * comment;
|
|
const char * payload;
|
|
size_t payloadSize;
|
|
|
|
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;
|
|
payload = "Hello, World!\n";
|
|
payloadSize = strlen(payload);
|
|
comment = "This is the comment";
|
|
isPrivate = false;
|
|
test_single_file_impl (trackers, trackerCount, payload, payloadSize, comment, isPrivate);
|
|
|
|
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_sys_path_basename (top, NULL);
|
|
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,
|
|
test_single_directory_random_payload };
|
|
|
|
return runTests (tests, NUM_TESTS (tests));
|
|
}
|