Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

DLL読み込み失敗のテストを追加する #1819

Merged
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
DLL読み込み失敗のテストを追加
  • Loading branch information
berryzplus committed Mar 12, 2022
commit 62f60b4229b29bd7acbf65b20bee07e310e95026
101 changes: 101 additions & 0 deletions tests/unittests/TExtModule.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
/*! @file */
/*
Copyright (C) 2022, Sakura Editor Organization

This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
arising from the use of this software.

Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:

1. The origin of this software must not be misrepresented;
you must not claim that you wrote the original software.
If you use this software in a product, an acknowledgment
in the product documentation would be appreciated but is
not required.

2. Altered source versions must be plainly marked as such,
and must not be misrepresented as being the original software.

3. This notice may not be removed or altered from any source
distribution.
*/
#include <gtest/gtest.h>

#include "extmodule/CDllHandler.h"

#include <type_traits>

/*!
外部DLL読み込みをテストするためのテンプレートクラス

CDllImp派生クラスを指定して使う。
テストではロード処理後の挙動をチェックするので、コンストラクタでinitしてしまう。
*/
template<class T, std::enable_if_t<std::is_base_of_v<CDllImp, T>, std::nullptr_t> = nullptr>
class TExtModule : public T {
private:
std::wstring_view dllName = L"";

protected:
//! DLLパスを返す
LPCWSTR GetDllNameImp(int index) override {
return dllName.empty() ? T::GetDllNameImp(index) : dllName.data();
}

public:
//! コンストラクタ
explicit TExtModule(std::wstring_view path = L"")
: dllName(path) {
// この関数の戻り値型はC++では推奨されない。
// あちこちで警告が出るとうっとおしいので呼出箇所をまとめておく
// 将来的には、適切な戻り値型に変更したい。
this->InitDll(nullptr);
}
};

/*!
外部DLLの読み込み失敗をテストするためのテンプレートクラス

CDllImp派生クラスを指定して使う。
DLL読み込み失敗をテストするために「あり得ないパス」を指定する。
*/
template<class T>
class TUnresolvedExtModule : public TExtModule<T> {
private:
// あり得ないパス
static constexpr auto& BadDllName = LR"(>\(^o^)\<)";

// 基底クラスの型
using Base = TExtModule<T>;

public:
TUnresolvedExtModule()
: Base(BadDllName) {
}
};

/*!
外部DLLの読み込み失敗をテストするためのテンプレートクラス

CDllImp派生クラスを指定して使う。
エクスポート関数のアドレス取得失敗をテストするためにMSHTMLを指定する。
MSHTMLは、Windowsには必ず存在していてサクラエディタでは使わないもの。
将来的にMSHTMLを使いたくなったら他のDLLを選定して定義を修正すること。
*/
template<class T>
class TUnsufficientExtModule : public TExtModule<T> {
private:
// サクラエディタでは利用しないWindowsのDLL名
static constexpr auto& UnusedWindowsDllName = L"MSHTML.DLL";

// 基底クラスの型
using Base = TExtModule<T>;

public:
TUnsufficientExtModule()
: Base(UnusedWindowsDllName) {
}
};
103 changes: 103 additions & 0 deletions tests/unittests/test-extmodules.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
/*! @file */
/*
Copyright (C) 2022, Sakura Editor Organization

This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
arising from the use of this software.

Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:

1. The origin of this software must not be misrepresented;
you must not claim that you wrote the original software.
If you use this software in a product, an acknowledgment
in the product documentation would be appreciated but is
not required.

2. Altered source versions must be plainly marked as such,
and must not be misrepresented as being the original software.

3. This notice may not be removed or altered from any source
distribution.
*/
#include <gtest/gtest.h>

#include "TExtModule.hpp"

#include <HtmlHelp.h> // CHtmlHelp.hで必要

#include "extmodule/CBregexpDll2.h"
#include "extmodule/CHtmlHelp.h"
//#include "extmodule/CIcu4cI18n.h" //継承不可なのでテストできない
//#include "extmodule/CMigemo.h" //TSingletonなのでテストできない
//#include "extmodule/CUchardet.h" //継承不可なのでテストできない
//#include "extmodule/CUxTheme.h" //TSingletonなのでテストできない
#include "macro/CPPA.h"
//#include "plugin/CDllPlugin.h" //継承不可なのでテストできない

/*!
外部DLLの読み込みテスト
*/
template <typename T>
class LoadTest : public ::testing::Test {
};

//! パラメータテストであるとマークする
TYPED_TEST_CASE_P(LoadTest);

/*!
読み込み失敗のテスト

DLLが見つからなくて失敗するケース
*/
TYPED_TEST_P(LoadTest, FailedToLoadLibrary)
{
// テスト対象のCDllImpl派生クラスをテストするための型を定義する
using ExtModule = TUnresolvedExtModule<TypeParam>;

// テストクラスをインスタンス化する
ExtModule extModule;

// DLLが見つからなくてIsAvailableはfalseになる
EXPECT_FALSE(extModule.IsAvailable());
}

/*!
読み込み失敗のテスト

エクスポート関数が取得できなくて失敗するケース
*/
TYPED_TEST_P(LoadTest, FailedToGetProcAddress)
{
// テスト対象のCDllImpl派生クラスをテストするための型を定義する
using ExtModule = TUnsufficientExtModule<TypeParam>;

// テストクラスをインスタンス化する
ExtModule extModule;

// エクスポート関数の一部が見つからなくてIsAvailableはfalseになる
EXPECT_FALSE(extModule.IsAvailable());
}

// test suiteを登録する
REGISTER_TYPED_TEST_SUITE_P(
LoadTest,
FailedToLoadLibrary, FailedToGetProcAddress);

/*!
テスト対象(外部DLLを読み込むクラス)

CDllImp派生クラスである必要がある。
*/
using ExtModuleImplementations = ::testing::Types<
CBregexpDll2,
CHtmlHelp,
CPPA>;

//! パラメータテストをインスタンス化する
INSTANTIATE_TYPED_TEST_SUITE_P(
ExtModule,
LoadTest,
ExtModuleImplementations);
2 changes: 2 additions & 0 deletions tests/unittests/tests1.vcxproj
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,7 @@
<ClCompile Include="test-crunningtimer.cpp" />
<ClCompile Include="test-csharedata.cpp" />
<ClCompile Include="test-czipfile.cpp" />
<ClCompile Include="test-extmodules.cpp" />
<ClCompile Include="test-printEFunctionCode.cpp" />
<ClCompile Include="test-cclipboard.cpp" />
<ClCompile Include="test-ccodebase.cpp" />
Expand Down Expand Up @@ -159,6 +160,7 @@
</ItemGroup>
<ItemGroup>
<ClInclude Include="eval_outputs.hpp" />
<ClInclude Include="TExtModule.hpp" />
<ClInclude Include="tests1_rc.h" />
</ItemGroup>
<ItemGroup>
Expand Down
6 changes: 6 additions & 0 deletions tests/unittests/tests1.vcxproj.filters
Original file line number Diff line number Diff line change
Expand Up @@ -169,6 +169,9 @@
<ClCompile Include="test-cppa.cpp">
<Filter>Test Files</Filter>
</ClCompile>
<ClCompile Include="test-extmodules.cpp">
<Filter>Test Files</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="StartEditorProcessForTest.h">
Expand All @@ -177,6 +180,9 @@
<ClInclude Include="eval_outputs.hpp">
<Filter>Other Files</Filter>
</ClInclude>
<ClInclude Include="TExtModule.hpp">
<Filter>Other Files</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClInclude Include="tests1_rc.h">
Expand Down