Skip to content

Commit fdb394a

Browse files
authored
Merge pull request #420 from Superhepper/fix-remaning-error-tests
Fixes remaining tests for Error types.
2 parents a87da5d + 0dc070d commit fdb394a

File tree

8 files changed

+367
-110
lines changed

8 files changed

+367
-110
lines changed

tss-esapi/src/error/return_code/tpm/format_zero.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ impl std::fmt::Display for TpmFormatZeroResponseCode {
8585
match self {
8686
TpmFormatZeroResponseCode::Error(e) => e.fmt(f),
8787
TpmFormatZeroResponseCode::Warning(e) => e.fmt(f),
88-
TpmFormatZeroResponseCode::VendorSpecific(_) => write!(f, "Vendor specific error"),
88+
TpmFormatZeroResponseCode::VendorSpecific(_) => write!(f, "Vendor specific error."),
8989
}
9090
}
9191
}
Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
1+
// Copyright 2023 Contributors to the Parsec project.
2+
// SPDX-License-Identifier: Apache-2.0
3+
mod tpm_format_one_argument_number_tests;
4+
mod tpm_format_one_error_tests;
5+
mod tpm_format_zero_tests;
6+
7+
use std::{convert::TryFrom, error::Error};
8+
use tss_esapi::{
9+
constants::tss::{TPM2_RC_ASYMMETRIC, TPM2_RC_SEQUENCE, TSS2_TPM_RC_LAYER},
10+
error::{ReturnCode, TpmFormatOneResponseCode, TpmFormatZeroResponseCode, TpmResponseCode},
11+
};
12+
13+
macro_rules! test_valid_conversions {
14+
(TpmResponseCode::$tpm_rc_item:ident, $tss_rc:ident) => {
15+
let expected_tss_rc = TSS2_TPM_RC_LAYER | $tss_rc;
16+
let actual_rc = ReturnCode::try_from(expected_tss_rc).unwrap_or_else(|_| {
17+
panic!(
18+
"Failed to convert {} in the TPM layer to a {}.",
19+
std::stringify!($tss_rc),
20+
std::any::type_name::<ReturnCode>()
21+
)
22+
});
23+
24+
if let ReturnCode::Tpm(actual_tpm_response_code) = actual_rc {
25+
match actual_tpm_response_code {
26+
TpmResponseCode::$tpm_rc_item(_) => {}
27+
_ => {
28+
panic!(
29+
"{} in the TPM layer did not convert into the expected {}.",
30+
std::stringify!($tss_rc),
31+
std::any::type_name::<TpmResponseCode>()
32+
);
33+
}
34+
}
35+
} else {
36+
panic!(
37+
"The TPM layer did not convert into the expected {}.",
38+
std::any::type_name::<ReturnCode>()
39+
);
40+
}
41+
42+
assert_eq!(
43+
expected_tss_rc,
44+
actual_rc.into(),
45+
"ReturnCode::Tpm did not convert into the expected TSS2_RC value."
46+
);
47+
};
48+
}
49+
50+
#[test]
51+
fn test_valid_tpm_format_zero_response_code() {
52+
test_valid_conversions!(TpmResponseCode::FormatZero, TPM2_RC_SEQUENCE);
53+
}
54+
55+
#[test]
56+
fn test_valid_tpm_format_one_response_code() {
57+
test_valid_conversions!(TpmResponseCode::FormatOne, TPM2_RC_ASYMMETRIC);
58+
}
59+
60+
macro_rules! test_display_trait_impl {
61+
($source_rc:ident, $tss_rc:ident) => {
62+
let value = u16::try_from(TSS2_TPM_RC_LAYER | $tss_rc)
63+
.unwrap_or_else(|_| {
64+
panic!(
65+
"It should be possible to convert the valid TSS2 response code {} from the TPM layer into a u16 value.",
66+
std::stringify!($tss_rc));
67+
});
68+
69+
let response_code = TpmResponseCode::try_from(value)
70+
.unwrap_or_else(|_| {
71+
panic!(
72+
"It should be possible to convert a u16 value representing a valid TSS2 response code {} from the TPM layer into a `{}` object.",
73+
std::stringify!($tss_rc),
74+
std::any::type_name::<TpmResponseCode>());
75+
});
76+
77+
78+
let source_response_code = $source_rc::try_from(value)
79+
.unwrap_or_else(|_| {
80+
panic!(
81+
"It should be possible to convert a u16 value representing a valid TSS2 response code from the TPM layer into a `{}` object.",
82+
std::any::type_name::<$source_rc>());
83+
});
84+
85+
assert_eq!(
86+
format!("{}", response_code),
87+
format!("{}", source_response_code)
88+
);
89+
};
90+
}
91+
92+
#[test]
93+
fn test_display_trait_implementation() {
94+
test_display_trait_impl!(TpmFormatZeroResponseCode, TPM2_RC_SEQUENCE);
95+
test_display_trait_impl!(TpmFormatOneResponseCode, TPM2_RC_ASYMMETRIC);
96+
}
97+
98+
macro_rules! test_error_trait_impl {
99+
($source_rc:ident, $tss_rc:ident) => {
100+
let value = u16::try_from(TSS2_TPM_RC_LAYER | $tss_rc)
101+
.unwrap_or_else(|_| {
102+
panic!(
103+
"It should be possible to convert the valid TSS2 response code {} from the TPM layer into a u16 value.",
104+
std::stringify!($tss_rc));
105+
});
106+
107+
let response_code = TpmResponseCode::try_from(value)
108+
.unwrap_or_else(|_| {
109+
panic!(
110+
"It should be possible to convert a u16 value representing a valid TSS2 response code {} from the TPM layer into a `{}` object.",
111+
std::stringify!($tss_rc),
112+
std::any::type_name::<TpmResponseCode>());
113+
});
114+
115+
let actual_source_rc = response_code.source()
116+
.unwrap_or_else(|| {
117+
panic!(
118+
"The `{}` object produced from the valid TSS2 response code {} from the TPM layer should have a source.",
119+
std::any::type_name::<TpmResponseCode>(),
120+
std::stringify!($tss_rc));
121+
});
122+
123+
let expected_source_rc = $source_rc::try_from(value)
124+
.unwrap_or_else(|_| {
125+
panic!(
126+
"It should be possible to convert a u16 value representing a valid TSS2 response code from the TPM layer into a `{}` object.",
127+
std::any::type_name::<$source_rc>());
128+
});
129+
130+
assert_eq!(
131+
format!("{}", actual_source_rc),
132+
format!("{}", expected_source_rc)
133+
);
134+
};
135+
}
136+
137+
#[test]
138+
fn test_error_trait_implementation() {
139+
test_error_trait_impl!(TpmFormatZeroResponseCode, TPM2_RC_SEQUENCE);
140+
test_error_trait_impl!(TpmFormatOneResponseCode, TPM2_RC_ASYMMETRIC);
141+
}

