- backing: keysinterface::KeysManager::new(seed, network, now.as_secs(), now.subsec_nanos()),
- override_session_priv: Mutex::new(None),
- override_channel_id_priv: Mutex::new(None),
+ backing: keysinterface::PhantomKeysManager::new(seed, now.as_secs(), now.subsec_nanos(), seed),
+ override_random_bytes: Mutex::new(None),
+ disable_revocation_policy_check: false,
+ enforcement_states: Mutex::new(HashMap::new()),
+ expectations: Mutex::new(None),
+ }
+ }
+
+ /// Sets an expectation that [`keysinterface::KeysInterface::get_shutdown_scriptpubkey`] is
+ /// called.
+ pub fn expect(&self, expectation: OnGetShutdownScriptpubkey) -> &Self {
+ self.expectations.lock().unwrap()
+ .get_or_insert_with(|| VecDeque::new())
+ .push_back(expectation);
+ self
+ }
+
+ pub fn derive_channel_keys(&self, channel_value_satoshis: u64, id: &[u8; 32]) -> EnforcingSigner {
+ let keys = self.backing.derive_channel_keys(channel_value_satoshis, id);
+ let state = self.make_enforcement_state_cell(keys.commitment_seed);
+ EnforcingSigner::new_with_revoked(keys, state, self.disable_revocation_policy_check)
+ }
+
+ fn make_enforcement_state_cell(&self, commitment_seed: [u8; 32]) -> Arc<Mutex<EnforcementState>> {
+ let mut states = self.enforcement_states.lock().unwrap();
+ if !states.contains_key(&commitment_seed) {
+ let state = EnforcementState::new();
+ states.insert(commitment_seed, Arc::new(Mutex::new(state)));
+ }
+ let cell = states.get(&commitment_seed).unwrap();
+ Arc::clone(cell)
+ }
+}
+
+pub(crate) fn panicking() -> bool {
+ #[cfg(feature = "std")]
+ let panicking = ::std::thread::panicking();
+ #[cfg(not(feature = "std"))]
+ let panicking = false;
+ return panicking;
+}
+
+impl Drop for TestKeysInterface {
+ fn drop(&mut self) {
+ if panicking() {
+ return;
+ }
+
+ if let Some(expectations) = &*self.expectations.lock().unwrap() {
+ if !expectations.is_empty() {
+ panic!("Unsatisfied expectations: {:?}", expectations);
+ }