@@ -80,6 +80,7 @@ public void testWriteBytesWithLengthGreaterThanData() {
8080 public void testResetShrinksAndResetsCount () {
8181 int byteArrayLength = randomIntBetween (0 , 100 );
8282 stream .writeBytes (randomByteArrayOfLength (byteArrayLength ), 0 , byteArrayLength );
83+ assertEquals (byteArrayLength , stream .size ());
8384 stream .reset ();
8485 assertEquals (0 , stream .size ());
8586 // After reset, should be able to write again
@@ -89,6 +90,72 @@ public void testResetShrinksAndResetsCount() {
8990 assertEquals (b , stream .bytes ().get (0 ));
9091 }
9192
93+ public void testSeek () {
94+ // Do some writing
95+ BytesStreamOutput s = new BytesStreamOutput (0 , BigArrays .NON_RECYCLING_INSTANCE );
96+ int byteArrayLength = randomIntBetween (0 , 100 );
97+ byte [] byteArray = randomByteArrayOfLength (byteArrayLength );
98+ s .writeBytes (byteArray , 0 , byteArrayLength );
99+
100+ // Seek either over what we've already written, or what we have yet to write
101+ int seekPosition = randomIntBetween (0 , 200 );
102+ s .seek (seekPosition );
103+ assertEquals (seekPosition , s .size ());
104+ }
105+
106+ public void testSeekAtBoundaries () {
107+ // Do some arbitrary writing
108+ BytesStreamOutput s = new BytesStreamOutput (0 , BigArrays .NON_RECYCLING_INSTANCE );
109+ int byteArrayLength = randomIntBetween (0 , 100 );
110+ byte [] byteArray = randomByteArrayOfLength (byteArrayLength );
111+ s .writeBytes (byteArray , 0 , byteArrayLength );
112+
113+ s .seek (0 );
114+ assertEquals (0 , s .size ());
115+ s .seek (Integer .MAX_VALUE );
116+ assertEquals (Integer .MAX_VALUE , s .size ());
117+ }
118+
119+ public void testSeekWithOverflow () {
120+ // Do some arbitrary writing and then overflow
121+ BytesStreamOutput s = new BytesStreamOutput (0 , BigArrays .NON_RECYCLING_INSTANCE );
122+ int byteArrayLength = randomIntBetween (0 , 100 );
123+ byte [] byteArray = randomByteArrayOfLength (byteArrayLength );
124+ s .writeBytes (byteArray , 0 , byteArrayLength );
125+ assertThrows (IllegalArgumentException .class , () -> s .seek (randomLongBetween ((long ) Integer .MAX_VALUE + 1 , (long ) Integer .MAX_VALUE + 100 )));
126+ }
127+
128+ public void testSkip () {
129+ // Do some arbitrary writing
130+ BytesStreamOutput s = new BytesStreamOutput (0 , BigArrays .NON_RECYCLING_INSTANCE );
131+ int byteArrayLength = randomIntBetween (0 , 100 );
132+ byte [] byteArray = randomByteArrayOfLength (byteArrayLength );
133+ s .writeBytes (byteArray , 0 , byteArrayLength );
134+
135+ int skipValue = randomIntBetween (0 , 100 );
136+ s .skip (skipValue );
137+ assertEquals (byteArrayLength + skipValue , s .size ());
138+ }
139+
140+ public void testSkipAtBoundaries () {
141+ BytesStreamOutput s = new BytesStreamOutput (0 , BigArrays .NON_RECYCLING_INSTANCE );
142+ s .skip (0 );
143+ assertEquals (0 , s .size ());
144+ s .skip (Integer .MAX_VALUE );
145+ assertEquals (Integer .MAX_VALUE , s .size ());
146+ }
147+
148+ public void testSkipWithOverflow () {
149+ // Do some arbitrary writing and then overflow
150+ BytesStreamOutput s = new BytesStreamOutput (0 , BigArrays .NON_RECYCLING_INSTANCE );
151+ int byteArrayLength = randomIntBetween (1 , 100 );
152+ byte [] byteArray = randomByteArrayOfLength (byteArrayLength );
153+ s .writeBytes (byteArray , 0 , byteArrayLength );
154+
155+ int skipPosition = randomIntBetween (Integer .MAX_VALUE - byteArrayLength + 1 , Integer .MAX_VALUE );
156+ assertThrows (IllegalArgumentException .class , () -> s .skip (skipPosition ));
157+ }
158+
92159 public void testSeekAndSkip () {
93160 int byteArrayLength = randomIntBetween (0 , 100 );
94161 byte [] byteArray = randomByteArrayOfLength (byteArrayLength );
0 commit comments