WindowsのPHPのCurlで”SSL certificate problem: unable to get local issuer certificate”

理由はよくわからないが解決法

https://raw.githubusercontent.com/bagder/ca-bundle/e9175fec5d0c4d42de24ed6d84a06d504d5e5a09/ca-bundle.crt

をダウンロードして何処かに置く。

php.iniを編集して以下を追加。

Google Testを使う

GoogleのC++用のテストフレームワーク。これを使うと何が嬉しいのか
・出力がきれい
・デフォルトでいろんなコマンドラインをつけてくれる
・コマンドラインでテストの制御ができる
・パラレルで実行できる(多分)

しかしGUIアプリの場合はテストは難しいのでここではスルー。テストはあくまで機能として分離がし易いものをテストする段階。付属のGoogleMockなどをつかって、Mockオブジェクトを作り分離させるために頑張る方法もあるのだろうがスルー。

実験

ここでは既存の自作テストプロジェクトをGoogleTestに置き換えていくことを想定。別に新規に追加しても良い。Windows, VS2013, C++/CLIプロジェクト

git submoduleで追加

ソリューションのフォルダで以下を実行して、googletestを持ってくる。べつにダウンロードしてもいい。

テストプロジェクトの設定

テストプロジェクトにgoogletestのソースコードを追加する。テストプロジェクトがなければコンソールアプリで作る。

まず、googletest\googletest\src\gtest-all.ccをプロジェクトのソースコードに追加。このファイルは必要なソースをincludeしてこのファイルだけで全部ビルドできる。

次にプロジェクトのインクルードパスに以下の2つを追加

これで準備が整ったのでmain.cpp(自分のファイル)にテストコードを書く。

InitGoogleTestは最初に書いたようにコマンドラインを処理してくれる。RUN_ALL_TESTSはこちらが定義したテストを実行する。今はまだ何も定義してない。

テストの定義

以下のように書く。

TESTマクロは2つの引数を取る。最初の引数はテストケースと呼ばれていて、テストを大きくカテゴライズしたもの、次の引数はそのカテゴリー内のテスト。1つのクラスをテストケースと考えてその中のメンバ関数をテスト名と考えてもいいかもしれない。

テストコード内でマクロを書く

テストコード内でテスト用のマクロを書く。これに引っかかるとテストに失敗するが、いろんな失敗のさせ方があるらしい。EXPECTは失敗しても続行の失敗(のはず)。ASSERTは失敗すると止める。

コマンドラインのチェック

ここで一旦コーディングをやめて、コマンドラインを試してみる。-hでヘルプを見れる。

–gtest_list_tests

オプション無しでテスト実行

GoogleTestをプロジェクトに追加しておくと、自分がテストするだけでなく、他人がプロジェクトの内容を知ることもできるし、実行ファイルを生成するので、どのように動くのかもわかって便利。

このようにテストをどんどん追加していくと、持つべきデータや初期化作業が共通化してくるので、これをFixtureと読んでおく。このFixture付きのテストがTEST_F。

TEST_F

以下の普通のTESTがあるとする。

これをTEST_Fに置き換えたのが以下。

TEST_Fの中でclassのインスタンスにアクセスできる。このクラスの初期化と終了処理はSetUpとTearDownのオーバーライドで行う。ちなみにこのクラスはテストごとに作られて、インスタンスは共通ではない。

まだ色々あるが終了。

Msys2 and ming-w64

msys2とming-w64が分かりづらいので少し調べた。

MSYS2

msys2はCygwinをベースにしていてmsys-2.0.dllがパスの切り替えやforkなど(多分)を行う。cygwinにはコマンドラインパッケージマネージャがないので、pacmanを有するmsys2の方がインストールがしやすい。

msys-2.0.dllに依存しない通常のexeをmsys2から起動するとパスの変換が行われる(コマンドラインの)。cygwinではこういうことは行われないようだ。

MINGW

Mingw-w64で一つの名前。Mingwの64ビットバージョンの意味ではない。これらはmsys2.0.dllに依存していないツールでWindows向けにビルドされたもの。
msys2でgccをインストールしようとすると以下の2つがある。

mingw-w64-i686-gcc
mingw-w64-x86_64-gcc

mingw-w64で一つの名前なのでi686が32bitでx86_64が64bitのgcc、これらをインストールするとそれぞれ/mingw32/binと/mingw64/binに置かれる。msys2をインストールすると、mingw32.exeとmingw64.exeができるが、この違いはパスの違いである。

これとは別のgccもあってそれはmsys2で動く実行ファイルを作るためのgcc。これはmsys2-develに含まれる。msys2.exeを起動すると上記パスに/mingw32などが含まれない。