/*
 * Copyright 2017 The Abseil Authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include <algorithm>
#include <cstdlib>

#include "gtest/gtest.h"
#include "absl/base/internal/malloc_extension.h"

namespace absl {
namespace base_internal {
namespace {

TEST(MallocExtension, MallocExtension) {
  void* a = malloc(1000);

  size_t cxx_bytes_used, c_bytes_used;
  if (!MallocExtension::instance()->GetNumericProperty(
          "generic.current_allocated_bytes", &cxx_bytes_used)) {
    EXPECT_TRUE(ABSL_MALLOC_EXTENSION_TEST_ALLOW_MISSING_EXTENSION);
  } else {
    ASSERT_TRUE(MallocExtension::instance()->GetNumericProperty(
        "generic.current_allocated_bytes", &cxx_bytes_used));
#ifndef MEMORY_SANITIZER
    EXPECT_GT(cxx_bytes_used, 1000);
    EXPECT_GT(c_bytes_used, 1000);
#endif

    EXPECT_TRUE(MallocExtension::instance()->VerifyAllMemory());

    EXPECT_EQ(MallocExtension::kOwned,
              MallocExtension::instance()->GetOwnership(a));
    // TODO(csilvers): this relies on undocumented behavior that
    // GetOwnership works on stack-allocated variables.  Use a better test.
    EXPECT_EQ(MallocExtension::kNotOwned,
              MallocExtension::instance()->GetOwnership(&cxx_bytes_used));
    EXPECT_EQ(MallocExtension::kNotOwned,
              MallocExtension::instance()->GetOwnership(nullptr));
    EXPECT_GE(MallocExtension::instance()->GetAllocatedSize(a), 1000);
    // This is just a sanity check.  If we allocated too much, tcmalloc is
    // broken
    EXPECT_LE(MallocExtension::instance()->GetAllocatedSize(a), 5000);
    EXPECT_GE(MallocExtension::instance()->GetEstimatedAllocatedSize(1000),
              1000);
    for (int i = 0; i < 10; ++i) {
      void* p = malloc(i);
      EXPECT_GE(MallocExtension::instance()->GetAllocatedSize(p),
                MallocExtension::instance()->GetEstimatedAllocatedSize(i));
      free(p);
    }
  }

  free(a);
}

TEST(nallocx, SaneBehavior) {
  for (size_t size = 0; size < 64 * 1024; ++size) {
    size_t alloc_size = nallocx(size, 0);
    EXPECT_LE(size, alloc_size) << "size is " << size;
    EXPECT_LE(alloc_size, std::max(size + 100, 2 * size)) << "size is " << size;
  }
}

}  // namespace
}  // namespace base_internal
}  // namespace absl
