Home | History | Annotate | Download | only in compression
      1 /*
      2  *
      3  * Copyright 2015 gRPC authors.
      4  *
      5  * Licensed under the Apache License, Version 2.0 (the "License");
      6  * you may not use this file except in compliance with the License.
      7  * You may obtain a copy of the License at
      8  *
      9  *     http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  * Unless required by applicable law or agreed to in writing, software
     12  * distributed under the License is distributed on an "AS IS" BASIS,
     13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  * See the License for the specific language governing permissions and
     15  * limitations under the License.
     16  *
     17  */
     18 
     19 #include <stdlib.h>
     20 #include <string.h>
     21 
     22 #include <grpc/compression.h>
     23 #include <grpc/grpc.h>
     24 #include <grpc/support/log.h>
     25 
     26 #include "src/core/lib/gpr/useful.h"
     27 #include "test/core/util/test_config.h"
     28 
     29 static void test_compression_algorithm_parse(void) {
     30   size_t i;
     31   const char* valid_names[] = {"identity", "gzip", "deflate", "stream/gzip"};
     32   const grpc_compression_algorithm valid_algorithms[] = {
     33       GRPC_COMPRESS_NONE, GRPC_COMPRESS_GZIP, GRPC_COMPRESS_DEFLATE,
     34       GRPC_COMPRESS_STREAM_GZIP};
     35   const char* invalid_names[] = {"gzip2", "foo", "", "2gzip"};
     36 
     37   gpr_log(GPR_DEBUG, "test_compression_algorithm_parse");
     38 
     39   for (i = 0; i < GPR_ARRAY_SIZE(valid_names); i++) {
     40     const char* valid_name = valid_names[i];
     41     grpc_compression_algorithm algorithm;
     42     const int success = grpc_compression_algorithm_parse(
     43         grpc_slice_from_static_string(valid_name), &algorithm);
     44     GPR_ASSERT(success != 0);
     45     GPR_ASSERT(algorithm == valid_algorithms[i]);
     46   }
     47 
     48   for (i = 0; i < GPR_ARRAY_SIZE(invalid_names); i++) {
     49     const char* invalid_name = invalid_names[i];
     50     grpc_compression_algorithm algorithm;
     51     int success;
     52     success = grpc_compression_algorithm_parse(
     53         grpc_slice_from_static_string(invalid_name), &algorithm);
     54     GPR_ASSERT(success == 0);
     55     /* the value of "algorithm" is undefined upon failure */
     56   }
     57 }
     58 
     59 static void test_compression_algorithm_name(void) {
     60   int success;
     61   const char* name;
     62   size_t i;
     63   const char* valid_names[] = {"identity", "gzip", "deflate", "stream/gzip"};
     64   const grpc_compression_algorithm valid_algorithms[] = {
     65       GRPC_COMPRESS_NONE, GRPC_COMPRESS_GZIP, GRPC_COMPRESS_DEFLATE,
     66       GRPC_COMPRESS_STREAM_GZIP};
     67 
     68   gpr_log(GPR_DEBUG, "test_compression_algorithm_name");
     69 
     70   for (i = 0; i < GPR_ARRAY_SIZE(valid_algorithms); i++) {
     71     success = grpc_compression_algorithm_name(valid_algorithms[i], &name);
     72     GPR_ASSERT(success != 0);
     73     GPR_ASSERT(strcmp(name, valid_names[i]) == 0);
     74   }
     75 
     76   success =
     77       grpc_compression_algorithm_name(GRPC_COMPRESS_ALGORITHMS_COUNT, &name);
     78   GPR_ASSERT(success == 0);
     79   /* the value of "name" is undefined upon failure */
     80 }
     81 
     82 static void test_compression_algorithm_for_level(void) {
     83   gpr_log(GPR_DEBUG, "test_compression_algorithm_for_level");
     84 
     85   {
     86     /* accept only identity (aka none) */
     87     uint32_t accepted_encodings = 0;
     88     GPR_BITSET(&accepted_encodings, GRPC_COMPRESS_NONE); /* always */
     89 
     90     GPR_ASSERT(GRPC_COMPRESS_NONE ==
     91                grpc_compression_algorithm_for_level(GRPC_COMPRESS_LEVEL_NONE,
     92                                                     accepted_encodings));
     93 
     94     GPR_ASSERT(GRPC_COMPRESS_NONE ==
     95                grpc_compression_algorithm_for_level(GRPC_COMPRESS_LEVEL_LOW,
     96                                                     accepted_encodings));
     97 
     98     GPR_ASSERT(GRPC_COMPRESS_NONE ==
     99                grpc_compression_algorithm_for_level(GRPC_COMPRESS_LEVEL_MED,
    100                                                     accepted_encodings));
    101 
    102     GPR_ASSERT(GRPC_COMPRESS_NONE ==
    103                grpc_compression_algorithm_for_level(GRPC_COMPRESS_LEVEL_HIGH,
    104                                                     accepted_encodings));
    105   }
    106 
    107   {
    108     /* accept only gzip */
    109     uint32_t accepted_encodings = 0;
    110     GPR_BITSET(&accepted_encodings, GRPC_COMPRESS_NONE); /* always */
    111     GPR_BITSET(&accepted_encodings, GRPC_COMPRESS_GZIP);
    112 
    113     GPR_ASSERT(GRPC_COMPRESS_NONE ==
    114                grpc_compression_algorithm_for_level(GRPC_COMPRESS_LEVEL_NONE,
    115                                                     accepted_encodings));
    116 
    117     GPR_ASSERT(GRPC_COMPRESS_GZIP ==
    118                grpc_compression_algorithm_for_level(GRPC_COMPRESS_LEVEL_LOW,
    119                                                     accepted_encodings));
    120 
    121     GPR_ASSERT(GRPC_COMPRESS_GZIP ==
    122                grpc_compression_algorithm_for_level(GRPC_COMPRESS_LEVEL_MED,
    123                                                     accepted_encodings));
    124 
    125     GPR_ASSERT(GRPC_COMPRESS_GZIP ==
    126                grpc_compression_algorithm_for_level(GRPC_COMPRESS_LEVEL_HIGH,
    127                                                     accepted_encodings));
    128   }
    129 
    130   {
    131     /* accept only deflate */
    132     uint32_t accepted_encodings = 0;
    133     GPR_BITSET(&accepted_encodings, GRPC_COMPRESS_NONE); /* always */
    134     GPR_BITSET(&accepted_encodings, GRPC_COMPRESS_DEFLATE);
    135 
    136     GPR_ASSERT(GRPC_COMPRESS_NONE ==
    137                grpc_compression_algorithm_for_level(GRPC_COMPRESS_LEVEL_NONE,
    138                                                     accepted_encodings));
    139 
    140     GPR_ASSERT(GRPC_COMPRESS_DEFLATE ==
    141                grpc_compression_algorithm_for_level(GRPC_COMPRESS_LEVEL_LOW,
    142                                                     accepted_encodings));
    143 
    144     GPR_ASSERT(GRPC_COMPRESS_DEFLATE ==
    145                grpc_compression_algorithm_for_level(GRPC_COMPRESS_LEVEL_MED,
    146                                                     accepted_encodings));
    147 
    148     GPR_ASSERT(GRPC_COMPRESS_DEFLATE ==
    149                grpc_compression_algorithm_for_level(GRPC_COMPRESS_LEVEL_HIGH,
    150                                                     accepted_encodings));
    151   }
    152 
    153   {
    154     /* accept gzip and deflate */
    155     uint32_t accepted_encodings = 0;
    156     GPR_BITSET(&accepted_encodings, GRPC_COMPRESS_NONE); /* always */
    157     GPR_BITSET(&accepted_encodings, GRPC_COMPRESS_GZIP);
    158     GPR_BITSET(&accepted_encodings, GRPC_COMPRESS_DEFLATE);
    159 
    160     GPR_ASSERT(GRPC_COMPRESS_NONE ==
    161                grpc_compression_algorithm_for_level(GRPC_COMPRESS_LEVEL_NONE,
    162                                                     accepted_encodings));
    163 
    164     GPR_ASSERT(GRPC_COMPRESS_GZIP ==
    165                grpc_compression_algorithm_for_level(GRPC_COMPRESS_LEVEL_LOW,
    166                                                     accepted_encodings));
    167 
    168     GPR_ASSERT(GRPC_COMPRESS_DEFLATE ==
    169                grpc_compression_algorithm_for_level(GRPC_COMPRESS_LEVEL_MED,
    170                                                     accepted_encodings));
    171 
    172     GPR_ASSERT(GRPC_COMPRESS_DEFLATE ==
    173                grpc_compression_algorithm_for_level(GRPC_COMPRESS_LEVEL_HIGH,
    174                                                     accepted_encodings));
    175   }
    176 
    177   {
    178     /* accept stream gzip */
    179     uint32_t accepted_encodings = 0;
    180     GPR_BITSET(&accepted_encodings, GRPC_COMPRESS_NONE); /* always */
    181     GPR_BITSET(&accepted_encodings, GRPC_COMPRESS_STREAM_GZIP);
    182 
    183     GPR_ASSERT(GRPC_COMPRESS_NONE ==
    184                grpc_compression_algorithm_for_level(GRPC_COMPRESS_LEVEL_NONE,
    185                                                     accepted_encodings));
    186 
    187     GPR_ASSERT(GRPC_COMPRESS_NONE ==
    188                grpc_compression_algorithm_for_level(GRPC_COMPRESS_LEVEL_LOW,
    189                                                     accepted_encodings));
    190 
    191     GPR_ASSERT(GRPC_COMPRESS_NONE ==
    192                grpc_compression_algorithm_for_level(GRPC_COMPRESS_LEVEL_MED,
    193                                                     accepted_encodings));
    194 
    195     GPR_ASSERT(GRPC_COMPRESS_NONE ==
    196                grpc_compression_algorithm_for_level(GRPC_COMPRESS_LEVEL_HIGH,
    197                                                     accepted_encodings));
    198   }
    199 
    200   {
    201     /* accept all algorithms */
    202     uint32_t accepted_encodings = 0;
    203     GPR_BITSET(&accepted_encodings, GRPC_COMPRESS_NONE); /* always */
    204     GPR_BITSET(&accepted_encodings, GRPC_COMPRESS_GZIP);
    205     GPR_BITSET(&accepted_encodings, GRPC_COMPRESS_DEFLATE);
    206     GPR_BITSET(&accepted_encodings, GRPC_COMPRESS_STREAM_GZIP);
    207 
    208     GPR_ASSERT(GRPC_COMPRESS_NONE ==
    209                grpc_compression_algorithm_for_level(GRPC_COMPRESS_LEVEL_NONE,
    210                                                     accepted_encodings));
    211 
    212     GPR_ASSERT(GRPC_COMPRESS_GZIP ==
    213                grpc_compression_algorithm_for_level(GRPC_COMPRESS_LEVEL_LOW,
    214                                                     accepted_encodings));
    215 
    216     GPR_ASSERT(GRPC_COMPRESS_DEFLATE ==
    217                grpc_compression_algorithm_for_level(GRPC_COMPRESS_LEVEL_MED,
    218                                                     accepted_encodings));
    219 
    220     GPR_ASSERT(GRPC_COMPRESS_DEFLATE ==
    221                grpc_compression_algorithm_for_level(GRPC_COMPRESS_LEVEL_HIGH,
    222                                                     accepted_encodings));
    223   }
    224 }
    225 
    226 static void test_compression_enable_disable_algorithm(void) {
    227   grpc_compression_options options;
    228   grpc_compression_algorithm algorithm;
    229 
    230   gpr_log(GPR_DEBUG, "test_compression_enable_disable_algorithm");
    231 
    232   grpc_compression_options_init(&options);
    233   for (algorithm = GRPC_COMPRESS_NONE;
    234        algorithm < GRPC_COMPRESS_ALGORITHMS_COUNT;
    235        algorithm = static_cast<grpc_compression_algorithm>(
    236            static_cast<int>(algorithm) + 1)) {
    237     /* all algorithms are enabled by default */
    238     GPR_ASSERT(grpc_compression_options_is_algorithm_enabled(&options,
    239                                                              algorithm) != 0);
    240   }
    241   /* disable one by one */
    242   for (algorithm = GRPC_COMPRESS_NONE;
    243        algorithm < GRPC_COMPRESS_ALGORITHMS_COUNT;
    244        algorithm = static_cast<grpc_compression_algorithm>(
    245            static_cast<int>(algorithm) + 1)) {
    246     grpc_compression_options_disable_algorithm(&options, algorithm);
    247     GPR_ASSERT(grpc_compression_options_is_algorithm_enabled(&options,
    248                                                              algorithm) == 0);
    249   }
    250   /* re-enable one by one */
    251   for (algorithm = GRPC_COMPRESS_NONE;
    252        algorithm < GRPC_COMPRESS_ALGORITHMS_COUNT;
    253        algorithm = static_cast<grpc_compression_algorithm>(
    254            static_cast<int>(algorithm) + 1)) {
    255     grpc_compression_options_enable_algorithm(&options, algorithm);
    256     GPR_ASSERT(grpc_compression_options_is_algorithm_enabled(&options,
    257                                                              algorithm) != 0);
    258   }
    259 }
    260 
    261 int main(int argc, char** argv) {
    262   grpc_init();
    263   test_compression_algorithm_parse();
    264   test_compression_algorithm_name();
    265   test_compression_algorithm_for_level();
    266   test_compression_enable_disable_algorithm();
    267   grpc_shutdown();
    268 
    269   return 0;
    270 }
    271