
		TOPPERS/ASP3カーネル
		サブ優先度機能のテスト

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

このドキュメントは，TOPPERS/ASP3カーネルのサブ優先度機能のテストの設計
メモである。

サブ優先度機能拡張パッケージを網羅的にテストすることを目的に設定する。

○テスト方針の目標と設計

サブ優先度機能のテストを設計するにあたって，次の2つの観点の網羅度を考
慮する。

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

統合仕様書の記述に基づいてテストする。統合仕様書の関連部分のすべてのタ
グを検討対象とする。ASP3カーネルのサブ優先度機能拡張パッケージで実装し
ている「対象ソフトウェアの実装に対する要求事項」については，すべてテス
トすることを目指す。

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

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

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

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

○統合仕様書のテスト対象タグ（統合仕様書の掲載順）

・スケジューリング規則

	NGKI0558	仕様に対する一般要求事項
	NGKI0559	テスト対象外（他のテストで間接的にテスト）
	NGKI0560	→ (E)
	NGKI0561	→ (E)

・サブ優先度の初期値
	NGKI3681	→ (A)

・chg_pri（サブ優先度機能関連仕様のみ）
	NGKI1194	→ (I)
	NGKI1195	→ (I)
	NGKI1196	→ (I)
	NGKI1197	→ (I)

・chg_spr
	NGKI3665	テスト対象外（他のテストで間接的にテスト）
	NGKI3666	→ (C)
	NGKI3667	→ (C)
	NGKI3669	→ (C)
	NGKI3672	→ (D)
	NGKI3673	→ (J)
	NGKI3674	→ (D)

・ref_tsk（サブ優先度機能関連仕様のみ）
	NGKI3662	→ (F)

・優先度上昇状態におけるスケジューリング規則
	NGKI5219	→ (E)

・ミューテックス機能による優先度変更（サブ優先度機能関連のみ）
	NGKI2015	→ (H)
	NGKI2016	→ (H)
	NGKI2017	→ (H)
	NGKI2018	→ (H)

・rot_rdq（サブ優先度機能関連仕様のみ）
	NGKI3663	→ (G)

・ENA_SPR
	NGKI3675	テスト対象外（他のテストで間接的にテスト）
	NGKI3678	→ pass2_subprio1
	NGKI3679	→ (B)
	NGKI3680	テスト対象外（他のテストで間接的にテスト）

○テスト項目

ここでのテスト対象はサブ優先度機能であるため，テスト対象タスクの優先度
が，サブ優先度を使用すると設定されている場合に絞ってテストするという考
え方もできる。そうでない場合のテストは，ベースパッケージのテストでカバー
されているためである。しかし，この観点のテストでは，ある優先度をサブ優
先度を使用すると設定した結果，すべての優先度でサブ優先度を使用してしま
うような不具合が検出できない。そこでここでは，テスト対象タスクの優先度
が，サブ優先度を使用すると設定されていない場合についても，サブ優先度が
使用されていないことを確認するための最低限のテストを行う。

(A) サブ優先度の初期化
	(A-1) タスクの生成時にUINT_MAXに初期化されること［NGKI3681］
	(A-2) タスクの終了と起動で変更されないこと

(B) ENA_SPRの機能［NGKI3679］
	(B-1) ENA_SPRによりサブ優先度を使用する優先度を1つ設定できること
	(B-2) ENA_SPRによりサブ優先度を使用する優先度を複数設定できること

(C) chg_sprの静的エラー
	(C-1) 非タスクコンテキストからの呼出し［NGKI3666］
	(C-2) CPUロック状態からの呼出し［NGKI3667］
	(C-3) tskidが有効範囲外（小さすぎる）［NGKI3669］
	(C-4) tskidが有効範囲外（大きすぎる）［NGKI3669］

