blob: 1d0fd6bed9418b1c3e1e39e19e6a06fd6f23eedf [file] [log] [blame]
// Copyright 2020 Google LLC
//
// 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
//
// https://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 "presence/scan_request_builder.h"
#include <vector>
#include "gmock/gmock.h"
#include "protobuf-matchers/protocol-buffer-matchers.h"
#include "gtest/gtest.h"
#include "absl/strings/string_view.h"
#include "internal/proto/credential.pb.h"
#include "presence/power_mode.h"
#include "presence/scan_request.h"
namespace nearby {
namespace presence {
namespace {
using ::nearby::internal::IdentityType;
constexpr absl::string_view kAccountName = "Google User";
constexpr bool kUseBle = true;
constexpr bool kOnlyScreenOnScan = true;
const IdentityType kIdentity = IdentityType::IDENTITY_TYPE_PRIVATE_GROUP;
const ScanType kScanType = ScanType::kPresenceScan;
const PowerMode powerMode = PowerMode::kLowLatency;
constexpr absl::string_view kManagerAppId = "Google App Manager";
DataElement CreateTestDataElement() {
return {DataElement::kTxPowerFieldType, "1"};
}
PresenceScanFilter CreateTestPresenceScanFilter() {
return {.scan_type = kScanType,
.extended_properties = {CreateTestDataElement()}};
}
LegacyPresenceScanFilter CreateTestLegacyPresenceScanFilter() {
return {.scan_type = kScanType};
}
TEST(ScanRequestBuilderTest, TestConstructor) {
EXPECT_FALSE(std::is_trivially_constructible<ScanRequestBuilder>::value);
}
TEST(ScanRequestBuilderTest, TestSetAccountName) {
ScanRequestBuilder builder;
builder.SetAccountName(kAccountName);
ScanRequest sr = builder.Build();
EXPECT_EQ(sr.account_name, kAccountName);
}
TEST(ScanRequestBuilderTest, TestSetPowerMode) {
ScanRequestBuilder builder;
builder.SetPowerMode(powerMode);
ScanRequest sr = builder.Build();
EXPECT_EQ(sr.power_mode, powerMode);
}
TEST(ScanRequestBuilderTest, TestSetScanType) {
ScanRequestBuilder builder;
builder.SetScanType(kScanType);
ScanRequest sr = builder.Build();
EXPECT_EQ(sr.scan_type, kScanType);
}
TEST(ScanRequestBuilderTest, TestAddIdentityType) {
ScanRequestBuilder builder;
builder.AddIdentityType(kIdentity);
ScanRequest sr = builder.Build();
EXPECT_EQ(sr.identity_types.size(), 1);
EXPECT_EQ(sr.identity_types[0], kIdentity);
}
TEST(ScanRequestBuilderTest, TestSetIdentityTypes) {
ScanRequestBuilder builder;
std::vector<IdentityType> types = {kIdentity};
builder.SetIdentityTypes(types);
ScanRequest sr = builder.Build();
EXPECT_EQ(sr.identity_types.size(), 1);
EXPECT_EQ(sr.identity_types, types);
}
TEST(ScanRequestBuilderTest, TestAddScanFilter) {
ScanRequestBuilder builder;
PresenceScanFilter presenceScanFilter = CreateTestPresenceScanFilter();
LegacyPresenceScanFilter legacyPresenceScanFilter =
CreateTestLegacyPresenceScanFilter();
builder.AddScanFilter(presenceScanFilter);
builder.AddScanFilter(legacyPresenceScanFilter);
ScanRequest sr = builder.Build();
EXPECT_EQ(sr.scan_filters.size(), 2);
EXPECT_TRUE(absl::holds_alternative<PresenceScanFilter>(sr.scan_filters[0]));
EXPECT_NE(&absl::get<PresenceScanFilter>(sr.scan_filters[0]),
&presenceScanFilter);
EXPECT_EQ(absl::get<PresenceScanFilter>(sr.scan_filters[0]),
presenceScanFilter);
EXPECT_TRUE(
absl::holds_alternative<LegacyPresenceScanFilter>(sr.scan_filters[1]));
EXPECT_NE(&absl::get<LegacyPresenceScanFilter>(sr.scan_filters[1]),
&legacyPresenceScanFilter);
EXPECT_EQ(absl::get<LegacyPresenceScanFilter>(sr.scan_filters[1]),
legacyPresenceScanFilter);
}
TEST(ScanRequestBuilderTest, TestSetScanFilters) {
PresenceScanFilter presenceScanFilter = CreateTestPresenceScanFilter();
LegacyPresenceScanFilter legacyPresenceScanFilter =
CreateTestLegacyPresenceScanFilter();
std::vector<absl::variant<PresenceScanFilter, LegacyPresenceScanFilter>>
filterList = {presenceScanFilter, legacyPresenceScanFilter};
ScanRequestBuilder builder;
builder.SetScanFilters(filterList);
ScanRequest sr = builder.Build();
EXPECT_EQ(sr.scan_filters.size(), 2);
EXPECT_TRUE(absl::holds_alternative<PresenceScanFilter>(sr.scan_filters[0]));
EXPECT_NE(&absl::get<PresenceScanFilter>(sr.scan_filters[0]),
&presenceScanFilter);
EXPECT_EQ(absl::get<PresenceScanFilter>(sr.scan_filters[0]),
presenceScanFilter);
EXPECT_TRUE(
absl::holds_alternative<LegacyPresenceScanFilter>(sr.scan_filters[1]));
EXPECT_NE(&absl::get<LegacyPresenceScanFilter>(sr.scan_filters[1]),
&legacyPresenceScanFilter);
EXPECT_EQ(absl::get<LegacyPresenceScanFilter>(sr.scan_filters[1]),
legacyPresenceScanFilter);
}
TEST(ScanRequestBuilderTest, TestNotEqualScanFilter) {
ScanRequestBuilder builderLegacy, builderModern;
ScanRequest legacy =
builderLegacy.AddScanFilter(LegacyPresenceScanFilter{}).Build();
ScanRequest modern =
builderModern.AddScanFilter(PresenceScanFilter{}).Build();
EXPECT_NE(legacy, modern);
}
TEST(ScanRequestBuilderTest, TestSetUseBle) {
ScanRequestBuilder builder;
builder.SetUseBle(kUseBle);
ScanRequest sr = builder.Build();
EXPECT_EQ(sr.use_ble, kUseBle);
}
TEST(ScanRequestBuilderTest, TestSetManagerAppId) {
ScanRequestBuilder builder;
builder.SetManagerAppId(kManagerAppId);
ScanRequest sr = builder.Build();
EXPECT_EQ(sr.manager_app_id, kManagerAppId);
}
TEST(ScanRequestBuilderTest, TestSetOnlyScreenOnScan) {
ScanRequestBuilder builder;
builder.SetOnlyScreenOnScan(kOnlyScreenOnScan);
ScanRequest sr = builder.Build();
EXPECT_EQ(sr.scan_only_when_screen_on, kOnlyScreenOnScan);
}
TEST(ScanRequestBuilderTest, TestChainCalls) {
ScanRequestBuilder builder;
ScanRequest sr = builder.SetAccountName(kAccountName)
.SetPowerMode(powerMode)
.SetOnlyScreenOnScan(kOnlyScreenOnScan)
.SetUseBle(kUseBle)
.SetManagerAppId(kManagerAppId)
.Build();
EXPECT_EQ(sr.account_name, kAccountName);
EXPECT_EQ(sr.scan_only_when_screen_on, kOnlyScreenOnScan);
EXPECT_EQ(sr.power_mode, powerMode);
EXPECT_EQ(sr.use_ble, kUseBle);
EXPECT_EQ(sr.manager_app_id, kManagerAppId);
}
TEST(ScanRequestBuilderTest, TestCopy) {
ScanRequestBuilder builder1;
builder1.SetOnlyScreenOnScan(kOnlyScreenOnScan).SetUseBle(kUseBle);
ScanRequestBuilder builder2 = {builder1};
EXPECT_EQ(builder1, builder2);
ScanRequest s1 = builder1.Build();
ScanRequest s2 = builder2.Build();
EXPECT_EQ(s1, s2);
}
} // namespace
} // namespace presence
} // namespace nearby