
		TOPPERS/ASP3カーネル
		優先度継承ミューテックスのテスト

		対応バージョン: Release 3.7.0
		最終更新: 2022年9月25日

このドキュメントは，TOPPERS/ASP3カーネルの優先度継承ミューテックスのテ
ストの設計メモである。

優先度継承拡張パッケージの開発に伴い，優先度継承ミューテックスのテスト
を行う必要が生じたが，従来のミューテックス機能のテストが体系的でない面
があった，従来のミューテックス機能のテストも兼ねたものとして検討した。

○テストの目標と方針

優先度継承ミューテックスのテストを行うにあたって，次の2つの観点の網羅
度を考慮する。

(1) 統合仕様書のタグの網羅度（ブラックボックステスト）

統合仕様書の記述に基づいてテストする。統合仕様書の関連部分のすべてのタ
グを検討対象とする。ASP3カーネルおよびその優先度継承拡張で実装している
対象ソフトウェアの実装に対する要求事項については，すべてテストすること
を目指す。

(2) ソースコードの網羅度（ホワイトボックステスト）

ソースコードに基づいてテストする。ソースコードのC1カバレッジが100%にな
るようにする（実行されることのないパスを除く）。

ここでは，まず(1)の観点からテストを設計する。この際に，ソースコードの
構造を考慮する。例えば，ソースコード上で共通な処理は，まとめてテストす
る方針とする。

次に，カバレッジ測定ツールを使って，(2)の観点でカバレッジ100%が達成さ
れているかを確認する。100%になっていない場合には，テストを追加する。

○仕様書からのテスト

●テスト範囲

テスト対象の仕様は次の通りとする。

　・「4.4.5 ミューテックス」の節
　・chg_pri（ミューテックス関連仕様のみ）

●テスト対象とするタグ

・「4.4.5 ミューテックス」の節

	NGKI2007	仕様に対する一般要求事項
	NGKI2008	テスト対象外（他のテストで間接的にテスト）
	NGKI2009	ユーザに対する要求
	NGKI2010	→ test_inherit2
	NGKI2011	→ test_inherit2
	NGKI2012	テスト対象外（他のテストで間接的にテスト）
	NGKI2013	→ test_inherit1
	NGKI2014	→ 優先度制御のテスト
	NGKI2015	→ 優先度制御のテスト
	NGKI2016	→ 優先度制御のテスト
	NGKI2017	→ 優先度制御のテスト
	NGKI2018	→ 優先度制御のテスト
	NGKI2019	→ タスクの終了処理とそれによる優先度制御
	NGKI2020	→ test_inherit1
	NGKI2021	テスト対象外（他のテストで間接的にテスト）
	NGKI2025	→ pass2_obj1
	NGKI2032	→ pass2_cfg1
	NGKI5193	→ test_inherit2
	NGKI2033	→ test_inherit1
	NGKI2034	テスト対象外（他のテストで間接的にテスト）
	NGKI2037	→ pass2_obj1
	NGKI2067	テスト対象外（他のテストで間接的にテスト）
	NGKI2068	テスト対象外（他のテストで間接的にテスト）
	NGKI2069	テスト対象外（他のテストで間接的にテスト）
	NGKI2070	→ test_inherit1
	NGKI2071	→ test_inherit1
	NGKI2072	→ test_inherit1
	NGKI2074	→ test_inherit1
	NGKI2075	→ test_inherit1
	NGKI3609	→ test_inherit1
	NGKI2078	→ test_inherit1
	NGKI2079	→ test_inherit1
	NGKI3463	→ test_inherit1
	NGKI2080	→ test_inherit1
	NGKI2081	→ test_inherit1
	NGKI2082	→ test_inherit1
	NGKI2083	→ test_inherit1
	NGKI2085	→ test_inherit2
	NGKI2086	テスト対象外（他のテストで間接的にテスト）
	NGKI2087	→ test_inherit1
	NGKI2088	→ test_inherit1
	NGKI2089	→ test_inherit1
	NGKI3611	→ test_inherit2
	NGKI2091	→ test_inherit1
	NGKI2092	→ test_inherit1
	NGKI2093	→ test_inherit1
	NGKI2094	→ test_inherit1
	NGKI2095	→ test_inherit1
	NGKI2096	→ test_inherit1
	NGKI2098	テスト対象外（他のテストで間接的にテスト）
	NGKI2099	→ test_inherit1
	NGKI2100	→ test_inherit1
	NGKI2101	→ test_inherit1
	NGKI2104	→ test_inherit1
	NGKI2105	→ test_inherit1
	NGKI2106	→ test_inherit1
	NGKI2107	→ test_inherit1
	NGKI2108	テスト対象外（他のテストで間接的にテスト）
	NGKI2109	→ test_inherit1
	NGKI2110	→ test_inherit1
	NGKI2111	→ test_inherit1
	NGKI5207	→ test_inherit1
	NGKI2115	→ test_inherit1
	NGKI2116	→ test_inherit1

