| /* |
| * Copyright (C) 2018 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 "src/traced/service/lazy_producer.h" |
| |
| #include "src/base/test/test_task_runner.h" |
| |
| #include "perfetto/tracing/core/data_source_config.h" |
| |
| #include <gmock/gmock.h> |
| #include <gtest/gtest.h> |
| |
| namespace perfetto { |
| namespace { |
| |
| constexpr const char* kDataSourceName = "android.heapprofd"; |
| constexpr const char* kPropertyName = "persist.heapprofd.enable"; |
| |
| using ::testing::_; |
| using ::testing::InSequence; |
| using ::testing::Return; |
| using ::testing::InvokeWithoutArgs; |
| |
| class MockLazyProducer : public LazyProducer { |
| public: |
| MockLazyProducer(base::TaskRunner* task_runner) |
| : LazyProducer(task_runner, 0, kDataSourceName, kPropertyName) {} |
| |
| MOCK_METHOD2(SetAndroidProperty, |
| bool(const std::string&, const std::string&)); |
| }; |
| |
| TEST(LazyProducersTest, Simple) { |
| DataSourceConfig cfg; |
| cfg.set_name(kDataSourceName); |
| base::TestTaskRunner task_runner; |
| auto done = task_runner.CreateCheckpoint("done"); |
| MockLazyProducer p(&task_runner); |
| InSequence s; |
| EXPECT_CALL(p, SetAndroidProperty(kPropertyName, "1")).WillOnce(Return(true)); |
| EXPECT_CALL(p, SetAndroidProperty(kPropertyName, "0")) |
| .WillOnce(InvokeWithoutArgs([&done]() { |
| done(); |
| return true; |
| })); |
| p.SetupDataSource(1, cfg); |
| p.StopDataSource(1); |
| task_runner.RunUntilCheckpoint("done"); |
| } |
| |
| TEST(LazyProducersTest, RefCount) { |
| DataSourceConfig cfg; |
| cfg.set_name(kDataSourceName); |
| base::TestTaskRunner task_runner; |
| auto done = task_runner.CreateCheckpoint("done"); |
| MockLazyProducer p(&task_runner); |
| InSequence s; |
| EXPECT_CALL(p, SetAndroidProperty(kPropertyName, "1")) |
| .WillRepeatedly(Return(true)); |
| p.SetupDataSource(1, cfg); |
| p.SetupDataSource(2, cfg); |
| p.StopDataSource(2); |
| task_runner.RunUntilIdle(); |
| EXPECT_CALL(p, SetAndroidProperty(kPropertyName, "0")) |
| .WillOnce(InvokeWithoutArgs([&done]() { |
| done(); |
| return true; |
| })); |
| p.StopDataSource(1); |
| task_runner.RunUntilCheckpoint("done"); |
| } |
| |
| TEST(LazyProducersTest, NoFlap) { |
| DataSourceConfig cfg; |
| cfg.set_name(kDataSourceName); |
| base::TestTaskRunner task_runner; |
| auto done = task_runner.CreateCheckpoint("done"); |
| MockLazyProducer p(&task_runner); |
| InSequence s; |
| EXPECT_CALL(p, SetAndroidProperty(kPropertyName, "1")) |
| .WillRepeatedly(Return(true)); |
| p.SetupDataSource(1, cfg); |
| p.StopDataSource(1); |
| p.SetupDataSource(2, cfg); |
| task_runner.RunUntilIdle(); |
| p.StopDataSource(2); |
| EXPECT_CALL(p, SetAndroidProperty(kPropertyName, "0")) |
| .WillOnce(InvokeWithoutArgs([&done]() { |
| done(); |
| return true; |
| })); |
| task_runner.RunUntilCheckpoint("done"); |
| } |
| |
| } // namespace |
| } // namespace perfetto |