| 389 | |
| 390 | #[test] |
| 391 | fn read_write_memory_via_api() { |
| 392 | let cfg = Config::new(); |
| 393 | let mut store = Store::new(&Engine::new(&cfg).unwrap(), ()); |
| 394 | let ty = MemoryType::new(1, None); |
| 395 | let mem = Memory::new(&mut store, ty).unwrap(); |
| 396 | mem.grow(&mut store, 1).unwrap(); |
| 397 | |
| 398 | let value = b"hello wasm"; |
| 399 | let size = mem.data_size(&store); |
| 400 | mem.write(&mut store, size - value.len(), value).unwrap(); |
| 401 | |
| 402 | let mut buffer = [0u8; 10]; |
| 403 | mem.read(&store, mem.data_size(&store) - buffer.len(), &mut buffer) |
| 404 | .unwrap(); |
| 405 | assert_eq!(value, &buffer); |
| 406 | |
| 407 | // Error conditions. |
| 408 | |
| 409 | // Out of bounds write. |
| 410 | |
| 411 | let size = mem.data_size(&store); |
| 412 | let res = mem.write(&mut store, size - value.len() + 1, value); |
| 413 | assert!(res.is_err()); |
| 414 | assert_ne!( |
| 415 | mem.data(&store)[mem.data_size(&store) - value.len() + 1], |
| 416 | value[0], |
| 417 | "no data is written", |
| 418 | ); |
| 419 | |
| 420 | // Out of bounds read. |
| 421 | |
| 422 | buffer[0] = 0x42; |
| 423 | let res = mem.read( |
| 424 | &store, |
| 425 | mem.data_size(&store) - buffer.len() + 1, |
| 426 | &mut buffer, |
| 427 | ); |
| 428 | assert!(res.is_err()); |
| 429 | assert_eq!(buffer[0], 0x42, "no data is read"); |
| 430 | |
| 431 | // Read offset overflow. |
| 432 | let res = mem.read(&store, usize::MAX, &mut buffer); |
| 433 | assert!(res.is_err()); |
| 434 | |
| 435 | // Write offset overflow. |
| 436 | let res = mem.write(&mut store, usize::MAX, &buffer); |
| 437 | assert!(res.is_err()); |
| 438 | } |
| 439 | |
| 440 | // Returns (a, b, c) pairs of function type and function such that |
| 441 | // |