// Copyright 2016 The Fuchsia Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include #include #include #include #include static_assert(fbl::is_standard_layout>::value, "fbl::unique_free_ptr's should have a standard layout"); // These tests mostly serve to exercise the unique_free_ptr type and work well with heap checkers as // the side effects of calling libc free() cannot be directly observed. static bool ufptr_test_move() { BEGIN_TEST; // Construct and move into another unique_ptr. { fbl::unique_free_ptr ptr(static_cast(malloc(sizeof(int)))); fbl::unique_free_ptr ptr2 = fbl::move(ptr); EXPECT_NULL(ptr, "expected ptr to be null"); } END_TEST; } static bool ufptr_test_null_scoped_destruction() { BEGIN_TEST; // Construct a null unique_ptr and let it fall out of scope - should not call // deleter. { fbl::unique_free_ptr ptr(nullptr); } END_TEST; } static bool ufptr_test_diff_scope_swap() { BEGIN_TEST; // Construct a pair of unique_ptrs in different scopes, swap them, and verify // that the values change places and that the values are destroyed at the // correct times. { fbl::unique_free_ptr ptr1(static_cast(malloc(sizeof(int)))); *ptr1 = 4; { fbl::unique_free_ptr ptr2(static_cast(malloc(sizeof(int)))); *ptr2 = 7; ptr1.swap(ptr2); EXPECT_EQ(7, *ptr1); EXPECT_EQ(4, *ptr2); } } END_TEST; } static bool ufptr_test_bool_op() { BEGIN_TEST; fbl::unique_free_ptr foo(static_cast(malloc(sizeof(int)))); EXPECT_TRUE(static_cast(foo)); foo.reset(); EXPECT_FALSE(static_cast(foo)); END_TEST; } static bool ufptr_test_comparison() { BEGIN_TEST; // Test comparison operators. fbl::unique_free_ptr null_unique; fbl::unique_free_ptr lesser_unique(static_cast(malloc(sizeof(int)))); *lesser_unique = 1; fbl::unique_free_ptr greater_unique(static_cast(malloc(sizeof(int)))); *greater_unique = 2; EXPECT_NE(lesser_unique.get(), greater_unique.get()); if (lesser_unique.get() > greater_unique.get()) lesser_unique.swap(greater_unique); // Comparison against nullptr EXPECT_TRUE( null_unique == nullptr); EXPECT_TRUE( lesser_unique != nullptr); EXPECT_TRUE(greater_unique != nullptr); EXPECT_TRUE(nullptr == null_unique); EXPECT_TRUE(nullptr != lesser_unique); EXPECT_TRUE(nullptr != greater_unique); // Comparison against other unique_free_ptr<>s EXPECT_TRUE( lesser_unique == lesser_unique); EXPECT_FALSE( lesser_unique == greater_unique); EXPECT_FALSE(greater_unique == lesser_unique); EXPECT_TRUE(greater_unique == greater_unique); EXPECT_FALSE( lesser_unique != lesser_unique); EXPECT_TRUE ( lesser_unique != greater_unique, ""); EXPECT_TRUE (greater_unique != lesser_unique, ""); EXPECT_FALSE(greater_unique != greater_unique); EXPECT_FALSE( lesser_unique < lesser_unique); EXPECT_TRUE ( lesser_unique < greater_unique, ""); EXPECT_FALSE(greater_unique < lesser_unique); EXPECT_FALSE(greater_unique < greater_unique); EXPECT_FALSE( lesser_unique > lesser_unique); EXPECT_FALSE( lesser_unique > greater_unique); EXPECT_TRUE (greater_unique > lesser_unique, ""); EXPECT_FALSE(greater_unique > greater_unique); EXPECT_TRUE ( lesser_unique <= lesser_unique, ""); EXPECT_TRUE ( lesser_unique <= greater_unique, ""); EXPECT_FALSE(greater_unique <= lesser_unique); EXPECT_TRUE (greater_unique <= greater_unique, ""); EXPECT_TRUE ( lesser_unique >= lesser_unique, ""); EXPECT_FALSE( lesser_unique >= greater_unique); EXPECT_TRUE (greater_unique >= lesser_unique, ""); EXPECT_TRUE (greater_unique >= greater_unique, ""); END_TEST; } BEGIN_TEST_CASE(unique_free_ptr) RUN_NAMED_TEST("Move", ufptr_test_move) RUN_NAMED_TEST("nullptr Scoped Destruction", ufptr_test_null_scoped_destruction) RUN_NAMED_TEST("Different Scope Swapping", ufptr_test_diff_scope_swap) RUN_NAMED_TEST("operator bool", ufptr_test_bool_op) RUN_NAMED_TEST("comparison operators", ufptr_test_comparison) END_TEST_CASE(unique_free_ptr);