public List<B2UploadPartResponse> list(final String fileid) throws BackgroundException {
        if(log.isInfoEnabled()) {
            log.info(String.format("List completed parts of file %s", fileid));
        }
        // This operation lists the parts that have been uploaded for a specific multipart upload.
        try {
            // Completed parts
            final List<B2UploadPartResponse> completed = new ArrayList<B2UploadPartResponse>();
            Integer startPartNumber = null;
            do {
                final B2ListPartsResponse response = session.getClient().listParts(
                        fileid, startPartNumber, null);
                completed.addAll(response.getFiles());
                startPartNumber = response.getNextPartNumber();
            }
            while(startPartNumber != null);
            return completed;
        }
        catch(B2ApiException e) {
            throw new B2ExceptionMappingService(this.fileid).map(e);
        }
        catch(IOException e) {
            throw new DefaultIOExceptionMappingService().map(e);
        }
    }
@Test
    public void testList() throws Exception {
        final Path bucket = new Path("test-cyberduck", EnumSet.of(Path.Type.directory, Path.Type.volume));
        final Path file = new Path(bucket, UUID.randomUUID().toString(), EnumSet.of(Path.Type.file));
        final B2StartLargeFileResponse startResponse = session.getClient().startLargeFileUpload(
            new B2VersionIdProvider(session).getVersionId(bucket),
            file.getName(), null, Collections.emptyMap());
        assertTrue(new B2LargeUploadPartService(session, new B2VersionIdProvider(session)).list(startResponse.getFileId()).isEmpty());
        session.getClient().cancelLargeFileUpload(startResponse.getFileId());
    }