X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=folly%2Ftest%2FMemoryTest.cpp;h=f3e6f8d383b4b8ae6af147df0df1256695366d8f;hb=c593d8eda8eea90818908fce46409b970ca1f540;hp=5c0145885a4b57a8e6f211dafc130e0def49bbf9;hpb=62504e55283a9b3072c6eb8f88fd0e67c14414e7;p=folly.git diff --git a/folly/test/MemoryTest.cpp b/folly/test/MemoryTest.cpp index 5c014588..f3e6f8d3 100644 --- a/folly/test/MemoryTest.cpp +++ b/folly/test/MemoryTest.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2015 Facebook, Inc. + * Copyright 2017 Facebook, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,13 +15,15 @@ */ #include -#include -#include + +#include +#include #include -#include -#include +#include +#include +#include using namespace folly; @@ -33,6 +35,18 @@ TEST(make_unique, compatible_with_std_make_unique) { make_unique("hello, world"); } +TEST(to_weak_ptr, example) { + auto s = std::make_shared(17); + EXPECT_EQ(1, s.use_count()); + EXPECT_EQ(2, (to_weak_ptr(s).lock(), s.use_count())) << "lvalue"; + EXPECT_EQ(3, (to_weak_ptr(decltype(s)(s)).lock(), s.use_count())) << "rvalue"; +} + +TEST(allocate_sys_buffer, compiles) { + auto buf = allocate_sys_buffer(256); + // Freed at the end of the scope. +} + template struct T {}; template struct S {}; template struct P {}; @@ -94,10 +108,47 @@ TEST(rebind_allocator, sanity_check) { ASSERT_EQ(nullptr, s.get()); } -int main(int argc, char **argv) { - FLAGS_logtostderr = true; - google::InitGoogleLogging(argv[0]); - testing::InitGoogleTest(&argc, argv); +template +static void test_enable_shared_from_this(std::shared_ptr sp) { + ASSERT_EQ(1l, sp.use_count()); + + // Test shared_from_this(). + std::shared_ptr sp2 = sp->shared_from_this(); + ASSERT_EQ(sp, sp2); + + // Test weak_from_this(). + std::weak_ptr wp = sp->weak_from_this(); + ASSERT_EQ(sp, wp.lock()); + sp.reset(); + sp2.reset(); + ASSERT_EQ(nullptr, wp.lock()); + + // Test shared_from_this() and weak_from_this() on object not owned by a + // shared_ptr. Undefined in C++14 but well-defined in C++17. Also known to + // work with libstdc++ >= 20150123. Feel free to add other standard library + // versions where the behavior is known. +#if __cplusplus >= 201700L || \ + __GLIBCXX__ >= 20150123L + C stack_resident; + ASSERT_THROW(stack_resident.shared_from_this(), std::bad_weak_ptr); + ASSERT_TRUE(stack_resident.weak_from_this().expired()); +#endif +} - return RUN_ALL_TESTS(); +TEST(enable_shared_from_this, compatible_with_std_enable_shared_from_this) { + // Compile-time compatibility. + class C_std : public std::enable_shared_from_this {}; + class C_folly : public folly::enable_shared_from_this {}; + static_assert( + noexcept(std::declval().shared_from_this()) == + noexcept(std::declval().shared_from_this()), ""); + static_assert( + noexcept(std::declval().shared_from_this()) == + noexcept(std::declval().shared_from_this()), ""); + static_assert(noexcept(std::declval().weak_from_this()), ""); + static_assert(noexcept(std::declval().weak_from_this()), ""); + + // Runtime compatibility. + test_enable_shared_from_this(std::make_shared()); + test_enable_shared_from_this(std::make_shared()); }