Changeset 14291


Ignore:
Timestamp:
Jun 8, 2014, 10:21:27 PM (8 years ago)
Author:
jordan
Message:

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

Location:
trunk/libtransmission
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/libtransmission/libtransmission-test.c

    r14289 r14291  
    490490      if (n == -1)
    491491        {
    492           fprintf (stderr, "Error writing '%s': %s", tmpl, tr_strerror(errno));
     492          fprintf (stderr, "Error writing '%s': %s\n", tmpl, tr_strerror(errno));
    493493          break;
    494494        }
  • trunk/libtransmission/makemeta-test.c

    r14289 r14291  
    1111
    1212#include "transmission.h"
     13#include "crypto.h"
    1314#include "makemeta.h"
     15
     16#include <unistd.h> /* sync() */
    1417
    1518#include <stdlib.h> /* mktemp() */
     
    4548  check_int_eq (payloadSize, builder->files[0].size);
    4649  check_int_eq (payloadSize, builder->totalSize);
    47   check (builder->isSingleFile);
     50  check (!builder->isFolder);
    4851  check (!builder->abortFlag);
    4952
     
    6063  /* now let's check our work: parse the  .torrent file */
    6164  ctor = tr_ctorNew (NULL);
     65  sync ();
    6266  tr_ctorSetMetainfoFromFile (ctor, torrent_file);
    6367  parse_result = tr_torrentParse (ctor, &inf);
     
    7276  check_int_eq (1, inf.fileCount);
    7377  check_int_eq (isPrivate, inf.isPrivate);
    74   check (!inf.isMultifile);
     78  check (!inf.isFolder);
    7579  check_int_eq (trackerCount, inf.trackerCount);
    7680
     
    112116}
    113117
     118
     119static int
     120test_single_directory_impl (const tr_tracker_info * trackers,
     121                            const size_t            trackerCount,
     122                            const void           ** payloads,
     123                            const size_t          * payloadSizes,
     124                            const size_t            payloadCount,
     125                            const char            * comment,
     126                            const bool              isPrivate)
     127{
     128  char* sandbox;
     129  char* torrent_file;
     130  tr_metainfo_builder* builder;
     131  tr_ctor * ctor;
     132  tr_parse_result parse_result;
     133  tr_info inf;
     134  char * top;
     135  char ** files;
     136  size_t totalSize;
     137  size_t i;
     138  char* tmpstr;
     139 
     140
     141  /* set up our local test sandbox */
     142  sandbox = libtest_sandbox_create();
     143
     144  /* create the top temp directory */
     145  top = tr_buildPath (sandbox, "folder.XXXXXX", NULL);
     146  tr_mkdtemp (top);
     147
     148  /* build the payload files that go into the top temp directory */
     149  files = tr_new (char*, payloadCount);
     150  totalSize = 0;
     151  for (i=0; i<payloadCount; i++)
     152    {
     153      char tmpl[16];
     154      tr_snprintf (tmpl, sizeof(tmpl), "file.%04zu%s", i, "XXXXXX");
     155      files[i] = tr_buildPath (top, tmpl, NULL);
     156      libtest_create_tmpfile_with_contents (files[i], payloads[i], payloadSizes[i]);
     157      totalSize += payloadSizes[i];
     158    }
     159  sync ();
     160
     161  /* init the builder */
     162  builder = tr_metaInfoBuilderCreate (top);
     163  check (!builder->abortFlag);
     164  check_streq (top, builder->top);
     165  check_int_eq (payloadCount, builder->fileCount);
     166  check_int_eq (totalSize, builder->totalSize);
     167  check (builder->isFolder);
     168  for (i=0; i<builder->fileCount; i++)
     169    {
     170      check_streq (files[i], builder->files[i].filename);
     171      check_int_eq (payloadSizes[i], builder->files[i].size);
     172    }
     173
     174  /* call tr_makeMetaInfo() to build the .torrent file */
     175  torrent_file = tr_strdup_printf ("%s.torrent", top);
     176  tr_makeMetaInfo (builder, torrent_file, trackers, trackerCount, comment, isPrivate);
     177  check (isPrivate == builder->isPrivate);
     178  check_streq (torrent_file, builder->outputFile);
     179  check_streq (comment, builder->comment);
     180  check_int_eq (trackerCount, builder->trackerCount);
     181  while (!builder->isDone)
     182    tr_wait_msec (100);
     183
     184  /* now let's check our work: parse the  .torrent file */
     185  ctor = tr_ctorNew (NULL);
     186  sync ();
     187  tr_ctorSetMetainfoFromFile (ctor, torrent_file);
     188  parse_result = tr_torrentParse (ctor, &inf);
     189  check_int_eq (TR_PARSE_OK, parse_result);
     190
     191  /* quick check of some of the parsed metainfo */
     192  check_int_eq (totalSize, inf.totalSize);
     193  tmpstr = tr_basename(top);
     194  check_streq (tmpstr, inf.name);
     195  tr_free (tmpstr);
     196  check_streq (comment, inf.comment);
     197  check_int_eq (payloadCount, inf.fileCount);
     198  check_int_eq (isPrivate, inf.isPrivate);
     199  check_int_eq (builder->isFolder, inf.isFolder);
     200  check_int_eq (trackerCount, inf.trackerCount);
     201
     202  /* cleanup */
     203  tr_free (torrent_file);
     204  tr_ctorFree (ctor);
     205  tr_metainfoFree (&inf);
     206  tr_metaInfoBuilderFree (builder);
     207  for (i=0; i<payloadCount; i++)
     208    tr_free (files[i]);
     209  tr_free (files);
     210  libtest_sandbox_destroy (sandbox);
     211  tr_free (sandbox);
     212  tr_free (top);
     213
     214  return 0;
     215}
     216 
     217static int
     218test_single_directory_random_payload_impl (const tr_tracker_info * trackers,
     219                                           const size_t            trackerCount,
     220                                           const size_t            maxFileCount,
     221                                           const size_t            maxFileSize,
     222                                           const char            * comment,
     223                                           const bool              isPrivate)
     224{
     225  size_t i;
     226  void ** payloads;
     227  size_t * payloadSizes;
     228  size_t payloadCount;
     229
     230  /* build random payloads */
     231  payloadCount = 1 + tr_cryptoWeakRandInt (maxFileCount);
     232  payloads = tr_new0 (void*, payloadCount);
     233  payloadSizes = tr_new0 (size_t, payloadCount);
     234  for (i=0; i<payloadCount; i++)
     235    {
     236      const size_t n = 1 + tr_cryptoWeakRandInt (maxFileSize);
     237      payloads[i] = tr_new (char, n);
     238      tr_cryptoRandBuf (payloads[i], n);
     239      payloadSizes[i] = n;
     240    }
     241
     242  /* run the test */
     243  test_single_directory_impl (trackers,
     244                              trackerCount,
     245                              (const void**) payloads,
     246                              payloadSizes,
     247                              payloadCount,
     248                              comment,
     249                              isPrivate);
     250
     251  /* cleanup */
     252  for (i=0; i<payloadCount; i++)
     253    tr_free (payloads[i]);
     254  tr_free (payloads);
     255  tr_free (payloadSizes);
     256
     257  return 0;
     258}
     259
     260#define DEFAULT_MAX_FILE_COUNT 16
     261#define DEFAULT_MAX_FILE_SIZE 1024
     262
     263static int
     264test_single_directory_random_payload (void)
     265{
     266  tr_tracker_info trackers[16];
     267  size_t trackerCount;
     268  bool isPrivate;
     269  const char * comment;
     270  size_t i;
     271
     272  trackerCount = 0;
     273  trackers[trackerCount].tier = trackerCount;
     274  trackers[trackerCount].announce = (char*) "udp://tracker.openbittorrent.com:80";
     275  ++trackerCount;
     276  trackers[trackerCount].tier = trackerCount;
     277  trackers[trackerCount].announce = (char*) "udp://tracker.publicbt.com:80";
     278  ++trackerCount;
     279  comment = "This is the comment";
     280  isPrivate = false;
     281
     282  for (i=0; i<10; i++)
     283    {
     284      test_single_directory_random_payload_impl (trackers,
     285                                                 trackerCount,
     286                                                 DEFAULT_MAX_FILE_COUNT,
     287                                                 DEFAULT_MAX_FILE_SIZE,
     288                                                 comment,
     289                                                 isPrivate);
     290    }
     291
     292  return 0;
     293}
     294
    114295int
    115296main (void)
    116297{
    117   const testFunc tests[] = { test_single_file };
     298  const testFunc tests[] = { test_single_file,
     299                             test_single_directory_random_payload };
    118300
    119301  return runTests (tests, NUM_TESTS (tests));
    120302}
    121 
  • trunk/libtransmission/metainfo.c

    r14264 r14291  
    147147      result = NULL;
    148148
    149       inf->isMultifile = 1;
     149      inf->isFolder = true;
    150150      inf->fileCount = tr_variantListSize (files);
    151151      inf->files = tr_new0 (tr_file, inf->fileCount);
     
    194194        return "path";
    195195
    196       inf->isMultifile      = 0;
     196      inf->isFolder         = false;
    197197      inf->fileCount        = 1;
    198198      inf->files            = tr_new0 (tr_file, 1);
Note: See TracChangeset for help on using the changeset viewer.