/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

/*!
 * Copyright (c) 2019 by Contributors
 * \file engine_shutdown_test.cc
 * \brief Tests engine shutdown for possible crashes
*/
#include <gtest/gtest.h>

#include "../src/engine/engine_impl.h"
#include "../include/test_util.h"

/**
 * This test will help ensure we don't crash during engine shutdown.
 * The crash happens during a static destructor call, so this test may pass and then cause a test-run process crash.
 */
TEST(EngineShutdown, stop_without_crashing) {
    static std::unique_ptr<mxnet::NDArray> ndArray;
    {
        auto engine = mxnet::Engine::_GetSharedRef();
        ndArray = std::make_unique<mxnet::NDArray>(mxnet::Context::CPU());
        engine->Stop();
    }
}