・chg_pri（ミューテックス関連仕様のみ）

	NGKI1194	→ chg_priによる優先度制御
	NGKI1195	→ chg_priによる優先度制御
	NGKI1196	→ chg_priによる優先度制御
	NGKI1197	→ chg_priによる優先度制御
	NGKI1201	→ test_inherit2

●test_inherit1

ミューテックス関連のサービスコールで振舞いの中で，優先度継承ミューテッ
クス1つだけでテストできるものをすべてテストする。

●test_inherit2

TA_NULL属性のミューテックス，TA_TPRI属性のミューテックス，優先度上限
ミューテックス，優先度継承ミューテックスを1つずつ用意し，振舞いの違い
をテストする。

また，優先度上限ミューテックスや，複数のミューテックスが必要なエラー条
件についてテストする。

●優先度制御のテスト

NGKI2014，NGKI2015，NGKI2016，NGKI2017，NGKI2018については，現在優先度
の変更が多くの処理で行われるため，処理毎にテストする必要がある。また，
優先度継承ミューテックスが拡張機能であることと，優先度上限ミューテック
スと優先度継承ミューテックスでは優先度制御の内容が大きく異なることから，
両者は別のプログラムでテストする方針とする。

・loc_mtx/ploc_mtxとunl_mtxによる優先度制御

優先度上限ミューテックスに対するloc_mtx/ploc_mtxとunl_mtxによる優先度
制御については，test_mutex4でテストされているため，新規には作成しない。
なお，test_mutex4で実施しているloc_mtxのE_ILUSEエラーのテストは，
test_inherit2と重複している。

優先度継承ミューテックスに対するloc_mtxとunl_mtxによる優先度制御につい
ては，test_inherit3でテストする。なお，優先度継承ミューテックスに対す
るploc_mtxでは，タスクの現在優先度の変更は起こらない。

・ini_mtxによる優先度制御

優先度上限ミューテックスに対するini_mtxによる優先度制御については，
test_mutex5でテストされているため，新規には準備しない。

優先度継承ミューテックスに対するini_mtxによる優先度制御については，
test_inherit4でテストする。

・タスクの待ち解除による優先度制御

優先度継承ミューテックスに対するロック待ち状態のタスクが，ミューテック
スをロックできた以外の理由で待ち解除される時には，ミューテックスをロッ
クしているタスクの優先度制御が必要である。この優先度制御については，
test_inherit5でテストする。

ロック待ち状態のタスクの待ち解除は，ロックできた以外では，rel_wai，
ras_ter，タスクの終了時，タイムアウト時に行われるが，これらはいずれも
共通の関数（wait_dequeue_wobj）で実装されているため，テストはrel_waiを
用いて行う。

優先度上限ミューテックスの場合は，この状況での優先度制御が必要ないため，
テストは行なっていない。

・タスクの終了処理とそれによる優先度制御

タスクの終了処理に関するテストとして，優先度制御に加えて，ロックしてい
るミューテックスのロック解除の仕様（NGKI2019）のテストを行う。優先度制
御については，タスクの待ち解除による優先度制御と，ミューテックスのロッ
ク解除による優先度制御を考える必要がある。

