152e5b99983c1f7ff0b9a1f3b4b80d779073b21c8Bertrand SIMONNET/* 252e5b99983c1f7ff0b9a1f3b4b80d779073b21c8Bertrand SIMONNET * Copyright (C) 2015 The Android Open Source Project 352e5b99983c1f7ff0b9a1f3b4b80d779073b21c8Bertrand SIMONNET * 452e5b99983c1f7ff0b9a1f3b4b80d779073b21c8Bertrand SIMONNET * Licensed under the Apache License, Version 2.0 (the "License"); 552e5b99983c1f7ff0b9a1f3b4b80d779073b21c8Bertrand SIMONNET * you may not use this file except in compliance with the License. 652e5b99983c1f7ff0b9a1f3b4b80d779073b21c8Bertrand SIMONNET * You may obtain a copy of the License at 752e5b99983c1f7ff0b9a1f3b4b80d779073b21c8Bertrand SIMONNET * 852e5b99983c1f7ff0b9a1f3b4b80d779073b21c8Bertrand SIMONNET * http://www.apache.org/licenses/LICENSE-2.0 952e5b99983c1f7ff0b9a1f3b4b80d779073b21c8Bertrand SIMONNET * 1052e5b99983c1f7ff0b9a1f3b4b80d779073b21c8Bertrand SIMONNET * Unless required by applicable law or agreed to in writing, software 1152e5b99983c1f7ff0b9a1f3b4b80d779073b21c8Bertrand SIMONNET * distributed under the License is distributed on an "AS IS" BASIS, 1252e5b99983c1f7ff0b9a1f3b4b80d779073b21c8Bertrand SIMONNET * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1352e5b99983c1f7ff0b9a1f3b4b80d779073b21c8Bertrand SIMONNET * See the License for the specific language governing permissions and 1452e5b99983c1f7ff0b9a1f3b4b80d779073b21c8Bertrand SIMONNET * limitations under the License. 1552e5b99983c1f7ff0b9a1f3b4b80d779073b21c8Bertrand SIMONNET */ 1611b8eb3cf14564630c8efd20d52d42796cf3cb0eDarin Petkov 1711b8eb3cf14564630c8efd20d52d42796cf3cb0eDarin Petkov 1851bf92a3cbe1fe27153baa0becae49075d9ea3b0Ben Chan#include <base/files/file_util.h> 191253186728abd35d7177008598627e7b872974e5Bertrand SIMONNET#include <base/files/scoped_temp_dir.h> 20b2f170970ebea7d7b6200761a5243224af536874Ken Mixter#include <gmock/gmock.h> 2111b8eb3cf14564630c8efd20d52d42796cf3cb0eDarin Petkov#include <gtest/gtest.h> 2211b8eb3cf14564630c8efd20d52d42796cf3cb0eDarin Petkov 23d83ca801ad65ae389d20e5dd3e30aed6f285ebf4Bertrand SIMONNET#include "metrics/c_metrics_library.h" 24d83ca801ad65ae389d20e5dd3e30aed6f285ebf4Bertrand SIMONNET#include "metrics/metrics_library.h" 2510b301da5759282417e2e94594838070e3ebacf5Sam Leffler 264c5daa47942e4d891c74ac56417dd815b25e6e3dKen Mixter 2711b8eb3cf14564630c8efd20d52d42796cf3cb0eDarin Petkovclass MetricsLibraryTest : public testing::Test { 2811b8eb3cf14564630c8efd20d52d42796cf3cb0eDarin Petkov protected: 2911b8eb3cf14564630c8efd20d52d42796cf3cb0eDarin Petkov virtual void SetUp() { 301253186728abd35d7177008598627e7b872974e5Bertrand SIMONNET ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); 312765d0abccd0c754422332d114cdecc271888e2dBertrand SIMONNET lib_.InitForTest(temp_dir_.path()); 324c5daa47942e4d891c74ac56417dd815b25e6e3dKen Mixter // Defeat metrics enabled caching between tests. 334c5daa47942e4d891c74ac56417dd815b25e6e3dKen Mixter lib_.cached_enabled_time_ = 0; 3411b8eb3cf14564630c8efd20d52d42796cf3cb0eDarin Petkov } 3511b8eb3cf14564630c8efd20d52d42796cf3cb0eDarin Petkov 361253186728abd35d7177008598627e7b872974e5Bertrand SIMONNET void SetMetricsConsent(bool enabled) { 371253186728abd35d7177008598627e7b872974e5Bertrand SIMONNET if (enabled) { 382765d0abccd0c754422332d114cdecc271888e2dBertrand SIMONNET ASSERT_EQ(base::WriteFile(lib_.consent_file_, "", 0), 0); 391253186728abd35d7177008598627e7b872974e5Bertrand SIMONNET } else { 402765d0abccd0c754422332d114cdecc271888e2dBertrand SIMONNET ASSERT_TRUE(base::DeleteFile(lib_.consent_file_, false)); 411253186728abd35d7177008598627e7b872974e5Bertrand SIMONNET } 4211b8eb3cf14564630c8efd20d52d42796cf3cb0eDarin Petkov } 4311b8eb3cf14564630c8efd20d52d42796cf3cb0eDarin Petkov 444c5daa47942e4d891c74ac56417dd815b25e6e3dKen Mixter void VerifyEnabledCacheHit(bool to_value); 454c5daa47942e4d891c74ac56417dd815b25e6e3dKen Mixter void VerifyEnabledCacheEviction(bool to_value); 464c5daa47942e4d891c74ac56417dd815b25e6e3dKen Mixter 4711b8eb3cf14564630c8efd20d52d42796cf3cb0eDarin Petkov MetricsLibrary lib_; 481253186728abd35d7177008598627e7b872974e5Bertrand SIMONNET base::ScopedTempDir temp_dir_; 4911b8eb3cf14564630c8efd20d52d42796cf3cb0eDarin Petkov}; 5011b8eb3cf14564630c8efd20d52d42796cf3cb0eDarin Petkov 514c5daa47942e4d891c74ac56417dd815b25e6e3dKen MixterTEST_F(MetricsLibraryTest, AreMetricsEnabledFalse) { 521253186728abd35d7177008598627e7b872974e5Bertrand SIMONNET SetMetricsConsent(false); 534c5daa47942e4d891c74ac56417dd815b25e6e3dKen Mixter EXPECT_FALSE(lib_.AreMetricsEnabled()); 544c5daa47942e4d891c74ac56417dd815b25e6e3dKen Mixter} 554c5daa47942e4d891c74ac56417dd815b25e6e3dKen Mixter 564c5daa47942e4d891c74ac56417dd815b25e6e3dKen MixterTEST_F(MetricsLibraryTest, AreMetricsEnabledTrue) { 571253186728abd35d7177008598627e7b872974e5Bertrand SIMONNET SetMetricsConsent(true); 584c5daa47942e4d891c74ac56417dd815b25e6e3dKen Mixter EXPECT_TRUE(lib_.AreMetricsEnabled()); 594c5daa47942e4d891c74ac56417dd815b25e6e3dKen Mixter} 604c5daa47942e4d891c74ac56417dd815b25e6e3dKen Mixter 614c5daa47942e4d891c74ac56417dd815b25e6e3dKen Mixtervoid MetricsLibraryTest::VerifyEnabledCacheHit(bool to_value) { 624c5daa47942e4d891c74ac56417dd815b25e6e3dKen Mixter // We might step from one second to the next one time, but not 100 634c5daa47942e4d891c74ac56417dd815b25e6e3dKen Mixter // times in a row. 644c5daa47942e4d891c74ac56417dd815b25e6e3dKen Mixter for (int i = 0; i < 100; ++i) { 654c5daa47942e4d891c74ac56417dd815b25e6e3dKen Mixter lib_.cached_enabled_time_ = 0; 661253186728abd35d7177008598627e7b872974e5Bertrand SIMONNET SetMetricsConsent(to_value); 671253186728abd35d7177008598627e7b872974e5Bertrand SIMONNET lib_.AreMetricsEnabled(); 681253186728abd35d7177008598627e7b872974e5Bertrand SIMONNET // If we check the metrics status twice in a row, we use the cached value 691253186728abd35d7177008598627e7b872974e5Bertrand SIMONNET // the second time. 701253186728abd35d7177008598627e7b872974e5Bertrand SIMONNET SetMetricsConsent(!to_value); 711253186728abd35d7177008598627e7b872974e5Bertrand SIMONNET if (lib_.AreMetricsEnabled() == to_value) 724c5daa47942e4d891c74ac56417dd815b25e6e3dKen Mixter return; 734c5daa47942e4d891c74ac56417dd815b25e6e3dKen Mixter } 744c5daa47942e4d891c74ac56417dd815b25e6e3dKen Mixter ADD_FAILURE() << "Did not see evidence of caching"; 754c5daa47942e4d891c74ac56417dd815b25e6e3dKen Mixter} 764c5daa47942e4d891c74ac56417dd815b25e6e3dKen Mixter 774c5daa47942e4d891c74ac56417dd815b25e6e3dKen Mixtervoid MetricsLibraryTest::VerifyEnabledCacheEviction(bool to_value) { 784c5daa47942e4d891c74ac56417dd815b25e6e3dKen Mixter lib_.cached_enabled_time_ = 0; 791253186728abd35d7177008598627e7b872974e5Bertrand SIMONNET SetMetricsConsent(!to_value); 804c5daa47942e4d891c74ac56417dd815b25e6e3dKen Mixter ASSERT_EQ(!to_value, lib_.AreMetricsEnabled()); 811253186728abd35d7177008598627e7b872974e5Bertrand SIMONNET 821253186728abd35d7177008598627e7b872974e5Bertrand SIMONNET SetMetricsConsent(to_value); 831253186728abd35d7177008598627e7b872974e5Bertrand SIMONNET // Sleep one second (or cheat to be faster) and check that we are not using 841253186728abd35d7177008598627e7b872974e5Bertrand SIMONNET // the cached value. 854c5daa47942e4d891c74ac56417dd815b25e6e3dKen Mixter --lib_.cached_enabled_time_; 864c5daa47942e4d891c74ac56417dd815b25e6e3dKen Mixter ASSERT_EQ(to_value, lib_.AreMetricsEnabled()); 874c5daa47942e4d891c74ac56417dd815b25e6e3dKen Mixter} 884c5daa47942e4d891c74ac56417dd815b25e6e3dKen Mixter 894c5daa47942e4d891c74ac56417dd815b25e6e3dKen MixterTEST_F(MetricsLibraryTest, AreMetricsEnabledCaching) { 904c5daa47942e4d891c74ac56417dd815b25e6e3dKen Mixter VerifyEnabledCacheHit(false); 914c5daa47942e4d891c74ac56417dd815b25e6e3dKen Mixter VerifyEnabledCacheHit(true); 924c5daa47942e4d891c74ac56417dd815b25e6e3dKen Mixter VerifyEnabledCacheEviction(false); 934c5daa47942e4d891c74ac56417dd815b25e6e3dKen Mixter VerifyEnabledCacheEviction(true); 944c5daa47942e4d891c74ac56417dd815b25e6e3dKen Mixter} 95a5b40d077fec4d9e379cc3ef20a2b5a9d36b71c3Bertrand SIMONNET 96a5b40d077fec4d9e379cc3ef20a2b5a9d36b71c3Bertrand SIMONNETTEST_F(MetricsLibraryTest, AreMetricsEnabledNoCaching) { 97a5b40d077fec4d9e379cc3ef20a2b5a9d36b71c3Bertrand SIMONNET // disable caching. 98a5b40d077fec4d9e379cc3ef20a2b5a9d36b71c3Bertrand SIMONNET lib_.use_caching_ = false; 99a5b40d077fec4d9e379cc3ef20a2b5a9d36b71c3Bertrand SIMONNET 100a5b40d077fec4d9e379cc3ef20a2b5a9d36b71c3Bertrand SIMONNET // Checking the consent repeatedly should return the right result. 101a5b40d077fec4d9e379cc3ef20a2b5a9d36b71c3Bertrand SIMONNET for (int i=0; i<100; ++i) { 102a5b40d077fec4d9e379cc3ef20a2b5a9d36b71c3Bertrand SIMONNET SetMetricsConsent(true); 103a5b40d077fec4d9e379cc3ef20a2b5a9d36b71c3Bertrand SIMONNET ASSERT_EQ(true, lib_.AreMetricsEnabled()); 104a5b40d077fec4d9e379cc3ef20a2b5a9d36b71c3Bertrand SIMONNET SetMetricsConsent(false); 105a5b40d077fec4d9e379cc3ef20a2b5a9d36b71c3Bertrand SIMONNET ASSERT_EQ(false, lib_.AreMetricsEnabled()); 106a5b40d077fec4d9e379cc3ef20a2b5a9d36b71c3Bertrand SIMONNET } 107a5b40d077fec4d9e379cc3ef20a2b5a9d36b71c3Bertrand SIMONNET} 108