(D) chg_sprの基本機能［NGKI3672］
  (D-1) 対象タスクの優先度が，サブ優先度を使用すると設定されている場合
	(D-1-1) 自タスクに対するchg_spr（TSK_SELFを使用）で，自タスクのサ
			ブ優先度が変更されること［NGKI3674］
	(D-1-2) 自タスクに対するchg_spr（自タスクのIDを使用）で，自タスク
			のサブ優先度が変更されること
	(D-1-3) 実行可能状態のタスクに対するchg_sprで，対象タスクのサブ優
			先度が変更されること
	(D-1-4) 実行できない状態のタスクに対するchg_sprで，対象タスクのサ
			ブ優先度が変更されること
	(D-1-5) 休止状態のタスクに対するchg_sprで，対象タスクのサブ優先度
			が変更されること
  (D-2) 対象タスクの優先度が，サブ優先度を使用すると設定されていない場
		合
	(D-2-1) 自タスクに対するchg_spr（TSK_SELFを使用）で，自タスクのサ
			ブ優先度が変更されること［NGKI3674］
	(D-2-2) 自タスクに対するchg_spr（自タスクのIDを使用）で，自タスク
			のサブ優先度が変更されること
	(D-2-3) 実行可能状態のタスクに対するchg_sprで，対象タスクのサブ優
			先度が変更されること
	(D-2-4) 実行できない状態のタスクに対するchg_sprで，対象タスクのサ
			ブ優先度が変更されること
	(D-2-5) 休止状態のタスクに対するchg_sprで，対象タスクのサブ優先度
			が変更されること

(E) タスクが実行できる状態に遷移した時の優先順位［NGKI0560］
  (E-1) タスクの優先度が，サブ優先度を使用すると設定されている場合
	(E-1-1) 同優先度の他のタスクよりサブ優先度が高い場合に，そのタスク
			より優先順位が高くなること（タスク切換えが起こる場合）
	(E-1-2) 同優先度の他のタスクよりサブ優先度が高い場合に，そのタスク
			より優先順位が高くなること（タスク切換えが起こらない場合）
	(E-1-3) 同優先度の他のタスクと同じサブ優先度の場合に，そのタスクよ
			り優先順位が低くなること［NGKI0561］
	(E-1-4) 同優先度の他のタスクよりサブ優先度が低い場合に，そのタスク
			より優先順位が低くなること
	(E-1-5) 優先度上昇状態である場合に，同優先度のサブ優先度0のタスク
			よりも優先順位が低く，他の同優先度のタスクよりも優先度が高
			くなること［NGKI5219］
  (E-2) タスクの優先度が，サブ優先度を使用すると設定されていない場合
	(E-2-1) 同優先度の他のタスクよりサブ優先度が高い場合に，サブ優先度
			に関係なく，そのタスクより優先順位が低くなること［NGKI0561］

(F) ref_tskによるサブ優先度の参照
	(F-1) ref_tskによりサブ優先度を参照できること［NGKI3662］

(G) rot_rdqのE_ILUSEエラー
	(G-1) 対象優先度がサブ優先度を使用すると設定されている場合には，
		  E_ILUSEエラーとなること［NGKI3663］
	(G-2) 対象優先度がサブ優先度を使用すると設定されていない場合には，
		  エラーとならないこと

(H) ミューテックス機能による優先順位制御

ミューテックス機能による優先順位制御は，ミューテックス機能によりタスク
の現在優先度が変化する場合と，サブ優先度が使われる状況で優先度上昇状態
であるか否かが変化する場合に行われる。

優先度継承ミューテックスをサポートしない場合には，ミューテックス機能に
よりタスクの現在優先度が変化する可能性があるのは，タスクが優先度上限
ミューテックスをロックする時と，ロック解除する時である。

優先度上限ミューテックスをロックする状況は，次の2つである。

　・loc_mtx／ploc_mtx／tloc_mtx：自タスクが優先度上限ミューテックスを
	ロックし，そのまま実行を継続するため，NGKI2015が適用される。いずれ
	も，ロック処理はmutex_acquire関数で行われる。

　・unl_mtx／タスクの終了処理：対象優先度上限ミューテックスのロック待
	ち状態のタスクが，ロックにを行い，実行できる状態に遷移するため，
	NGKI2016が適用される。いずれも，ロック処理はmutex_release関数で行
	われる。

優先度上限ミューテックスをロック解除する状況は，次の3つである。

　・unl_mtx：自タスクが対象優先度上限ミューテックスをロック解除し，そ
	のまま実行できる状態を継続するため，NGKI2015が適用される。ロック解
	除処理は，unl_mtx関数で行われる。

　・ini_mtx：対象優先度上限ミューテックスをロックしていたタスクが，ロッ
	ク解除する。ロック解除するタスクの状態は変化しないため，実行できる
	状態であった場合はNGKI2015が，待ち状態でタスクの優先度順の待ち行列
	につながれている場合にはNGKI2017とNGKI2018が適用される。ロック解除
	処理は，ini_mtx関数で行われる。

　・タスクの終了処理：対象タスクが優先度上限ミューテックスをロック解除
	し，終了する。終了したタスクの優先順位は管理する必要がないため，適
	用される仕様はない。ロック解除処理は，task_terminate関数で行われる。

優先度上昇状態であるか否かが変化する可能性があるのも，タスクが優先度上
限ミューテックスをロックする時とロック解除する時で，現在優先度が変化す
る可能性があるのと同じである。

以上より，ミューテックス機能による優先順位制御が必要な箇所が4つに絞ら
れた。ただし，ini_mtxについては，ロック解除するタスクが実行できる状態
であった場合と，待ち状態でタスクの優先度順の待ち行列につながれている場
合を分けて，5つと考える。

さらに，対象タスクの優先度がサブ優先度を使用すると設定されている場合と
いない場合を分ける。ただし，NGKI2017とNGKI2018は，サブ優先度の影響を受
けないため，ini_mtxでロック解除するタスクが待ち状態でタスクの優先度順
の待ち行列につながれている場合は，サブ優先度を使用すると設定されている
場合のみにおいて，サブ優先度が使用されないことのみをテストする。

