⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xdelta3-test.h

📁 Linux下一个可以比较二进制文件的工具xdelta3.0u的源码。
💻 H
📖 第 1 页 / 共 5 页
字号:
      return ret;    }  return 0;}  static inttest_recode_command (xd3_stream *stream, int ignore){  /* Things to test:   * - with and without a source file (recode does not change)   *    * (recode may or may not change -- 8 variations)   * - with and without adler32   * - with and without app header   * - with and without secondary   */  int has_source;  int variant;  int change;  int ret;  for (has_source = 0; has_source < 2; has_source++)    {      for (variant = 0; variant < 8; variant++)	{	  for (change = 0; change < 8; change++)	    {	      if ((ret = test_recode_command2 (stream, has_source,					       variant, change)))		{		  return ret;		}	    }	  DOT ();	}    }  return 0;}/*********************************************************************** EXTERNAL I/O DECOMPRESSION/RECOMPRESSION ***********************************************************************/#if EXTERNAL_COMPRESSION/* This performs one step of the test_externally_compressed_io * function described below.  It builds a pipe containing both Xdelta * and external compression/decompression that should not modify the * data passing through. */static inttest_compressed_pipe (xd3_stream *stream, main_extcomp *ext, char* buf,		      const char* comp_options, const char* decomp_options,		      int do_ext_recomp, const char* msg){  int ret;  char decomp_buf[TESTBUFSIZE];  if (do_ext_recomp)    {      sprintf (decomp_buf, " | %s %s", ext->decomp_cmdname, ext->decomp_options);    }  else    {      decomp_buf[0] = 0;    }  sprintf (buf, "%s %s < %s | %s %s | %s %s%s > %s",	   ext->recomp_cmdname, ext->recomp_options,	   TEST_TARGET_FILE,	   program_name, comp_options,	   program_name, decomp_options,	   decomp_buf,	   TEST_RECON_FILE);  if ((ret = system (buf)) != 0)    {      stream->msg = msg;      return XD3_INTERNAL;    }  if ((ret = compare_files (stream, TEST_TARGET_FILE, TEST_RECON_FILE)))    {      return XD3_INTERNAL;    }  DOT ();  return 0;}/* We want to test that a pipe such as: * * --> | gzip -cf | xdelta3 -cf | xdelta3 -dcf | gzip -dcf | --> * * is transparent, i.e., does not modify the stream of data.  However, * we also want to verify that at the center the data is properly * compressed, i.e., that we do not just have a re-compressed gzip * format, that we have an VCDIFF format.  We do this in two steps. * First test the above pipe, then test with suppressed output * recompression (-D).  The result should be the original input: * * --> | gzip -cf | xdelta3 -cf | xdelta3 -Ddcf | --> * * Finally we want to test that -D also disables input decompression: * * --> | gzip -cf | xdelta3 -Dcf | xdelta3 -Ddcf | gzip -dcf | --> */static inttest_externally_compressed_io (xd3_stream *stream, int ignore){  usize_t i;  int ret;  char buf[TESTBUFSIZE];  mt_init (& static_mtrand, 0x9f73f7fc);  if ((ret = test_make_inputs (stream, NULL, NULL))) { return ret; }  for (i = 0; i < SIZEOF_ARRAY (extcomp_types); i += 1)    {      main_extcomp *ext = & extcomp_types[i];      /* Test for the existence of the external command first, if not skip. */      sprintf (buf, "%s %s < /dev/null > /dev/null", ext->recomp_cmdname, ext->recomp_options);      if ((ret = system (buf)) != 0)	{	  DP(RINT "%s=0", ext->recomp_cmdname);	  continue;	}      if ((ret = test_compressed_pipe (stream, ext, buf, "-cfq", "-dcfq", 1,				       "compression failed: identity pipe")) ||	  (ret = test_compressed_pipe (stream, ext, buf, "-cfq", "-Rdcfq", 0,				       "compression failed: without recompression")) ||	  (ret = test_compressed_pipe (stream, ext, buf, "-Dcfq", "-Rdcfq", 1,				       "compression failed: without decompression")))	{	  return ret;	}    }  return 0;}/* This tests the proper functioning of external decompression for * source files.  The source and target files are identical and * compressed by gzip.  Decoding such a delta with recompression * disbaled (-R) should produce the original, uncompressed * source/target file.  Then it checks with output recompression * enabled--in this case the output should be a compressed copy of the * original source/target file.  Then it checks that encoding with * decompression disabled works--the compressed files are identical * and decoding them should always produce a compressed output, * regardless of -R since the encoded delta file had decompression * disabled.. */static inttest_source_decompression (xd3_stream *stream, int ignore){  int ret;  char buf[TESTBUFSIZE];  const main_extcomp *ext;  mt_init (& static_mtrand, 0x9f73f7fc);  test_setup ();  if ((ret = test_make_inputs (stream, NULL, NULL))) { return ret; }  /* Use gzip. */  if ((ext = main_get_compressor ("G")) == NULL) { DP(RINT "skipped"); return 0; }  /* Save an uncompressed copy. */  if ((ret = test_save_copy (TEST_TARGET_FILE))) { return ret; }  /* Compress the target. */  sprintf (buf, "%s %s < %s > %s", ext->recomp_cmdname,	   ext->recomp_options, TEST_TARGET_FILE, TEST_SOURCE_FILE);  if ((ret = do_cmd (stream, buf))) { return ret; }  /* Copy back to the source. */  sprintf (buf, "cp -f %s %s", TEST_SOURCE_FILE, TEST_TARGET_FILE);  if ((ret = do_cmd (stream, buf))) { return ret; }  /* Now the two identical files are compressed.  Delta-encode the target,   * with decompression. */  sprintf (buf, "%s -eq -s%s %s %s", program_name, TEST_SOURCE_FILE, TEST_TARGET_FILE, TEST_DELTA_FILE);  if ((ret = do_cmd (stream, buf))) { return ret; }  /* Decode the delta file with recompression disabled, should get an   * uncompressed file out. */  sprintf (buf, "%s -dq -R -s%s %s %s", program_name, TEST_SOURCE_FILE, TEST_DELTA_FILE, TEST_RECON_FILE);  if ((ret = do_cmd (stream, buf))) { return ret; }  if ((ret = compare_files (stream, TEST_COPY_FILE, TEST_RECON_FILE))) { return ret; }  /* Decode the delta file with recompression, should get a compressed file   * out.  But we can't compare compressed files directly. */  sprintf (buf, "%s -dqf -s%s %s %s", program_name, TEST_SOURCE_FILE, TEST_DELTA_FILE, TEST_RECON_FILE);  if ((ret = do_cmd (stream, buf))) { return ret; }  sprintf (buf, "%s %s < %s > %s", ext->decomp_cmdname, ext->decomp_options, TEST_RECON_FILE, TEST_RECON2_FILE);  if ((ret = do_cmd (stream, buf))) { return ret; }  if ((ret = compare_files (stream, TEST_COPY_FILE, TEST_RECON2_FILE))) { return ret; }  /* Encode with decompression disabled */  sprintf (buf, "%s -feqD -s%s %s %s", program_name, TEST_SOURCE_FILE, TEST_TARGET_FILE, TEST_DELTA_FILE);  if ((ret = do_cmd (stream, buf))) { return ret; }  /* Decode the delta file with recompression enabled, it doesn't matter,   * should get the compressed file out. */  sprintf (buf, "%s -fdq -s%s %s %s", program_name, TEST_SOURCE_FILE, TEST_DELTA_FILE, TEST_RECON_FILE);  if ((ret = do_cmd (stream, buf))) { return ret; }  if ((ret = compare_files (stream, TEST_TARGET_FILE, TEST_RECON_FILE))) { return ret; }  /* Try again with recompression disabled, it doesn't make a difference. */  sprintf (buf, "%s -fqRd -s%s %s %s", program_name, TEST_SOURCE_FILE, TEST_DELTA_FILE, TEST_RECON_FILE);  if ((ret = do_cmd (stream, buf))) { return ret; }  if ((ret = compare_files (stream, TEST_TARGET_FILE, TEST_RECON_FILE))) { return ret; }  test_cleanup();  return 0;}#endif/*********************************************************************** FORCE, STDOUT ***********************************************************************//* This tests that output will not overwrite an existing file unless * -f was specified.  The test is for encoding (the same code handles * it for decoding). */static inttest_force_behavior (xd3_stream *stream, int ignore){  int ret;  char buf[TESTBUFSIZE];  /* Create empty target file */  test_setup ();  sprintf (buf, "cp /dev/null %s", TEST_TARGET_FILE);  if ((ret = do_cmd (stream, buf))) { return ret; }  /* Encode to delta file */  sprintf (buf, "%s -e %s %s", program_name,	   TEST_TARGET_FILE, TEST_DELTA_FILE);  if ((ret = do_cmd (stream, buf))) { return ret; }  /* Encode again, should fail. */  sprintf (buf, "%s -q -e %s %s ", program_name,	   TEST_TARGET_FILE, TEST_DELTA_FILE);  if ((ret = do_fail (stream, buf))) { return ret; }  /* Force it, should succeed. */  sprintf (buf, "%s -f -e %s %s", program_name,	   TEST_TARGET_FILE, TEST_DELTA_FILE);  if ((ret = do_cmd (stream, buf))) { return ret; }  test_cleanup();  return 0;}/* This checks the proper operation of the -c flag.  When specified * the default output becomes stdout, otherwise the input must be * provided (encode) or it may be defaulted (decode w/ app header). */static inttest_stdout_behavior (xd3_stream *stream, int ignore){  int ret;  char buf[TESTBUFSIZE];  test_setup();  sprintf (buf, "cp /dev/null %s", TEST_TARGET_FILE);  if ((ret = do_cmd (stream, buf))) { return ret; }  /* Without -c, encode writes to delta file */  sprintf (buf, "%s -e %s %s", program_name,	   TEST_TARGET_FILE, TEST_DELTA_FILE);  if ((ret = do_cmd (stream, buf))) { return ret; }  /* With -c, encode writes to stdout */  sprintf (buf, "%s -e -c %s > %s", program_name,	   TEST_TARGET_FILE, TEST_DELTA_FILE);  if ((ret = do_cmd (stream, buf))) { return ret; }  /* Without -c, decode writes to target file name, but it fails because the   * file exists. */  sprintf (buf, "%s -q -d %s ", program_name, TEST_DELTA_FILE);  if ((ret = do_fail (stream, buf))) { return ret; }  /* With -c, decode writes to stdout */  sprintf (buf, "%s -d -c %s > /dev/null", program_name, TEST_DELTA_FILE);  if ((ret = do_cmd (stream, buf))) { return ret; }  test_cleanup();  return 0;}/* This tests that the no-output flag (-J) works. */static inttest_no_output (xd3_stream *stream, int ignore){  int ret;  char buf[TESTBUFSIZE];  test_setup ();  sprintf (buf, "touch %s && chmod 0000 %s",	   TEST_NOPERM_FILE, TEST_NOPERM_FILE);  if ((ret = do_cmd (stream, buf))) { return ret; }  if ((ret = test_make_inputs (stream, NULL, NULL))) { return ret; }  /* Try no_output encode w/out unwritable output file */  sprintf (buf, "%s -q -f -e %s %s", program_name,	   TEST_TARGET_FILE, TEST_NOPERM_FILE);  if ((ret = do_fail (stream, buf))) { return ret; }  sprintf (buf, "%s -J -e %s %s", program_name,	   TEST_TARGET_FILE, TEST_NOPERM_FILE);  if ((ret = do_cmd (stream, buf))) { return ret; }  /* Now really write the delta to test decode no-output */  sprintf (buf, "%s -e %s %s", program_name,	   TEST_TARGET_FILE, TEST_DELTA_FILE);  if ((ret = do_cmd (stream, buf))) { return ret; }  sprintf (buf, "%s -q -f -d %s %s", program_name,	   TEST_DELTA_FILE, TEST_NOPERM_FILE);  if ((ret = do_fail (stream, buf))) { return ret; }  sprintf (buf, "%s -J -d %s %s", program_name,	   TEST_DELTA_FILE, TEST_NOPERM_FILE);  if ((ret = do_cmd (stream, buf))) { return ret; }  test_cleanup ();  return 0;}/*********************************************************************** Source identical optimization ***********************************************************************//* Computing a delta should be fastest when the two inputs are * identical, this checks it.  The library is called to compute a * delta between a 10000 byte file, 1000 byte winsize, 500 byte source * blocksize.  The same buffer is used for both source and target. */static inttest_identical_behavior (xd3_stream *stream, int ignore){#define IDB_TGTSZ 10000#define IDB_BLKSZ 500#define IDB_WINSZ 1000#define IDB_DELSZ 1000#define IDB_WINCNT (IDB_TGTSZ / IDB_WINSZ)  int ret, i;  uint8_t buf[IDB_TGTSZ];  uint8_t del[IDB_DELSZ];  uint8_t rec[IDB_TGTSZ];  xd3_source source;  int nextencwin = 0;  int winstarts = 0, winfinishes = 0;  xoff_t srcwin = -1;  usize_t delpos = 0, recsize;  xd3_config config;  for (i = 0; i < IDB_TGTSZ; i += 1) { buf[i] = mt_random (&static_mtrand); }  stream->winsize = IDB_WINSZ;  source.size     = IDB_TGTSZ;  source.blksize  = IDB_BLKSZ;  source.name     = "";  source.curblk   = NULL;  source.curblkno = -1;  if ((ret = xd3_set_source (stream, & source))) { goto fail; }  /* Compute an delta between identical source and targets. */  for (;;)    {      ret = xd3_encode_input (stream);      if (ret == XD3_INPUT)	{	  xd3_avail_input (stream, buf + (IDB_WINSZ * nextencwin), IDB_WINSZ);	  nextencwin += 1;	  continue;	}      if (ret == XD3_GETSRCBLK)	{	  source.curblkno = source.getblkno;	  source.onblk    = IDB_BLKSZ;	  source.curblk   = buf + source.getblkno * IDB_BLKSZ;	  srcwin = source.getblkno;	  continue;	}      if (ret == XD3_WINSTART)	{	  winstarts++;	  continue;	}      if (ret == XD3_WINFINISH)	{	  winfinishes++;	  if (winfinishes == IDB_WINCNT)	    {	      break;	    }	  continue;	}      if (ret != XD3_OUTPUT) { goto fail; }      CHECK(delpos + stream->avail_out <= IDB_DELSZ);      memcpy (del + delpos, stream->next_out, stream->avail_out);      delpos += stream->avail_out;      xd3_consume_output (stream);    }  CHECK(srcwin == source.blocks - 1);  CHECK(winfinishes == IDB_WINCNT);  CHECK(winstarts == IDB_WINCNT);  CHECK(nextencwin == IDB_WINCNT);  /* Reset. */  source.blksize  = IDB_TGTSZ;  source.onblk    = IDB_TGTSZ;  source.curblk   = buf;  source.curblkno = 0;  if ((ret = xd3_close_stream (stream))) { goto fail; }  xd3_free_stream (stream);  xd3_init_config (& config, 0);  if ((ret = xd3_config_stream (stream, & config))) { goto fail; }  if ((ret = xd3_set_source (stream, & source))) { goto fail; }  /* Decode. */  if ((ret = xd3_decode_stream (stream, del, delpos, rec, & recsize, IDB_TGTSZ))) { goto fail; }  /* Check result size and data. */  if (recsize != IDB_TGTSZ) { stream->msg = "wrong size reconstruction"; goto fail; }  if (memcmp (rec, buf, IDB_TGTSZ) != 0) { stream->msg = "wrong data reconstruction"; goto fail; }  /* Check that there was one copy per window. */  IF_DEBUG (if (stream->n_scpy != IDB_WINCNT ||		stream->n_add != 0 ||		stream->n_run != 0) { stream->msg = "wrong copy count"; goto fail; });  /* Check that no checksums were computed because the initial match     was presumed. */  IF_DEBUG (if (stream->large_ckcnt != 0) { stream->msg = "wrong checksum behavior"; goto fail; });  ret = 0; fail:  return ret;}/*********************************************************************** String matching test ***********************************************************************//* Check particular matching behaviors by calling * xd3_string_match_soft directly with specific arguments. */typedef struct _string_match_test string_match_test;typedef enum{  SM_NONE    = 0,  SM_LAZY    = (1 << 1),} string_match_flags;struct _string_match_test{  const char *input;  int         flags;  const char *result;};static const string_match_test match_tests[] ={  /* nothing */  { "1234567890", SM_NONE, "" },  /* basic run, copy */  { "11111111112323232323", SM_NONE, "R0/10 C12/8@10" },  /* no run smaller than MIN_RUN=8 */  { "1111111",  SM_NONE, "C1/6@0" },  { "11111111", SM_NONE, "R0/8" },  /* simple promotion: the third copy address depends on promotion */  { "ABCDEF_ABCDEF^ABCDEF", SM_NONE,    "C7/6@0 C14/6@7" },  /* { "ABCDEF_ABCDEF^ABCDEF", SM_PROMOTE, "C7/6@0 C

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -