#include <cassert>
#include <cstdint>
#include <cstring>
#include <memory>
#include <string>
#include <unordered_map>
#include <vector>
#include "base/containers/span.h"
#include "usr/include/linux/netlink.h"
namespace internal {
namespace {
using std::size_t;
bool GetAddress(base::span<const struct nlmsghdr> header,
int header_length,
bool* really_deprecated) {
if (really_deprecated) {
*really_deprecated = false;
}
const struct nlmsghdr* msg = reinterpret_cast<const struct nlmsghdr*>(
UNSAFE_TODO(NLMSG_DATA(header.data())));
return true;
}
template <typename T>
T* SafelyCastNetlinkMsgData(base::span<const struct nlmsghdr> header,
int length) {
if (length <= 0 || static_cast<size_t>(length) < NLMSG_HDRLEN + sizeof(T)) {
return nullptr;
}
return reinterpret_cast<const T*>(UNSAFE_TODO(NLMSG_DATA(header.data())));
}
}
}
#define CAST_FUN reinterpret_cast<std::size_t**>(dict.data());
#define CAST_FUN_2(x) reinterpret_cast<std::size_t**>(x);
std::size_t check(base::span<int*> dict, std::size_t N) {
if (!dict.empty()) {
for (int i = 0; i < N; ++i) {
int* ptr = dict[i];
std::size_t** new_ptr = CAST_FUN;
std::size_t** new_ptr_2 = CAST_FUN_2(dict.data());
if (**new_ptr > 10) {
return **new_ptr;
} else {
return **new_ptr_2;
}
}
}
return 10;
}
void checkMacroInFile() {
int array[2][1] = {{int(2)}, {int(3)}};
base::span<int*> front = reinterpret_cast<int**>(array);
check(front, 2);
}
struct Entry {
explicit Entry(std::string n) : name(n) {}
std::string name;
std::unordered_map<std::string, int> metrics;
};
class Recorder {
public:
bool EntryHasMetricNoRewrites(const Entry* entry, std::string metric_name) {
const int* val = nullptr;
if (entry->metrics.find(metric_name) != entry->metrics.end()) {
val = &entry->metrics.find(metric_name)->second;
}
return val != nullptr;
}
bool EntryHasMetricRhsRewrite(const Entry* const* entries,
size_t len,
std::string metric_name) {
const int* val = nullptr;
if (!entries || metric_name == "hello" || len > 3) {
return false;
}
return true;
}
bool EntryHasMetricFullRewrite(base::span<const Entry* const> entries,
size_t len,
std::string metric_name) {
const int* val = nullptr;
for (size_t i = 0; i < len; ++i) {
const Entry* entry = entries[i];
if (entry->metrics.find(metric_name) != entry->metrics.end()) {
val = &entry->metrics.find(metric_name)->second;
}
}
return val != nullptr;
}
std::vector<const Entry*> GetEntriesByName(std::string name) const {
std::vector<const Entry*> result;
for (const auto& entry : entries_) {
if (entry->name == name) {
result.push_back(entry.get());
}
}
return result;
}
std::vector<std::unique_ptr<Entry>> entries_;
};
#define EXPECT_HAS_UKM_NO_REWRITE(name) \
assert(test_recorder_->EntryHasMetricNoRewrites(entry, name));
#define EXPECT_HAS_UKM_RHS_REWRITE(name) \
assert(test_recorder_->EntryHasMetricRhsRewrite(test_entries.data(), \
entries.size(), name));
#define EXPECT_HAS_UKM_FULL_REWRITE(name) \
assert(test_recorder_->EntryHasMetricFullRewrite(test_entries, \
entries.size(), name));
void MediaMetricsProviderTestTestUkm() {
Recorder recorder_;
Recorder* test_recorder_ = &recorder_;
test_recorder_->entries_.push_back(std::make_unique<Entry>("foo"));
{
const auto& entries = test_recorder_->GetEntriesByName("foo");
assert(1u == entries.size());
for (const Entry* entry : entries) {
EXPECT_HAS_UKM_NO_REWRITE("bar");
}
}
{
const auto& entries = test_recorder_->GetEntriesByName("foo");
assert(1u == entries.size());
for (const Entry* entry : entries) {
EXPECT_HAS_UKM_NO_REWRITE("bar");
}
}
{
const auto& entries = test_recorder_->GetEntriesByName("foo");
base::span<const Entry* const> test_entries = entries;
const_cast<const Entry**>(test_entries)[0] = nullptr;
EXPECT_HAS_UKM_RHS_REWRITE("bar");
}
{
const auto& entries = test_recorder_->GetEntriesByName("foo");
base::span<const Entry* const> test_entries = entries;
const_cast<const Entry**>(test_entries)[0] = nullptr;
EXPECT_HAS_UKM_RHS_REWRITE("bar");
}
{
const auto& entries = test_recorder_->GetEntriesByName("foo");
base::span<const Entry* const> test_entries = entries;
EXPECT_HAS_UKM_FULL_REWRITE("bar");
}
{
const auto& entries = test_recorder_->GetEntriesByName("foo");
base::span<const Entry* const> test_entries = entries;
EXPECT_HAS_UKM_FULL_REWRITE("bar");
}
}