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

📄 xdelta3-test.h

📁 This program is free software you can redistribute it and/or modify it under the terms of the GNU G
💻 H
📖 第 1 页 / 共 5 页
字号:
	  if ((inst.size = d->size1) == 0)	    {	      inst.size = TESTBUFSIZE;	    }	  XD3_CHOOSE_INSTRUCTION (stream, NULL, & inst);	  if (inst.code2 != 0 || inst.code1 != i)	    {	      stream->msg = "wrong single instruction";	      return XD3_INTERNAL;	    }	}      else	{	  prev.type = d->type1;	  prev.size = d->size1;	  inst.type = d->type2;	  inst.size = d->size2;	  XD3_CHOOSE_INSTRUCTION (stream, & prev, & inst);	  if (prev.code2 != i)	    {	      stream->msg = "wrong double instruction";	      return XD3_INTERNAL;	    }	}    }  return 0;}/****************************************************************************************** TEST INSTRUCTION TABLE CODING ******************************************************************************************/#if GENERIC_ENCODE_TABLES/* Test that encoding and decoding a code table works */static inttest_encode_code_table (xd3_stream *stream, int ignore){  int ret;  const uint8_t *comp_data;  usize_t comp_size;  if ((ret = xd3_compute_alternate_table_encoding (stream, & comp_data, & comp_size)))    {      return ret;    }  stream->acache.s_near = __alternate_code_table_desc.near_modes;  stream->acache.s_same = __alternate_code_table_desc.same_modes;  if ((ret = xd3_apply_table_encoding (stream, comp_data, comp_size)))    {      return ret;    }  if (memcmp (stream->code_table, xd3_alternate_code_table (), sizeof (xd3_dinst) * 256) != 0)    {      stream->msg = "wrong code table reconstruction";      return XD3_INTERNAL;    }  return 0;}#endif/****************************************************************************************** 64BIT STREAMING ******************************************************************************************//* This test encodes and decodes a series of 1 megabyte windows, each containing a long * run of zeros along with a single xoff_t size record to indicate the sequence. */static inttest_streaming (xd3_stream *in_stream, uint8_t *encbuf, uint8_t *decbuf, uint8_t *delbuf, usize_t megs){  xd3_stream estream, dstream;  int ret;  usize_t i, delsize, decsize;  if ((ret = xd3_config_stream (& estream, NULL)) ||      (ret = xd3_config_stream (& dstream, NULL)))    {      goto fail;    }  for (i = 0; i < megs; i += 1)    {      ((usize_t*) encbuf)[0] = i;      if ((i % 200) == 199) { DOT (); }      if ((ret = xd3_process_stream (1, & estream, xd3_encode_input, 0,				     encbuf, 1 << 20,				     delbuf, & delsize, 1 << 10)))	{	  in_stream->msg = estream.msg;	  goto fail;	}      if ((ret = xd3_process_stream (0, & dstream, xd3_decode_input, 0,				     delbuf, delsize,				     decbuf, & decsize, 1 << 20)))	{	  in_stream->msg = dstream.msg;	  goto fail;	}      if (decsize != 1 << 20 ||	  memcmp (encbuf, decbuf, 1 << 20) != 0)	{	  in_stream->msg = "wrong result";	  ret = XD3_INTERNAL;	  goto fail;	}    }  if ((ret = xd3_close_stream (& estream)) ||      (ret = xd3_close_stream (& dstream)))    {      goto fail;    } fail:  xd3_free_stream (& estream);  xd3_free_stream (& dstream);  return ret;}/* Run tests of data streaming of over and around 4GB of data. */static inttest_compressed_stream_overflow (xd3_stream *stream, int ignore){  int ret;  uint8_t *buf;  if ((buf = malloc (TWO_MEGS_AND_DELTA)) == NULL) { return ENOMEM; }  memset (buf, 0, TWO_MEGS_AND_DELTA);  /* Test overflow of a 32-bit file offset. */  if (SIZEOF_XOFF_T == 4)    {      ret = test_streaming (stream, buf, buf + (1 << 20), buf + (2 << 20), (1 << 12) + 1);      if (ret == XD3_INTERNAL && MSG_IS ("decoder file offset overflow"))	{	  ret = 0;	}      else	{	  stream->msg = "expected overflow condition";	  ret = XD3_INTERNAL;	  goto fail;	}    }  /* Test transfer of exactly 32bits worth of data. */  if ((ret = test_streaming (stream, buf, buf + (1 << 20), buf + (2 << 20), 1 << 12))) { goto fail; } fail:  free (buf);  return ret;}/****************************************************************************************** COMMAND LINE ******************************************************************************************//* For each pair of command templates in the array below, test that encoding and decoding * commands work.  Also check for the expected size delta, which should be approximately * TEST_ADD_RATIO times the file size created by test_make_inputs.  Due to differences in * the application header, it is suppressed (-A) so that all delta files are the same. */static inttest_command_line_arguments (xd3_stream *stream, int ignore){  int i, ret;  static const char* cmdpairs[] =  {    /* standard input, output */    "%s %s -A < %s > %s", "%s -d < %s > %s",    "%s %s -A -e < %s > %s", "%s -d < %s > %s",    "%s %s -A= encode < %s > %s", "%s decode < %s > %s",    "%s %s -A -q encode < %s > %s", "%s -qdq < %s > %s",    /* file input, standard output */    "%s %s -A= %s > %s", "%s -d %s > %s",    "%s %s -A -e %s > %s", "%s -d %s > %s",    "%s %s encode -A= %s > %s", "%s decode %s > %s",    /* file input, output */    "%s %s -A= %s %s", "%s -d %s %s",    "%s %s -A -e %s %s", "%s -d %s %s",    "%s %s -A= encode %s %s", "%s decode %s %s",    /* option placement */    "%s %s -A -f %s %s", "%s -f -d %s %s",    "%s %s -e -A= %s %s", "%s -d -f %s %s",    "%s %s -f encode -A= %s %s", "%s -f decode -f %s %s",  };  char ecmd[TESTBUFSIZE], dcmd[TESTBUFSIZE];  int pairs = SIZEOF_ARRAY (cmdpairs) / 2;  xoff_t tsize;  xoff_t dsize;  double ratio;  srand (0x89162337);  for (i = 0; i < pairs; i += 1)    {      test_setup ();      if ((ret = test_make_inputs (stream, NULL, & tsize))) { return ret; }      sprintf (ecmd, cmdpairs[2*i], program_name, test_softcfg_str, TEST_TARGET_FILE, TEST_DELTA_FILE);      sprintf (dcmd, cmdpairs[2*i+1], program_name, TEST_DELTA_FILE, TEST_RECON_FILE);          /* Encode and decode. */      if ((ret = system (ecmd)) != 0)	{	  DP(RINT "xdelta3: encode command: %s\n", ecmd);	  stream->msg = "encode cmd failed";	  return XD3_INTERNAL;	}      if ((ret = system (dcmd)) != 0)	{	  DP(RINT "xdelta3: decode command: %s\n", dcmd);	  stream->msg = "decode cmd failed";	  return XD3_INTERNAL;	}      /* Compare the target file. */      if ((ret = compare_files (stream, TEST_TARGET_FILE, TEST_RECON_FILE)))	{	  return ret;	}      if ((ret = test_file_size (TEST_DELTA_FILE, & dsize)))	{	  return ret;	}      ratio = (double) dsize / (double) tsize;      /* Check that it is not too small, not too large. */      if (ratio >= TEST_ADD_RATIO + TEST_EPSILON)	{	  DP(RINT "xdelta3: test encode with size ratio %.3f, expected < %.3f (%"Q"u, %"Q"u)\n",	    ratio, TEST_ADD_RATIO + TEST_EPSILON, dsize, tsize);	  stream->msg = "strange encoding";	  return XD3_INTERNAL;	}      if (ratio <= TEST_ADD_RATIO - TEST_EPSILON)	{	  DP(RINT "xdelta3: test encode with size ratio %.3f, expected > %.3f\n",	    ratio, TEST_ADD_RATIO - TEST_EPSILON);	  stream->msg = "strange encoding";	  return XD3_INTERNAL;	}      /* Also check that compare_files works.  The delta and original should not be       * identical. */      if ((ret = compare_files (stream, TEST_DELTA_FILE, TEST_TARGET_FILE)) == 0)	{	  stream->msg = "broken compare_files";	  return XD3_INTERNAL;	}      test_cleanup ();      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){  int i, ret;  char buf[TESTBUFSIZE];  srand (0x91723913);  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;  srand (0x9ff56acb);  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);

⌨️ 快捷键说明

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