summaryrefslogtreecommitdiff
path: root/src/couch/test/exunit/couch_compress_tests.exs
blob: 5550e066165985dabbbc2c27350afa1476e97787 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
defmodule Couch.Test.CouchCompress do
  use Couch.Test.ExUnit.Case
  alias Couch.Test.Utils

  import Utils

  @term {[{:a, 1}, {:b, 2}, {:c, 3}, {:d, 4}, {:e, 5}]}

  @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>>

  @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>>

  @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>>

  @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>>

  @corrupt <<2, 12, 85, 06>>

  describe "couch_compress" do
    test "compress" do
      assert @none === :couch_compress.compress(@term, :none)
      assert @none !== :couch_compress.compress(@term, {:deflate, 9})
      assert @none !== :couch_compress.compress(@term, :snappy)

      # assert that compressed output is smaller than uncompressed input
      assert bit_size(:couch_compress.compress(@term, {:deflate, 9})) < bit_size(@none)
      assert bit_size(:couch_compress.compress(@term, :snappy)) < bit_size(@none)
    end

    test "decompress" do
      assert @term === :couch_compress.decompress(@none)
      assert @term === :couch_compress.decompress(@deflate)
      assert @term === :couch_compress.decompress(@snappy)
      assert @term === :couch_compress.decompress(@snappy_bigendian)
      assert catch_error(:couch_compress.decompress(@corrupt)) == :invalid_compression
    end

    test "recompress" do
      res = @none

      # none -> deflate
      res = :couch_compress.compress(res, {:deflate, 9})
      assert :couch_compress.is_compressed(res, {:deflate, 9})

      # deflate -> snappy
      res = :couch_compress.compress(res, :snappy)
      assert :couch_compress.is_compressed(res, :snappy)

      # snappy -> none
      res = :couch_compress.compress(res, :none)
      assert :couch_compress.is_compressed(res, :none)

      # none -> snappy
      res = :couch_compress.compress(res, :snappy)
      assert :couch_compress.is_compressed(res, :snappy)

      # snappy -> deflate
      res = :couch_compress.compress(res, {:deflate, 9})
      assert :couch_compress.is_compressed(res, {:deflate, 9})

      # deflate -> none
      res = :couch_compress.compress(res, :none)
      assert :couch_compress.is_compressed(res, :none)
    end

    test "is_compressed" do
      assert :couch_compress.is_compressed(@none, :none)
      assert :couch_compress.is_compressed(@deflate, {:deflate, 9})
      assert :couch_compress.is_compressed(@snappy, :snappy)
      assert :couch_compress.is_compressed(@snappy_bigendian, :snappy)
      refute :couch_compress.is_compressed(@none, {:deflate, 0})
      refute :couch_compress.is_compressed(@none, {:deflate, 9})
      refute :couch_compress.is_compressed(@none, :snappy)
      refute :couch_compress.is_compressed(@deflate, :none)
      refute :couch_compress.is_compressed(@deflate, :snappy)
      refute :couch_compress.is_compressed(@snappy, :none)
      refute :couch_compress.is_compressed(@snappy, {:deflate, 9})
      refute :couch_compress.is_compressed(@snappy_bigendian, :none)
      refute :couch_compress.is_compressed(@snappy_bigendian, {:deflate, 9})

      assert catch_error(:couch_compress.is_compressed(@corrupt, :none)) ==
               :invalid_compression

      assert catch_error(:couch_compress.is_compressed(@corrupt, {:deflate, 9})) ==
               :invalid_compression

      assert catch_error(:couch_compress.is_compressed(@corrupt, :snappy)) ==
               :invalid_compression
    end

    test "uncompressed_size" do
      assert :couch_compress.uncompressed_size(@none) === 49
      assert :couch_compress.uncompressed_size(@deflate) === 49
      assert :couch_compress.uncompressed_size(@snappy) === 49
      assert :couch_compress.uncompressed_size(@snappy_bigendian) === 49

      assert :couch_compress.uncompressed_size(
               :couch_compress.compress(:x, {:deflate, 9})
             ) === 5

      assert catch_error(:couch_compress.uncompressed_size(@corrupt)) ==
               :invalid_compression
    end
  end
end