1e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Copyright 2015 PDFium Authors. All rights reserved.
2e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Use of this source code is governed by a BSD-style license that can be
3e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// found in the LICENSE file.
4e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
5e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include <limits>
6e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
7ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "core/include/fxcrt/fx_memory.h"
8e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include "testing/gtest/include/gtest/gtest.h"
9e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
10e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovnamespace {
11e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
12e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovconst size_t kMaxByteAlloc = std::numeric_limits<size_t>::max();
13e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovconst size_t kMaxIntAlloc = kMaxByteAlloc / sizeof(int);
14e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovconst size_t kOverflowIntAlloc = kMaxIntAlloc + 100;
15e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovconst size_t kWidth = 640;
16e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovconst size_t kOverflowIntAlloc2D = kMaxIntAlloc / kWidth + 10;
17e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
18e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}  // namespace
19e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
20e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// TODO(tsepez): re-enable OOM tests if we can find a way to
21e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// prevent it from hosing the bots.
22e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovTEST(fxcrt, DISABLED_FX_AllocOOM) {
23ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  EXPECT_DEATH_IF_SUPPORTED((void)FX_Alloc(int, kMaxIntAlloc), "");
24e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
25ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int* ptr = FX_Alloc(int, 1);
26ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  EXPECT_TRUE(ptr);
27ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  EXPECT_DEATH_IF_SUPPORTED((void)FX_Realloc(int, ptr, kMaxIntAlloc), "");
28ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_Free(ptr);
29e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
30e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
31e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovTEST(fxcrt, FX_AllocOverflow) {
32ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  EXPECT_DEATH_IF_SUPPORTED((void)FX_Alloc(int, kOverflowIntAlloc), "");
33e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
34ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int* ptr = FX_Alloc(int, 1);
35ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  EXPECT_TRUE(ptr);
36ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  EXPECT_DEATH_IF_SUPPORTED((void)FX_Realloc(int, ptr, kOverflowIntAlloc), "");
37ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_Free(ptr);
38e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
39e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
40e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovTEST(fxcrt, FX_AllocOverflow2D) {
41ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  EXPECT_DEATH_IF_SUPPORTED((void)FX_Alloc2D(int, kWidth, kOverflowIntAlloc2D),
42ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                            "");
43e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
44e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
45e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovTEST(fxcrt, DISABLED_FX_TryAllocOOM) {
46ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  EXPECT_FALSE(FX_TryAlloc(int, kMaxIntAlloc));
47e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
48ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int* ptr = FX_Alloc(int, 1);
49ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  EXPECT_TRUE(ptr);
50ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  EXPECT_FALSE(FX_TryRealloc(int, ptr, kMaxIntAlloc));
51ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_Free(ptr);
52e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
53e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
54e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovTEST(fxcrt, FX_TryAllocOverflow) {
55ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  EXPECT_FALSE(FX_TryAlloc(int, kOverflowIntAlloc));
56e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
57ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int* ptr = FX_Alloc(int, 1);
58ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  EXPECT_TRUE(ptr);
59ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  EXPECT_FALSE(FX_TryRealloc(int, ptr, kOverflowIntAlloc));
60ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_Free(ptr);
61e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
62e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
63e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovTEST(fxcrt, DISABLED_FXMEM_DefaultOOM) {
64ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  EXPECT_FALSE(FXMEM_DefaultAlloc(kMaxByteAlloc, 0));
65e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
66ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  void* ptr = FXMEM_DefaultAlloc(1, 0);
67ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  EXPECT_TRUE(ptr);
68ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  EXPECT_FALSE(FXMEM_DefaultRealloc(ptr, kMaxByteAlloc, 0));
69ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXMEM_DefaultFree(ptr, 0);
70e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
71