1ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov/* 2ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov * Copyright (C) 2014 The Android Open Source Project 3ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov * 4ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov * Licensed under the Apache License, Version 2.0 (the "License"); 5ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov * you may not use this file except in compliance with the License. 6ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov * You may obtain a copy of the License at 7ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov * 8ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov * http://www.apache.org/licenses/LICENSE-2.0 9ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov * 10ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov * Unless required by applicable law or agreed to in writing, software 11ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov * distributed under the License is distributed on an "AS IS" BASIS, 12ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov * See the License for the specific language governing permissions and 14ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov * limitations under the License. 15ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov */ 16ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov 17ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov#include <gtest/gtest.h> 18ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov 19ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov#include <private/UniquePtr.h> 20ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov 21ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanovstatic int cCount = 0; 22ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanovstruct C { 23ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov C() { ++cCount; } 24ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov ~C() { --cCount; } 25ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov}; 26ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov 27ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanovstatic bool freed = false; 28ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanovstruct Freer { 29ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov void operator() (int* p) { 30ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov ASSERT_EQ(123, *p); 31ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov free(p); 32ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov freed = true; 33ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov } 34ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov}; 35ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov 36ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy IvanovTEST(UniquePtr, smoke) { 37ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov // 38ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov // UniquePtr<T> tests... 39ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov // 40ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov 41ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov // Can we free a single object? 42ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov { 43ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov UniquePtr<C> c(new C); 44ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov ASSERT_TRUE(cCount == 1); 45ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov } 46ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov ASSERT_TRUE(cCount == 0); 47ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov // Does release work? 48ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov C* rawC; 49ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov { 50ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov UniquePtr<C> c(new C); 51ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov ASSERT_TRUE(cCount == 1); 52ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov rawC = c.release(); 53ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov } 54ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov ASSERT_TRUE(cCount == 1); 55ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov delete rawC; 56ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov // Does reset work? 57ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov { 58ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov UniquePtr<C> c(new C); 59ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov ASSERT_TRUE(cCount == 1); 60ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov c.reset(new C); 61ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov ASSERT_TRUE(cCount == 1); 62ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov } 63ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov ASSERT_TRUE(cCount == 0); 64ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov 65ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov // 66ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov // UniquePtr<T[]> tests... 67ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov // 68ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov 69ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov // Can we free an array? 70ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov { 71ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov UniquePtr<C[]> cs(new C[4]); 72ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov ASSERT_TRUE(cCount == 4); 73ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov } 74ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov ASSERT_TRUE(cCount == 0); 75ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov // Does release work? 76ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov { 77ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov UniquePtr<C[]> c(new C[4]); 78ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov ASSERT_TRUE(cCount == 4); 79ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov rawC = c.release(); 80ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov } 81ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov ASSERT_TRUE(cCount == 4); 82ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov delete[] rawC; 83ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov // Does reset work? 84ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov { 85ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov UniquePtr<C[]> c(new C[4]); 86ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov ASSERT_TRUE(cCount == 4); 87ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov c.reset(new C[2]); 88ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov ASSERT_TRUE(cCount == 2); 89ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov } 90ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov ASSERT_TRUE(cCount == 0); 91ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov 92ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov // 93ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov // Custom deleter tests... 94ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov // 95ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov ASSERT_TRUE(!freed); 96ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov { 97ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov UniquePtr<int, Freer> i(reinterpret_cast<int*>(malloc(sizeof(int)))); 98ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov *i = 123; 99ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov } 100ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov ASSERT_TRUE(freed); 101ae69a9584baf8dd6a28065538ca09d1924ebd9e4Dmitriy Ivanov} 102