tss-esapi/tests/integration_tests/error_tests/return_code_tests/tpm_tests/mod.rs

Lines changed: 0 additions & 9 deletions
This file was deleted.
Lines changed: 184 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,184 @@
1+
// Copyright 2023 Contributors to the Parsec project.
2+
// SPDX-License-Identifier: Apache-2.
3+
4+
mod tpm_format_zero_error_tests;
5+
mod tpm_format_zero_warning_tests;
6+
7+
use bitfield::bitfield;
8+
use std::{convert::TryFrom, error::Error};
9+
use tss_esapi::{
10+
constants::tss::{
11+
TPM2_RC_AUTHSIZE, TPM2_RC_CONTEXT_GAP, TPM2_RC_INITIALIZE, TSS2_TPM_RC_LAYER,
12+
},
13+
error::{
14+
ReturnCode, TpmFormatZeroErrorResponseCode, TpmFormatZeroResponseCode,
15+
TpmFormatZeroWarningResponseCode, TpmResponseCode,
16+
},
17+
};
18+
19+
bitfield! {
20+
pub struct VendorSpecificBitHelper(u32);
21+
_, set_is_vendor_specific: 10;
22+
}
23+
24+
#[test]
25+
fn test_vendor_specific_valid_conversions() {
26+
// Bit 10 In the TPM format zero return code is the bit indicating vendor specific.
27+
// |11|10| 9| 8 | 7| 6| 5| 4| 3| 2| 1| 0|
28+
// | W| V| R|TPM 2.0| | error number |
29+
let mut helper = VendorSpecificBitHelper(TSS2_TPM_RC_LAYER | TPM2_RC_INITIALIZE);
30+
helper.set_is_vendor_specific(true);
31+
let expected_tss_rc = helper.0;
32+
33+
let actual_rc = ReturnCode::try_from(expected_tss_rc)
34+
.expect("Failed to convert TPM zero error return code value with vendor specific bit set into a ReturnCode.");
35+
36+
if let ReturnCode::Tpm(TpmResponseCode::FormatZero(
37+
TpmFormatZeroResponseCode::VendorSpecific(actual),
38+
)) = actual_rc
39+
{
40+
assert_eq!(
41+
expected_tss_rc,
42+
actual.into(),
43+
"Converting vendor specific return code did not return the original value."
44+
);
45+
} else {
46+
panic!("TPM TSS2_RC layer did no convert into ReturnCode::Tpm");
47+
}
48+
49+
assert_eq!(
50+
expected_tss_rc,
51+
actual_rc.into(),
52+
"The vendor specific return code did not convert into the expected TSS2_RC in the TPM layer."
53+
)
54+
}
55+
56+
#[test]
57+
fn test_vendor_specific_error_trait_implementation() {
58+
// Bit 10 In the TPM format zero return code is the bit indicating vendor specific.
59+
// |11|10| 9| 8 | 7| 6| 5| 4| 3| 2| 1| 0|
60+
// | W| V| R|TPM 2.0| | error number |
61+
let mut helper = VendorSpecificBitHelper(TSS2_TPM_RC_LAYER | TPM2_RC_INITIALIZE);
62+
helper.set_is_vendor_specific(true);
63+
let expected_tss_rc = helper.0;
64+
let expected_tss_rc_error_part = u16::try_from(expected_tss_rc)
65+
.expect("A TSS return code with the vendor specific bit set from the TPM layer should a valid u16 value.");
66+
let vendor_specific_rc = TpmFormatZeroResponseCode::VendorSpecific(expected_tss_rc_error_part);
67+
68+
assert!(
69+
vendor_specific_rc.source().is_none(),
70+
"`source() method for vendor specific error did not return the expected value."
71+
);
72+
}
73+
74+
#[test]
75+
fn test_vendor_specific_display_trait_implementation() {
76+
// Bit 10 In the TPM format zero return code is the bit indicating vendor specific.
77+
// |11|10| 9| 8 | 7| 6| 5| 4| 3| 2| 1| 0|
78+
// | W| V| R|TPM 2.0| | error number |
79+
let mut helper = VendorSpecificBitHelper(TSS2_TPM_RC_LAYER | TPM2_RC_INITIALIZE);
80+
helper.set_is_vendor_specific(true);
81+
let expected_tss_rc = helper.0;
82+
let expected_tss_rc_error_part = u16::try_from(expected_tss_rc)
83+
.expect("A TSS return code with the vendor specific bit set from the TPM layer should a valid u16 value.");
84+
let vendor_specific_rc = TpmFormatZeroResponseCode::VendorSpecific(expected_tss_rc_error_part);
85+
86+
assert_eq!(
87+
"Vendor specific error.",
88+
format!("{}", vendor_specific_rc),
89+
"The vendor specific return code did not produce the expected error message."
90+
);
91+
}
92+
93+
bitfield! {
94+
pub struct ErrorNumberHelper(u32);
95+
u8, error_number, _: 6, 0;
96+
}
97+
98+
macro_rules! test_display_trait_impl {
99+
($source_rc:ident, $tss_rc:ident) => {
100+
let value = u16::try_from(TSS2_TPM_RC_LAYER | $tss_rc)
101+
.unwrap_or_else(|_| {
102+
panic!(
103+
"It should be possible to convert the valid TSS2 response code {} from the TPM layer into a u16 value.",
104+
std::stringify!($tss_rc));
105+
});
106+
107+
let response_code = TpmFormatZeroResponseCode::try_from(value)
108+
.unwrap_or_else(|_| {
109+
panic!(
110+
"It should be possible to convert a u16 value representing a valid TSS2 response code {} from the TPM layer into a `{}` object.",
111+
std::stringify!($tss_rc),
112+
std::any::type_name::<TpmFormatZeroResponseCode>());
113+
});
114+
115+
let helper = ErrorNumberHelper(TSS2_TPM_RC_LAYER | $tss_rc);
116+
117+
let source_response_code = $source_rc::try_from(helper.error_number())
118+
.unwrap_or_else(|_| {
119+
panic!(
120+
"It should be possible to convert the bits 0-6 a value representing a valid TSS2 response code {} from the TPM layer into a `{}` object.",
121+
std::stringify!($tss_rc),
122+
std::any::type_name::<$source_rc>());
123+
});
124+
125+
assert_eq!(
126+
format!("{}", response_code),
127+
format!("{}", source_response_code)
128+
);
129+
};
130+
}
131+
132+
#[test]
133+
fn test_error_display_implementation() {
134+
test_display_trait_impl!(TpmFormatZeroWarningResponseCode, TPM2_RC_CONTEXT_GAP);
135+
test_display_trait_impl!(TpmFormatZeroErrorResponseCode, TPM2_RC_AUTHSIZE);
136+
}
137+
138+
macro_rules! test_error_trait_impl {
139+
($source_rc:ident, $tss_rc:ident) => {
140+
let value = u16::try_from(TSS2_TPM_RC_LAYER | $tss_rc)
141+
.unwrap_or_else(|_| {
142+
panic!(
143+
"It should be possible to convert the valid TSS2 response code {} from the TPM layer into a u16 value.",
144+
std::stringify!($tss_rc));
145+
});
146+
147+
let response_code = TpmFormatZeroResponseCode::try_from(value)
148+
.unwrap_or_else(|_| {
149+
panic!(
150+
"It should be possible to convert a u16 value representing a valid TSS2 response code {} from the TPM layer into a `{}` object.",
151+
std::stringify!($tss_rc),
152+
std::any::type_name::<TpmFormatZeroResponseCode>());
153+
});
154+
155+
let helper = ErrorNumberHelper(TSS2_TPM_RC_LAYER | $tss_rc);
156+
157+
let actual_source_rc = response_code.source()
158+
.unwrap_or_else(|| {
159+
panic!(
160+
"The `{}` object produced from the valid TSS2 response code {} from the TPM layer should have a source.",
161+
std::any::type_name::<TpmFormatZeroResponseCode>(),
162+
std::stringify!($tss_rc));
163+
});
164+
165+
let expected_source_rc = $source_rc::try_from(helper.error_number())
166+
.unwrap_or_else(|_| {
167+
panic!(
168+
"It should be possible to convert the bits 0-6 a value representing a valid TSS2 response code {} from the TPM layer into a `{}` object.",
169+
std::stringify!($tss_rc),
170+
std::any::type_name::<$source_rc>());
171+
});
172+
173+
assert_eq!(
174+
format!("{}", actual_source_rc),
175+
format!("{}", expected_source_rc)
176+
);
177+
};
178+
}
179+
180+
#[test]
181+
fn test_error_trait_implementation() {
182+
test_error_trait_impl!(TpmFormatZeroWarningResponseCode, TPM2_RC_CONTEXT_GAP);
183+
test_error_trait_impl!(TpmFormatZeroErrorResponseCode, TPM2_RC_AUTHSIZE);
184+
}

