/* * Copyright 2019 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 "common/observer_registry.h" #include "common/bind.h" #include "gtest/gtest.h" namespace bluetooth { namespace common { class SingleObserverRegistryTest : public ::testing::Test { protected: void SetUp() override { registry_ = new SingleObserverRegistry; } void TearDown() override { delete registry_; } SingleObserverRegistry* registry_; }; void Increment(int* count) { (*count)++; } void IncrementBy(int* count, int n) { (*count) += n; } TEST_F(SingleObserverRegistryTest, wrapped_callback) { int count = 0; auto wrapped_callback = registry_->Register(Bind(&Increment, Unretained(&count))); wrapped_callback.Run(); EXPECT_EQ(count, 1); wrapped_callback.Run(); EXPECT_EQ(count, 2); wrapped_callback.Run(); EXPECT_EQ(count, 3); registry_->Unregister(); } TEST_F(SingleObserverRegistryTest, unregister) { int count = 0; auto wrapped_callback = registry_->Register(Bind(&Increment, Unretained(&count))); registry_->Unregister(); wrapped_callback.Run(); EXPECT_EQ(count, 0); } TEST_F(SingleObserverRegistryTest, second_register) { int count = 0; auto wrapped_callback = registry_->Register(Bind(&Increment, Unretained(&count))); registry_->Unregister(); auto wrapped_callback2 = registry_->Register(Bind(&Increment, Unretained(&count))); wrapped_callback.Run(); EXPECT_EQ(count, 0); wrapped_callback2.Run(); EXPECT_EQ(count, 1); } class MultipleObserverRegistryTest : public ::testing::Test { protected: void SetUp() override { registry_ = new MultipleObserverRegistry<2>; } void TearDown() override { delete registry_; } MultipleObserverRegistry<2>* registry_; }; TEST_F(MultipleObserverRegistryTest, single_wrapped_callback) { int count = 0; auto wrapped_callback = registry_->Register(0, Bind(&Increment, Unretained(&count))); wrapped_callback.Run(); EXPECT_EQ(count, 1); wrapped_callback.Run(); EXPECT_EQ(count, 2); wrapped_callback.Run(); EXPECT_EQ(count, 3); registry_->Unregister(0); } TEST_F(MultipleObserverRegistryTest, multiple_wrapped_callback) { int count = 0; auto wrapped_callback0 = registry_->Register(0, Bind(&Increment, Unretained(&count))); auto wrapped_callback1 = registry_->Register(1, Bind(&IncrementBy, Unretained(&count), 10)); wrapped_callback0.Run(); EXPECT_EQ(count, 1); wrapped_callback1.Run(); EXPECT_EQ(count, 11); registry_->Unregister(0); wrapped_callback0.Run(); EXPECT_EQ(count, 11); wrapped_callback1.Run(); EXPECT_EQ(count, 21); registry_->Unregister(1); EXPECT_EQ(count, 21); } } // namespace common } // namespace bluetooth