1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
use holochain_types::prelude::*;
use strum_macros::EnumIter;

const WASM_WORKSPACE_TARGET: &str = "wasm_workspace/target";

#[derive(EnumIter, Clone, Copy)]
pub enum TestWasm {
    AgentInfo,
    Anchor,
    Bench,
    Capability,
    CounterSigning,
    Create,
    Crd,
    Crud,
    Debug,
    EntryDefs,
    EmitSignal,
    HashEntry,
    Foo,
    GenesisSelfCheckInvalid,
    GenesisSelfCheckValid,
    HashPath,
    HdkExtern,
    InitFail,
    InitPass,
    Link,
    MigrateAgentFail,
    MigrateAgentPass,
    MultipleCalls,
    MustGet,
    PostCommitSuccess,
    PostCommitVolley,
    Query,
    RandomBytes,
    Schedule,
    XSalsa20Poly1305,
    SerRegression,
    Sign,
    SysTime,
    Update,
    Validate,
    ValidateLink,
    ValidateInvalid,
    ValidateCreateLinkInvalid,
    ValidateValid,
    ValidateCreateLinkValid,
    ValidationPackageFail,
    ValidationPackageSuccess,
    WhoAmI,
    ZomeInfo,
}

impl From<TestWasm> for ZomeName {
    fn from(test_wasm: TestWasm) -> ZomeName {
        ZomeName::from(match test_wasm {
            TestWasm::AgentInfo => "agent_info",
            TestWasm::Anchor => "anchor",
            TestWasm::Bench => "bench",
            TestWasm::Capability => "capability",
            TestWasm::CounterSigning => "countersigning",
            TestWasm::Create => "create_entry",
            TestWasm::Crd => "crd",
            TestWasm::Crud => "crud",
            TestWasm::Debug => "debug",
            TestWasm::EntryDefs => "entry_defs",
            TestWasm::EmitSignal => "emit_signal",
            TestWasm::HashEntry => "hash_entry",
            TestWasm::Foo => "foo",
            TestWasm::GenesisSelfCheckInvalid => "genesis_self_check_invalid",
            TestWasm::GenesisSelfCheckValid => "genesis_self_check_valid",
            TestWasm::HashPath => "hash_path",
            TestWasm::HdkExtern => "hdk_extern",
            TestWasm::InitFail => "init_fail",
            TestWasm::InitPass => "init_pass",
            TestWasm::Link => "link",
            TestWasm::MigrateAgentFail => "migrate_agent_fail",
            TestWasm::MigrateAgentPass => "migrate_agent_pass",
            TestWasm::MultipleCalls => "multiple_calls",
            TestWasm::MustGet => "must_get",
            TestWasm::PostCommitSuccess => "post_commit_success",
            TestWasm::PostCommitVolley => "post_commit_volley",
            TestWasm::Query => "query",
            TestWasm::RandomBytes => "random_bytes",
            TestWasm::Schedule => "schedule",
            TestWasm::XSalsa20Poly1305 => "x_salsa20_poly1305",
            TestWasm::SerRegression => "ser_regression",
            TestWasm::Sign => "sign",
            TestWasm::SysTime => "sys_time",
            TestWasm::Update => "update_entry",
            TestWasm::Validate => "validate",
            TestWasm::ValidateLink => "validate_link",
            TestWasm::ValidateInvalid => "validate_invalid",
            TestWasm::ValidateCreateLinkInvalid => "validate_link_add_invalid",
            TestWasm::ValidateValid => "validate_valid",
            TestWasm::ValidateCreateLinkValid => "validate_link_add_valid",
            TestWasm::ValidationPackageFail => "validation_package_fail",
            TestWasm::ValidationPackageSuccess => "validation_package_success",
            TestWasm::WhoAmI => "whoami",
            TestWasm::ZomeInfo => "zome_info",
        })
    }
}

