test-runtime: GenesisBuilder runtime API impl + tests (#14310)

* test-runtime: GenesisBuilder runtime API impl + tests

This PR provides implementation of `GenesisBuilder` API for `substrate-test-runtime`, can be considered as reference imiplementation for other runtimes.
The `GenesisBuilder` implementation is gated by `gensis-config` feature.

Tested scenarios:
- default `GenesisConfig` to JSON blob,
- deserialization of `GenesisConfig` from custom JSON, and storing its keys into the Storage (genesis storage creation).
- creation of genesis storage using partial JSON definition,
- checking if invalid/renamed JSON files causes the runtime to panic,

* missing file added

* client: GenesisBuilder helper added

* feature renamed: genesis-config -> genesis-builder

* Update Cargo.toml

* Update Cargo.toml

* Update Cargo.toml

* Update Cargo.toml

* redundant function removed

* genesis builder helper: introduced RuntimeGenesisBuild

* test-runtime: get rid of unused T

* redundant bound removed

* helper: use GenesisBuild again

* tests adjusted for on_genesis

* test-runtime: support for BuildGenesisConfig

* helper: BuildGenesisConfig support

* Update client/genesis-builder/src/lib.rs

Co-authored-by: Davide Galassi <davxy@datawok.net>

* Update test-utils/runtime/src/test_json/readme.md

Co-authored-by: Davide Galassi <davxy@datawok.net>

* Update test-utils/runtime/src/test_json/readme.md

Co-authored-by: Davide Galassi <davxy@datawok.net>

* Update test-utils/runtime/src/genesismap.rs

Co-authored-by: Davide Galassi <davxy@datawok.net>

* jsons are now human-friendly

* fix

* improvements

* jsons fixed

* helper: no_defaults added

* test-runtime: no_defaults added

* test-runtime: patching fn removed

* helper: patching fn removed

* helper: moved to frame_support

* test-runtime: fixes

* Cargo.lock updated

* fmt + naming

* test-runtime: WasmExecutor used

* helper / test-runtime: struct removed

* test-runtime: merge fixes

* Cargo.lock + test-utils/runtime/Cargo.toml updated

* doc fixed

* client/rpc: test fixed (new rt api)

* client/rpc-spec-v2: test fix

* doc fix

* test-runtime: disable-genesis-builder feature

* fix

* fix

* ".git/.scripts/commands/fmt/fmt.sh"

* test-runtime: rerun added to build script

---------

Co-authored-by: Davide Galassi <davxy@datawok.net>
Co-authored-by: parity-processbot <>
This commit is contained in:
Michal Kucharczyk
2023-07-24 18:12:52 +02:00
committed by GitHub
parent 7fdcb83117
commit 53cbda1de6
14 changed files with 730 additions and 24 deletions
+15 -11
View File
@@ -73,10 +73,10 @@ impl Default for GenesisStorageBuilder {
}
impl GenesisStorageBuilder {
/// Creates a storage builder for genesis config. `substrage test runtime` `GenesisConfig` is
/// initialized with provided `authorities`, `endowed_accounts` with given balance. Key-pairs
/// from `extra_storage` will be injected into built storage. `HEAP_PAGES` key and value will
/// also be placed into storage.
/// Creates a storage builder for genesis config. `substrage test runtime`
/// [`RuntimeGenesisConfig`] is initialized with provided `authorities`, `endowed_accounts` with
/// given balance. Key-value pairs from `extra_storage` will be injected into built storage.
/// `HEAP_PAGES` key and value will also be placed into storage.
pub fn new(
authorities: Vec<AccountId>,
endowed_accounts: Vec<AccountId>,
@@ -91,7 +91,7 @@ impl GenesisStorageBuilder {
}
}
/// Override default wasm code to be placed into GenesisConfig.
/// Override default wasm code to be placed into RuntimeGenesisConfig.
pub fn with_wasm_code(mut self, wasm_code: &Option<Vec<u8>>) -> Self {
self.wasm_code = wasm_code.clone();
self
@@ -107,8 +107,8 @@ impl GenesisStorageBuilder {
self
}
/// Builds the `GenesisConfig` and returns its storage.
pub fn build(self) -> Storage {
/// A `RuntimeGenesisConfig` from internal configuration
pub fn genesis_config(&self) -> RuntimeGenesisConfig {
let authorities_sr25519: Vec<_> = self
.authorities
.clone()
@@ -116,7 +116,7 @@ impl GenesisStorageBuilder {
.map(|id| sr25519::Public::from(id))
.collect();
let genesis_config = RuntimeGenesisConfig {
RuntimeGenesisConfig {
system: frame_system::GenesisConfig {
code: self.wasm_code.clone().unwrap_or(wasm_binary_unwrap().to_vec()),
..Default::default()
@@ -135,11 +135,15 @@ impl GenesisStorageBuilder {
..Default::default()
},
balances: pallet_balances::GenesisConfig { balances: self.balances.clone() },
};
}
}
let mut storage = genesis_config
/// Builds the `RuntimeGenesisConfig` and returns its storage.
pub fn build(self) -> Storage {
let mut storage = self
.genesis_config()
.build_storage()
.expect("Build storage from substrate-test-runtime GenesisConfig");
.expect("Build storage from substrate-test-runtime RuntimeGenesisConfig");
if let Some(heap_pages) = self.heap_pages_override {
storage.top.insert(well_known_keys::HEAP_PAGES.into(), heap_pages.encode());