From cbdf361f3f10ddfc351c24a1baab85a648d5e16d Mon Sep 17 00:00:00 2001 From: "Bobby R. Bruce" Date: Tue, 12 Nov 2019 18:57:36 -0800 Subject: [PATCH] test,base: Added GTest for base/loader/image_file_data.cc image_file_data.cc reads an image file, or an image file compressed with gzip. Mock image file data, and that data in a gzipped state, has been included in base/loader/small_image_file.test.hh to aid testing. Change-Id: I69691b93ca03c34d6bd736cbc5c6503115bd7b3f Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/22743 Reviewed-by: Daniel Carvalho Reviewed-by: Jason Lowe-Power Maintainer: Jason Lowe-Power Tested-by: kokoro --- src/base/SConscript | 2 + src/base/loader/image_file_data.test.cc | 110 ++++++++++++++++++ src/base/loader/small_image_file.test.hh | 141 +++++++++++++++++++++++ 3 files changed, 253 insertions(+) create mode 100644 src/base/loader/image_file_data.test.cc create mode 100644 src/base/loader/small_image_file.test.hh diff --git a/src/base/SConscript b/src/base/SConscript index a01146384..c9162b472 100644 --- a/src/base/SConscript +++ b/src/base/SConscript @@ -84,6 +84,8 @@ Source('loader/dtb_file.cc') Source('loader/ecoff_object.cc') Source('loader/elf_object.cc') Source('loader/image_file_data.cc') +GTest('loader/image_file_data.test', 'loader/image_file_data.test.cc', +'loader/image_file_data.cc') Source('loader/memory_image.cc') Source('loader/object_file.cc') Source('loader/symtab.cc') diff --git a/src/base/loader/image_file_data.test.cc b/src/base/loader/image_file_data.test.cc new file mode 100644 index 000000000..61eeae178 --- /dev/null +++ b/src/base/loader/image_file_data.test.cc @@ -0,0 +1,110 @@ +/* + * Copyright (c) 2019 The Regents of the University of California + * All rights reserved + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer; + * redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution; + * neither the name of the copyright holders nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Authors: Bobby R. Bruce + */ + +#include +#include +#include + +#include + +#include "base/loader/image_file_data.hh" +#include "base/loader/small_image_file.test.hh" + +TEST(ImageFileDataTest, SimpleImage) +{ + /* + * Create a temporary file from our data blob. + */ + char filename[] = "image-XXXXXX"; + int fd = mkstemp(filename); + ASSERT_NE(-1, fd); + ssize_t size = write(fd, image_file, sizeof(image_file)); + + /* + * In this basic test, the image file is simply loaded to the + * ImageFileData object (i.e., no decompression). + */ + ImageFileData idf(filename); + + EXPECT_EQ(idf.filename(), filename); + EXPECT_EQ(size, idf.len()); + + for (size_t i = 0; i < sizeof(image_file); i++) { + EXPECT_EQ(image_file[i], idf.data()[i]); + } + + /* + * Close and delete the temporary file. + */ + close(fd); + unlink(filename); +} + + +TEST(ImageFileDataTest, GZipImage) +{ + /* + * Create temporary files from our data blobs. + */ + char filename_gz[] = "image-XXXXXX"; + int fd_gz = mkstemp(filename_gz); + ASSERT_NE(-1, fd_gz); + ssize_t size_gz = write(fd_gz, image_file_gzipped, + sizeof(image_file_gzipped)); + + char filename[] = "image-XXXXXX"; + int fd = mkstemp(filename); + ASSERT_NE(-1, fd); + ssize_t size = write(fd, image_file, sizeof(image_file)); + + /* + * ImageFileData decompresses a gzipped file. image_file_gzipped is just + * image_file gzipped. Therefore ifd_gz.len() should equal ifd.len() and + * ifd.data() should equal ifd_gz.data(). + */ + ImageFileData ifd_gz(filename_gz); + ImageFileData ifd(filename); + + EXPECT_EQ(ifd.len(), ifd_gz.len()); + EXPECT_EQ(size, ifd.len()); + EXPECT_NE(size_gz, ifd_gz.len()); + + for (size_t index = 0; index < ifd.len(); index++) { + EXPECT_EQ(ifd.data()[index], ifd_gz.data()[index]); + } + + /* + * Close and delete the temporary files. + */ + close(fd); + unlink(filename); + close(fd_gz); + unlink(filename_gz); +} diff --git a/src/base/loader/small_image_file.test.hh b/src/base/loader/small_image_file.test.hh new file mode 100644 index 000000000..df49f0b7d --- /dev/null +++ b/src/base/loader/small_image_file.test.hh @@ -0,0 +1,141 @@ +/* + * Copyright (c) 2019 The Regents of the University of California + * All rights reserved + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer; + * redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution; + * neither the name of the copyright holders nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Authors: Bobby R. Bruce + */ + +#ifndef __SMALL_IMAGE_FILE_HH__ +#define __SMALL_IMAGE_FILE_HH__ + +#include + +/** + * This image file contains the text "This is a test image.\n" 31 times. + */ +const uint8_t image_file[] = { + 0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, + 0x61, 0x20, 0x74, 0x65, 0x73, 0x74, 0x20, 0x69, + 0x6d, 0x61, 0x67, 0x65, 0x2e, 0x0a, 0x54, 0x68, + 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, + 0x74, 0x65, 0x73, 0x74, 0x20, 0x69, 0x6d, 0x61, + 0x67, 0x65, 0x2e, 0x0a, 0x54, 0x68, 0x69, 0x73, + 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x74, 0x65, + 0x73, 0x74, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, + 0x2e, 0x0a, 0x54, 0x68, 0x69, 0x73, 0x20, 0x69, + 0x73, 0x20, 0x61, 0x20, 0x74, 0x65, 0x73, 0x74, + 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2e, 0x0a, + 0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, + 0x61, 0x20, 0x74, 0x65, 0x73, 0x74, 0x20, 0x69, + 0x6d, 0x61, 0x67, 0x65, 0x2e, 0x0a, 0x54, 0x68, + 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, + 0x74, 0x65, 0x73, 0x74, 0x20, 0x69, 0x6d, 0x61, + 0x67, 0x65, 0x2e, 0x0a, 0x54, 0x68, 0x69, 0x73, + 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x74, 0x65, + 0x73, 0x74, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, + 0x2e, 0x0a, 0x54, 0x68, 0x69, 0x73, 0x20, 0x69, + 0x73, 0x20, 0x61, 0x20, 0x74, 0x65, 0x73, 0x74, + 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2e, 0x0a, + 0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, + 0x61, 0x20, 0x74, 0x65, 0x73, 0x74, 0x20, 0x69, + 0x6d, 0x61, 0x67, 0x65, 0x2e, 0x0a, 0x54, 0x68, + 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, + 0x74, 0x65, 0x73, 0x74, 0x20, 0x69, 0x6d, 0x61, + 0x67, 0x65, 0x2e, 0x0a, 0x54, 0x68, 0x69, 0x73, + 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x74, 0x65, + 0x73, 0x74, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, + 0x2e, 0x0a, 0x54, 0x68, 0x69, 0x73, 0x20, 0x69, + 0x73, 0x20, 0x61, 0x20, 0x74, 0x65, 0x73, 0x74, + 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2e, 0x0a, + 0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, + 0x61, 0x20, 0x74, 0x65, 0x73, 0x74, 0x20, 0x69, + 0x6d, 0x61, 0x67, 0x65, 0x2e, 0x0a, 0x54, 0x68, + 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, + 0x74, 0x65, 0x73, 0x74, 0x20, 0x69, 0x6d, 0x61, + 0x67, 0x65, 0x2e, 0x0a, 0x54, 0x68, 0x69, 0x73, + 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x74, 0x65, + 0x73, 0x74, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, + 0x2e, 0x0a, 0x54, 0x68, 0x69, 0x73, 0x20, 0x69, + 0x73, 0x20, 0x61, 0x20, 0x74, 0x65, 0x73, 0x74, + 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2e, 0x0a, + 0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, + 0x61, 0x20, 0x74, 0x65, 0x73, 0x74, 0x20, 0x69, + 0x6d, 0x61, 0x67, 0x65, 0x2e, 0x0a, 0x54, 0x68, + 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, + 0x74, 0x65, 0x73, 0x74, 0x20, 0x69, 0x6d, 0x61, + 0x67, 0x65, 0x2e, 0x0a, 0x54, 0x68, 0x69, 0x73, + 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x74, 0x65, + 0x73, 0x74, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, + 0x2e, 0x0a, 0x54, 0x68, 0x69, 0x73, 0x20, 0x69, + 0x73, 0x20, 0x61, 0x20, 0x74, 0x65, 0x73, 0x74, + 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2e, 0x0a, + 0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, + 0x61, 0x20, 0x74, 0x65, 0x73, 0x74, 0x20, 0x69, + 0x6d, 0x61, 0x67, 0x65, 0x2e, 0x0a, 0x54, 0x68, + 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, + 0x74, 0x65, 0x73, 0x74, 0x20, 0x69, 0x6d, 0x61, + 0x67, 0x65, 0x2e, 0x0a, 0x54, 0x68, 0x69, 0x73, + 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x74, 0x65, + 0x73, 0x74, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, + 0x2e, 0x0a, 0x54, 0x68, 0x69, 0x73, 0x20, 0x69, + 0x73, 0x20, 0x61, 0x20, 0x74, 0x65, 0x73, 0x74, + 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2e, 0x0a, + 0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, + 0x61, 0x20, 0x74, 0x65, 0x73, 0x74, 0x20, 0x69, + 0x6d, 0x61, 0x67, 0x65, 0x2e, 0x0a, 0x54, 0x68, + 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, + 0x74, 0x65, 0x73, 0x74, 0x20, 0x69, 0x6d, 0x61, + 0x67, 0x65, 0x2e, 0x0a, 0x54, 0x68, 0x69, 0x73, + 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x74, 0x65, + 0x73, 0x74, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, + 0x2e, 0x0a, 0x54, 0x68, 0x69, 0x73, 0x20, 0x69, + 0x73, 0x20, 0x61, 0x20, 0x74, 0x65, 0x73, 0x74, + 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2e, 0x0a, + 0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, + 0x61, 0x20, 0x74, 0x65, 0x73, 0x74, 0x20, 0x69, + 0x6d, 0x61, 0x67, 0x65, 0x2e, 0x0a, 0x54, 0x68, + 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, + 0x74, 0x65, 0x73, 0x74, 0x20, 0x69, 0x6d, 0x61, + 0x67, 0x65, 0x2e, 0x0a, 0x54, 0x68, 0x69, 0x73, + 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x74, 0x65, + 0x73, 0x74, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, + 0x2e, 0x0a +}; + +/** + * This is "image_file" compressed using GZip. + */ +const uint8_t image_file_gzipped[] = { + 0x1f, 0x8b, 0x08, 0x08, 0x48, 0x4b, 0xcb, 0x5d, + 0x00, 0x03, 0x62, 0x6c, 0x61, 0x2e, 0x69, 0x6d, + 0x67, 0x00, 0x0b, 0xc9, 0xc8, 0x2c, 0x56, 0x00, + 0xa2, 0x44, 0x85, 0x92, 0xd4, 0xe2, 0x12, 0x85, + 0xcc, 0xdc, 0xc4, 0xf4, 0x54, 0x3d, 0xae, 0x90, + 0x51, 0xd1, 0x51, 0xd1, 0x41, 0x26, 0x0a, 0x00, + 0xc9, 0x58, 0x6c, 0x4e, 0xaa, 0x02, 0x00, 0x00 +}; + +#endif // __SMALL_IMAGE_FILE_HH__ \ No newline at end of file -- 2.30.2