blob: 3d11be41aa4cf00781af34059d9cf25477cee0c2 [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.
-module(couch_compress_tests).
-include_lib("couch/include/couch_eunit.hrl").
-define(TERM, {[{a, 1}, {b, 2}, {c, 3}, {d, 4}, {e, 5}]}).
-define(NONE,
<<131, 104, 1, 108, 0, 0, 0, 5, 104, 2, 100, 0, 1, 97, 97, 1, 104, 2, 100, 0, 1, 98, 97, 2, 104,
2, 100, 0, 1, 99, 97, 3, 104, 2, 100, 0, 1, 100, 97, 4, 104, 2, 100, 0, 1, 101, 97, 5, 106>>
).
-define(DEFLATE,
<<131, 80, 0, 0, 0, 48, 120, 218, 203, 96, 204, 97, 96, 96, 96, 205, 96, 74, 97, 96, 76, 76,
100, 4, 211, 73, 137, 76, 96, 58, 57, 145, 25, 76, 167, 36, 178, 128, 233, 212, 68, 214, 44,
0, 212, 169, 9, 51>>
).
-define(SNAPPY,
<<1, 49, 64, 131, 104, 1, 108, 0, 0, 0, 5, 104, 2, 100, 0, 1, 97, 97, 1, 104, 1, 8, 8, 98, 97,
2, 5, 8, 8, 99, 97, 3, 5, 8, 44, 100, 97, 4, 104, 2, 100, 0, 1, 101, 97, 5, 106>>
).
-define(SNAPPY_BIGENDIAN,
<<1, 49, 60, 131, 104, 1, 108, 0, 0, 0, 5, 104, 2, 100, 0, 1, 97, 97, 1, 5, 8, 8, 98, 97, 2, 5,
8, 8, 99, 97, 3, 5, 8, 44, 100, 97, 4, 104, 2, 100, 0, 1, 101, 97, 5, 106>>
).
-define(CORRUPT, <<2, 12, 85, 06>>).
-define(DEFLATE_COMPRESSION, {deflate, 9}).
-define(DEFLATE_COMPRESSION_ZERO, {deflate, 0}).
couch_compress_test_() ->
{
"couch compress tests",
[
fun t_compress/0,
fun t_decompress/0,
fun t_recompress/0,
fun t_is_compressed/0,
fun t_uncompressed_size/0
]
}.
t_compress() ->
?assertEqual(?NONE, couch_compress:compress(?TERM, none)),
?assertNotEqual(?NONE, couch_compress:compress(?TERM, ?DEFLATE_COMPRESSION)),
?assertNotEqual(?NONE, couch_compress:compress(?TERM, snappy)),
% assert that compressed output is smaller than uncompressed output
?assert(bit_size(couch_compress:compress(?TERM, ?DEFLATE_COMPRESSION)) < bit_size(?NONE)),
?assert(bit_size(couch_compress:compress(?TERM, snappy)) < bit_size(?NONE)).
t_decompress() ->
?assertEqual(?TERM, couch_compress:decompress(?NONE)),
?assertEqual(?TERM, couch_compress:decompress(?DEFLATE)),
?assertEqual(?TERM, couch_compress:decompress(?SNAPPY)),
?assertEqual(?TERM, couch_compress:decompress(?SNAPPY_BIGENDIAN)),
?assertError(invalid_compression, couch_compress:decompress(?CORRUPT)).
t_recompress() ->
Result1 = ?NONE,
% none -> deflate
Result2 = couch_compress:compress(Result1, ?DEFLATE_COMPRESSION),
?assert(couch_compress:is_compressed(Result2, ?DEFLATE_COMPRESSION)),
% deflate -> snappy
Result3 = couch_compress:compress(Result2, snappy),
?assert(couch_compress:is_compressed(Result3, snappy)),
% snappy -> none
Result4 = couch_compress:compress(Result3, none),
?assert(couch_compress:is_compressed(Result4, none)),
% none -> snappy
Result5 = couch_compress:compress(Result4, snappy),
?assert(couch_compress:is_compressed(Result5, snappy)),
% snappy -> deflate
Result6 = couch_compress:compress(Result5, ?DEFLATE_COMPRESSION),
?assert(couch_compress:is_compressed(Result6, ?DEFLATE_COMPRESSION)),
% deflate -> none
Result7 = couch_compress:compress(Result6, none),
?assert(couch_compress:is_compressed(Result7, none)).
t_is_compressed() ->
?assert(couch_compress:is_compressed(?NONE, none)),
?assert(couch_compress:is_compressed(?DEFLATE, ?DEFLATE_COMPRESSION)),
?assert(couch_compress:is_compressed(?SNAPPY, snappy)),
?assert(couch_compress:is_compressed(?SNAPPY_BIGENDIAN, snappy)),
?assertNot(couch_compress:is_compressed(?NONE, ?DEFLATE_COMPRESSION_ZERO)),
?assertNot(couch_compress:is_compressed(?NONE, ?DEFLATE_COMPRESSION)),
?assertNot(couch_compress:is_compressed(?NONE, snappy)),
?assertNot(couch_compress:is_compressed(?DEFLATE, none)),
?assertNot(couch_compress:is_compressed(?DEFLATE, snappy)),
?assertNot(couch_compress:is_compressed(?SNAPPY, none)),
?assertNot(couch_compress:is_compressed(?SNAPPY, ?DEFLATE_COMPRESSION)),
?assertNot(couch_compress:is_compressed(?SNAPPY_BIGENDIAN, none)),
?assertNot(couch_compress:is_compressed(?SNAPPY_BIGENDIAN, ?DEFLATE_COMPRESSION)),
?assertError(invalid_compression, couch_compress:is_compressed(?CORRUPT, none)),
?assertError(invalid_compression, couch_compress:is_compressed(?CORRUPT, ?DEFLATE_COMPRESSION)),
?assertError(invalid_compression, couch_compress:is_compressed(?CORRUPT, snappy)).
t_uncompressed_size() ->
?assertEqual(49, couch_compress:uncompressed_size(?NONE)),
?assertEqual(49, couch_compress:uncompressed_size(?DEFLATE)),
?assertEqual(49, couch_compress:uncompressed_size(?SNAPPY)),
?assertEqual(49, couch_compress:uncompressed_size(?SNAPPY_BIGENDIAN)),
?assertEqual(
5,
couch_compress:uncompressed_size(
couch_compress:compress(x, ?DEFLATE_COMPRESSION)
)
),
?assertError(invalid_compression, couch_compress:uncompressed_size(?CORRUPT)).