Code Composer StudioでCppUTestを試す

追記：2013年11月7日：スタックとヒープの設定を追記した。少なすぎると実機で動作しない。

#CppUTestを使ってみる
テストフレームワークの一つであるCppUTestを実機で動作させてみる。
ターゲットはTI社製Cortex-M4を搭載したStellaris Launchpad LM4F120（￥550で売ってたヤツ）で、開発環境はTI社謹製のCode Composer Studio v5（以下、CCS）でやってみる。
CCSを起動し、Workspaceに適当な名前（ここではworkspace_LM4F120_CppUTestとした）を入れてOKを押下。
![image001.png](https://qiita-image-store.s3.amazonaws.com/0/21786/f7f5ab6f-82eb-47f9-81dd-50b83ae1b3ce.png)
#ライブラリの生成
##プロジェクトの作成
まず、CppUTestライブラリを生成するプロジェクトを作成する。
File => New => CCS Projectで新規プロジェクトを作成する。

| Description | comment |
|:------------:|:------------:|
| Project name | 何でもいいと思うがここではCppUTestとした |
| Output type | ライブラリ形式なのでStatic Libraryを選択 |
| Use default location | 今回はソースコードを分離しないのでチェックしたまま |
| Variant | 左に120hと入力で絞り込みでき、LM4F120H5QRを選択 |
| Project templates | Empty Projectを選択 |

入力が完了したらFinishを押下。
![image003.png](https://qiita-image-store.s3.amazonaws.com/0/21786/179001f5-1683-c54d-f565-0428343e2f9c.png)
##UppUTestのインポート
プロジェクトを右クリック（もしくはプロジェクトを選んでFileメニュー）からImportでImportダイアログを開く。General⇒File Systemを選んでNextをクリック。Browseを押下してCppUTestディレクトリを指定してOKを押下。
![image005.png](https://qiita-image-store.s3.amazonaws.com/0/21786/3fdc117d-c2ba-e214-cb59-8da5c04e7ef2.png)
次のようにインポートするインクルードファイルとソースファイルを指定する。PlatformsはインクルードではGcc、ソースファイルではIarを選ぶ。なお、ソースファイルに含まれる拡張子dspのような不要なファイルは組み込まない。Finishをクリックしてインポートを実行する。
![image007.png](https://qiita-image-store.s3.amazonaws.com/0/21786/85781c7b-d578-fa40-5b57-e0ab9d514c25.png)
インポート後のプロジェクトは次のようになる。
![image009.png](https://qiita-image-store.s3.amazonaws.com/0/21786/5021689a-4f97-49c4-a1f5-1b10d3cd77d3.png)
##プロジェクトの設定
まずインクルードディレクトリを指定する。プロジェクトを右クリック（もしくはプロジェクトを選択してFileメニュー）からPropertiesを選択し、プロパティダイアログを表示する。左のツリービューからBuild⇒ARM Compiler⇒Include Optionsを選択し、右下のディレクトリサーチ追加ペインにあるAddボタンをクリックし、Workspaceボタンから参照して次のようにプロジェクト内のインクルードパスを指定する。
![image011.png](https://qiita-image-store.s3.amazonaws.com/0/21786/74fcf1d1-3138-da1d-4e5d-1883c353b912.png)
OKを押下すると次のようなディレクトリ指定となるので更にOKを押下する。
![image013.png](https://qiita-image-store.s3.amazonaws.com/0/21786/40f92a1c-48b2-6075-cb94-c81883c94a8b.png)
ディレクトリパスに追加されていることを確認する。
![image015.png](https://qiita-image-store.s3.amazonaws.com/0/21786/2b71252f-ca72-a721-af0d-c1e719a60acc.png)
続けてシンボル定義をしておく。同じプロパティダイアログのツリービューからBuild⇒ARM Compiler⇒Advanced Options⇒Predefined Symbolsを選択し、右上のPre-define NAMEペインのAddボタンをクリックし、次のようにシンボル「_LIB」を定義する。
![image017.png](https://qiita-image-store.s3.amazonaws.com/0/21786/9e6ea1f7-72fe-2aa3-0562-79361c39b058.png)
追加されていることを確認する。
![image019.png](https://qiita-image-store.s3.amazonaws.com/0/21786/d2b4cf7a-216e-4dd6-6fbb-d08d495565bb.png)
最後に言語オプションで例外ハンドリングを有効にする。同じプロパティダイアログのツリービューからBuild⇒ARM Compiler⇒Advanced Options⇒Language Optionsを選択し、Enable C++ exception handling(--exceptions)にチェックを入れ、OKボタンをクリックする。
![image021.png](https://qiita-image-store.s3.amazonaws.com/0/21786/cec21954-8c05-0920-a1cf-e9831306660f.png)
開発環境の違いによりtolower()関数が定義されているヘッダファイルが異なっているので、プロジェクトのsrc/Platforms/Iar/UtestPlatform.cppを開き、インクルードファイルにctype.hを追加する。

```c:UtestPlatform.cpp
#include <ctype.h>
```

##ビルド
ビルドを実行（別段の理由が無ければCtrl+Bでよい）し、ライブラリCppUTest.libが生成する。ライブラリファイルはDebug（設定によりRelease）以下に生成される。
![image023.png](https://qiita-image-store.s3.amazonaws.com/0/21786/1d4a9598-b560-ddb2-458f-a8aa060a0ff6.png)
#テストケースの実装
##プロジェクトの作成
続いてテストケースを実装してみる。今回は簡単のため同じワークスペース上でテストケースを実装する。File => New => CCS Projectで新規プロジェクトを作成する。

| Description | comment |
|:------------:|:------------:|
| Project name | 何でもいいと思うがここではLab2とした |
| Output type | 実行形式なのでExecutableを選択 |
| Use default location | 今回はソースコードを分離しないのでチェックしたまま |
| Variant | 左に120hと入力で絞り込みでき、LM4F120H5QRを選択 |
| Connection | Stellaris In-Circuit Debug Interfaceを選択 |
| Project templates | Empty Project (with main.c)を選択 |

入力が完了したらFinishを押下。
![image025.png](https://qiita-image-store.s3.amazonaws.com/0/21786/27ba8324-e456-fa3a-e74a-a9db942a85b8.png)
CppUTestなので自動生成されたmain.cをmain.cppにリネームしておく。
![image027.png](https://qiita-image-store.s3.amazonaws.com/0/21786/929b9345-accb-c89c-d745-2384c8f31e5a.png)
##インクルードパスの指定
インクルードディレクトリの指定をライブラリの時とおなじ要領で設定する。同じワークスペース上にあるときはWorkspaceボタンを押下して次のように設定すれば良い。なお、ワークスペース内に無いときはFile Systemで指定する。
![image029.png](https://qiita-image-store.s3.amazonaws.com/0/21786/94843502-8d67-0ffa-f44b-79111b36d027.png)
##ライブラリの指定
Build⇒ARM Linker⇒File Search Pathを選び右上のInclude library fileペインでAddボタンを押下し、CppUTest.libを指定する。なお、次画面は指定後の画面。
![image031.png](https://qiita-image-store.s3.amazonaws.com/0/21786/1b7b3bcd-a387-ecb1-07b1-6fe856eaacbb.png)
Addボタンを押下するとAdd file pathダイアログが開くのでWorkspaceボタンを押下し、次のようにワークスペース内にある事前に作成したライブラリを指定する。
![image033.png](https://qiita-image-store.s3.amazonaws.com/0/21786/b5a5eed3-ac24-3ff3-3b84-9930d9a87b39.png)
確認してOKボタンを押下する。
![image035.png](https://qiita-image-store.s3.amazonaws.com/0/21786/cfefaf5c-06c2-55a4-dce3-1ab8686a26be.png)
##テストケースの実装
今回の例ではメイン関数にテストケースを直接コーディングして動作を確認する。

```c:main.cpp
#include <CppUTest/CommandLineTestRunner.h>
#include <CppUTest/TestHarness.h>

/* … */

int main()
{
	/* … */
	static char *argv[] = { "main" };
	CommandLineTestRunner::RunAllTests(sizeof(argv)/sizeof(*argv), argv);
	/* … */
}

int hoge(void)
{
	return 3;
}

int hoge(int a)
{
	return a+1;
}

TEST_GROUP(TestSuiteHoge)
{};

TEST(TestSuiteHoge, TestCaseHoge)
{
	LONGS_EQUAL(3, hoge());
}

TEST(TestSuiteHoge, TestCaseHoge2)
{
	LONGS_EQUAL(3, hoge(2));
}
```

##スタックとヒープの設定
CppUTestのテストを実行するには一定以上のスタックサイズとヒープサイズが必要になる。正確に見積もりしていないが、ここではスタックサイズ2KB、ヒープサイズ8KBを指定した。Build⇒ARM Linker⇒Basic Optionsを選び、Set C system stack sizeに2048、Heap Size for C/C++ dynamic memory allocationに8192を指定する。
![image037.png](https://qiita-image-store.s3.amazonaws.com/0/21786/1f3cee59-d6b5-16c9-d004-c02963e41bd7.png)

##結果をコンソール出力
Debug ConfigurationsのMainタブにあるUse the same console for CIO all CPUsにチェックマークを入れておくと、CIOをコンソールに出力してくれる。
![image039.png](https://qiita-image-store.s3.amazonaws.com/0/21786/ae18a9f9-1fd9-088a-cebf-98b1ab887a32.png)

##実行結果
実行結果はこの通り。
![image041.png](https://qiita-image-store.s3.amazonaws.com/0/21786/f42b5020-d5bf-e9b8-787a-3ce87195395c.png)