blob: 3db5ec3070d6e7783c5d6306e898e0677f7d1dd9 [file] [log] [blame]
// Copyright (C) 2022 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#include "statsd_test_util.h"
#include "gtest_matchers.h"
#include "src/stats_log.pb.h"
namespace android {
namespace os {
namespace statsd {
#ifdef __ANDROID__
namespace {
const string appName = "app1";
const int32_t uid = 1000;
const int64_t version = 1;
const string versionString = "v1";
const string installer = "com.android.vending";
} // anonymous namespace
TEST(StatsdTestUtil_PackageInfo, TestBuildPackageInfo) {
PackageInfo packageInfo = buildPackageInfo(appName, uid, version, versionString,
/* installer */ nullopt, /* certHash */ {},
/* deleted */ false, /* hashStrings */ false,
/* installerIndex */ nullopt);
EXPECT_THAT(packageInfo.version(), Eq(version));
EXPECT_THAT(packageInfo.uid(), Eq(uid));
EXPECT_THAT(packageInfo.deleted(), Eq(false));
}
// Set up parameterized test for testing with different values for pacakage certificate hashes.
class StatsdTestUtil_PackageInfo_CertificateHash : public TestWithParam<vector<uint8_t>> {};
INSTANTIATE_TEST_SUITE_P(
CertificateHashSizes, StatsdTestUtil_PackageInfo_CertificateHash,
Values(vector<uint8_t>(), vector<uint8_t>{'a'}, vector<uint8_t>{'a', 'b'}),
[](const TestParamInfo<StatsdTestUtil_PackageInfo_CertificateHash::ParamType>& info) {
if (info.param.empty()) {
return string("empty");
}
return string(info.param.begin(), info.param.end());
});
TEST_P(StatsdTestUtil_PackageInfo_CertificateHash, TestBuildPackageInfoCertificateHash) {
const vector<uint8_t>& certHash = GetParam();
PackageInfo packageInfo = buildPackageInfo(appName, uid, version, versionString,
/* installer */ nullopt, certHash,
/* deleted */ false, /* hashStrings */ false,
/* installerIndex */ nullopt);
EXPECT_THAT(packageInfo.has_truncated_certificate_hash(), !certHash.empty());
string expectedCertHash(certHash.begin(), certHash.end());
EXPECT_THAT(packageInfo.truncated_certificate_hash(), Eq(expectedCertHash));
}
TEST(StatsdTestUtil_PackageInfo, TestBuildPackageInfoHashStrings) {
PackageInfo packageInfo = buildPackageInfo(appName, uid, version, versionString,
/* installer */ nullopt, /* certHash */ {},
/* deleted */ false, /* hashStrings */ true,
/* installerIndex */ nullopt);
EXPECT_TRUE(packageInfo.has_name_hash());
EXPECT_THAT(packageInfo.name_hash(), Eq(Hash64(appName)));
EXPECT_FALSE(packageInfo.has_name());
EXPECT_TRUE(packageInfo.has_version_string_hash());
EXPECT_THAT(packageInfo.version_string_hash(), Eq(Hash64(versionString)));
EXPECT_FALSE(packageInfo.has_version_string());
}
TEST(StatsdTestUtil_PackageInfo, TestBuildPackageInfoNoHashStrings) {
PackageInfo packageInfo = buildPackageInfo(appName, uid, version, versionString,
/* installer */ nullopt, /* certHash */ {},
/* deleted */ false, /* hashStrings */ false,
/* installerIndex */ nullopt);
EXPECT_TRUE(packageInfo.has_name());
EXPECT_THAT(packageInfo.name(), Eq(appName));
EXPECT_FALSE(packageInfo.has_name_hash());
EXPECT_TRUE(packageInfo.has_version_string());
EXPECT_THAT(packageInfo.version_string(), Eq(versionString));
EXPECT_FALSE(packageInfo.has_version_string_hash());
}
// Test with multiple permutations of installerIndex(uint32_t) and hashString(bool) tuples.
class StatsdTestUtil_PackageInfo_InstallerIndexAndHashStrings
: public TestWithParam<tuple<optional<uint32_t>, bool>> {};
INSTANTIATE_TEST_SUITE_P(InstallerIndexAndHashStrings,
StatsdTestUtil_PackageInfo_InstallerIndexAndHashStrings,
Combine(Values(optional(2), nullopt), Bool()));
TEST_P(StatsdTestUtil_PackageInfo_InstallerIndexAndHashStrings, TestBuildPackageInfoNoInstaller) {
const auto& [installerIndex, hashStrings] = GetParam();
PackageInfo packageInfo = buildPackageInfo(appName, uid, version, versionString,
/* installer */ nullopt, /* certHash */ {},
/* deleted */ false, hashStrings, installerIndex);
EXPECT_FALSE(packageInfo.has_installer_index());
EXPECT_FALSE(packageInfo.has_installer_hash());
EXPECT_FALSE(packageInfo.has_installer());
}
// Set up parameterized test for testing with different boolean values for hashStrings parameter
// in buildPackageInfo()/buildPackageInfos()
class StatsdTestUtil_PackageInfo_HashStrings : public TestWithParam<bool> {};
INSTANTIATE_TEST_SUITE_P(HashStrings, StatsdTestUtil_PackageInfo_HashStrings, Bool(),
PrintToStringParamName());
TEST_P(StatsdTestUtil_PackageInfo_HashStrings, TestBuildPackageInfoWithInstallerAndInstallerIndex) {
const bool hashStrings = GetParam();
PackageInfo packageInfo = buildPackageInfo(appName, uid, version, versionString, installer,
/* certHash */ {}, /* deleted */ false, hashStrings,
/* installerIndex */ 1);
EXPECT_THAT(packageInfo.installer_index(), Eq(1));
EXPECT_FALSE(packageInfo.has_installer_hash());
EXPECT_FALSE(packageInfo.has_installer());
}
TEST(StatsdTestUtil_PackageInfo, TestBuildPackageInfoWithInstallerNoInstallerIndexHashStrings) {
PackageInfo packageInfo =
buildPackageInfo(appName, uid, version, versionString, installer, /* certHash */ {},
/* deleted */ false, /* hashStrings */ true,
/* installerIndex */ nullopt);
EXPECT_FALSE(packageInfo.has_installer_index());
EXPECT_THAT(packageInfo.installer_hash(), Eq(Hash64(installer)));
EXPECT_FALSE(packageInfo.has_installer());
}
TEST(StatsdTestUtil_PackageInfo, TestBuildPackageInfoWithInstallerNoInstallerIndexNoHashStrings) {
PackageInfo packageInfo =
buildPackageInfo(appName, uid, version, versionString, installer, /* certHash */ {},
/* deleted */ false, /* hashStrings */ false,
/* installerIndex */ nullopt);
EXPECT_FALSE(packageInfo.has_installer_index());
EXPECT_THAT(packageInfo.installer(), Eq(installer));
EXPECT_FALSE(packageInfo.has_installer_hash());
}
TEST_P(StatsdTestUtil_PackageInfo_HashStrings, TestBuildPackageInfosEmptyOptionalParams) {
const bool hashStrings = GetParam();
vector<PackageInfo> packageInfos = buildPackageInfos(
{appName}, {uid}, {version}, {versionString}, /* installers */ {}, /* certHashes */ {},
/* deleted */ {false}, /* installerIndices */ {}, hashStrings);
PackageInfo packageInfo = buildPackageInfo(
appName, uid, version, versionString, /* installer */ nullopt, /* certHash */ {},
/* deleted */ false, hashStrings, /* installerIndex */ nullopt);
EXPECT_THAT(packageInfos, Pointwise(EqPackageInfo(), {packageInfo}));
}
TEST_P(StatsdTestUtil_PackageInfo_HashStrings, TestBuildPackageInfosNonEmptyOptionalParams) {
const bool hashStrings = GetParam();
vector<PackageInfo> packageInfos = buildPackageInfos(
{appName}, {uid}, {version}, {versionString}, {installer}, /* certHashes */ {{'a'}},
/* deleted */ {false}, /* installerIndices */ {3}, hashStrings);
PackageInfo packageInfo =
buildPackageInfo(appName, uid, version, versionString, installer, /* certHash */ {'a'},
/* deleted */ false, hashStrings, /* installerIndex */ 3);
EXPECT_THAT(packageInfos, Pointwise(EqPackageInfo(), {packageInfo}));
}
#else
GTEST_LOG_(INFO) << "This test does nothing.\n";
#endif
} // namespace statsd
} // namespace os
} // namespace android