/* * Copyright (C) 2023, Google LLC. and others * * This program and the accompanying materials are made available under the * terms of the Eclipse Distribution License v. 1.0 which is available at * https://www.eclipse.org/org/documents/edl-v10.php. * * SPDX-License-Identifier: BSD-3-Clause */ package org.eclipse.jgit.transport; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.security.MessageDigest; import java.util.zip.Deflater; import org.eclipse.jgit.lib.AnyObjectId; import org.eclipse.jgit.lib.Constants; import org.eclipse.jgit.util.NB; import org.eclipse.jgit.util.TemporaryBuffer; import org.eclipse.jgit.util.TemporaryBuffer.Heap; /** * Helper class to create packs for tests. */ public class InMemoryPack { private final Heap tinyPack; public InMemoryPack() { this(1024); } public InMemoryPack(int size) { this.tinyPack = new TemporaryBuffer.Heap(size); } public InMemoryPack header(int cnt) throws IOException { final byte[] hdr = new byte[8]; NB.encodeInt32(hdr, 0, 2); NB.encodeInt32(hdr, 4, cnt); tinyPack.write(Constants.PACK_SIGNATURE); tinyPack.write(hdr, 0, 8); return this; } public InMemoryPack write(int i) throws IOException { tinyPack.write(i); return this; } public InMemoryPack deflate(byte[] content) throws IOException { Deflater deflater = new Deflater(); byte[] buf = new byte[128]; deflater.setInput(content, 0, content.length); deflater.finish(); do { final int n = deflater.deflate(buf, 0, buf.length); if (n > 0) tinyPack.write(buf, 0, n); } while (!deflater.finished()); return this; } public InMemoryPack copyRaw(AnyObjectId o) throws IOException { o.copyRawTo(tinyPack); return this; } public InMemoryPack digest() throws IOException { MessageDigest md = Constants.newMessageDigest(); md.update(tinyPack.toByteArray()); tinyPack.write(md.digest()); return this; } public InputStream toInputStream() throws IOException { return new ByteArrayInputStream(tinyPack.toByteArray()); } public byte[] toByteArray() throws IOException { return tinyPack.toByteArray(); } }