f5bbe5e419c21e0117f03a2393e98725c7496f48
[platform/core/appfw/pkgmgr-info.git] / test / unit_tests / test_parcel.cc
1 /*
2  * Copyright (c) 2021 Samsung Electronics Co., Ltd.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 #include <gtest/gtest.h>
18
19 #include <cstdio>
20 #include <parcel.hh>
21 #include <iostream>
22 #include <tuple>
23
24 #include "common/database/abstract_db_handler.hh"
25 #include "common/parcel/abstract_parcelable.hh"
26 #include "common/parcel/appinfo_parcelable.hh"
27 #include "common/parcel/certinfo_parcelable.hh"
28 #include "common/parcel/filter_parcelable.hh"
29 #include "common/parcel/parcelable_factory.hh"
30 #include "common/parcel/pkginfo_parcelable.hh"
31 #include "common/parcel/query_parcelable.hh"
32 #include "common/parcel/result_parcelable.hh"
33
34 #include "pkgmgrinfo_basic.h"
35
36 #include "parcel_utils.hh"
37
38 namespace pp = pkgmgr_common::parcel;
39
40 class AbstractParcelableTest : public pp::AbstractParcelable {
41  public:
42   AbstractParcelableTest(char *a, char *b, char *c)
43       : AbstractParcelable(), a_(nullptr), b_(nullptr), c_(nullptr) {
44     if (a) a_ = strdup(a);
45     if (b) b_ = strdup(b);
46     if (c) c_ = strdup(c);
47   }
48
49   AbstractParcelableTest()
50       : AbstractParcelable(), a_(nullptr), b_(nullptr), c_(nullptr) {}
51
52   ~AbstractParcelableTest() {
53     if (a_) free(a_);
54     if (b_) free(b_);
55     if (c_) free(c_);
56   }
57
58   const char *GetA() const { return a_; }
59
60   const char *GetB() const { return b_; }
61
62   const char *GetC() const { return c_; }
63
64   virtual void WriteToParcel(tizen_base::Parcel *parcel) const {
65     WriteString(parcel, a_);
66     WriteString(parcel, b_);
67     WriteString(parcel, c_);
68   }
69
70   virtual void ReadFromParcel(tizen_base::Parcel *parcel) {
71     ReadString(parcel, &a_);
72     ReadString(parcel, &b_);
73     ReadString(parcel, &c_);
74   }
75
76  private:
77   char *a_;
78   char *b_;
79   char *c_;
80 };
81
82 class ParcelTest : public ::testing::Test {
83  public:
84   virtual void SetUp() {}
85
86   virtual void TearDown() {}
87 };
88
89 TEST_F(ParcelTest, AbstractParcelableTest) {
90   tizen_base::Parcel parcel;
91   char *a = nullptr;
92   char *b = const_cast<char *>("");
93   char *c = const_cast<char *>("test_str");
94   AbstractParcelableTest parcelableA(a, b, c);
95   AbstractParcelableTest parcelableB;
96   parcel.WriteParcelable(parcelableA);
97   parcel.ReadParcelable(&parcelableB);
98
99   EXPECT_EQ(parcelableB.GetA(), nullptr);
100   EXPECT_STREQ(parcelableA.GetB(), parcelableB.GetB());
101   EXPECT_STREQ(parcelableA.GetC(), parcelableB.GetC());
102 }
103
104 TEST_F(ParcelTest, AppInfoParcelable) {
105   tizen_base::Parcel parcel;
106   std::vector<application_x *> origin_applications;
107
108   origin_applications.emplace_back(GetTestApplication("test_appid1"));
109   origin_applications.emplace_back(GetTestApplication("test_appid2"));
110   pp::AppInfoParcelable origin_parcelable(std::move(origin_applications));
111   pp::AppInfoParcelable new_parcelable;
112   parcel.WriteParcelable(origin_parcelable);
113   parcel.ReadParcelable(&new_parcelable);
114
115   EXPECT_TRUE(IsEqualApplications(origin_parcelable.GetAppInfo(),
116                                   new_parcelable.GetAppInfo()));
117 }
118
119 TEST_F(ParcelTest, PkgInfoParcelable) {
120   tizen_base::Parcel parcel;
121   std::vector<package_x *> origin_packages;
122
123   origin_packages.emplace_back(GetTestPackage("test_pkgid1"));
124   origin_packages.emplace_back(GetTestPackage("test_pkgid2"));
125   pp::PkgInfoParcelable origin_parcelable(std::move(origin_packages));
126   pp::PkgInfoParcelable new_parcelable;
127   parcel.WriteParcelable(origin_parcelable);
128   parcel.ReadParcelable(&new_parcelable);
129
130   EXPECT_TRUE(IsEqualPackages(origin_parcelable.GetPkgInfo(),
131                               new_parcelable.GetPkgInfo()));
132 }
133
134 TEST_F(ParcelTest, FilterParcelable) {
135   tizen_base::Parcel parcel;
136   pkgmgrinfo_filter_x *filter = GetTestFilter();
137   int flag = 0b101010;
138
139   pp::FilterParcelable origin_parcelable(0, filter, flag);
140   pp::FilterParcelable new_parcelable;
141   parcel.WriteParcelable(origin_parcelable);
142   parcel.ReadParcelable(&new_parcelable);
143
144   EXPECT_TRUE(
145       IsEqualFilter(origin_parcelable.GetFilter(), new_parcelable.GetFilter()));
146   EXPECT_EQ(origin_parcelable.GetFlag(), new_parcelable.GetFlag());
147 }
148
149 TEST_F(ParcelTest, CertInfoParcelable) {
150   tizen_base::Parcel parcel;
151   pkgmgr_certinfo_x *certinfo = GetTestCertInfo();
152   std::string test_str = "test_str";
153
154   pp::CertInfoParcelable origin_parcelable(0, certinfo, test_str);
155   pp::CertInfoParcelable new_parcelable;
156   parcel.WriteParcelable(origin_parcelable);
157   parcel.ReadParcelable(&new_parcelable);
158
159   EXPECT_TRUE(IsEqualCertInfo(origin_parcelable.GetCertInfo(),
160                               new_parcelable.GetCertInfo()));
161   EXPECT_EQ(origin_parcelable.GetPkgId(), new_parcelable.GetPkgId());
162 }
163
164 TEST_F(ParcelTest, ResultParcelable) {
165   tizen_base::Parcel parcel;
166   std::vector<std::vector<std::string>> vt{{"a1", "a2"}, {"b1", "b2"}};
167
168   pp::ResultParcelable origin_parcelable(std::move(vt));
169   pp::ResultParcelable new_parcelable;
170   parcel.WriteParcelable(origin_parcelable);
171   parcel.ReadParcelable(&new_parcelable);
172
173   EXPECT_EQ(origin_parcelable.GetResult(), new_parcelable.GetResult());
174 }
175
176 TEST_F(ParcelTest, QueryParcelable) {
177   tizen_base::Parcel parcel;
178   std::string query = "select * from package_info";
179
180   pp::QueryParcelable origin_parcelable(0, query,
181       pkgmgr_common::database::AbstractDBHandler::DBType::DB_TYPE_FILE_PKGDB,
182       pkgmgr_common::database::AbstractDBHandler::OperationType::OPERATION_TYPE_READ);
183   pp::QueryParcelable new_parcelable;
184   parcel.WriteParcelable(origin_parcelable);
185   parcel.ReadParcelable(&new_parcelable);
186
187   EXPECT_EQ(origin_parcelable.GetQuery(), new_parcelable.GetQuery());
188   EXPECT_EQ(origin_parcelable.GetDBType(), new_parcelable.GetDBType());
189   EXPECT_EQ(origin_parcelable.GetOpType(), new_parcelable.GetOpType());
190 }
191
192 TEST_F(ParcelTest, ParcelableFactory) {
193   tizen_base::Parcel parcel;
194   std::unique_ptr<pp::AbstractParcelable> ptr;
195   pp::AppInfoParcelable appinfo_parcelable;
196   pp::CertInfoParcelable certinfo_parcelable;
197   pp::FilterParcelable filter_parcelable;
198   pp::PkgInfoParcelable pkginfo_parcelable;
199   pp::QueryParcelable query_parcelable;
200   pp::ResultParcelable result_parcelable;
201
202   parcel.WriteParcelable(appinfo_parcelable);
203   ptr = pp::ParcelableFactory::GetInst().CreateParcel(&parcel.GetRaw()[0],
204                                                       parcel.GetRaw().size());
205   EXPECT_NE(ptr, nullptr);
206   EXPECT_EQ(ptr->GetType(), pp::ParcelableType::AppInfo);
207   parcel.Clear();
208
209   parcel.WriteParcelable(certinfo_parcelable);
210   ptr = pp::ParcelableFactory::GetInst().CreateParcel(&parcel.GetRaw()[0],
211                                                       parcel.GetRaw().size());
212   EXPECT_NE(ptr, nullptr);
213   EXPECT_EQ(ptr->GetType(), pp::ParcelableType::CertInfo);
214   parcel.Clear();
215
216   parcel.WriteParcelable(filter_parcelable);
217   ptr = pp::ParcelableFactory::GetInst().CreateParcel(&parcel.GetRaw()[0],
218                                                       parcel.GetRaw().size());
219   EXPECT_NE(ptr, nullptr);
220   EXPECT_EQ(ptr->GetType(), pp::ParcelableType::Filter);
221   parcel.Clear();
222
223   parcel.WriteParcelable(pkginfo_parcelable);
224   ptr = pp::ParcelableFactory::GetInst().CreateParcel(&parcel.GetRaw()[0],
225                                                       parcel.GetRaw().size());
226   EXPECT_NE(ptr, nullptr);
227   EXPECT_EQ(ptr->GetType(), pp::ParcelableType::PkgInfo);
228   parcel.Clear();
229
230   parcel.WriteParcelable(query_parcelable);
231   ptr = pp::ParcelableFactory::GetInst().CreateParcel(&parcel.GetRaw()[0],
232                                                       parcel.GetRaw().size());
233   EXPECT_NE(ptr, nullptr);
234   EXPECT_EQ(ptr->GetType(), pp::ParcelableType::Query);
235   parcel.Clear();
236
237   parcel.WriteParcelable(result_parcelable);
238   ptr = pp::ParcelableFactory::GetInst().CreateParcel(&parcel.GetRaw()[0],
239                                                       parcel.GetRaw().size());
240   EXPECT_NE(ptr, nullptr);
241   EXPECT_EQ(ptr->GetType(), pp::ParcelableType::Result);
242   parcel.Clear();
243 }