1*795d594fSAndroid Build Coastguard Worker /*
2*795d594fSAndroid Build Coastguard Worker * Copyright (C) 2021 The Android Open Source Project
3*795d594fSAndroid Build Coastguard Worker *
4*795d594fSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*795d594fSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*795d594fSAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*795d594fSAndroid Build Coastguard Worker *
8*795d594fSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*795d594fSAndroid Build Coastguard Worker *
10*795d594fSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*795d594fSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*795d594fSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*795d594fSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*795d594fSAndroid Build Coastguard Worker * limitations under the License.
15*795d594fSAndroid Build Coastguard Worker */
16*795d594fSAndroid Build Coastguard Worker
17*795d594fSAndroid Build Coastguard Worker #include "service.h"
18*795d594fSAndroid Build Coastguard Worker
19*795d594fSAndroid Build Coastguard Worker #include "android-base/result-gmock.h"
20*795d594fSAndroid Build Coastguard Worker #include "common_runtime_test.h"
21*795d594fSAndroid Build Coastguard Worker #include "gtest/gtest.h"
22*795d594fSAndroid Build Coastguard Worker
23*795d594fSAndroid Build Coastguard Worker namespace art {
24*795d594fSAndroid Build Coastguard Worker namespace service {
25*795d594fSAndroid Build Coastguard Worker namespace {
26*795d594fSAndroid Build Coastguard Worker
27*795d594fSAndroid Build Coastguard Worker using ::android::base::testing::HasError;
28*795d594fSAndroid Build Coastguard Worker using ::android::base::testing::Ok;
29*795d594fSAndroid Build Coastguard Worker using ::android::base::testing::WithMessage;
30*795d594fSAndroid Build Coastguard Worker
31*795d594fSAndroid Build Coastguard Worker using std::literals::operator""s; // NOLINT
32*795d594fSAndroid Build Coastguard Worker
33*795d594fSAndroid Build Coastguard Worker class ArtServiceTest : public testing::Test {};
34*795d594fSAndroid Build Coastguard Worker
TEST_F(ArtServiceTest,ValidatePathElementOk)35*795d594fSAndroid Build Coastguard Worker TEST_F(ArtServiceTest, ValidatePathElementOk) {
36*795d594fSAndroid Build Coastguard Worker EXPECT_THAT(ValidatePathElement("com.android.foo", "packageName"), Ok());
37*795d594fSAndroid Build Coastguard Worker EXPECT_THAT(ValidatePathElement("...", "packageName"), Ok());
38*795d594fSAndroid Build Coastguard Worker EXPECT_THAT(ValidatePathElement("!@#$%^&*()_+-=", "packageName"), Ok());
39*795d594fSAndroid Build Coastguard Worker }
40*795d594fSAndroid Build Coastguard Worker
TEST_F(ArtServiceTest,ValidatePathElementEmpty)41*795d594fSAndroid Build Coastguard Worker TEST_F(ArtServiceTest, ValidatePathElementEmpty) {
42*795d594fSAndroid Build Coastguard Worker EXPECT_THAT(ValidatePathElement("", "packageName"),
43*795d594fSAndroid Build Coastguard Worker HasError(WithMessage("packageName is empty")));
44*795d594fSAndroid Build Coastguard Worker }
45*795d594fSAndroid Build Coastguard Worker
TEST_F(ArtServiceTest,ValidatePathElementDot)46*795d594fSAndroid Build Coastguard Worker TEST_F(ArtServiceTest, ValidatePathElementDot) {
47*795d594fSAndroid Build Coastguard Worker EXPECT_THAT(ValidatePathElement(".", "packageName"),
48*795d594fSAndroid Build Coastguard Worker HasError(WithMessage("Invalid packageName '.'")));
49*795d594fSAndroid Build Coastguard Worker }
50*795d594fSAndroid Build Coastguard Worker
TEST_F(ArtServiceTest,ValidatePathElementDotDot)51*795d594fSAndroid Build Coastguard Worker TEST_F(ArtServiceTest, ValidatePathElementDotDot) {
52*795d594fSAndroid Build Coastguard Worker EXPECT_THAT(ValidatePathElement("..", "packageName"),
53*795d594fSAndroid Build Coastguard Worker HasError(WithMessage("Invalid packageName '..'")));
54*795d594fSAndroid Build Coastguard Worker }
55*795d594fSAndroid Build Coastguard Worker
TEST_F(ArtServiceTest,ValidatePathElementSlash)56*795d594fSAndroid Build Coastguard Worker TEST_F(ArtServiceTest, ValidatePathElementSlash) {
57*795d594fSAndroid Build Coastguard Worker EXPECT_THAT(ValidatePathElement("a/b", "packageName"),
58*795d594fSAndroid Build Coastguard Worker HasError(WithMessage("packageName 'a/b' has invalid character '/'")));
59*795d594fSAndroid Build Coastguard Worker }
60*795d594fSAndroid Build Coastguard Worker
TEST_F(ArtServiceTest,ValidatePathElementNul)61*795d594fSAndroid Build Coastguard Worker TEST_F(ArtServiceTest, ValidatePathElementNul) {
62*795d594fSAndroid Build Coastguard Worker EXPECT_THAT(ValidatePathElement("a\0b"s, "packageName"),
63*795d594fSAndroid Build Coastguard Worker HasError(WithMessage("packageName 'a\0b' has invalid character '\\0'"s)));
64*795d594fSAndroid Build Coastguard Worker }
65*795d594fSAndroid Build Coastguard Worker
TEST_F(ArtServiceTest,ValidatePathElementSubstringOk)66*795d594fSAndroid Build Coastguard Worker TEST_F(ArtServiceTest, ValidatePathElementSubstringOk) {
67*795d594fSAndroid Build Coastguard Worker EXPECT_THAT(ValidatePathElementSubstring("com.android.foo", "packageName"), Ok());
68*795d594fSAndroid Build Coastguard Worker EXPECT_THAT(ValidatePathElementSubstring(".", "packageName"), Ok());
69*795d594fSAndroid Build Coastguard Worker EXPECT_THAT(ValidatePathElementSubstring("..", "packageName"), Ok());
70*795d594fSAndroid Build Coastguard Worker EXPECT_THAT(ValidatePathElementSubstring("...", "packageName"), Ok());
71*795d594fSAndroid Build Coastguard Worker EXPECT_THAT(ValidatePathElementSubstring("!@#$%^&*()_+-=", "packageName"), Ok());
72*795d594fSAndroid Build Coastguard Worker }
73*795d594fSAndroid Build Coastguard Worker
TEST_F(ArtServiceTest,ValidatePathElementSubstringEmpty)74*795d594fSAndroid Build Coastguard Worker TEST_F(ArtServiceTest, ValidatePathElementSubstringEmpty) {
75*795d594fSAndroid Build Coastguard Worker EXPECT_THAT(ValidatePathElementSubstring("", "packageName"),
76*795d594fSAndroid Build Coastguard Worker HasError(WithMessage("packageName is empty")));
77*795d594fSAndroid Build Coastguard Worker }
78*795d594fSAndroid Build Coastguard Worker
TEST_F(ArtServiceTest,ValidatePathElementSubstringSlash)79*795d594fSAndroid Build Coastguard Worker TEST_F(ArtServiceTest, ValidatePathElementSubstringSlash) {
80*795d594fSAndroid Build Coastguard Worker EXPECT_THAT(ValidatePathElementSubstring("a/b", "packageName"),
81*795d594fSAndroid Build Coastguard Worker HasError(WithMessage("packageName 'a/b' has invalid character '/'")));
82*795d594fSAndroid Build Coastguard Worker }
83*795d594fSAndroid Build Coastguard Worker
TEST_F(ArtServiceTest,ValidatePathElementSubstringNul)84*795d594fSAndroid Build Coastguard Worker TEST_F(ArtServiceTest, ValidatePathElementSubstringNul) {
85*795d594fSAndroid Build Coastguard Worker EXPECT_THAT(ValidatePathElementSubstring("a\0b"s, "packageName"),
86*795d594fSAndroid Build Coastguard Worker HasError(WithMessage("packageName 'a\0b' has invalid character '\\0'"s)));
87*795d594fSAndroid Build Coastguard Worker }
88*795d594fSAndroid Build Coastguard Worker
TEST_F(ArtServiceTest,ValidateDexPathOk)89*795d594fSAndroid Build Coastguard Worker TEST_F(ArtServiceTest, ValidateDexPathOk) { EXPECT_THAT(ValidateDexPath("/a/b.apk"), Ok()); }
90*795d594fSAndroid Build Coastguard Worker
TEST_F(ArtServiceTest,ValidateDexPathEmpty)91*795d594fSAndroid Build Coastguard Worker TEST_F(ArtServiceTest, ValidateDexPathEmpty) {
92*795d594fSAndroid Build Coastguard Worker EXPECT_THAT(ValidateDexPath(""), HasError(WithMessage("Path is empty")));
93*795d594fSAndroid Build Coastguard Worker }
94*795d594fSAndroid Build Coastguard Worker
TEST_F(ArtServiceTest,ValidateDexPathRelative)95*795d594fSAndroid Build Coastguard Worker TEST_F(ArtServiceTest, ValidateDexPathRelative) {
96*795d594fSAndroid Build Coastguard Worker EXPECT_THAT(ValidateDexPath("a/b.apk"),
97*795d594fSAndroid Build Coastguard Worker HasError(WithMessage("Path 'a/b.apk' is not an absolute path")));
98*795d594fSAndroid Build Coastguard Worker }
99*795d594fSAndroid Build Coastguard Worker
TEST_F(ArtServiceTest,ValidateDexPathNonNormal)100*795d594fSAndroid Build Coastguard Worker TEST_F(ArtServiceTest, ValidateDexPathNonNormal) {
101*795d594fSAndroid Build Coastguard Worker EXPECT_THAT(ValidateDexPath("/a/c/../b.apk"),
102*795d594fSAndroid Build Coastguard Worker HasError(WithMessage("Path '/a/c/../b.apk' is not in normal form")));
103*795d594fSAndroid Build Coastguard Worker }
104*795d594fSAndroid Build Coastguard Worker
TEST_F(ArtServiceTest,ValidateDexPathNul)105*795d594fSAndroid Build Coastguard Worker TEST_F(ArtServiceTest, ValidateDexPathNul) {
106*795d594fSAndroid Build Coastguard Worker EXPECT_THAT(ValidateDexPath("/a/\0/b.apk"s),
107*795d594fSAndroid Build Coastguard Worker HasError(WithMessage("Path '/a/\0/b.apk' has invalid character '\\0'"s)));
108*795d594fSAndroid Build Coastguard Worker }
109*795d594fSAndroid Build Coastguard Worker
110*795d594fSAndroid Build Coastguard Worker class ArtServiceGcTest : public CommonRuntimeTest {};
111*795d594fSAndroid Build Coastguard Worker
TEST_F(ArtServiceGcTest,GetGarbageCollector)112*795d594fSAndroid Build Coastguard Worker TEST_F(ArtServiceGcTest, GetGarbageCollector) {
113*795d594fSAndroid Build Coastguard Worker EXPECT_THAT(GetGarbageCollector(), testing::HasSubstr("CollectorType"));
114*795d594fSAndroid Build Coastguard Worker }
115*795d594fSAndroid Build Coastguard Worker
116*795d594fSAndroid Build Coastguard Worker } // namespace
117*795d594fSAndroid Build Coastguard Worker } // namespace service
118*795d594fSAndroid Build Coastguard Worker } // namespace art
119