xref: /aosp_15_r20/external/zstd/contrib/pzstd/test/RoundTripTest.cpp (revision 01826a4963a0d8a59bc3812d29bdf0fb76416722)
1*01826a49SYabin Cui /*
2*01826a49SYabin Cui  * Copyright (c) Meta Platforms, Inc. and affiliates.
3*01826a49SYabin Cui  * All rights reserved.
4*01826a49SYabin Cui  *
5*01826a49SYabin Cui  * This source code is licensed under both the BSD-style license (found in the
6*01826a49SYabin Cui  * LICENSE file in the root directory of this source tree) and the GPLv2 (found
7*01826a49SYabin Cui  * in the COPYING file in the root directory of this source tree).
8*01826a49SYabin Cui  */
9*01826a49SYabin Cui extern "C" {
10*01826a49SYabin Cui #include "datagen.h"
11*01826a49SYabin Cui }
12*01826a49SYabin Cui #include "Options.h"
13*01826a49SYabin Cui #include "test/RoundTrip.h"
14*01826a49SYabin Cui #include "utils/ScopeGuard.h"
15*01826a49SYabin Cui 
16*01826a49SYabin Cui #include <cstddef>
17*01826a49SYabin Cui #include <cstdio>
18*01826a49SYabin Cui #include <cstdlib>
19*01826a49SYabin Cui #include <memory>
20*01826a49SYabin Cui #include <random>
21*01826a49SYabin Cui 
22*01826a49SYabin Cui using namespace std;
23*01826a49SYabin Cui using namespace pzstd;
24*01826a49SYabin Cui 
25*01826a49SYabin Cui namespace {
26*01826a49SYabin Cui string
writeData(size_t size,double matchProba,double litProba,unsigned seed)27*01826a49SYabin Cui writeData(size_t size, double matchProba, double litProba, unsigned seed) {
28*01826a49SYabin Cui   std::unique_ptr<uint8_t[]> buf(new uint8_t[size]);
29*01826a49SYabin Cui   RDG_genBuffer(buf.get(), size, matchProba, litProba, seed);
30*01826a49SYabin Cui   string file = tmpnam(nullptr);
31*01826a49SYabin Cui   auto fd = std::fopen(file.c_str(), "wb");
32*01826a49SYabin Cui   auto guard = makeScopeGuard([&] { std::fclose(fd); });
33*01826a49SYabin Cui   auto bytesWritten = std::fwrite(buf.get(), 1, size, fd);
34*01826a49SYabin Cui   if (bytesWritten != size) {
35*01826a49SYabin Cui     std::abort();
36*01826a49SYabin Cui   }
37*01826a49SYabin Cui   return file;
38*01826a49SYabin Cui }
39*01826a49SYabin Cui 
40*01826a49SYabin Cui template <typename Generator>
generateInputFile(Generator & gen)41*01826a49SYabin Cui string generateInputFile(Generator& gen) {
42*01826a49SYabin Cui   // Use inputs ranging from 1 Byte to 2^16 Bytes
43*01826a49SYabin Cui   std::uniform_int_distribution<size_t> size{1, 1 << 16};
44*01826a49SYabin Cui   std::uniform_real_distribution<> prob{0, 1};
45*01826a49SYabin Cui   return writeData(size(gen), prob(gen), prob(gen), gen());
46*01826a49SYabin Cui }
47*01826a49SYabin Cui 
48*01826a49SYabin Cui template <typename Generator>
generateOptions(Generator & gen,const string & inputFile)49*01826a49SYabin Cui Options generateOptions(Generator& gen, const string& inputFile) {
50*01826a49SYabin Cui   Options options;
51*01826a49SYabin Cui   options.inputFiles = {inputFile};
52*01826a49SYabin Cui   options.overwrite = true;
53*01826a49SYabin Cui 
54*01826a49SYabin Cui   std::uniform_int_distribution<unsigned> numThreads{1, 32};
55*01826a49SYabin Cui   std::uniform_int_distribution<unsigned> compressionLevel{1, 10};
56*01826a49SYabin Cui 
57*01826a49SYabin Cui   options.numThreads = numThreads(gen);
58*01826a49SYabin Cui   options.compressionLevel = compressionLevel(gen);
59*01826a49SYabin Cui 
60*01826a49SYabin Cui   return options;
61*01826a49SYabin Cui }
62*01826a49SYabin Cui }
63*01826a49SYabin Cui 
main()64*01826a49SYabin Cui int main() {
65*01826a49SYabin Cui   std::mt19937 gen(std::random_device{}());
66*01826a49SYabin Cui 
67*01826a49SYabin Cui   auto newlineGuard = makeScopeGuard([] { std::fprintf(stderr, "\n"); });
68*01826a49SYabin Cui   for (unsigned i = 0; i < 10000; ++i) {
69*01826a49SYabin Cui     if (i % 100 == 0) {
70*01826a49SYabin Cui       std::fprintf(stderr, "Progress: %u%%\r", i / 100);
71*01826a49SYabin Cui     }
72*01826a49SYabin Cui     auto inputFile = generateInputFile(gen);
73*01826a49SYabin Cui     auto inputGuard = makeScopeGuard([&] { std::remove(inputFile.c_str()); });
74*01826a49SYabin Cui     for (unsigned i = 0; i < 10; ++i) {
75*01826a49SYabin Cui       auto options = generateOptions(gen, inputFile);
76*01826a49SYabin Cui       if (!roundTrip(options)) {
77*01826a49SYabin Cui         std::fprintf(stderr, "numThreads: %u\n", options.numThreads);
78*01826a49SYabin Cui         std::fprintf(stderr, "level: %u\n", options.compressionLevel);
79*01826a49SYabin Cui         std::fprintf(stderr, "decompress? %u\n", (unsigned)options.decompress);
80*01826a49SYabin Cui         std::fprintf(stderr, "file: %s\n", inputFile.c_str());
81*01826a49SYabin Cui         return 1;
82*01826a49SYabin Cui       }
83*01826a49SYabin Cui     }
84*01826a49SYabin Cui   }
85*01826a49SYabin Cui   return 0;
86*01826a49SYabin Cui }
87