tss-esapi/tests/integration_tests/error_tests/return_code_tests/tpm_tests/tpm_format_zero_warning_tests.rs renamed to tss-esapi/tests/integration_tests/error_tests/return_code_tests/tpm_tests/tpm_format_zero_tests/tpm_format_zero_warning_tests.rs

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -230,3 +230,44 @@ fn test_display_implementation() {
230230
TpmFormatZeroWarning::NvUnavailable
231231
);
232232
}
233+
234+
macro_rules! test_error_number_method {
235+
(TpmFormatZeroWarning::$zero_warning:ident) => {
236+
let zero_warning_rc = TpmFormatZeroWarningResponseCode::from(TpmFormatZeroWarning::$zero_warning);
237+
assert_eq!(
238+
TpmFormatZeroWarning::$zero_warning,
239+
zero_warning_rc.error_number(),
240+
"The TpmFormatZeroWarningResponseCode `error_number()` method did not return the expected TpmFormatZeroWarning"
241+
);
242+
};
243+
}
244+
245+
#[test]
246+
fn test_error_number() {
247+
test_error_number_method!(TpmFormatZeroWarning::ContextGap);
248+
test_error_number_method!(TpmFormatZeroWarning::ObjectMemory);
249+
test_error_number_method!(TpmFormatZeroWarning::SessionMemory);
250+
test_error_number_method!(TpmFormatZeroWarning::ObjectHandles);
251+
test_error_number_method!(TpmFormatZeroWarning::Locality);
252+
test_error_number_method!(TpmFormatZeroWarning::Yielded);
253+
test_error_number_method!(TpmFormatZeroWarning::Canceled);
254+
test_error_number_method!(TpmFormatZeroWarning::Testing);
255+
test_error_number_method!(TpmFormatZeroWarning::ReferenceH0);
256+
test_error_number_method!(TpmFormatZeroWarning::ReferenceH1);
257+
test_error_number_method!(TpmFormatZeroWarning::ReferenceH2);
258+
test_error_number_method!(TpmFormatZeroWarning::ReferenceH3);
259+
test_error_number_method!(TpmFormatZeroWarning::ReferenceH4);
260+
test_error_number_method!(TpmFormatZeroWarning::ReferenceH5);
261+
test_error_number_method!(TpmFormatZeroWarning::ReferenceH6);
262+
test_error_number_method!(TpmFormatZeroWarning::ReferenceS0);
263+
test_error_number_method!(TpmFormatZeroWarning::ReferenceS1);
264+
test_error_number_method!(TpmFormatZeroWarning::ReferenceS2);
265+
test_error_number_method!(TpmFormatZeroWarning::ReferenceS3);
266+
test_error_number_method!(TpmFormatZeroWarning::ReferenceS4);
267+
test_error_number_method!(TpmFormatZeroWarning::ReferenceS5);
268+
test_error_number_method!(TpmFormatZeroWarning::ReferenceS6);
269+
test_error_number_method!(TpmFormatZeroWarning::NvRate);
270+
test_error_number_method!(TpmFormatZeroWarning::Lockout);
271+
test_error_number_method!(TpmFormatZeroWarning::Retry);
272+
test_error_number_method!(TpmFormatZeroWarning::NvUnavailable);
273+
}

0 commit comments

Comments
 (0)