The Stats namespace is deprecated. Change-Id: I17b1aa7fbced5db7b325e5339395281f3b3eda0b Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/51528 Reviewed-by: Giacomo Travaglini <giacomo.travaglini@arm.com> Reviewed-by: Daniel Carvalho <odanrc@yahoo.com.br> Maintainer: Giacomo Travaglini <giacomo.travaglini@arm.com> Tested-by: kokoro <noreply+kokoro@google.com>
660 lines
19 KiB
C++
660 lines
19 KiB
C++
/*
|
|
* Copyright (c) 2021 Daniel R. Carvalho
|
|
* All rights reserved
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions are
|
|
* met: redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer;
|
|
* redistributions in binary form must reproduce the above copyright
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
* documentation and/or other materials provided with the distribution;
|
|
* neither the name of the copyright holders nor the names of its
|
|
* contributors may be used to endorse or promote products derived from
|
|
* this software without specific prior written permission.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
*/
|
|
|
|
#include <gtest/gtest-spi.h>
|
|
#include <gtest/gtest.h>
|
|
|
|
#include "base/stats/group.hh"
|
|
#include "base/stats/info.hh"
|
|
#include "base/stats/output.hh"
|
|
|
|
using namespace gem5;
|
|
|
|
/** Test that the constructor without a parent doesn't do anything. */
|
|
TEST(StatsGroupTest, ConstructNoParent)
|
|
{
|
|
statistics::Group root(nullptr);
|
|
ASSERT_EQ(root.getStatGroups().size(), 0);
|
|
}
|
|
|
|
/** Test adding a single stat group to a root node. */
|
|
TEST(StatsGroupTest, AddGetSingleStatGroup)
|
|
{
|
|
statistics::Group root(nullptr);
|
|
statistics::Group node1(nullptr);
|
|
root.addStatGroup("Node1", &node1);
|
|
|
|
const auto root_map = root.getStatGroups();
|
|
ASSERT_EQ(root_map.size(), 1);
|
|
ASSERT_NE(root_map.find("Node1"), root_map.end());
|
|
|
|
ASSERT_EQ(node1.getStatGroups().size(), 0);
|
|
}
|
|
|
|
/** Test that group names are unique within a node's stat group. */
|
|
TEST(StatsGroupDeathTest, AddUniqueNameStatGroup)
|
|
{
|
|
statistics::Group root(nullptr);
|
|
statistics::Group node1(nullptr);
|
|
statistics::Group node2(nullptr);
|
|
root.addStatGroup("Node1", &node1);
|
|
ASSERT_ANY_THROW(root.addStatGroup("Node1", &node2));
|
|
}
|
|
|
|
/** Test that group names are not unique among two nodes' stat groups. */
|
|
TEST(StatsGroupTest, AddNotUniqueNameAmongGroups)
|
|
{
|
|
statistics::Group root(nullptr);
|
|
statistics::Group node1(nullptr);
|
|
statistics::Group node2(nullptr);
|
|
statistics::Group node1_1(nullptr);
|
|
root.addStatGroup("Node1", &node1);
|
|
node1.addStatGroup("Node1_1", &node1_1);
|
|
ASSERT_NO_THROW(node1.addStatGroup("Node1", &node2));
|
|
}
|
|
|
|
/** Test that a group cannot add a non-existent group. */
|
|
TEST(StatsGroupDeathTest, AddNull)
|
|
{
|
|
statistics::Group root(nullptr);
|
|
ASSERT_ANY_THROW(root.addStatGroup("Node1", nullptr));
|
|
}
|
|
|
|
/** Test that a group cannot add itself. */
|
|
TEST(StatsGroupDeathTest, AddItself)
|
|
{
|
|
statistics::Group root(nullptr);
|
|
ASSERT_ANY_THROW(root.addStatGroup("Node1", &root));
|
|
}
|
|
|
|
/** @todo Test that a group cannot be added in a cycle. */
|
|
TEST(StatsGroupDeathTest, DISABLED_AddCycle)
|
|
{
|
|
statistics::Group root(nullptr);
|
|
statistics::Group node1(nullptr);
|
|
statistics::Group node1_1(nullptr);
|
|
root.addStatGroup("Node1", &node1);
|
|
node1.addStatGroup("Node1_1", &node1_1);
|
|
ASSERT_ANY_THROW(node1_1.addStatGroup("Root", &root));
|
|
}
|
|
|
|
/** Test adding multiple stat groups to a root node. */
|
|
TEST(StatsGroupTest, AddGetMultipleStatGroup)
|
|
{
|
|
statistics::Group root(nullptr);
|
|
statistics::Group node1(nullptr);
|
|
statistics::Group node2(nullptr);
|
|
root.addStatGroup("Node1", &node1);
|
|
root.addStatGroup("Node2", &node2);
|
|
|
|
const auto root_map = root.getStatGroups();
|
|
ASSERT_EQ(root_map.size(), 2);
|
|
ASSERT_NE(root_map.find("Node1"), root_map.end());
|
|
ASSERT_NE(root_map.find("Node2"), root_map.end());
|
|
|
|
ASSERT_EQ(node1.getStatGroups().size(), 0);
|
|
ASSERT_EQ(node2.getStatGroups().size(), 0);
|
|
}
|
|
|
|
/** Make sure that the groups are correctly assigned in the map. */
|
|
TEST(StatsGroupTest, ConstructCorrectlyAssigned)
|
|
{
|
|
statistics::Group root(nullptr);
|
|
statistics::Group node1(nullptr);
|
|
statistics::Group node1_1(nullptr);
|
|
statistics::Group node1_1_1(nullptr);
|
|
root.addStatGroup("Node1", &node1);
|
|
node1.addStatGroup("Node1_1", &node1_1);
|
|
node1_1.addStatGroup("Node1_1_1", &node1_1_1);
|
|
|
|
ASSERT_EQ(node1.getStatGroups().find("Node1_1")->second->getStatGroups(),
|
|
node1_1.getStatGroups());
|
|
}
|
|
|
|
/**
|
|
* Test that the constructor, when provided both the parent and the nodes'
|
|
* name, creates the following tree:
|
|
*
|
|
* root
|
|
* |
|
|
* node1
|
|
*/
|
|
TEST(StatsGroupTest, ConstructOneLevelLinear)
|
|
{
|
|
statistics::Group root(nullptr);
|
|
statistics::Group node1(&root, "Node1");
|
|
|
|
const auto root_map = root.getStatGroups();
|
|
ASSERT_EQ(root_map.size(), 1);
|
|
ASSERT_NE(root_map.find("Node1"), root_map.end());
|
|
|
|
ASSERT_EQ(node1.getStatGroups().size(), 0);
|
|
}
|
|
|
|
/**
|
|
* Test that the constructor, when provided both the parent and the nodes'
|
|
* name, creates the following tree:
|
|
*
|
|
* root
|
|
* / \
|
|
* node1 node2
|
|
*/
|
|
TEST(StatsGroupTest, ConstructOneLevelOfTwoNodes)
|
|
{
|
|
statistics::Group root(nullptr);
|
|
statistics::Group node1(&root, "Node1");
|
|
statistics::Group node2(&root, "Node2");
|
|
|
|
const auto root_map = root.getStatGroups();
|
|
ASSERT_EQ(root_map.size(), 2);
|
|
ASSERT_NE(root_map.find("Node1"), root_map.end());
|
|
ASSERT_NE(root_map.find("Node2"), root_map.end());
|
|
|
|
ASSERT_EQ(node1.getStatGroups().size(), 0);
|
|
ASSERT_EQ(node2.getStatGroups().size(), 0);
|
|
}
|
|
|
|
/**
|
|
* Test that the constructor, when provided both the parent and the nodes'
|
|
* name, creates the following tree:
|
|
*
|
|
* root
|
|
* |
|
|
* node1
|
|
* |
|
|
* node1_1
|
|
*/
|
|
TEST(StatsGroupTest, ConstructTwoLevelsLinear)
|
|
{
|
|
statistics::Group root(nullptr);
|
|
statistics::Group node1(&root, "Node1");
|
|
statistics::Group node1_1(&node1, "Node1_1");
|
|
|
|
const auto root_map = root.getStatGroups();
|
|
ASSERT_EQ(root_map.size(), 1);
|
|
ASSERT_NE(root_map.find("Node1"), root_map.end());
|
|
ASSERT_EQ(root_map.find("Node1_1"), root_map.end());
|
|
|
|
ASSERT_EQ(node1.getStatGroups().size(), 1);
|
|
ASSERT_NE(node1.getStatGroups().find("Node1_1"),
|
|
node1.getStatGroups().end());
|
|
|
|
ASSERT_EQ(node1_1.getStatGroups().size(), 0);
|
|
}
|
|
|
|
/**
|
|
* Test that the constructor, when provided both the parent and the nodes'
|
|
* name, creates the following tree:
|
|
*
|
|
* root
|
|
* / \
|
|
* node1 node2
|
|
* | / \
|
|
* node1_1 node2_1 node2_2
|
|
*/
|
|
TEST(StatsGroupTest, ConstructTwoLevelsUnbalancedTree)
|
|
{
|
|
statistics::Group root(nullptr);
|
|
statistics::Group node1(&root, "Node1");
|
|
statistics::Group node2(&root, "Node2");
|
|
statistics::Group node1_1(&node1, "Node1_1");
|
|
statistics::Group node2_1(&node2, "Node2_1");
|
|
statistics::Group node2_2(&node2, "Node2_2");
|
|
|
|
const auto root_map = root.getStatGroups();
|
|
ASSERT_EQ(root_map.size(), 2);
|
|
ASSERT_NE(root_map.find("Node1"), root_map.end());
|
|
ASSERT_NE(root_map.find("Node2"), root_map.end());
|
|
ASSERT_EQ(root_map.find("Node1_1"), root_map.end());
|
|
ASSERT_EQ(root_map.find("Node2_1"), root_map.end());
|
|
ASSERT_EQ(root_map.find("Node2_2"), root_map.end());
|
|
|
|
ASSERT_EQ(node1.getStatGroups().size(), 1);
|
|
ASSERT_NE(node1.getStatGroups().find("Node1_1"),
|
|
node1.getStatGroups().end());
|
|
ASSERT_EQ(node1.getStatGroups().find("Node2_1"),
|
|
node1.getStatGroups().end());
|
|
ASSERT_EQ(node1.getStatGroups().find("Node2_2"),
|
|
node1.getStatGroups().end());
|
|
|
|
ASSERT_EQ(node2.getStatGroups().size(), 2);
|
|
ASSERT_EQ(node2.getStatGroups().find("Node1_1"),
|
|
node2.getStatGroups().end());
|
|
ASSERT_NE(node2.getStatGroups().find("Node2_1"),
|
|
node2.getStatGroups().end());
|
|
ASSERT_NE(node2.getStatGroups().find("Node2_2"),
|
|
node2.getStatGroups().end());
|
|
|
|
ASSERT_EQ(node1_1.getStatGroups().size(), 0);
|
|
ASSERT_EQ(node2_1.getStatGroups().size(), 0);
|
|
ASSERT_EQ(node2_2.getStatGroups().size(), 0);
|
|
}
|
|
|
|
class DummyInfo : public Stats::Info
|
|
{
|
|
public:
|
|
using Stats::Info::Info;
|
|
|
|
int value = 0;
|
|
|
|
bool check() const override { return true; }
|
|
void prepare() override {}
|
|
void reset() override { value = 0; }
|
|
bool zero() const override { return false; }
|
|
void visit(Stats::Output &visitor) override {}
|
|
};
|
|
|
|
/** Test adding stats to a group. */
|
|
TEST(StatsGroupTest, AddGetStat)
|
|
{
|
|
statistics::Group root(nullptr);
|
|
auto info_vec = root.getStats();
|
|
ASSERT_EQ(info_vec.size(), 0);
|
|
|
|
DummyInfo info;
|
|
info.setName("InfoAddGetStat");
|
|
root.addStat(&info);
|
|
info_vec = root.getStats();
|
|
ASSERT_EQ(info_vec.size(), 1);
|
|
ASSERT_EQ(info_vec[0]->name, "InfoAddGetStat");
|
|
|
|
DummyInfo info2;
|
|
info2.setName("InfoAddGetStat2");
|
|
root.addStat(&info2);
|
|
info_vec = root.getStats();
|
|
ASSERT_EQ(info_vec.size(), 2);
|
|
ASSERT_EQ(info_vec[0]->name, "InfoAddGetStat");
|
|
ASSERT_EQ(info_vec[1]->name, "InfoAddGetStat2");
|
|
}
|
|
|
|
/** Test that a group cannot merge if another group is not provided. */
|
|
TEST(StatsGroupDeathTest, MergeStatGroupNoGroup)
|
|
{
|
|
statistics::Group root(nullptr);
|
|
ASSERT_ANY_THROW(root.mergeStatGroup(nullptr));
|
|
}
|
|
|
|
/** Test that a group cannot merge with itself. */
|
|
TEST(StatsGroupDeathTest, MergeStatGroupItself)
|
|
{
|
|
statistics::Group root(nullptr);
|
|
ASSERT_ANY_THROW(root.mergeStatGroup(&root));
|
|
}
|
|
|
|
/** Test merging groups. */
|
|
TEST(StatsGroupTest, MergeStatGroup)
|
|
{
|
|
statistics::Group root(nullptr);
|
|
statistics::Group node1(nullptr);
|
|
|
|
DummyInfo info;
|
|
info.setName("InfoMergeStatGroup");
|
|
node1.addStat(&info);
|
|
DummyInfo info2;
|
|
info2.setName("InfoMergeStatGroup2");
|
|
node1.addStat(&info2);
|
|
|
|
root.mergeStatGroup(&node1);
|
|
auto info_vec = root.getStats();
|
|
ASSERT_EQ(info_vec.size(), 2);
|
|
ASSERT_EQ(info_vec[0]->name, "InfoMergeStatGroup");
|
|
ASSERT_EQ(info_vec[1]->name, "InfoMergeStatGroup2");
|
|
}
|
|
|
|
/** Test that a group that has already been merged cannot be merged again. */
|
|
TEST(StatsGroupDeathTest, MergeStatGroupMergedParent)
|
|
{
|
|
statistics::Group root(nullptr);
|
|
statistics::Group node1(nullptr);
|
|
statistics::Group node2(nullptr);
|
|
root.mergeStatGroup(&node2);
|
|
ASSERT_ANY_THROW(node1.mergeStatGroup(&node2));
|
|
}
|
|
|
|
/**
|
|
* Test that after a group has been merged, adding stats to it will add
|
|
* stats to the group it was merged to too.
|
|
*/
|
|
TEST(StatsGroupTest, AddStatMergedParent)
|
|
{
|
|
statistics::Group root(nullptr);
|
|
statistics::Group node1(nullptr);
|
|
statistics::Group node1_1(nullptr);
|
|
|
|
root.mergeStatGroup(&node1);
|
|
root.mergeStatGroup(&node1_1);
|
|
|
|
DummyInfo info;
|
|
info.setName("AddStatMergedParent");
|
|
node1_1.addStat(&info);
|
|
|
|
auto info_vec = root.getStats();
|
|
ASSERT_EQ(info_vec.size(), 1);
|
|
ASSERT_EQ(info_vec[0]->name, "AddStatMergedParent");
|
|
info_vec = node1.getStats();
|
|
ASSERT_EQ(info_vec.size(), 0);
|
|
info_vec = node1_1.getStats();
|
|
ASSERT_EQ(info_vec.size(), 1);
|
|
ASSERT_EQ(info_vec[0]->name, "AddStatMergedParent");
|
|
}
|
|
|
|
/**
|
|
* Test that after a group has been merged, adding stats to the "main" group
|
|
* does not add stats to the group it was merged to.
|
|
*/
|
|
TEST(StatsGroupTest, AddStatMergedParentMain)
|
|
{
|
|
statistics::Group root(nullptr);
|
|
statistics::Group node1(nullptr);
|
|
|
|
root.mergeStatGroup(&node1);
|
|
|
|
DummyInfo info;
|
|
info.setName("AddStatMergedParentMain");
|
|
root.addStat(&info);
|
|
|
|
auto info_vec = root.getStats();
|
|
ASSERT_EQ(info_vec.size(), 1);
|
|
ASSERT_EQ(info_vec[0]->name, "AddStatMergedParentMain");
|
|
info_vec = node1.getStats();
|
|
ASSERT_EQ(info_vec.size(), 0);
|
|
}
|
|
|
|
/**
|
|
* Test that calling the constructor with a parent, but no name merges the
|
|
* groups.
|
|
*/
|
|
TEST(StatsGroupTest, ConstructNoName)
|
|
{
|
|
statistics::Group root(nullptr);
|
|
statistics::Group node1(&root);
|
|
|
|
DummyInfo info;
|
|
info.setName("InfoConstructNoName");
|
|
node1.addStat(&info);
|
|
|
|
auto info_vec = root.getStats();
|
|
ASSERT_EQ(info_vec.size(), 1);
|
|
ASSERT_EQ(info_vec[0]->name, "InfoConstructNoName");
|
|
}
|
|
|
|
/**
|
|
* Test that calling regStats calls the respective function of all sub-groups
|
|
* and merged groups.
|
|
*/
|
|
TEST(StatsGroupTest, RegStats)
|
|
{
|
|
class TestGroup : public statistics::Group
|
|
{
|
|
public:
|
|
using statistics::Group::Group;
|
|
|
|
int value = 0;
|
|
|
|
void
|
|
regStats() override
|
|
{
|
|
value++;
|
|
statistics::Group::regStats();
|
|
}
|
|
};
|
|
|
|
TestGroup root(nullptr);
|
|
root.value = 1;
|
|
TestGroup node1(&root, "Node1");
|
|
node1.value = 2;
|
|
TestGroup node1_1(&node1, "Node1_1");
|
|
node1_1.value = 3;
|
|
TestGroup node1_2(&node1_1);
|
|
node1_2.value = 4;
|
|
|
|
node1.regStats();
|
|
ASSERT_EQ(root.value, 1);
|
|
ASSERT_EQ(node1.value, 3);
|
|
ASSERT_EQ(node1_1.value, 4);
|
|
ASSERT_EQ(node1_2.value, 5);
|
|
}
|
|
|
|
/**
|
|
* Test that resetting a stat from a specific node reset the stats of all its
|
|
* sub-groups and merged groups, and that it does not reset the stats of its
|
|
* parents.
|
|
*/
|
|
TEST(StatsGroupTest, ResetStats)
|
|
{
|
|
statistics::Group root(nullptr);
|
|
statistics::Group node1(&root, "Node1");
|
|
statistics::Group node1_1(&node1, "Node1_1");
|
|
statistics::Group node1_2(&node1_1);
|
|
|
|
DummyInfo info;
|
|
info.setName("InfoResetStats");
|
|
info.value = 1;
|
|
root.addStat(&info);
|
|
|
|
DummyInfo info2;
|
|
info2.setName("InfoResetStats2");
|
|
info2.value = 2;
|
|
node1.addStat(&info2);
|
|
|
|
DummyInfo info3;
|
|
info3.setName("InfoResetStats3");
|
|
info3.value = 3;
|
|
node1_1.addStat(&info3);
|
|
|
|
DummyInfo info4;
|
|
info4.setName("InfoResetStats4");
|
|
info4.value = 4;
|
|
node1_1.addStat(&info4);
|
|
|
|
DummyInfo info5;
|
|
info5.setName("InfoResetStats5");
|
|
info5.value = 5;
|
|
node1_2.addStat(&info5);
|
|
|
|
node1.resetStats();
|
|
ASSERT_EQ(info.value, 1);
|
|
ASSERT_EQ(info2.value, 0);
|
|
ASSERT_EQ(info3.value, 0);
|
|
ASSERT_EQ(info4.value, 0);
|
|
ASSERT_EQ(info5.value, 0);
|
|
}
|
|
|
|
/**
|
|
* Test that calling preDumpStats calls the respective function of all sub-
|
|
* groups and merged groups.
|
|
*/
|
|
TEST(StatsGroupTest, PreDumpStats)
|
|
{
|
|
class TestGroup : public statistics::Group
|
|
{
|
|
public:
|
|
using statistics::Group::Group;
|
|
|
|
int value = 0;
|
|
|
|
void
|
|
preDumpStats() override
|
|
{
|
|
value++;
|
|
statistics::Group::preDumpStats();
|
|
}
|
|
};
|
|
|
|
TestGroup root(nullptr);
|
|
root.value = 1;
|
|
TestGroup node1(&root, "Node1");
|
|
node1.value = 2;
|
|
TestGroup node1_1(&node1, "Node1_1");
|
|
node1_1.value = 3;
|
|
TestGroup node1_2(&node1_1);
|
|
node1_2.value = 4;
|
|
|
|
node1.preDumpStats();
|
|
ASSERT_EQ(root.value, 1);
|
|
ASSERT_EQ(node1.value, 3);
|
|
ASSERT_EQ(node1_1.value, 4);
|
|
ASSERT_EQ(node1_2.value, 5);
|
|
}
|
|
|
|
/** Test that resolving a non-existent stat returns a nullptr. */
|
|
TEST(StatsGroupTest, ResolveStatNone)
|
|
{
|
|
statistics::Group root(nullptr);
|
|
|
|
DummyInfo info;
|
|
info.setName("InfoResolveStatNone");
|
|
root.addStat(&info);
|
|
|
|
auto info_found = root.resolveStat("InfoResolveStatAny");
|
|
ASSERT_EQ(info_found, nullptr);
|
|
}
|
|
|
|
/** Test resolving a stat belonging to the caller group. */
|
|
TEST(StatsGroupTest, ResolveStatSelf)
|
|
{
|
|
statistics::Group root(nullptr);
|
|
|
|
DummyInfo info;
|
|
info.setName("InfoResolveStatSelf");
|
|
root.addStat(&info);
|
|
|
|
DummyInfo info2;
|
|
info2.setName("InfoResolveStatSelf2");
|
|
root.addStat(&info2);
|
|
|
|
DummyInfo info3;
|
|
info3.setName("InfoResolveStatSelf3");
|
|
root.addStat(&info3);
|
|
|
|
auto info_found = root.resolveStat("InfoResolveStatSelf");
|
|
ASSERT_NE(info_found, nullptr);
|
|
ASSERT_EQ(info_found->name, "InfoResolveStatSelf");
|
|
|
|
info_found = root.resolveStat("InfoResolveStatSelf2");
|
|
ASSERT_NE(info_found, nullptr);
|
|
ASSERT_EQ(info_found->name, "InfoResolveStatSelf2");
|
|
|
|
info_found = root.resolveStat("InfoResolveStatSelf3");
|
|
ASSERT_NE(info_found, nullptr);
|
|
ASSERT_EQ(info_found->name, "InfoResolveStatSelf3");
|
|
}
|
|
|
|
/** Test that resolving stats from sub-groups is possible. */
|
|
TEST(StatsGroupTest, ResolveSubGroupStatFromParent)
|
|
{
|
|
statistics::Group root(nullptr);
|
|
statistics::Group node1(&root, "Node1");
|
|
statistics::Group node1_1(&node1, "Node1_1");
|
|
statistics::Group node1_1_1(&node1_1, "Node1_1_1");
|
|
|
|
DummyInfo info;
|
|
info.setName("InfoResolveSubGroupStatFromParent");
|
|
node1.addStat(&info);
|
|
|
|
DummyInfo info2;
|
|
info2.setName("InfoResolveSubGroupStatFromParent2");
|
|
node1_1.addStat(&info2);
|
|
|
|
DummyInfo info3;
|
|
info3.setName("InfoResolveSubGroupStatFromParent3");
|
|
node1_1_1.addStat(&info3);
|
|
|
|
auto info_found =
|
|
root.resolveStat("Node1.InfoResolveSubGroupStatFromParent");
|
|
ASSERT_NE(info_found, nullptr);
|
|
ASSERT_EQ(info_found->name, "InfoResolveSubGroupStatFromParent");
|
|
|
|
info_found = root.resolveStat(
|
|
"Node1.Node1_1.InfoResolveSubGroupStatFromParent2");
|
|
ASSERT_NE(info_found, nullptr);
|
|
ASSERT_EQ(info_found->name, "InfoResolveSubGroupStatFromParent2");
|
|
|
|
info_found = root.resolveStat(
|
|
"Node1.Node1_1.Node1_1_1.InfoResolveSubGroupStatFromParent3");
|
|
ASSERT_NE(info_found, nullptr);
|
|
ASSERT_EQ(info_found->name, "InfoResolveSubGroupStatFromParent3");
|
|
}
|
|
|
|
/** Test that resolving a stat from the parent is not possible. */
|
|
TEST(StatsGroupTest, ResolveStatSubGroupOnSubGroup)
|
|
{
|
|
statistics::Group root(nullptr);
|
|
statistics::Group node1(&root, "Node1");
|
|
|
|
DummyInfo info;
|
|
info.setName("InfoResolveStatSubGroupOnSubGroup");
|
|
root.addStat(&info);
|
|
|
|
auto info_found = node1.resolveStat("InfoResolveStatSubGroupOnSubGroup");
|
|
ASSERT_EQ(info_found, nullptr);
|
|
}
|
|
|
|
/** Test that resolving a merged stat is possible. */
|
|
TEST(StatsGroupTest, ResolveStatMerged)
|
|
{
|
|
statistics::Group root(nullptr);
|
|
statistics::Group node1(nullptr);
|
|
|
|
DummyInfo info;
|
|
info.setName("InfoResolveStatMerged");
|
|
node1.addStat(&info);
|
|
DummyInfo info2;
|
|
info2.setName("InfoResolveStatMerged2");
|
|
node1.addStat(&info2);
|
|
|
|
root.mergeStatGroup(&node1);
|
|
|
|
auto info_found = root.resolveStat("InfoResolveStatMerged");
|
|
ASSERT_NE(info_found, nullptr);
|
|
ASSERT_EQ(info_found->name, "InfoResolveStatMerged");
|
|
|
|
info_found = root.resolveStat("InfoResolveStatMerged2");
|
|
ASSERT_NE(info_found, nullptr);
|
|
ASSERT_EQ(info_found->name, "InfoResolveStatMerged2");
|
|
}
|
|
|
|
/** Test that resolving a stat belonging to a merged sub-group is possible. */
|
|
TEST(StatsGroupTest, ResolveStatMergedSubGroup)
|
|
{
|
|
statistics::Group root(nullptr);
|
|
statistics::Group node1(nullptr);
|
|
statistics::Group node2(nullptr);
|
|
|
|
DummyInfo info;
|
|
info.setName("InfoResolveStatMergedSubGroup");
|
|
node2.addStat(&info);
|
|
|
|
root.addStatGroup("Node1", &node1);
|
|
node1.mergeStatGroup(&node2);
|
|
|
|
auto info_found = root.resolveStat("Node1.InfoResolveStatMergedSubGroup");
|
|
ASSERT_NE(info_found, nullptr);
|
|
ASSERT_EQ(info_found->name, "InfoResolveStatMergedSubGroup");
|
|
}
|