diff --git a/utils/src/test/java/com/cloud/utils/storage/QCOW2UtilsTest.java b/utils/src/test/java/com/cloud/utils/storage/QCOW2UtilsTest.java new file mode 100644 index 00000000000..92881a63cda --- /dev/null +++ b/utils/src/test/java/com/cloud/utils/storage/QCOW2UtilsTest.java @@ -0,0 +1,121 @@ +// +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// +package com.cloud.utils.storage; + +import static org.junit.Assert.assertEquals; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.nio.ByteBuffer; +import java.nio.charset.Charset; + +import org.junit.Before; +import org.junit.Test; + +public class QCOW2UtilsTest { + + InputStream inputStream; + + final Long virtualSize = 21474836480L; + + /** + * The QCOW2 Header + * + * uint32_t magic; + * uint32_t version; + * + * uint64_t backing_file_offset; + * uint32_t backing_file_size; + * + * uint32_t cluster_bits; + * uint64_t size; + * + * uint32_t crypt_method; + * + * uint32_t l1_size; + * int64_t l1_table_offset; + * + * uint64_t refcount_table_offset; + * uint32_t refcount_table_clusters; + * + * uint32_t nb_snapshots; + * uint64_t snapshots_offset; + * + * @see https://people.gnome.org/~markmc/qcow-image-format.html + */ + + @Before + public void setup() { + + ByteBuffer byteBuffer = ByteBuffer.allocate(72); + + // Magic + byteBuffer.put("QFI".getBytes(Charset.forName("UTF-8"))); + byteBuffer.put((byte)0xfb); + + // Version + byteBuffer.putInt(2); + + // Backing file offset + byteBuffer.putLong(0L); + + // Backing file size + byteBuffer.putInt(0); + + // Cluster bits + byteBuffer.putInt(0); + + // Size + byteBuffer.putLong(virtualSize); + + // Crypt method + byteBuffer.putInt(0); + + // L1 Size + byteBuffer.putInt(0); + + // L1 Table offset + byteBuffer.putLong(0L); + + // Refcount table offset + byteBuffer.putLong(0L); + + // Refcount table cluster + byteBuffer.putInt(0); + + // NB Snapshots + byteBuffer.putInt(0); + + // Snapshots offset + byteBuffer.putLong(0L); + + inputStream = new ByteArrayInputStream(byteBuffer.array()); + } + + @Test + public void getVirtualSizeHeaderLocation() { + assertEquals(24, QCOW2Utils.getVirtualSizeHeaderLocation()); + } + + @Test + public void getVirtualSizeTest() throws IOException { + assertEquals(virtualSize.longValue(), QCOW2Utils.getVirtualSize(inputStream)); + } +}