以上より，以下の(H-1)〜(H-9)の9つの観点でテストを設計する。

  (H-1) loc_mtx／ploc_mtxで優先度上限ミューテックスをロックしたことに
		よる自タスクの優先順位の制御（対象タスクの優先度が，サブ優先度
		を使用すると設定されている場合）
	(H-1-1) 自タスクの現在優先度が上がり，上がった優先度内でサブ優先度
			0の中の最高優先順位になること
	(H-1-2) 自タスクの現在優先度はそのままで，あらたに優先度上昇状態に
			なったため，サブ優先度0の中の最高優先順位になること
	(H-1-3) 自タスクの現在優先度がそのままで，優先度上昇状態が続くため
			に，サブ優先度0の中での優先順位が変わらないこと
  (H-2) loc_mtx／ploc_mtxで優先度上限ミューテックスをロックしたことに
		よる自タスクの優先順位の制御（対象タスクの優先度が，サブ優先度
		を使用すると設定されていない場合）
		＊(H-1-1)〜(H-1-3)のいずれの状況も，サブ優先度を使用すると設定
		  されていない場合にも同じ振舞いとなり，使用していないことが区
		  別できない．そのため，テスト対象から外す．
  (H-3) unl_mtxの結果，他タスクが優先度上限ミューテックスをロックした
		ことによるロックしたタスクの優先順位の制御（対象タスクの優先度
		が，サブ優先度を使用すると設定されている場合）
	(H-3-1) ロックしたタスクの現在優先度が上がり，上がった優先度内でサ
			ブ優先度0の中の最低優先順位になること
	(H-3-2) ロックしたタスクの現在優先度はそのままで，サブ優先度0の中
			の最低優先順位になること
  (H-4) unl_mtxの結果，他タスクが優先度上限ミューテックスをロックした
		ことによるロックしたタスクの優先順位の制御（対象タスクの優先度
		が，サブ優先度を使用すると設定されていない場合）
	(H-4-1) ロックしたタスクの現在優先度が上がり，上がった優先度内でサ
			ブ優先度に関係なく最低優先順位になること
  (H-5) unl_mtxで優先度上限ミューテックスをロック解除したことによる自
		タスクの優先順位の制御（対象タスクの優先度が，サブ優先度を使用
		すると設定されている場合）
	(H-5-1) 自タスクの現在優先度が下がり，下がった優先度内で元のサブ優
			先度の中の最高優先順位になること（ディスパッチが起こる場合）
	(H-5-2) 自タスクの現在優先度が下がり，下がった優先度内で元のサブ優
			先度の中の最高優先順位になること（ディスパッチが起こらない
			場合）
	(H-5-3) 自タスクの現在優先度がそのままで，優先度上昇状態でなくなっ
			たために，元のサブ優先度の中の最高優先順位になること（ディ
			スパッチが起こる場合）
	(H-5-4) 自タスクの現在優先度がそのままで，優先度上昇状態でなくなっ
			たために，元のサブ優先度の中の最高優先順位になること（ディ
			スパッチが起こらない場合）
	(H-5-5) 自タスクの現在優先度がそのままで，優先度上昇状態が続くため
			に，サブ優先度0の中での優先順位が変わらないこと
  (H-6) unl_mtxで優先度上限ミューテックスをロック解除したことによる自
		タスクの優先順位の制御（対象タスクの優先度が，サブ優先度を使用
		すると設定されていない場合）
	(H-6-1) 自タスクの現在優先度が下がり，下がった優先度内でサブ優先度
			に関係なく最高優先順位になること
  (H-7) ini_mtxで優先度上限ミューテックスを初期化したことによるロック
		解除したタスクの優先順位の制御（ロックしたタスクが実行できる状
		態の場合。対象タスクの優先度が，サブ優先度を使用すると設定され
		ている場合）
	(H-7-1) ロック解除したタスクの現在優先度が下がり，下がった優先度内
			で元のサブ優先度の中の最高優先順位になること（ディスパッチ
			が起こる場合）
	(H-7-2) ロック解除したタスクの現在優先度が下がり，下がった優先度内
			で元のサブ優先度の中の最高優先順位になること（ディスパッチ
			が起こらない場合）
	(H-7-3) ロック解除したタスクの現在優先度がそのままで，優先度上昇状
			態でなくなったために，元のサブ優先度の中の最高優先順位にな
			ること（ディスパッチが起こる場合）
	(H-7-4) ロック解除したタスクの現在優先度がそのままで，優先度上昇状
			態でなくなったために，元のサブ優先度の中の最高優先順位にな
			ること（ディスパッチが起こらない場合）
	(H-7-5) ロック解除したタスクの現在優先度がそのままで，優先度上昇状
			態が続くために，サブ優先度0の中での優先順位が変わらないこと
  (H-8) ini_mtxで優先度上限ミューテックスを初期化したことによるロック
		解除したタスクの優先順位の制御（ロックしたタスクが実行できる状
		態の場合。対象タスクの優先度が，サブ優先度を使用すると設定され
		ていない場合）
	(H-8-1) ロック解除したタスクの現在優先度が下がり，下がった優先度内
			でサブ優先度に関係なく最高優先順位になること
  (H-9) ini_mtxで優先度上限ミューテックスを初期化したことによるロック
		解除したタスクの優先順位の制御（ロックしたタスクが待ち状態でタ
		スクの優先度順の待ち行列につながれている場合。対象タスクの優先
		度が，サブ優先度を使用すると設定されている場合）
	(H-9-1) ロック解除したタスクの現在優先度が下がり，待ち行列の中での
			順序が，サブ優先度に関係なく，下がった優先度内で最後になる
			こと［NGKI2017］［NGKI2018］
	(H-9-2) ロック解除したタスクの現在優先度がそのままで，優先度上昇状
			態でなくなったために，待ち行列の中での順序が，サブ優先度に
			関係なく，同優先度内で最後になること［NGKI2017］［NGKI2018］
	(H-9-3) ロック解除したタスクの現在優先度がそのままで，優先度上昇状
			態が続くために，待ち行列の中での順序が，サブ優先度に関係な
			く，変わらないこと

