# Babe initialization in tests

**URL:** https://forum.duniter.org/t/babe-initialization-in-tests/11553
**Category:** Duniter-v2
**Created:** [13 September 2023 13:36 UTC](https://forum.duniter.org/t/babe-initialization-in-tests/11553 "2023-09-13T13:36:55Z")
**Posts on this page:** 4
**Page:** 1

<div class="post-metadata">

### Author: ![HugoTrentesaux](https://forum.duniter.org/user_avatar/forum.duniter.org/hugotrentesaux/32/6396_2.png) [@HugoTrentesaux](https://forum.duniter.org/u/HugoTrentesaux)
#### Post date: [13 September 2023 13:36 UTC](https://forum.duniter.org/t/babe-initialization-in-tests/11553/1 "2023-09-13T13:36:55Z")

</div>

**TL;DR** @tuxmain comment en es-tu venu à ajouter `mock_babe_initialize` ?

* * *

Dans la fonction mock `run_to_block` des tests d’intégration du runtime gdev, tu as ajouté une fonction `mock_babe_initialize` (dans time-based UD) et incrémenté manuellement les slot BABE (dans distance-oracle).

J’ai un problème lors de la mise à jour v0.9.42 : le `current_epoch_start` n’est pas mis à jour, et donc les sessions sont incrémentées à chaque bloc (`ShouldEndSession`). Et vu que tu as modifié plusieurs trucs dans cette fonction lié à BABE, je me dis que tu as peut-être une idée.

J’ai ajouté un test `test_session_change` dans une branche `hugo-test-session-change` qui passe bien sur `master`, mais plus sur la mise à jour.

On dirait que `Session::on_initialize(System::block_number());` est bien appelé, mais par `on_new_session()` de BABE.

* * *

Il y a deux possibilités pour que `enact_epoch_change` soit appelé :

- `on_new_session` (dans notre cas)
- `trigger` de `EpochChangeTrigger` si les autorités ne changent jamais

`on_new_session` devrait être appelé dans `rotate_session` de la pallet `Session` elle même appelée dans `on_initialize`. Si je résume :

1. `on_initialize` de `Session` ✔
2. `rotate_session` de `Session` ✔
3. `on_new_session` de `Babe` ❓
4. `enact_epoch_change` de `Babe` ❌

…

* * *

En attendant, j’ai ajouté un changement de session à ta fonction :

```rust
fn mock_babe_initialize(n: u32) {
    let slot: sp_consensus_babe::Slot = (n as u64).into();
    pallet_babe::CurrentSlot::<Runtime>::put(slot);
    // force epoch change based on session
    let session = Session::current_index() as u64;
    pallet_babe::EpochIndex::<Runtime>::put(session);
}

```

Le problème de l’`EpochIndex` est probablement le même que celui du `CurrentSlot` qui est également modifié dans `initialize` de `Babe`.

---

<div class="post-metadata">

### Author: ![tuxmain](https://forum.duniter.org/user_avatar/forum.duniter.org/tuxmain/32/6423_2.png) [@tuxmain](https://forum.duniter.org/u/tuxmain)
#### Post date: [13 September 2023 16:52 UTC](https://forum.duniter.org/t/babe-initialization-in-tests/11553/2 "2023-09-13T16:52:52Z")

</div>

Je ne sais plus, j’ai dû trouver ça dans une branche d’Élois. Je regarderai ce soir.

---

<div class="post-metadata">

### Author: ![tuxmain](https://forum.duniter.org/user_avatar/forum.duniter.org/tuxmain/32/6423_2.png) [@tuxmain](https://forum.duniter.org/u/tuxmain)
#### Post date: [13 September 2023 21:13 UTC](https://forum.duniter.org/t/babe-initialization-in-tests/11553/3 "2023-09-13T21:13:24Z")

</div>

Ce devait être parce qu’en mode manuel, Babe n’incrémente pas le slot, et que pour une certaine raison il y avait besoin du slot pour [!178](https://git.duniter.org/nodes/rust/duniter-v2s/-/merge_requests/178). J’avais bien recopié ce patch depuis la branche d’Élois correspondante.

Comme j’avais aussi eu besoin de toucher à ça pour la distance, la ligne suivante au mieux est annulée par `mock_babe_initialize`, au pire crée des incohérences à cause des deux lignes entre elle et l’appel à `mock_babe_initialize`&nbsp;:

```rust
pallet_babe::CurrentSlot::<Runtime>::put(pallet_babe::CurrentSlot::<Runtime>::get() + 1);

```

---

<div class="post-metadata">

### Author: ![HugoTrentesaux](https://forum.duniter.org/user_avatar/forum.duniter.org/hugotrentesaux/32/6396_2.png) [@HugoTrentesaux](https://forum.duniter.org/u/HugoTrentesaux)
#### Post date: [14 September 2023 08:03 UTC](https://forum.duniter.org/t/babe-initialization-in-tests/11553/4 "2023-09-14T08:03:51Z")

</div>

Ok. Ce serait embêtant d’avoir des tests qui passent alors qu’il ne devraient pas juste parce que le mock est incohérent. On pourrait essayer de réécrire ces mocks en s’inspirant de polkadot :

```rust
fn run_to_block(n: u32) {
	assert!(System::block_number() < n);
	while System::block_number() < n {
		let block_number = System::block_number();
		AllPalletsWithSystem::on_finalize(block_number);
		System::set_block_number(block_number + 1);
		maybe_new_session(block_number + 1);
		AllPalletsWithSystem::on_initialize(block_number + 1);
	}
}

```

Je vais essayer de faire ça dans la MR de mise à jour après avoir réglé [le problème des providers](https://forum.duniter.org/t/noproviders-error/11554).
