Home | History | Annotate | Download | only in tests
      1 // Copyright (C) 2017 The Android Open Source Project
      2 //
      3 // Licensed under the Apache License, Version 2.0 (the "License");
      4 // you may not use this file except in compliance with the License.
      5 // You may obtain a copy of the License at
      6 //
      7 //      http://www.apache.org/licenses/LICENSE-2.0
      8 //
      9 // Unless required by applicable law or agreed to in writing, software
     10 // distributed under the License is distributed on an "AS IS" BASIS,
     11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     12 // See the License for the specific language governing permissions and
     13 // limitations under the License.
     14 
     15 #include "src/config/ConfigManager.h"
     16 #include "src/metrics/MetricsManager.h"
     17 #include "statsd_test_util.h"
     18 
     19 #include <gmock/gmock.h>
     20 #include <gtest/gtest.h>
     21 
     22 #include <stdio.h>
     23 #include <iostream>
     24 
     25 using namespace android;
     26 using namespace android::os::statsd;
     27 using namespace testing;
     28 using namespace std;
     29 
     30 namespace android {
     31 namespace os {
     32 namespace statsd {
     33 
     34 static ostream& operator<<(ostream& os, const StatsdConfig& config) {
     35     return os << "StatsdConfig{id=" << config.id() << "}";
     36 }
     37 
     38 }  // namespace statsd
     39 }  // namespace os
     40 }  // namespace android
     41 
     42 /**
     43  * Mock ConfigListener
     44  */
     45 class MockListener : public ConfigListener {
     46 public:
     47     MOCK_METHOD3(OnConfigUpdated, void(const int64_t timestampNs, const ConfigKey& key,
     48                                        const StatsdConfig& config));
     49     MOCK_METHOD1(OnConfigRemoved, void(const ConfigKey& key));
     50 };
     51 
     52 /**
     53  * Validate that the ConfigKey is the one we wanted.
     54  */
     55 MATCHER_P2(ConfigKeyEq, uid, id, "") {
     56     return arg.GetUid() == uid && (long long)arg.GetId() == (long long)id;
     57 }
     58 
     59 /**
     60  * Validate that the StatsdConfig is the one we wanted.
     61  */
     62 MATCHER_P(StatsdConfigEq, id, 0) {
     63     return (long long)arg.id() == (long long)id;
     64 }
     65 
     66 const int64_t testConfigId = 12345;
     67 
     68 /**
     69  * Test the addOrUpdate and remove methods
     70  */
     71 TEST(ConfigManagerTest, TestAddUpdateRemove) {
     72     sp<MockListener> listener = new StrictMock<MockListener>();
     73 
     74     sp<ConfigManager> manager = new ConfigManager();
     75     manager->AddListener(listener);
     76 
     77     StatsdConfig config91;
     78     config91.set_id(91);
     79     StatsdConfig config92;
     80     config92.set_id(92);
     81     StatsdConfig config93;
     82     config93.set_id(93);
     83     StatsdConfig config94;
     84     config94.set_id(94);
     85 
     86     {
     87         InSequence s;
     88 
     89         manager->StartupForTest();
     90 
     91         // Add another one
     92         EXPECT_CALL(*(listener.get()), OnConfigUpdated(_, ConfigKeyEq(1, StringToId("zzz")),
     93             StatsdConfigEq(91)))
     94                 .RetiresOnSaturation();
     95         manager->UpdateConfig(ConfigKey(1, StringToId("zzz")), config91);
     96 
     97         // Update It
     98         EXPECT_CALL(*(listener.get()), OnConfigUpdated(_, ConfigKeyEq(1, StringToId("zzz")),
     99             StatsdConfigEq(92)))
    100                 .RetiresOnSaturation();
    101         manager->UpdateConfig(ConfigKey(1, StringToId("zzz")), config92);
    102 
    103         // Add one with the same uid but a different name
    104         EXPECT_CALL(*(listener.get()), OnConfigUpdated(_, ConfigKeyEq(1, StringToId("yyy")),
    105             StatsdConfigEq(93)))
    106                 .RetiresOnSaturation();
    107         manager->UpdateConfig(ConfigKey(1, StringToId("yyy")), config93);
    108 
    109         // Add one with the same name but a different uid
    110         EXPECT_CALL(*(listener.get()), OnConfigUpdated(_, ConfigKeyEq(2, StringToId("zzz")),
    111             StatsdConfigEq(94)))
    112                 .RetiresOnSaturation();
    113         manager->UpdateConfig(ConfigKey(2, StringToId("zzz")), config94);
    114 
    115         // Remove (1,yyy)
    116         EXPECT_CALL(*(listener.get()), OnConfigRemoved(ConfigKeyEq(1, StringToId("yyy"))))
    117                 .RetiresOnSaturation();
    118         manager->RemoveConfig(ConfigKey(1, StringToId("yyy")));
    119 
    120         // Remove (2,zzz)
    121         EXPECT_CALL(*(listener.get()), OnConfigRemoved(ConfigKeyEq(2, StringToId("zzz"))))
    122                 .RetiresOnSaturation();
    123         manager->RemoveConfig(ConfigKey(2, StringToId("zzz")));
    124 
    125         // Remove (1,zzz)
    126         EXPECT_CALL(*(listener.get()), OnConfigRemoved(ConfigKeyEq(1, StringToId("zzz"))))
    127                 .RetiresOnSaturation();
    128         manager->RemoveConfig(ConfigKey(1, StringToId("zzz")));
    129 
    130         // Remove (2,zzz) again and we shouldn't get the callback
    131         manager->RemoveConfig(ConfigKey(2, StringToId("zzz")));
    132     }
    133 }
    134 
    135 /**
    136  * Test removing all of the configs for a uid.
    137  */
    138 TEST(ConfigManagerTest, TestRemoveUid) {
    139     sp<MockListener> listener = new StrictMock<MockListener>();
    140 
    141     sp<ConfigManager> manager = new ConfigManager();
    142     manager->AddListener(listener);
    143 
    144     StatsdConfig config;
    145 
    146     EXPECT_CALL(*(listener.get()), OnConfigUpdated(_, _, _)).Times(5);
    147     EXPECT_CALL(*(listener.get()), OnConfigRemoved(ConfigKeyEq(2, StringToId("xxx"))));
    148     EXPECT_CALL(*(listener.get()), OnConfigRemoved(ConfigKeyEq(2, StringToId("yyy"))));
    149     EXPECT_CALL(*(listener.get()), OnConfigRemoved(ConfigKeyEq(2, StringToId("zzz"))));
    150 
    151     manager->StartupForTest();
    152     manager->UpdateConfig(ConfigKey(1, StringToId("aaa")), config);
    153     manager->UpdateConfig(ConfigKey(2, StringToId("xxx")), config);
    154     manager->UpdateConfig(ConfigKey(2, StringToId("yyy")), config);
    155     manager->UpdateConfig(ConfigKey(2, StringToId("zzz")), config);
    156     manager->UpdateConfig(ConfigKey(3, StringToId("bbb")), config);
    157 
    158     manager->RemoveConfigs(2);
    159 }
    160