// 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 #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::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 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(sr.scan_filters[0])); EXPECT_NE(&absl::get(sr.scan_filters[0]), &presenceScanFilter); EXPECT_EQ(absl::get(sr.scan_filters[0]), presenceScanFilter); EXPECT_TRUE( absl::holds_alternative(sr.scan_filters[1])); EXPECT_NE(&absl::get(sr.scan_filters[1]), &legacyPresenceScanFilter); EXPECT_EQ(absl::get(sr.scan_filters[1]), legacyPresenceScanFilter); } TEST(ScanRequestBuilderTest, TestSetScanFilters) { PresenceScanFilter presenceScanFilter = CreateTestPresenceScanFilter(); LegacyPresenceScanFilter legacyPresenceScanFilter = CreateTestLegacyPresenceScanFilter(); std::vector> filterList = {presenceScanFilter, legacyPresenceScanFilter}; ScanRequestBuilder builder; builder.SetScanFilters(filterList); ScanRequest sr = builder.Build(); EXPECT_EQ(sr.scan_filters.size(), 2); EXPECT_TRUE(absl::holds_alternative(sr.scan_filters[0])); EXPECT_NE(&absl::get(sr.scan_filters[0]), &presenceScanFilter); EXPECT_EQ(absl::get(sr.scan_filters[0]), presenceScanFilter); EXPECT_TRUE( absl::holds_alternative(sr.scan_filters[1])); EXPECT_NE(&absl::get(sr.scan_filters[1]), &legacyPresenceScanFilter); EXPECT_EQ(absl::get(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