return pos
def truncate(self, pos=None):
+ self._checkClosed()
+ self._checkWritable()
+
# Flush the stream. We're mixing buffered I/O with lower-level I/O,
# and a flush may be necessary to synch both views of the current
# file state.
self.assertRaises(ValueError, b.peek)
self.assertRaises(ValueError, b.read1, 1)
+ def test_truncate_on_read_only(self):
+ rawio = self.MockFileIO(b"abc")
+ bufio = self.tp(rawio)
+ self.assertFalse(bufio.writable())
+ self.assertRaises(self.UnsupportedOperation, bufio.truncate)
+ self.assertRaises(self.UnsupportedOperation, bufio.truncate, 0)
+
class CBufferedReaderTest(BufferedReaderTest, SizeofTest):
tp = io.BufferedReader
# You can't construct a BufferedRandom over a non-seekable stream.
test_unseekable = None
+ # writable() returns True, so there's no point to test it over
+ # a writable stream.
+ test_truncate_on_read_only = None
+
class CBufferedRandomTest(BufferedRandomTest, SizeofTest):
tp = io.BufferedRandom
PyObject *res = NULL;
CHECK_INITIALIZED(self)
+ CHECK_CLOSED(self, "truncate of closed file")
+ if (!self->writable) {
+ return bufferediobase_unsupported("truncate");
+ }
if (!ENTER_BUFFERED(self))
return NULL;
- if (self->writable) {
- res = buffered_flush_and_rewind_unlocked(self);
- if (res == NULL)
- goto end;
- Py_CLEAR(res);
+ res = buffered_flush_and_rewind_unlocked(self);
+ if (res == NULL) {
+ goto end;
}
+ Py_CLEAR(res);
+
res = PyObject_CallMethodOneArg(self->raw, _PyIO_str_truncate, pos);
if (res == NULL)
goto end;