(I) chg_priによる優先順位制御

chg_priによる優先順位制御（NGKI1194，NGKI1195，NGKI1196）は，対象タス
クの現在優先度が変化する場合と，対象タスクが優先度上昇状態でない場合に
行われる。これらの条件を満たさない場合は，優先順位は変更されない
（NGKI1197）。

優先度継承ミューテックスをサポートしない場合には，対象タスクの現在優先
度が変化するのは，優先度上限ミューテックスをロックしていない場合，すな
わち，優先度上昇状態でない場合のみである。よって，「現在優先度が変化す
る」と「優先度上昇状態でない」の2つの条件は一致する。

chg_priによる優先順位制御には，対象タスクが実行できる状態の場合には
NGKI1194が，待ち状態でタスクの優先度順の待ち行列につながれている場合に
はNGKI1195とNGKI1196が適用される。実行できる状態を，実行状態の場合（す
なわち，対象タスクが自タスクの場合）と実行可能状態の場合に分けてテスト
する方法もあるが，ソースコード上は処理に違いがないため，ここでは分けな
いことにする。

以上より，対象タスクが「実行できる状態の場合」と「待ち状態でタスクの優
先度順の待ち行列につながれている場合」，対象タスクが優先度上昇状態の場
合とそうでない場合，対象タスクの優先度がサブ優先度を使用すると設定され
ている場合といない場合の組み合わせを網羅すると，8つの組み合わせが考え
られる。

ただし，優先度上昇状態の場合は優先順位制御を行わないため，サブ優先度を
使用すると設定されているか否かは関係しない。そこで，「優先度上昇状態で
あり，優先度がサブ優先度を使用すると設定されていない場合」は除外する。
また，NGKI1195とNGKI1196は，サブ優先度の影響を受けないため，対象タスク
が待ち状態でタスクの優先度順の待ち行列につながれている場合は，サブ優先
度を使用すると設定されている場合のみにおいて，サブ優先度が使用されない
ことのみをテストする。

以上より，以下の(I-1)〜(I-5)の5つの観点でテストを設計する。

  (I-1) 対象タスクが実行できる状態で，優先度上昇状態でなく，優先度がサ
	 	ブ優先度を使用すると設定されている場合
	(I-1-1) 同優先度の他のタスクよりサブ優先度が高い場合に，そのタスク
			より優先順位が高くなること（タスク切換えが起こる場合）
	(I-1-2) 同優先度の他のタスクよりサブ優先度が高い場合に，そのタスク
			より優先順位が高くなること（タスク切換えが起こらない場合）
	(I-1-3) 同優先度の他のタスクと同じサブ優先度の場合に，そのタスクよ
			り優先順位が低くなること［NGKI1194］
	(I-1-4) 同優先度の他のタスクよりサブ優先度が低い場合に，そのタスク
			より優先順位が低くなること
  (I-2) 対象タスクが実行できる状態で，優先度上昇状態でなく，優先度がサ
	 	ブ優先度を使用すると設定されていない場合
	(I-2-1) 同優先度の他のタスクよりサブ優先度が高い場合に，サブ優先度
			に関係なく，そのタスクより優先順位が低くなること［NGKI1194］
  (I-3) 対象タスクが実行できる状態で，優先度上昇状態であり（すなわち，
	 	現在優先度が変化せず），優先度がサブ優先度を使用すると設定され
	 	ている場合
	(I-3-1) 優先順位が変わらないこと［NGKI1197］
  (I-4) 対象タスクが待ち状態でタスクの優先度順の待ち行列につながれてい
		る場合で，優先度上昇状態でなく，優先度がサブ優先度を使用すると
		設定されている場合
	(I-4-1) 対象タスクの待ち行列の中での順序が，サブ優先度に関係なく，
			同優先度内で最後になること［NGKI1195］［NGKI1196］
  (I-5) 対象タスクが待ち状態でタスクの優先度順の待ち行列につながれてい
		る場合で，優先度上昇状態であり（すなわち，現在優先度が変化せ
		ず），優先度がサブ優先度を使用すると設定されている場合
	(I-5-1) 待ち行列の中での順番が変わらないこと［NGKI1197］

