1 /*
2  * Copyright (c) 2022 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "location_approximately_permission_test.h"
17 
18 #include "accesstoken_kit.h"
19 #include "message_parcel.h"
20 #include "nativetoken_kit.h"
21 #include "token_setproc.h"
22 
23 #include "common_utils.h"
24 #include "constant_definition.h"
25 #include "location.h"
26 #include "permission_manager.h"
27 
28 using namespace testing::ext;
29 namespace OHOS {
30 namespace Location {
31 const int32_t LOCATION_APPROXIMATELY_PERM = 3;
SetUp()32 void LocationApproximatelyPermissionTest::SetUp()
33 {
34     MockNativePermission();
35     reportManager_ = ReportManager::GetInstance();
36     EXPECT_NE(nullptr, reportManager_);
37 }
38 
TearDown()39 void LocationApproximatelyPermissionTest::TearDown()
40 {
41     reportManager_ = nullptr;
42 }
43 
MockNativePermission()44 void LocationApproximatelyPermissionTest::MockNativePermission()
45 {
46     const char *perms[] = {
47         ACCESS_APPROXIMATELY_LOCATION.c_str(), ACCESS_BACKGROUND_LOCATION.c_str(),
48         MANAGE_SECURE_SETTINGS.c_str()
49     };
50     NativeTokenInfoParams infoInstance = {
51         .dcapsNum = 0,
52         .permsNum = LOCATION_APPROXIMATELY_PERM,
53         .aclsNum = 0,
54         .dcaps = nullptr,
55         .perms = perms,
56         .acls = nullptr,
57         .processName = "LocatorApproximatePermissionTest",
58         .aplStr = "system_basic",
59     };
60     tokenId_ = GetAccessTokenId(&infoInstance);
61     SetSelfTokenID(tokenId_);
62     Security::AccessToken::AccessTokenKit::ReloadNativeTokenInfo();
63 }
64 
65 HWTEST_F(LocationApproximatelyPermissionTest, ReportManagerApproximatelyLocationTest001, TestSize.Level1)
66 {
67     std::shared_ptr<Request> request = std::make_shared<Request>();
68     request->SetTokenId(tokenId_);
69     EXPECT_EQ(nullptr, reportManager_->GetPermittedLocation(request, nullptr));
70     MessageParcel parcel;
71     parcel.WriteDouble(MAX_LATITUDE + 1.0);  // latitude is out of range
72     parcel.WriteDouble(MAX_LONGITUDE + 1.0);  // longitude is out of range
73     parcel.WriteDouble(14.0);         // altitude
74     parcel.WriteDouble(1000.0);       // accuracy
75     parcel.WriteDouble(10.0);         // speed
76     parcel.WriteDouble(90.0);         // direction
77     parcel.WriteInt64(1000000000);    // timeStamp
78     parcel.WriteInt64(1000000000);    // timeSinceBoot
79     parcel.WriteString16(u"additions"); // additions
80     parcel.WriteInt64(1);             // additionSize
81     parcel.WriteInt32(0);          // isFromMock
82     std::unique_ptr<Location> location = std::make_unique<Location>();
83     location->ReadFromParcel(parcel);
84     auto newLocation = reportManager_->GetPermittedLocation(request, location);
85     if (newLocation != nullptr) {
86         EXPECT_EQ(MAX_LATITUDE, newLocation->GetLatitude());
87         EXPECT_EQ(MAX_LONGITUDE, newLocation->GetLongitude());
88         EXPECT_EQ(DEFAULT_APPROXIMATELY_ACCURACY, newLocation->GetAccuracy());
89     }
90 }
91 
92 HWTEST_F(LocationApproximatelyPermissionTest, ReportManagerApproximatelyLocationTest002, TestSize.Level1)
93 {
94     std::shared_ptr<Request> request = std::make_shared<Request>();
95     request->SetTokenId(tokenId_);
96     EXPECT_EQ(nullptr, reportManager_->GetPermittedLocation(request, nullptr));
97     MessageParcel parcel;
98     parcel.WriteDouble(-MAX_LATITUDE - 1.0);  // latitude
99     parcel.WriteDouble(-MAX_LONGITUDE - 1.0);  // longitude
100     parcel.WriteDouble(14.0);         // altitude
101     parcel.WriteDouble(1000.0);       // accuracy
102     parcel.WriteDouble(10.0);         // speed
103     parcel.WriteDouble(90.0);         // direction
104     parcel.WriteInt64(1000000000);    // timeStamp
105     parcel.WriteInt64(1000000000);    // timeSinceBoot
106     parcel.WriteString16(u"additions"); // additions
107     parcel.WriteInt64(1);             // additionSize
108     parcel.WriteInt32(0);          // isFromMock
109     std::unique_ptr<Location> location = std::make_unique<Location>();
110     location->ReadFromParcel(parcel);
111     auto newLocation = reportManager_->GetPermittedLocation(request, location);
112     if (newLocation != nullptr) {
113         EXPECT_EQ(-MAX_LATITUDE, newLocation->GetLatitude());
114         EXPECT_EQ(-MAX_LONGITUDE, newLocation->GetLongitude());
115         EXPECT_EQ(DEFAULT_APPROXIMATELY_ACCURACY, newLocation->GetAccuracy());
116     }
117 }
118 }  // namespace Location
119 }  // namespace OHOS