1 use std::ptr; 2 3 fn main() { 4 big_poll(); 5 big_string(); 6 big_iovecs(); 7 } 8 9 fn big_string() { 10 let mut s = String::new(); 11 for _ in 0..10_000 { 12 s.push_str("hello world"); 13 } 14 let dir_fd = test_programs::preview1::open_scratch_directory(".").unwrap(); 15 assert_eq!( 16 unsafe { wasip1::path_create_directory(dir_fd, &s) }, 17 Err(wasip1::ERRNO_NOMEM) 18 ); 19 } 20 21 fn big_iovecs() { 22 let mut iovs = Vec::new(); 23 let mut ciovs = Vec::new(); 24 for _ in 0..10_000 { 25 iovs.push(wasip1::Iovec { 26 buf: ptr::null_mut(), 27 buf_len: 0, 28 }); 29 ciovs.push(wasip1::Ciovec { 30 buf: ptr::null(), 31 buf_len: 0, 32 }); 33 } 34 let dir_fd = test_programs::preview1::open_scratch_directory(".").unwrap(); 35 let fd = unsafe { 36 wasip1::path_open( 37 dir_fd, 38 0, 39 "hi", 40 wasip1::OFLAGS_CREAT, 41 wasip1::RIGHTS_FD_WRITE | wasip1::RIGHTS_FD_READ, 42 0, 43 0, 44 ) 45 .unwrap() 46 }; 47 48 unsafe { 49 assert_eq!(wasip1::fd_write(fd, &ciovs), Err(wasip1::ERRNO_NOMEM)); 50 assert_eq!(wasip1::fd_read(fd, &iovs), Err(wasip1::ERRNO_NOMEM)); 51 assert_eq!(wasip1::fd_pwrite(fd, &ciovs, 0), Err(wasip1::ERRNO_NOMEM)); 52 assert_eq!(wasip1::fd_pread(fd, &iovs, 0), Err(wasip1::ERRNO_NOMEM)); 53 } 54 55 ciovs.truncate(1); 56 iovs.truncate(1); 57 iovs.push(wasip1::Iovec { 58 buf: ptr::null_mut(), 59 buf_len: 10_000, 60 }); 61 ciovs.push(wasip1::Ciovec { 62 buf: ptr::null(), 63 buf_len: 10_000, 64 }); 65 unsafe { 66 assert_eq!(wasip1::fd_write(fd, &ciovs), Err(wasip1::ERRNO_NOMEM)); 67 assert_eq!(wasip1::fd_read(fd, &iovs), Err(wasip1::ERRNO_NOMEM)); 68 assert_eq!(wasip1::fd_pwrite(fd, &ciovs, 0), Err(wasip1::ERRNO_NOMEM)); 69 assert_eq!(wasip1::fd_pread(fd, &iovs, 0), Err(wasip1::ERRNO_NOMEM)); 70 } 71 } 72 73 fn big_poll() { 74 let mut huge_poll = Vec::new(); 75 let mut huge_events = Vec::new(); 76 for _ in 0..10_000 { 77 huge_poll.push(subscribe_timeout(0)); 78 huge_events.push(empty_event()); 79 } 80 let err = unsafe { 81 wasip1::poll_oneoff( 82 huge_poll.as_ptr(), 83 huge_events.as_mut_ptr(), 84 huge_poll.len(), 85 ) 86 .unwrap_err() 87 }; 88 assert_eq!(err, wasip1::ERRNO_NOMEM); 89 90 fn subscribe_timeout(timeout: u64) -> wasip1::Subscription { 91 wasip1::Subscription { 92 userdata: 0, 93 u: wasip1::SubscriptionU { 94 tag: wasip1::EVENTTYPE_CLOCK.raw(), 95 u: wasip1::SubscriptionUU { 96 clock: wasip1::SubscriptionClock { 97 id: wasip1::CLOCKID_MONOTONIC, 98 timeout, 99 precision: 0, 100 flags: 0, 101 }, 102 }, 103 }, 104 } 105 } 106 107 fn empty_event() -> wasip1::Event { 108 wasip1::Event { 109 error: wasip1::ERRNO_SUCCESS, 110 fd_readwrite: wasip1::EventFdReadwrite { 111 nbytes: 0, 112 flags: 0, 113 }, 114 type_: wasip1::EVENTTYPE_CLOCK, 115 userdata: 0, 116 } 117 } 118 } 119