優先度上限ミューテックスに関しては，前節で述べた通り，タスクの待ち解除
による優先度制御は必要ない。タスクの終了（ext_tsk）時のロック解除とそ
れによる優先度制御についてはtest_mutex6で，タスクの強制終了（ter_tsk）
時のロック解除とそれによる優先度制御についてはtest_mutex7でテストされ
ているため，新規には準備しない。その他のサービスコールによるタスクの終
了についてはテストされていないが，これらは共通の関数（task_terminate）
で実装されているため，個別にテストする必要性は低いと考えられる。それに
もかかわず，ext_tskとter_tskを個別にテストしているのは，TOPPERS/ASPカー
ネルではこれらを個別に実装していたためである（テストプログラムはそのま
ま活用している）。

なお，test_mutex6では，タスクの優先順位の回転（rot_rdq）についても
テストを行なっている。

優先度継承ミューテックスに関しては，タスクの終了処理（task_terminate）
時のタスクの待ち解除による優先度制御については，test_inherit5でテスト
したことになっている。ロック解除とそれによる優先度制御については，
test_inherit6でテストする。

タスクの終了処理は，ext_tsk，ras_ter，ena_ter，ter_tsk，ena_dsp，
chg_ipmで行われるが，これらはいずれも共通の関数（task_terminate）で実
装されているため，テストは，自タスクの終了はext_tsk，他タスクの終了は
ter_tskを用いて行う。

・chg_priによる優先度制御

chg_priによる優先度制御に関するテストとして，NGKI1194，NGKI1195，
NGKI1196，NGKI1197と，対象タスクが優先度継承ミューテックス待ち状態であっ
た場合の推移的な優先度継承に伴う優先度制御を考える必要がある。

NGKI1194，NGKI1195，NGKI1196が適用される条件は，「chg_priを発行した結
果，対象タスクの現在優先度が変化する場合と，対象タスクの現在優先度が上
昇していない場合」であるため，「対象タスクの現在優先度が変化する場合」
と「対象タスクの現在優先度が上昇状態にない場合」を個別にテストする。

優先度上限ミューテックスに関連するchg_priによる優先度制御については，
test_mutex8でテストされているため，新規には準備しない。

優先度継承ミューテックスに関連するchg_priによる優先度制御については，
test_inherit7でテストする。

○ソースコードカバレッジの確認

●テスト範囲

テスト対象のサービスコール／関数は次の通りとする。

　・loc_mtx，ploc_mtx，tloc_mtx
　・unl_mtx
　・ini_mtx
　・ref_mtx
　・chg_pri（ミューテックス関連部分のみ）
　・wait_dequeue_wobj（ミューテックス関連部分のみ）
　・task_terminate（ミューテックス関連部分のみ）

上記のサービスコールの下請け関数（task.c，wait.cなどに含まれる関数）で，
ミューテックス機能以外と共通のものには，基本的には踏み込まない。

●カバレッジ計測

カバレッジ計測ツール（gcov）を用いて，ここまでのテストプログラムのソー
スカバレッジ（C1カバレッジ）を計測したところ，以下のパスが通っていない
ことがわかった。以下では通っていないパスと，必要な場合には対策について
述べる。

・remove_mutex

remove_mutexで，「return(false)」を通るパス。このパスは，remove_mutex
をunl_mtxから呼ぶように拡張した場合（extension.txtを参照）に使うもので
ある。拡張しない場合には，このパスを通ることはない。そのため，対策は不
要である。

・loc_mtx，tloc_mtxのE_RASTERエラー

タスク終了が要求された状態でloc_mtx，tloc_mtxが呼ばれた場合に，
E_RASTERエラーを返すパスが実行されていない。test_inherit1に，このパス
を通るテストを追加する。

・tloc_mtxのE_TMOUTエラー

ミューテックスがロックされた状態で，tmoutをTMO_POLとしてtloc_mtxが呼ば
れた場合に，E_TMOUTエラーを返すパスが実行されていない。test_inherit1に，
このパスを通るテストを追加する。

・chg_priのE_ILUSEエラー

chg_priのE_ILUSEエラーの検出処理で，通っていない基本ブロックがあるが，
状況が不明。

以上
