// 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 <unittest/unittest.h>
#include <sched.h>
#include <threads.h>

#include "dso-ctor/dso-ctor.h"

namespace {

bool global_ctor_ran;

static struct Global {
    Global() { global_ctor_ran = true; }
    ~Global() {
        // This is just some random nonempty thing that the compiler
        // can definitely never decide to optimize away.  We can't
        // easily test that the destructor got run, but we can ensure
        // that using a static destructor compiles and links correctly.
        sched_yield();
    }
} global;

bool check_ctor() {
    BEGIN_TEST;
    EXPECT_TRUE(global_ctor_ran, "global constuctor didn't run!");
    END_TEST;
}

int my_static = 23;

bool check_initializer() {
    BEGIN_TEST;
    EXPECT_EQ(my_static, 23, "static initializer didn't run!");
    END_TEST;
}

bool tlocal_ctor_ran, tlocal_dtor_ran;
thread_local ThreadLocal<&tlocal_ctor_ran, &tlocal_dtor_ran> tlocal;

int do_thread_local_dtor_test(void*) {
    BEGIN_HELPER;
    EXPECT_TRUE(decltype(tlocal)::check_before_reference());
    tlocal.flag = true;
    EXPECT_TRUE(decltype(tlocal)::check_after_reference());
    EXPECT_TRUE(check_dso_tlocal_in_thread());
    END_HELPER;
}

bool check_thread_local_ctor_dtor() {
    BEGIN_TEST;
    thrd_t th;
    ASSERT_EQ(thrd_create(&th, &do_thread_local_dtor_test, nullptr),
              thrd_success);
    int retval = -1;
    EXPECT_EQ(thrd_join(th, &retval), thrd_success);
    EXPECT_TRUE(static_cast<bool>(retval));
    EXPECT_TRUE(decltype(tlocal)::check_after_join());
    EXPECT_TRUE(check_dso_tlocal_after_join());
    END_TEST;
}

}  // namespace

BEGIN_TEST_CASE(ctors)
RUN_TEST(check_ctor)
RUN_TEST(check_initializer)
RUN_TEST(check_dso_ctor)
RUN_TEST(check_thread_local_ctor_dtor)
END_TEST_CASE(ctors)
