/*
 *  Copyright (c) 2025 The WebRTC project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

#include "common_audio/allocation_counter.h"

#if defined(WEBRTC_ALLOCATION_COUNTER_AVAILABLE)

#include <cstddef>
#include <cstdlib>
#include <vector>

#include "test/gtest.h"

namespace {
constinit thread_local size_t g_new_count = 0u;
constinit thread_local size_t g_delete_count = 0u;
}  // namespace

void* operator new(size_t s) {
  ++g_new_count;
  return malloc(s);
}

void* operator new[](size_t s) {
  ++g_new_count;
  return malloc(s);
}

void operator delete(void* p) throw() {
  ++g_delete_count;
  return free(p);
}

void operator delete[](void* p) throw() {
  ++g_delete_count;
  return free(p);
}

namespace webrtc {

AllocationCounter::AllocationCounter()
    : initial_new_count_(g_new_count), initial_delete_count_(g_delete_count) {}

size_t AllocationCounter::new_count() const {
  return g_new_count - initial_new_count_;
}

size_t AllocationCounter::delete_count() const {
  return g_delete_count - initial_delete_count_;
}

TEST(AllocationCounterTest, CountsHeapAllocations) {
  std::vector<int> v;
  AllocationCounter counter;
  EXPECT_EQ(counter.new_count(), 0u);
  EXPECT_EQ(counter.delete_count(), 0u);
  v.resize(1000);
  EXPECT_EQ(counter.new_count(), 1u);
  EXPECT_EQ(counter.delete_count(), 0u);
  v.clear();
  v.shrink_to_fit();
  EXPECT_EQ(counter.new_count(), 1u);
  EXPECT_EQ(counter.delete_count(), 1u);
}

}  // namespace webrtc

#endif  // defined(WEBRTC_ALLOCATION_COUNTER_AVAILABLE)
