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