tests(nix-daemon/framed): verify waking behaviour
We should never return `Poll::Pending` without having received it from the underlying reader. Change-Id: I8c79c0243dc45889c1df478712971ef930e5f3a9 Reviewed-on: https://cl.snix.dev/c/snix/+/30498 Tested-by: besadii Reviewed-by: Florian Klink <flokli@flokli.de>
This commit is contained in:
		
							parent
							
								
									20589ef8cb
								
							
						
					
					
						commit
						d5c5269ca4
					
				
					 1 changed files with 36 additions and 16 deletions
				
			
		|  | @ -236,7 +236,19 @@ mod nix_framed_tests { | |||
|         assert!(reader.is_eof()); | ||||
|     } | ||||
| 
 | ||||
|     struct SplitMock<'a>(&'a [u8]); | ||||
|     struct SplitMock<'a> { | ||||
|         data: &'a [u8], | ||||
|         pending: bool, | ||||
|     } | ||||
| 
 | ||||
|     impl<'a> SplitMock<'a> { | ||||
|         fn new(data: &'a [u8]) -> Self { | ||||
|             Self { | ||||
|                 data, | ||||
|                 pending: false, | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     impl AsyncRead for SplitMock<'_> { | ||||
|         fn poll_read( | ||||
|  | @ -244,14 +256,13 @@ mod nix_framed_tests { | |||
|             _cx: &mut task::Context<'_>, | ||||
|             buf: &mut ReadBuf<'_>, | ||||
|         ) -> Poll<io::Result<()>> { | ||||
|             let data = self.0; | ||||
| 
 | ||||
|             if data.is_empty() { | ||||
|             if self.data.is_empty() { | ||||
|                 self.pending = true; | ||||
|                 Poll::Pending | ||||
|             } else { | ||||
|                 let n = min(buf.remaining(), data.len()); | ||||
|                 buf.put_slice(&data[..n]); | ||||
|                 self.0 = &data[n..]; | ||||
|                 let n = min(buf.remaining(), self.data.len()); | ||||
|                 buf.put_slice(&self.data[..n]); | ||||
|                 self.data = &self.data[n..]; | ||||
| 
 | ||||
|                 Poll::Ready(Ok(())) | ||||
|             } | ||||
|  | @ -271,14 +282,17 @@ mod nix_framed_tests { | |||
|             let input = &input[..end_point]; | ||||
| 
 | ||||
|             let unsplit_res = { | ||||
|                 let mut dut = NixFramedReader::new(SplitMock(input)); | ||||
|                 let mut dut = NixFramedReader::new(SplitMock::new(input)); | ||||
|                 let mut data_buf = vec![0; input.len()]; | ||||
|                 let mut read_buf = ReadBuf::new(&mut data_buf); | ||||
| 
 | ||||
|                 for _ in 0..256 { | ||||
|                     match Pin::new(&mut dut).poll_read(&mut cx, &mut read_buf) { | ||||
|                         Poll::Ready(res) => res.unwrap(), | ||||
|                         Poll::Pending => break, | ||||
|                         Poll::Pending => { | ||||
|                             assert!(dut.reader.pending); | ||||
|                             break; | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
| 
 | ||||
|  | @ -291,35 +305,41 @@ mod nix_framed_tests { | |||
|                     "end_point = {end_point}, state = {:?}", | ||||
|                     dut.state | ||||
|                 ); | ||||
|                 (dut.state, data_buf, dut.reader.0) | ||||
|                 (dut.state, data_buf, dut.reader.data) | ||||
|             }; | ||||
| 
 | ||||
|             for split_point in 1..end_point.saturating_sub(1) { | ||||
|                 let split_res = { | ||||
|                     let mut dut = NixFramedReader::new(SplitMock(&[])); | ||||
|                     let mut dut = NixFramedReader::new(SplitMock::new(&[])); | ||||
|                     let mut data_buf = vec![0; input.len()]; | ||||
|                     let mut read_buf = ReadBuf::new(&mut data_buf); | ||||
| 
 | ||||
|                     dut.reader.0 = &input[..split_point]; | ||||
|                     dut.reader = SplitMock::new(&input[..split_point]); | ||||
|                     for _ in 0..256 { | ||||
|                         match Pin::new(&mut dut).poll_read(&mut cx, &mut read_buf) { | ||||
|                             Poll::Ready(res) => res.unwrap(), | ||||
|                             Poll::Pending => break, | ||||
|                             Poll::Pending => { | ||||
|                                 assert!(dut.reader.pending); | ||||
|                                 break; | ||||
|                             } | ||||
|                         } | ||||
|                     } | ||||
| 
 | ||||
|                     dut.reader.0 = &input[split_point - dut.reader.0.len()..]; | ||||
|                     dut.reader = SplitMock::new(&input[split_point - dut.reader.data.len()..]); | ||||
|                     for _ in 0..256 { | ||||
|                         match Pin::new(&mut dut).poll_read(&mut cx, &mut read_buf) { | ||||
|                             Poll::Ready(res) => res.unwrap(), | ||||
|                             Poll::Pending => break, | ||||
|                             Poll::Pending => { | ||||
|                                 assert!(dut.reader.pending); | ||||
|                                 break; | ||||
|                             } | ||||
|                         } | ||||
|                     } | ||||
| 
 | ||||
|                     let len = read_buf.filled().len(); | ||||
|                     data_buf.truncate(len); | ||||
| 
 | ||||
|                     (dut.state, data_buf, dut.reader.0) | ||||
|                     (dut.state, data_buf, dut.reader.data) | ||||
|                 }; | ||||
| 
 | ||||
|                 assert_eq!(split_res, unsplit_res); | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue