/*
 *  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 "absl/base/attributes.h"
#include "test/gtest.h"

namespace {
#if defined(ABSL_HAVE_THREAD_LOCAL)
ABSL_CONST_INIT thread_local size_t g_new_count = 0u;
ABSL_CONST_INIT thread_local size_t g_delete_count = 0u;
#elif defined(WEBRTC_POSIX)
#error Handle WEBRTC_POSIX
#else
#error Unsupported platform
#endif
}  // 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)