impl From<TestWasm> for DnaWasm {
    fn from(test_wasm: TestWasm) -> DnaWasm {
        DnaWasm::from(match test_wasm {
            TestWasm::AgentInfo => {
                get_code("wasm32-unknown-unknown/release/test_wasm_agent_info.wasm")
            }
            TestWasm::Anchor => get_code("wasm32-unknown-unknown/release/test_wasm_anchor.wasm"),
            TestWasm::Bench => get_code("wasm32-unknown-unknown/release/test_wasm_bench.wasm"),
            TestWasm::Capability => {
                get_code("wasm32-unknown-unknown/release/test_wasm_capability.wasm")
            }
            TestWasm::CounterSigning => {
                get_code("wasm32-unknown-unknown/release/test_wasm_countersigning.wasm")
            }
            TestWasm::Create => {
                get_code("wasm32-unknown-unknown/release/test_wasm_create_entry.wasm")
            }
            TestWasm::Crd => get_code("wasm32-unknown-unknown/release/test_wasm_crd.wasm"),
            TestWasm::Crud => get_code("wasm32-unknown-unknown/release/test_wasm_crud.wasm"),
            TestWasm::Debug => get_code("wasm32-unknown-unknown/release/test_wasm_debug.wasm"),
            TestWasm::EntryDefs => {
                get_code("wasm32-unknown-unknown/release/test_wasm_entry_defs.wasm")
            }
            TestWasm::EmitSignal => {
                get_code("wasm32-unknown-unknown/release/test_wasm_emit_signal.wasm")
            }
            TestWasm::HashEntry => {
                get_code("wasm32-unknown-unknown/release/test_wasm_hash_entry.wasm")
            }
            TestWasm::Foo => get_code("wasm32-unknown-unknown/release/test_wasm_foo.wasm"),
            TestWasm::GenesisSelfCheckInvalid => {
                get_code("wasm32-unknown-unknown/release/test_wasm_genesis_self_check_invalid.wasm")
            }
            TestWasm::GenesisSelfCheckValid => {
                get_code("wasm32-unknown-unknown/release/test_wasm_genesis_self_check_valid.wasm")
            }
            TestWasm::HashPath => {
                get_code("wasm32-unknown-unknown/release/test_wasm_hash_path.wasm")
            }
            TestWasm::HdkExtern => {
                get_code("wasm32-unknown-unknown/release/test_wasm_hdk_extern.wasm")
            }
            TestWasm::InitFail => {
                get_code("wasm32-unknown-unknown/release/test_wasm_init_fail.wasm")
            }
            TestWasm::InitPass => {
                get_code("wasm32-unknown-unknown/release/test_wasm_init_pass.wasm")
            }
            TestWasm::Link => get_code("wasm32-unknown-unknown/release/test_wasm_link.wasm"),
            TestWasm::MigrateAgentFail => {
                get_code("wasm32-unknown-unknown/release/test_wasm_migrate_agent_fail.wasm")
            }
            TestWasm::MigrateAgentPass => {
                get_code("wasm32-unknown-unknown/release/test_wasm_migrate_agent_pass.wasm")
            }
            TestWasm::MultipleCalls => {
                get_code("wasm32-unknown-unknown/release/test_wasm_multiple_calls.wasm")
            }
            TestWasm::MustGet => get_code("wasm32-unknown-unknown/release/test_wasm_must_get.wasm"),
            TestWasm::PostCommitSuccess => {
                get_code("wasm32-unknown-unknown/release/test_wasm_post_commit_success.wasm")
            }
            TestWasm::PostCommitVolley => {
                get_code("wasm32-unknown-unknown/release/test_wasm_post_commit_volley.wasm")
            }
            TestWasm::Query => get_code("wasm32-unknown-unknown/release/test_wasm_query.wasm"),
            TestWasm::RandomBytes => {
                get_code("wasm32-unknown-unknown/release/test_wasm_random_bytes.wasm")
            }
            TestWasm::Schedule => {
                get_code("wasm32-unknown-unknown/release/test_wasm_schedule.wasm")
            }
            TestWasm::XSalsa20Poly1305 => {
                get_code("wasm32-unknown-unknown/release/test_wasm_x_salsa20_poly1305.wasm")
            }
            TestWasm::SerRegression => {
                get_code("wasm32-unknown-unknown/release/test_wasm_ser_regression.wasm")
            }
            TestWasm::Sign => get_code("wasm32-unknown-unknown/release/test_wasm_sign.wasm"),
            TestWasm::SysTime => get_code("wasm32-unknown-unknown/release/test_wasm_sys_time.wasm"),
            TestWasm::Update => {
                get_code("wasm32-unknown-unknown/release/test_wasm_update_entry.wasm")
            }
            TestWasm::Validate => {
                get_code("wasm32-unknown-unknown/release/test_wasm_validate.wasm")
            }
            TestWasm::ValidateLink => {
                get_code("wasm32-unknown-unknown/release/test_wasm_validate_link.wasm")
            }
            TestWasm::ValidateInvalid => {
                get_code("wasm32-unknown-unknown/release/test_wasm_validate_invalid.wasm")
            }
            TestWasm::ValidateCreateLinkInvalid => {
                get_code("wasm32-unknown-unknown/release/test_wasm_validate_link_add_invalid.wasm")
            }
            TestWasm::ValidateValid => {
                get_code("wasm32-unknown-unknown/release/test_wasm_validate_valid.wasm")
            }
            TestWasm::ValidateCreateLinkValid => {
                get_code("wasm32-unknown-unknown/release/test_wasm_validate_link_add_valid.wasm")
            }
            TestWasm::ValidationPackageFail => {
                get_code("wasm32-unknown-unknown/release/test_wasm_validation_package_fail.wasm")
            }
            TestWasm::ValidationPackageSuccess => {
                get_code("wasm32-unknown-unknown/release/test_wasm_validation_package_success.wasm")
            }
            TestWasm::WhoAmI => get_code("wasm32-unknown-unknown/release/test_wasm_whoami.wasm"),
            TestWasm::ZomeInfo => {
                get_code("wasm32-unknown-unknown/release/test_wasm_zome_info.wasm")
            }
        })
    }
}

fn get_code(path: &'static str) -> Vec<u8> {
    let path = match option_env!("HC_TEST_WASM_DIR") {
        Some(dir) => format!("{}/{}", dir, path),
        None => format!(
            "{}/{}/{}",
            env!("CARGO_MANIFEST_DIR"),
            WASM_WORKSPACE_TARGET,
            path
        ),
    };
    let warning = format!(
        "Wasm: {:?} was not found. Maybe you need to build the test wasms\n
        Run `cargo build --features 'build_wasms' --manifest-path=crates/holochain/Cargo.toml`
        or pass the feature flag to `cargo test`
        ",
        path
    );
    std::fs::read(path).expect(&warning)
}

impl From<TestWasm> for ZomeDef {
    fn from(test_wasm: TestWasm) -> Self {
        tokio_helper::block_forever_on(async move {
            let dna_wasm: DnaWasm = test_wasm.into();
            let (_, wasm_hash) = holochain_types::dna::wasm::DnaWasmHashed::from_content(dna_wasm)
                .await
                .into_inner();
            ZomeDef::Wasm(WasmZome { wasm_hash })
        })
    }
}

impl From<TestWasm> for (ZomeName, ZomeDef) {
    fn from(test_wasm: TestWasm) -> Self {
        (test_wasm.into(), test_wasm.into())
    }
}

impl From<TestWasm> for Zome {
    fn from(test_wasm: TestWasm) -> Self {
        Zome::new(test_wasm.into(), test_wasm.into())
    }
}