test_checksum.cpp
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:6k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: test_checksum.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 19:42:37  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.2
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: test_checksum.cpp,v 1000.1 2004/06/01 19:42:37 gouriano Exp $
  10. * ===========================================================================
  11. *
  12. *                            PUBLIC DOMAIN NOTICE
  13. *               National Center for Biotechnology Information
  14. *
  15. *  This software/database is a "United States Government Work" under the
  16. *  terms of the United States Copyright Act.  It was written as part of
  17. *  the author's official duties as a United States Government employee and
  18. *  thus cannot be copyrighted.  This software/database is freely available
  19. *  to the public for use. The National Library of Medicine and the U.S.
  20. *  Government have not placed any restriction on its use or reproduction.
  21. *
  22. *  Although all reasonable efforts have been taken to ensure the accuracy
  23. *  and reliability of the software and data, the NLM and the U.S.
  24. *  Government do not and cannot warrant the performance or results that
  25. *  may be obtained by using this software or data. The NLM and the U.S.
  26. *  Government disclaim all warranties, express or implied, including
  27. *  warranties of performance, merchantability or fitness for any particular
  28. *  purpose.
  29. *
  30. *  Please cite the author in any work or product based on this material.
  31. *
  32. * ===========================================================================
  33. *
  34. * Author:  Aaron Ucko, NCBI
  35. *
  36. * File Description:
  37. *   checksum computation test
  38. *
  39. * ===========================================================================
  40. */
  41. #include <ncbi_pch.hpp>
  42. #include <corelib/ncbiapp.hpp>
  43. #include <util/checksum.hpp>
  44. // must be last
  45. #include <test/test_assert.h>
  46. USING_NCBI_SCOPE;
  47. class CChecksumTestApp : public CNcbiApplication
  48. {
  49. public:
  50.     void Init(void);
  51.     int  Run (void);
  52. };
  53. void CChecksumTestApp::Init(void)
  54. {
  55.     auto_ptr<CArgDescriptions> arg_desc(new CArgDescriptions);
  56.     arg_desc->SetUsageContext(GetArguments().GetProgramBasename(),
  57.                               "CChecksum test program");
  58.     arg_desc->AddFlag("selftest",
  59.                       "Just verify behavior on internal test data");
  60.     arg_desc->AddExtra(0, kMax_UInt, "files to process (stdin if none given)",
  61.                        CArgDescriptions::eInputFile,
  62.                        CArgDescriptions::fPreOpen | CArgDescriptions::fBinary);
  63.     SetupArgDescriptions(arg_desc.release());
  64. }
  65. static void s_ComputeSums(CNcbiIstream& is, CChecksum& crc32,
  66.                           CChecksum& md5)
  67. {
  68.     while (!is.eof()) {
  69.         char buf[289]; // use a weird size to force varying phases
  70.         is.read(buf, sizeof(buf));
  71.         size_t count = is.gcount();
  72.         if (count) {
  73.             crc32.AddChars(buf, count);
  74.             md5  .AddChars(buf, count);
  75.         }
  76.     }
  77. }
  78. static bool s_VerifySum(const string& s, const string& md5hex)
  79. {
  80.     cerr << "Input: "" << NStr::PrintableString(s) << '"' << endl;
  81.     bool ok = true;
  82.     CNcbiIstrstream is(s.data(), s.size());
  83.     CChecksum       new_crc32(CChecksum::eCRC32), new_md5(CChecksum::eMD5);
  84.     s_ComputeSums(is, new_crc32, new_md5);
  85. #if 0
  86.     cerr << "Expected CRC32: " << hex << crc32 << endl;
  87.     cerr << "Computed CRC32: " << hex << new_crc32.GetChecksum() << endl;
  88.     if (crc32 != new_crc32.GetChecksum()) {
  89.         cerr << "FAILED!" << endl;
  90.         ok = false;
  91.     }
  92. #endif
  93.     CNcbiOstrstream oss;
  94.     new_md5.WriteChecksumData(oss);
  95.     string new_md5hex = CNcbiOstrstreamToString(oss);
  96.     cerr << "Expected MD5: " << md5hex << endl;
  97.     cerr << "Computed " << new_md5hex << endl;
  98.     if ( !NStr::EndsWith(new_md5hex, md5hex) ) {
  99.         cerr << "FAILED!" << endl;
  100.         ok = false;
  101.     }
  102.     return ok;
  103. }
  104. int CChecksumTestApp::Run(void)
  105. {
  106.     CArgs args = GetArgs();
  107.     if (args["selftest"]) {
  108.         // Not testing CRCs for now, since I can't find an external
  109.         // implementation that agrees with what we have.
  110.         // MD5 test cases from RFC 1321
  111.         bool ok = s_VerifySum(kEmptyStr, "d41d8cd98f00b204e9800998ecf8427e");
  112.         ok &= s_VerifySum("a", "0cc175b9c0f1b6a831c399e269772661");
  113.         ok &= s_VerifySum("abc", "900150983cd24fb0d6963f7d28e17f72");
  114.         ok &= s_VerifySum("message digest",
  115.                           "f96b697d7cb7938d525a2f31aaf161d0");
  116.         ok &= s_VerifySum("abcdefghijklmnopqrstuvwxyz",
  117.                           "c3fcd3d76192e4007dfb496cca67e13b");
  118.         ok &= s_VerifySum
  119.             ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",
  120.              "d174ab98d277d9f5a5611c2c9f419d9f");
  121.         ok &= s_VerifySum("1234567890123456789012345678901234567890123456789"
  122.                           "0123456789012345678901234567890",
  123.                           "57edf4a22be3c955ac49da2e2107b67a");
  124.         return !ok;
  125.     } else if (args.GetNExtra()) {
  126.         for (size_t extra = 1;  extra <= args.GetNExtra();  extra++) {
  127.             if (extra > 1) {
  128.                 cout << endl;
  129.             }
  130.             cout << "File: " << args[extra].AsString() << endl;
  131.             CNcbiIstream& is = args[extra].AsInputFile();
  132.             CChecksum crc32(CChecksum::eCRC32), md5(CChecksum::eMD5);
  133.             s_ComputeSums(is, crc32, md5);
  134.             crc32.WriteChecksumData(cout) << endl;
  135.             md5.  WriteChecksumData(cout) << endl;
  136.         }
  137.     } else {
  138.         CChecksum crc32(CChecksum::eCRC32), md5(CChecksum::eMD5);
  139.         s_ComputeSums(cin, crc32, md5);
  140.         crc32.WriteChecksumData(cout) << endl;
  141.         md5.  WriteChecksumData(cout) << endl;
  142.     }
  143.     return 0;
  144. }
  145. int main(int argc, char** argv)
  146. {
  147.     return CChecksumTestApp().AppMain(argc, argv, 0, eDS_Default, 0);
  148. }
  149. /*
  150. * ===========================================================================
  151. *
  152. * $Log: test_checksum.cpp,v $
  153. * Revision 1000.1  2004/06/01 19:42:37  gouriano
  154. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.2
  155. *
  156. * Revision 1.2  2004/05/17 21:09:26  gorelenk
  157. * Added include of PCH ncbi_pch.hpp
  158. *
  159. * Revision 1.1  2003/07/29 21:29:26  ucko
  160. * Add MD5 support (cribbed from the C Toolkit)
  161. *
  162. *
  163. * ===========================================================================
  164. */