(J) chg_sprによる優先順位制御

chg_sprによる優先順位制御（NGKI3673）は，対象タスクが実行できる状態で，
対象タスクの現在優先度がサブ優先度を使用すると設定されており，対象タス
クが優先度上昇状態でない場合に行われる。

そこで，この3つの条件がすべて満たされる場合と，それぞれの条件が満たさ
れない場合（他の2条件は満たされる）の4つの場合を考えることにする。対象
タスクが実行できる状態でない場合として，待ち状態でタスクの優先度順の待
ち行列につながれている場合を用いる。

  (J-1) 対象タスクが実行できる状態で，優先度上昇状態でなく，優先度がサ
	 	ブ優先度を使用すると設定されている場合
	(J-1-1) 同優先度の他のタスクよりサブ優先度が高くなる場合に，そのタ
			スクより優先順位が高くなること（タスク切換えが起こる場合）
	(J-1-2) 同優先度の他のタスクよりサブ優先度が高くなる場合に，そのタ
			スクより優先順位が高くなること（タスク切換えが起こらない場
			合）
	(J-1-3) 同優先度の他のタスクと同じサブ優先度になる場合に，そのタス
			クより優先順位が低くなること（タスク切換えが起こる場合）
			［NGKI3673］
	(J-1-4) 同優先度の他のタスクと同じサブ優先度になる場合に，そのタス
			クより優先順位が低くなること（タスク切換えが起こらない場合）
			［NGKI3673］
	(J-1-5) 同優先度の他のタスクよりサブ優先度が低くなる場合に，サブ優
			先度が変更され，そのタスクより優先順位が低くなること（タス
			ク切換えが起こる場合）
	(J-1-6) 同優先度の他のタスクよりサブ優先度が低くなる場合に，サブ優
			先度が変更され，そのタスクより優先順位が低くなること（タス
			ク切換えが起こらない場合）
  (J-2) 対象タスクが実行できる状態で，優先度上昇状態でなく，優先度がサ
	 	ブ優先度を使用すると設定されていない場合
	(J-2-1) 同優先度の他のタスクよりサブ優先度が高い場合に，サブ優先度
			に関係なく，そのタスクより優先順位が低くなること
  (J-3) 対象タスクが実行できる状態で，優先度上昇状態であり，優先度がサ
	 	ブ優先度を使用すると設定されている場合
	(J-3-1) 優先順位が変わらないこと
  (J-4) 対象タスクが待ち状態でタスクの優先度順の待ち行列につながれてい
		る場合で，優先度上昇状態でなく，優先度がサブ優先度を使用すると
		設定されている場合
	(J-4-1) 対象タスクの待ち行列の中での順序が変わらないこと

○テストプログラム

以上のテスト項目を，3つのテストプログラムに，以下のように割り当てる。

・test_inherit1
	(A)(B-2)(C)(D)(E)(F)(G)

・test_inherit2
	(B-1)(H)

・test_inherit3
	(I)(J)

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

●テスト範囲

サブ優先度機能拡張パッケージで追加または修正したすべてのコードを対象と
する。具体的には，以下の通り。

　・initialize_task
　・current_subpri
　・queue_insert_subprio_tail
　・queue_insert_subprio_head
　・change_priority
　・change_subprio
　・chg_spr
　・mutex_raise_priority
　・mutex_drop_priority
　・rot_rdqのILUSEエラーのチェックコード
　・ref_tskのサブ優先度の参照コード

●カバレッジ計測

カバレッジ計測ツール（gcov）を用いて，ここまでのテストプログラムのソー
スカバレッジ（C1カバレッジ）を計測したところ，以下のパスが通っていない
ことがわかった。上記のソースコードはカバレッジが100%になっていた。

以上
