1*76559068SAndroid Build Coastguard Worker //===-- vector_test.cpp -----------------------------------------*- C++ -*-===//
2*76559068SAndroid Build Coastguard Worker //
3*76559068SAndroid Build Coastguard Worker // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*76559068SAndroid Build Coastguard Worker // See https://llvm.org/LICENSE.txt for license information.
5*76559068SAndroid Build Coastguard Worker // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*76559068SAndroid Build Coastguard Worker //
7*76559068SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
8*76559068SAndroid Build Coastguard Worker
9*76559068SAndroid Build Coastguard Worker #include "tests/scudo_unit_test.h"
10*76559068SAndroid Build Coastguard Worker
11*76559068SAndroid Build Coastguard Worker #include "vector.h"
12*76559068SAndroid Build Coastguard Worker
TEST(ScudoVectorTest,Basic)13*76559068SAndroid Build Coastguard Worker TEST(ScudoVectorTest, Basic) {
14*76559068SAndroid Build Coastguard Worker scudo::Vector<int, 64U> V;
15*76559068SAndroid Build Coastguard Worker EXPECT_EQ(V.size(), 0U);
16*76559068SAndroid Build Coastguard Worker V.push_back(42);
17*76559068SAndroid Build Coastguard Worker EXPECT_EQ(V.size(), 1U);
18*76559068SAndroid Build Coastguard Worker EXPECT_EQ(V[0], 42);
19*76559068SAndroid Build Coastguard Worker V.push_back(43);
20*76559068SAndroid Build Coastguard Worker EXPECT_EQ(V.size(), 2U);
21*76559068SAndroid Build Coastguard Worker EXPECT_EQ(V[0], 42);
22*76559068SAndroid Build Coastguard Worker EXPECT_EQ(V[1], 43);
23*76559068SAndroid Build Coastguard Worker }
24*76559068SAndroid Build Coastguard Worker
TEST(ScudoVectorTest,Stride)25*76559068SAndroid Build Coastguard Worker TEST(ScudoVectorTest, Stride) {
26*76559068SAndroid Build Coastguard Worker scudo::Vector<scudo::uptr, 32U> V;
27*76559068SAndroid Build Coastguard Worker for (scudo::uptr I = 0; I < 1000; I++) {
28*76559068SAndroid Build Coastguard Worker V.push_back(I);
29*76559068SAndroid Build Coastguard Worker EXPECT_EQ(V.size(), I + 1U);
30*76559068SAndroid Build Coastguard Worker EXPECT_EQ(V[I], I);
31*76559068SAndroid Build Coastguard Worker }
32*76559068SAndroid Build Coastguard Worker for (scudo::uptr I = 0; I < 1000; I++)
33*76559068SAndroid Build Coastguard Worker EXPECT_EQ(V[I], I);
34*76559068SAndroid Build Coastguard Worker }
35*76559068SAndroid Build Coastguard Worker
TEST(ScudoVectorTest,ResizeReduction)36*76559068SAndroid Build Coastguard Worker TEST(ScudoVectorTest, ResizeReduction) {
37*76559068SAndroid Build Coastguard Worker scudo::Vector<int, 64U> V;
38*76559068SAndroid Build Coastguard Worker V.push_back(0);
39*76559068SAndroid Build Coastguard Worker V.push_back(0);
40*76559068SAndroid Build Coastguard Worker EXPECT_EQ(V.size(), 2U);
41*76559068SAndroid Build Coastguard Worker V.resize(1);
42*76559068SAndroid Build Coastguard Worker EXPECT_EQ(V.size(), 1U);
43*76559068SAndroid Build Coastguard Worker }
44*76559068SAndroid Build Coastguard Worker
45*76559068SAndroid Build Coastguard Worker #if defined(__linux__)
46*76559068SAndroid Build Coastguard Worker
47*76559068SAndroid Build Coastguard Worker #include <sys/resource.h>
48*76559068SAndroid Build Coastguard Worker
49*76559068SAndroid Build Coastguard Worker // Verify that if the reallocate fails, nothing new is added.
TEST(ScudoVectorTest,ReallocateFails)50*76559068SAndroid Build Coastguard Worker TEST(ScudoVectorTest, ReallocateFails) {
51*76559068SAndroid Build Coastguard Worker scudo::Vector<char, 256U> V;
52*76559068SAndroid Build Coastguard Worker scudo::uptr capacity = V.capacity();
53*76559068SAndroid Build Coastguard Worker
54*76559068SAndroid Build Coastguard Worker // Get the current address space size.
55*76559068SAndroid Build Coastguard Worker rlimit Limit = {};
56*76559068SAndroid Build Coastguard Worker EXPECT_EQ(0, getrlimit(RLIMIT_AS, &Limit));
57*76559068SAndroid Build Coastguard Worker
58*76559068SAndroid Build Coastguard Worker rlimit EmptyLimit = {.rlim_cur = 0, .rlim_max = Limit.rlim_max};
59*76559068SAndroid Build Coastguard Worker EXPECT_EQ(0, setrlimit(RLIMIT_AS, &EmptyLimit));
60*76559068SAndroid Build Coastguard Worker
61*76559068SAndroid Build Coastguard Worker // qemu does not honor the setrlimit, so verify before proceeding.
62*76559068SAndroid Build Coastguard Worker scudo::MemMapT MemMap;
63*76559068SAndroid Build Coastguard Worker if (MemMap.map(/*Addr=*/0U, scudo::getPageSizeCached(), "scudo:test",
64*76559068SAndroid Build Coastguard Worker MAP_ALLOWNOMEM)) {
65*76559068SAndroid Build Coastguard Worker MemMap.unmap();
66*76559068SAndroid Build Coastguard Worker setrlimit(RLIMIT_AS, &Limit);
67*76559068SAndroid Build Coastguard Worker TEST_SKIP("Limiting address space does not prevent mmap.");
68*76559068SAndroid Build Coastguard Worker }
69*76559068SAndroid Build Coastguard Worker
70*76559068SAndroid Build Coastguard Worker V.resize(capacity);
71*76559068SAndroid Build Coastguard Worker // Set the last element so we can check it later.
72*76559068SAndroid Build Coastguard Worker V.back() = '\0';
73*76559068SAndroid Build Coastguard Worker
74*76559068SAndroid Build Coastguard Worker // The reallocate should fail, so the capacity should not change.
75*76559068SAndroid Build Coastguard Worker V.reserve(capacity + 1000);
76*76559068SAndroid Build Coastguard Worker EXPECT_EQ(capacity, V.capacity());
77*76559068SAndroid Build Coastguard Worker
78*76559068SAndroid Build Coastguard Worker // Now try to do a push back and verify that the size does not change.
79*76559068SAndroid Build Coastguard Worker scudo::uptr Size = V.size();
80*76559068SAndroid Build Coastguard Worker V.push_back('2');
81*76559068SAndroid Build Coastguard Worker EXPECT_EQ(Size, V.size());
82*76559068SAndroid Build Coastguard Worker // Verify that the last element in the vector did not change.
83*76559068SAndroid Build Coastguard Worker EXPECT_EQ('\0', V.back());
84*76559068SAndroid Build Coastguard Worker
85*76559068SAndroid Build Coastguard Worker EXPECT_EQ(0, setrlimit(RLIMIT_AS, &Limit));
86*76559068SAndroid Build Coastguard Worker }
87*76559068SAndroid Build Coastguard Worker #endif
88