blob: 05764a43c62e046995566f7f3105fd190b914ff4 [file] [log] [blame]
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License
#include <string>
#include <gtest/gtest.h>
#include <gmock/gmock.h>
#include <stout/gtest.hpp>
#include <stout/gzip.hpp>
using std::string;
#ifdef HAVE_LIBZ
TEST(GzipTest, CompressDecompressString)
{
// Test bad compression levels, outside of [-1, Z_BEST_COMPRESSION].
ASSERT_ERROR(gzip::compress("", -2));
ASSERT_ERROR(gzip::compress("", Z_BEST_COMPRESSION + 1));
string s =
"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do "
"eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad "
"minim veniam, quis nostrud exercitation ullamco laboris nisi ut "
"aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit "
"in voluptate velit esse cillum dolore eu fugiat nulla pariatur. "
"Excepteur sint occaecat cupidatat non proident, sunt in culpa qui "
"officia deserunt mollit anim id est laborum.";
Try<string> compressed = gzip::compress(s);
ASSERT_SOME(compressed);
Try<string> decompressed = gzip::decompress(compressed.get());
ASSERT_SOME(decompressed);
ASSERT_EQ(s, decompressed.get());
// Test with a 1MB random string!
s = "";
while (s.length() < (1024 * 1024)) {
s.append(1, ' ' + (rand() % ('~' - ' ')));
}
compressed = gzip::compress(s);
ASSERT_SOME(compressed);
decompressed = gzip::decompress(compressed.get());
ASSERT_SOME(decompressed);
ASSERT_EQ(s, decompressed.get());
s = "";
compressed = gzip::compress(s);
ASSERT_SOME(compressed);
decompressed = gzip::decompress(compressed.get());
ASSERT_SOME(decompressed);
ASSERT_EQ(s, decompressed.get());
}
TEST(GzipTest, Decompressor)
{
string s =
"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do "
"eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad "
"minim veniam, quis nostrud exercitation ullamco laboris nisi ut "
"aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit "
"in voluptate velit esse cillum dolore eu fugiat nulla pariatur. "
"Excepteur sint occaecat cupidatat non proident, sunt in culpa qui "
"officia deserunt mollit anim id est laborum.";
Try<string> compressed = gzip::compress(s);
ASSERT_SOME(compressed);
gzip::Decompressor decompressor;
// Decompress 1 byte at a time.
string decompressed;
size_t i = 0;
while (i < compressed->size()) {
size_t chunkSize = 1;
string chunk = compressed->substr(i, chunkSize);
Try<string> decompressedChunk = decompressor.decompress(chunk);
ASSERT_SOME(decompressedChunk);
decompressed += decompressedChunk.get();
i += chunkSize;
}
EXPECT_TRUE(decompressor.finished());
ASSERT_EQ(s, decompressed);
}
#endif // HAVE_LIBZ