xref: /aosp_15_r20/external/libtextclassifier/native/annotator/zlib-utils_test.cc (revision 993b0882672172b81d12fad7a7ac0c3e5c824a12)
1*993b0882SAndroid Build Coastguard Worker /*
2*993b0882SAndroid Build Coastguard Worker  * Copyright (C) 2018 The Android Open Source Project
3*993b0882SAndroid Build Coastguard Worker  *
4*993b0882SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*993b0882SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*993b0882SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*993b0882SAndroid Build Coastguard Worker  *
8*993b0882SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*993b0882SAndroid Build Coastguard Worker  *
10*993b0882SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*993b0882SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*993b0882SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*993b0882SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*993b0882SAndroid Build Coastguard Worker  * limitations under the License.
15*993b0882SAndroid Build Coastguard Worker  */
16*993b0882SAndroid Build Coastguard Worker 
17*993b0882SAndroid Build Coastguard Worker #include "annotator/zlib-utils.h"
18*993b0882SAndroid Build Coastguard Worker 
19*993b0882SAndroid Build Coastguard Worker #include <memory>
20*993b0882SAndroid Build Coastguard Worker 
21*993b0882SAndroid Build Coastguard Worker #include "annotator/model_generated.h"
22*993b0882SAndroid Build Coastguard Worker #include "utils/zlib/zlib.h"
23*993b0882SAndroid Build Coastguard Worker #include "gmock/gmock.h"
24*993b0882SAndroid Build Coastguard Worker #include "gtest/gtest.h"
25*993b0882SAndroid Build Coastguard Worker 
26*993b0882SAndroid Build Coastguard Worker namespace libtextclassifier3 {
27*993b0882SAndroid Build Coastguard Worker 
TEST(AnnotatorZlibUtilsTest,CompressModel)28*993b0882SAndroid Build Coastguard Worker TEST(AnnotatorZlibUtilsTest, CompressModel) {
29*993b0882SAndroid Build Coastguard Worker   ModelT model;
30*993b0882SAndroid Build Coastguard Worker   model.regex_model.reset(new RegexModelT);
31*993b0882SAndroid Build Coastguard Worker   model.regex_model->patterns.emplace_back(new RegexModel_::PatternT);
32*993b0882SAndroid Build Coastguard Worker   model.regex_model->patterns.back()->pattern = "this is a test pattern";
33*993b0882SAndroid Build Coastguard Worker   model.regex_model->patterns.emplace_back(new RegexModel_::PatternT);
34*993b0882SAndroid Build Coastguard Worker   model.regex_model->patterns.back()->pattern = "this is a second test pattern";
35*993b0882SAndroid Build Coastguard Worker 
36*993b0882SAndroid Build Coastguard Worker   model.datetime_model.reset(new DatetimeModelT);
37*993b0882SAndroid Build Coastguard Worker   model.datetime_model->patterns.emplace_back(new DatetimeModelPatternT);
38*993b0882SAndroid Build Coastguard Worker   model.datetime_model->patterns.back()->regexes.emplace_back(
39*993b0882SAndroid Build Coastguard Worker       new DatetimeModelPattern_::RegexT);
40*993b0882SAndroid Build Coastguard Worker   model.datetime_model->patterns.back()->regexes.back()->pattern =
41*993b0882SAndroid Build Coastguard Worker       "an example datetime pattern";
42*993b0882SAndroid Build Coastguard Worker   model.datetime_model->extractors.emplace_back(new DatetimeModelExtractorT);
43*993b0882SAndroid Build Coastguard Worker   model.datetime_model->extractors.back()->pattern =
44*993b0882SAndroid Build Coastguard Worker       "an example datetime extractor";
45*993b0882SAndroid Build Coastguard Worker 
46*993b0882SAndroid Build Coastguard Worker   model.intent_options.reset(new IntentFactoryModelT);
47*993b0882SAndroid Build Coastguard Worker   model.intent_options->generator.emplace_back(
48*993b0882SAndroid Build Coastguard Worker       new IntentFactoryModel_::IntentGeneratorT);
49*993b0882SAndroid Build Coastguard Worker   const std::string intent_generator1 = "lua generator 1";
50*993b0882SAndroid Build Coastguard Worker   model.intent_options->generator.back()->lua_template_generator =
51*993b0882SAndroid Build Coastguard Worker       std::vector<uint8_t>(intent_generator1.begin(), intent_generator1.end());
52*993b0882SAndroid Build Coastguard Worker   model.intent_options->generator.emplace_back(
53*993b0882SAndroid Build Coastguard Worker       new IntentFactoryModel_::IntentGeneratorT);
54*993b0882SAndroid Build Coastguard Worker   const std::string intent_generator2 = "lua generator 2";
55*993b0882SAndroid Build Coastguard Worker   model.intent_options->generator.back()->lua_template_generator =
56*993b0882SAndroid Build Coastguard Worker       std::vector<uint8_t>(intent_generator2.begin(), intent_generator2.end());
57*993b0882SAndroid Build Coastguard Worker 
58*993b0882SAndroid Build Coastguard Worker   // Compress the model.
59*993b0882SAndroid Build Coastguard Worker   EXPECT_TRUE(CompressModel(&model));
60*993b0882SAndroid Build Coastguard Worker 
61*993b0882SAndroid Build Coastguard Worker   // Pack and load the model.
62*993b0882SAndroid Build Coastguard Worker   flatbuffers::FlatBufferBuilder builder;
63*993b0882SAndroid Build Coastguard Worker   builder.Finish(Model::Pack(builder, &model));
64*993b0882SAndroid Build Coastguard Worker   const Model* compressed_model =
65*993b0882SAndroid Build Coastguard Worker       GetModel(reinterpret_cast<const char*>(builder.GetBufferPointer()));
66*993b0882SAndroid Build Coastguard Worker   ASSERT_TRUE(compressed_model != nullptr);
67*993b0882SAndroid Build Coastguard Worker 
68*993b0882SAndroid Build Coastguard Worker   // Decompress the fields again and check that they match the original.
69*993b0882SAndroid Build Coastguard Worker   std::unique_ptr<ZlibDecompressor> decompressor = ZlibDecompressor::Instance();
70*993b0882SAndroid Build Coastguard Worker   ASSERT_TRUE(decompressor != nullptr);
71*993b0882SAndroid Build Coastguard Worker   std::string uncompressed_pattern;
72*993b0882SAndroid Build Coastguard Worker   EXPECT_TRUE(decompressor->MaybeDecompress(
73*993b0882SAndroid Build Coastguard Worker       compressed_model->regex_model()->patterns()->Get(0)->compressed_pattern(),
74*993b0882SAndroid Build Coastguard Worker       &uncompressed_pattern));
75*993b0882SAndroid Build Coastguard Worker   EXPECT_EQ(uncompressed_pattern, "this is a test pattern");
76*993b0882SAndroid Build Coastguard Worker   EXPECT_TRUE(decompressor->MaybeDecompress(
77*993b0882SAndroid Build Coastguard Worker       compressed_model->regex_model()->patterns()->Get(1)->compressed_pattern(),
78*993b0882SAndroid Build Coastguard Worker       &uncompressed_pattern));
79*993b0882SAndroid Build Coastguard Worker   EXPECT_EQ(uncompressed_pattern, "this is a second test pattern");
80*993b0882SAndroid Build Coastguard Worker   EXPECT_TRUE(decompressor->MaybeDecompress(compressed_model->datetime_model()
81*993b0882SAndroid Build Coastguard Worker                                                 ->patterns()
82*993b0882SAndroid Build Coastguard Worker                                                 ->Get(0)
83*993b0882SAndroid Build Coastguard Worker                                                 ->regexes()
84*993b0882SAndroid Build Coastguard Worker                                                 ->Get(0)
85*993b0882SAndroid Build Coastguard Worker                                                 ->compressed_pattern(),
86*993b0882SAndroid Build Coastguard Worker                                             &uncompressed_pattern));
87*993b0882SAndroid Build Coastguard Worker   EXPECT_EQ(uncompressed_pattern, "an example datetime pattern");
88*993b0882SAndroid Build Coastguard Worker   EXPECT_TRUE(decompressor->MaybeDecompress(compressed_model->datetime_model()
89*993b0882SAndroid Build Coastguard Worker                                                 ->extractors()
90*993b0882SAndroid Build Coastguard Worker                                                 ->Get(0)
91*993b0882SAndroid Build Coastguard Worker                                                 ->compressed_pattern(),
92*993b0882SAndroid Build Coastguard Worker                                             &uncompressed_pattern));
93*993b0882SAndroid Build Coastguard Worker   EXPECT_EQ(uncompressed_pattern, "an example datetime extractor");
94*993b0882SAndroid Build Coastguard Worker 
95*993b0882SAndroid Build Coastguard Worker   EXPECT_TRUE(DecompressModel(&model));
96*993b0882SAndroid Build Coastguard Worker   EXPECT_EQ(model.regex_model->patterns[0]->pattern, "this is a test pattern");
97*993b0882SAndroid Build Coastguard Worker   EXPECT_EQ(model.regex_model->patterns[1]->pattern,
98*993b0882SAndroid Build Coastguard Worker             "this is a second test pattern");
99*993b0882SAndroid Build Coastguard Worker   EXPECT_EQ(model.datetime_model->patterns[0]->regexes[0]->pattern,
100*993b0882SAndroid Build Coastguard Worker             "an example datetime pattern");
101*993b0882SAndroid Build Coastguard Worker   EXPECT_EQ(model.datetime_model->extractors[0]->pattern,
102*993b0882SAndroid Build Coastguard Worker             "an example datetime extractor");
103*993b0882SAndroid Build Coastguard Worker   EXPECT_EQ(
104*993b0882SAndroid Build Coastguard Worker       model.intent_options->generator[0]->lua_template_generator,
105*993b0882SAndroid Build Coastguard Worker       std::vector<uint8_t>(intent_generator1.begin(), intent_generator1.end()));
106*993b0882SAndroid Build Coastguard Worker   EXPECT_EQ(
107*993b0882SAndroid Build Coastguard Worker       model.intent_options->generator[1]->lua_template_generator,
108*993b0882SAndroid Build Coastguard Worker       std::vector<uint8_t>(intent_generator2.begin(), intent_generator2.end()));
109*993b0882SAndroid Build Coastguard Worker }
110*993b0882SAndroid Build Coastguard Worker 
111*993b0882SAndroid Build Coastguard Worker }  // namespace libtextclassifier3
112