modified comments. changed std::equal to absl::equal

This commit is contained in:
Andrei Medar 2020-08-28 13:29:12 +00:00
parent 2db661d655
commit 25291a1ab7
6 changed files with 76 additions and 80 deletions

View File

@ -12,16 +12,26 @@
// See the License for the specific language governing permissions and
// limitations under the License.
#ifndef SAPI_LODEPNG_HELPERS_H
#define SAPI_LODEPNG_HELPERS_H
#include <glog/logging.h>
#include <cstdint>
#include <vector>
#include "sandboxed_api/sandbox2/util/fileops.h"
#include "sandboxed_api/sandbox2/util/temp_file.h"
constexpr uint32_t kWidth = 512, kHeight = 512, kImgLen = kWidth * kHeight * 4;
// Returns a vector that contains values used for testing.
// This part of code is taken from
// https://github.com/lvandeve/lodepng/blob/master/examples/example_encode.c#L96-L104.
// The generated image contains square fractals.
std::vector<uint8_t> GenerateValues();
// Creates a temporary directory in the current working directory and returns
// the path.
std::string CreateTempDirAtCWD();
#endif // SAPI_LODEPNG_HELPERS_H

View File

@ -14,16 +14,16 @@
#include <glog/logging.h>
#include <filesystem>
#include <iostream>
#include "helpers.h"
#include "sandbox.h"
void EncodeDecodeOneStep(SapiLodepngSandbox &sandbox, LodepngApi &api) {
// encode the image
// Generate the values.
std::vector<uint8_t> image(GenerateValues());
// Encode the image
sapi::v::Array<uint8_t> sapi_image(image.data(), kImgLen);
sapi::v::ConstCStr sapi_filename("/output/out_generated1.png");
@ -33,22 +33,22 @@ void EncodeDecodeOneStep(SapiLodepngSandbox &sandbox, LodepngApi &api) {
CHECK(result.ok());
CHECK(!result.value());
// after the image has been encoded, decode it to check that the
// pixel values are the same
// After the image has been encoded, decode it to check that the
// pixel values are the same.
sapi::v::UInt sapi_width2, sapi_height2;
sapi::v::IntBase<uint8_t *> sapi_image_ptr(0);
result = api.lodepng_decode32_file(
sapi_image_ptr.PtrBoth(), sapi_width2.PtrBoth(), sapi_height2.PtrBoth(),
sapi_filename.PtrBefore());
CHECK(result.ok());
CHECK(!result.value());
CHECK(sapi_width2.GetValue() == kWidth);
CHECK(sapi_height2.GetValue() == kHeight);
// the pixels have been allocated inside the sandboxed process
// The pixels have been allocated inside the sandboxed process
// memory, so we need to transfer them to this process.
// Transferring the memory has the following steps:
// 1) define a RemotePtr variable that holds the memory location from
@ -63,23 +63,26 @@ void EncodeDecodeOneStep(SapiLodepngSandbox &sandbox, LodepngApi &api) {
CHECK(sandbox.TransferFromSandboxee(&sapi_pixels).ok());
// now, we can compare the values
CHECK(std::equal(image.begin(), image.end(), sapi_pixels.GetData()));
// Now, we can compare the values.
CHECK(absl::equal(image.begin(), image.end(), sapi_pixels.GetData(),
sapi_pixels.GetData() + kImgLen));
// Free the memory allocated inside the sandbox.
CHECK(sandbox.GetRpcChannel()->Free(sapi_image_ptr.GetValue()).ok());
}
void EncodeDecodeTwoSteps(SapiLodepngSandbox &sandbox, LodepngApi &api) {
// generate the values
// Generate the values.
std::vector<uint8_t> image(GenerateValues());
// encode the image into memory first
// Encode the image into memory first.
sapi::v::Array<uint8_t> sapi_image(image.data(), kImgLen);
sapi::v::ConstCStr sapi_filename("/output/out_generated2.png");
sapi::v::ULLong sapi_pngsize;
sapi::v::IntBase<uint8_t *> sapi_png_ptr(0);
// encode it into memory
// Encode it into memory.
sapi::StatusOr<unsigned int> result =
api.lodepng_encode32(sapi_png_ptr.PtrBoth(), sapi_pngsize.PtrBoth(),
sapi_image.PtrBefore(), kWidth, kHeight);
@ -87,15 +90,15 @@ void EncodeDecodeTwoSteps(SapiLodepngSandbox &sandbox, LodepngApi &api) {
CHECK(result.ok());
CHECK(!result.value());
// the new array (pointed to by sapi_png_ptr) is allocated
// The new array (pointed to by sapi_png_ptr) is allocated
// inside the sandboxed process so we need to transfer it to this
// process
// process.
sapi::v::Array<uint8_t> sapi_png_array(sapi_pngsize.GetValue());
sapi_png_array.SetRemote(sapi_png_ptr.GetValue());
CHECK(sandbox.TransferFromSandboxee(&sapi_png_array).ok());
// write the image into the file (from memory)
// Write the image into the file (from memory).
result =
api.lodepng_save_file(sapi_png_array.PtrBefore(), sapi_pngsize.GetValue(),
sapi_filename.PtrBefore());
@ -103,12 +106,12 @@ void EncodeDecodeTwoSteps(SapiLodepngSandbox &sandbox, LodepngApi &api) {
CHECK(result.ok());
CHECK(!result.value());
// now, decode the image using the 2 steps in order to compare the values
// Now, decode the image using the 2 steps in order to compare the values.
sapi::v::UInt sapi_width2, sapi_height2;
sapi::v::IntBase<uint8_t *> sapi_png_ptr2(0);
sapi::v::ULLong sapi_pngsize2;
// load the file in memory
// Load the file in memory.
result =
api.lodepng_load_file(sapi_png_ptr2.PtrBoth(), sapi_pngsize2.PtrBoth(),
sapi_filename.PtrBefore());
@ -118,14 +121,14 @@ void EncodeDecodeTwoSteps(SapiLodepngSandbox &sandbox, LodepngApi &api) {
CHECK(sapi_pngsize.GetValue() == sapi_pngsize2.GetValue());
// transfer the png array
// Transfer the png array.
sapi::v::Array<uint8_t> sapi_png_array2(sapi_pngsize2.GetValue());
sapi_png_array2.SetRemote(sapi_png_ptr2.GetValue());
CHECK(sandbox.TransferFromSandboxee(&sapi_png_array2).ok());
// after the file is loaded, decode it so we have access to the values
// directly
// After the file is loaded, decode it so we have access to the values
// directly.
sapi::v::IntBase<uint8_t *> sapi_png_ptr3(0);
result = api.lodepng_decode32(
sapi_png_ptr3.PtrBoth(), sapi_width2.PtrBoth(), sapi_height2.PtrBoth(),
@ -137,15 +140,17 @@ void EncodeDecodeTwoSteps(SapiLodepngSandbox &sandbox, LodepngApi &api) {
CHECK(sapi_width2.GetValue() == kWidth);
CHECK(sapi_height2.GetValue() == kHeight);
// transfer the pixels so they can be used
// Transfer the pixels so they can be used here.
sapi::v::Array<uint8_t> sapi_pixels(kImgLen);
sapi_pixels.SetRemote(sapi_png_ptr3.GetValue());
CHECK(sandbox.TransferFromSandboxee(&sapi_pixels).ok());
// compare values
CHECK(std::equal(image.begin(), image.end(), sapi_pixels.GetData()));
// Compare the values.
CHECK(absl::equal(image.begin(), image.end(), sapi_pixels.GetData(),
sapi_pixels.GetData() + kImgLen));
// Free the memory allocated inside the sandbox.
CHECK(sandbox.GetRpcChannel()->Free(sapi_png_ptr.GetValue()).ok());
CHECK(sandbox.GetRpcChannel()->Free(sapi_png_ptr2.GetValue()).ok());
CHECK(sandbox.GetRpcChannel()->Free(sapi_png_ptr3.GetValue()).ok());

View File

@ -19,14 +19,15 @@
using ::sapi::IsOk;
using ::testing::Eq;
using ::testing::NotNull;
using ::testing::IsTrue;
using ::testing::NotNull;
namespace {
TEST(HelpersTest, CreateTempDirAtCWD) {
const std::string images_path = CreateTempDirAtCWD();
EXPECT_THAT(sandbox2::file_util::fileops::Exists(images_path, false), IsTrue());
EXPECT_THAT(sandbox2::file_util::fileops::Exists(images_path, false),
IsTrue());
ASSERT_THAT(sandbox2::file_util::fileops::DeleteRecursively(images_path),
IsTrue());
@ -45,8 +46,8 @@ TEST(LodePngTest, Init) {
IsTrue());
}
// generate an image, encode it, decode it and compare the pixels with the
// initial values
// Generate an image, encode it, decode it and compare the pixels with the
// initial values.
TEST(LodePngTest, EncodeDecodeOneStep) {
const std::string images_path = CreateTempDirAtCWD();
@ -54,10 +55,8 @@ TEST(LodePngTest, EncodeDecodeOneStep) {
ASSERT_THAT(sandbox.Init(), IsOk()) << "Error during sandbox init";
LodepngApi api(&sandbox);
// generate the values
std::vector<uint8_t> image(GenerateValues());
// encode the image
sapi::v::Array<uint8_t> sapi_image(image.data(), kImgLen);
sapi::v::ConstCStr sapi_filename("/output/out_generated1.png");
@ -68,8 +67,6 @@ TEST(LodePngTest, EncodeDecodeOneStep) {
ASSERT_THAT(result, Eq(0)) << "Result from encode32_file not 0";
// after the image has been encoded, decode it to check that the
// pixel values are the same
sapi::v::UInt sapi_width2, sapi_height2;
sapi::v::IntBase<uint8_t *> sapi_image_ptr(0);
@ -83,32 +80,24 @@ TEST(LodePngTest, EncodeDecodeOneStep) {
EXPECT_THAT(sapi_width2.GetValue(), Eq(kWidth)) << "Widths differ";
EXPECT_THAT(sapi_height2.GetValue(), Eq(kHeight)) << "Heights differ";
// the pixels have been allocated inside the sandboxed process
// memory, so we need to transfer them to this process.
// Transferring the memory has the following steps:
// 1) define a RemotePtr variable that holds the memory location from
// the sandboxed process
// 2) define an array with the required length
// 3) set the remote pointer for the array to specify where the memory
// that will be transferred is located
// 4) transfer the memory to this process (this step is why we need
// the pointer and the length)
sapi::v::Array<uint8_t> sapi_pixels(kImgLen);
sapi_pixels.SetRemote(sapi_image_ptr.GetValue());
ASSERT_THAT(sandbox.TransferFromSandboxee(&sapi_pixels), IsOk())
<< "Error during transfer from sandboxee";
// now, we can compare the values
EXPECT_THAT(std::equal(image.begin(), image.end(), sapi_pixels.GetData()),
EXPECT_THAT(absl::equal(image.begin(), image.end(), sapi_pixels.GetData(),
sapi_pixels.GetData() + kImgLen),
IsTrue())
<< "values differ";
EXPECT_THAT(sandbox.GetRpcChannel()->Free(sapi_image_ptr.GetValue()), IsOk());
ASSERT_THAT(sandbox2::file_util::fileops::DeleteRecursively(images_path),
IsTrue());
}
// similar to the previous test, only that we use encoding by saving the data in
// Similar to the previous test, only that we use encoding by saving the data in
// memory and then writing it to the file and decoding by first decoding in
// memory and then getting the actual pixel values.
TEST(LodePngTest, EncodeDecodeTwoSteps) {
@ -118,17 +107,14 @@ TEST(LodePngTest, EncodeDecodeTwoSteps) {
ASSERT_THAT(sandbox.Init(), IsOk()) << "Error during sandbox init";
LodepngApi api(&sandbox);
// generate the values
std::vector<uint8_t> image(GenerateValues());
// encode the image into memory first
sapi::v::Array<uint8_t> sapi_image(image.data(), kImgLen);
sapi::v::ConstCStr sapi_filename("/output/out_generated2.png");
sapi::v::ULLong sapi_pngsize;
sapi::v::IntBase<uint8_t *> sapi_png_ptr(0);
// encode it into memory
SAPI_ASSERT_OK_AND_ASSIGN(
unsigned int result,
api.lodepng_encode32(sapi_png_ptr.PtrBoth(), sapi_pngsize.PtrBoth(),
@ -136,16 +122,12 @@ TEST(LodePngTest, EncodeDecodeTwoSteps) {
ASSERT_THAT(result, Eq(0)) << "Result from encode32 call not 0";
// the new array (pointed to by sapi_png_ptr) is allocated
// inside the sandboxed process so we need to transfer it to this
// process
sapi::v::Array<uint8_t> sapi_png_array(sapi_pngsize.GetValue());
sapi_png_array.SetRemote(sapi_png_ptr.GetValue());
ASSERT_THAT(sandbox.TransferFromSandboxee(&sapi_png_array), IsOk())
<< "Error during transfer from sandboxee";
// write the image into the file (from memory)
SAPI_ASSERT_OK_AND_ASSIGN(
result,
api.lodepng_save_file(sapi_png_array.PtrBefore(), sapi_pngsize.GetValue(),
@ -153,12 +135,10 @@ TEST(LodePngTest, EncodeDecodeTwoSteps) {
ASSERT_THAT(result, Eq(0)) << "Result from save_file call not 0";
// now, decode the image using the 2 steps in order to compare the values
sapi::v::UInt sapi_width2, sapi_height2;
sapi::v::IntBase<uint8_t *> sapi_png_ptr2(0);
sapi::v::ULLong sapi_pngsize2;
// load the file in memory
SAPI_ASSERT_OK_AND_ASSIGN(
result,
api.lodepng_load_file(sapi_png_ptr2.PtrBoth(), sapi_pngsize2.PtrBoth(),
@ -169,15 +149,12 @@ TEST(LodePngTest, EncodeDecodeTwoSteps) {
EXPECT_THAT(sapi_pngsize.GetValue(), Eq(sapi_pngsize2.GetValue()))
<< "Png sizes differ";
// transfer the png array
sapi::v::Array<uint8_t> sapi_png_array2(sapi_pngsize2.GetValue());
sapi_png_array2.SetRemote(sapi_png_ptr2.GetValue());
ASSERT_THAT(sandbox.TransferFromSandboxee(&sapi_png_array2), IsOk())
<< "Error during transfer from sandboxee";
// after the file is loaded, decode it so we have access to the values
// directly
sapi::v::IntBase<uint8_t *> sapi_png_ptr3(0);
SAPI_ASSERT_OK_AND_ASSIGN(
result,
@ -190,18 +167,21 @@ TEST(LodePngTest, EncodeDecodeTwoSteps) {
EXPECT_THAT(sapi_width2.GetValue(), Eq(kWidth)) << "Widths differ";
EXPECT_THAT(sapi_height2.GetValue(), Eq(kHeight)) << "Heights differ";
// transfer the pixels so they can be used
sapi::v::Array<uint8_t> sapi_pixels(kImgLen);
sapi_pixels.SetRemote(sapi_png_ptr3.GetValue());
ASSERT_THAT(sandbox.TransferFromSandboxee(&sapi_pixels), IsOk())
<< "Error during transfer from sandboxee";
// now we can compare values
EXPECT_THAT(std::equal(image.begin(), image.end(), sapi_pixels.GetData()),
EXPECT_THAT(absl::equal(image.begin(), image.end(), sapi_pixels.GetData(),
sapi_pixels.GetData() + kImgLen),
IsTrue())
<< "values differ";
EXPECT_THAT(sandbox.GetRpcChannel()->Free(sapi_png_ptr.GetValue()), IsOk());
EXPECT_THAT(sandbox.GetRpcChannel()->Free(sapi_png_ptr2.GetValue()), IsOk());
EXPECT_THAT(sandbox.GetRpcChannel()->Free(sapi_png_ptr3.GetValue()), IsOk());
ASSERT_THAT(sandbox2::file_util::fileops::DeleteRecursively(images_path),
IsTrue());
}

View File

@ -21,19 +21,18 @@
#include "sandboxed_api/sandbox2/util/fileops.h"
void EncodeDecodeOneStep(const std::string &images_path) {
// generate the values
// Generate the values.
std::vector<uint8_t> image(GenerateValues());
// encode the image
// Encode the image.
const std::string filename = images_path + "/out_generated1.png";
unsigned int result =
lodepng_encode32_file(filename.c_str(), image.data(), kWidth, kHeight);
CHECK(!result);
// after the image has been encoded, decode it to check that the
// pixel values are the same
// After the image has been encoded, decode it to check that the
// pixel values are the same.
unsigned int width2, height2;
uint8_t *image2 = 0;
@ -44,16 +43,17 @@ void EncodeDecodeOneStep(const std::string &images_path) {
CHECK(width2 == kWidth);
CHECK(height2 == kHeight);
// now, we can compare the values
CHECK(std::equal(image.begin(), image.end(), image2));
// Now, we can compare the values.
CHECK(absl::equal(image.begin(), image.end(), image2, image2 + kImgLen));
free(image2);
}
void EncodeDecodeTwoSteps(const std::string &images_path) {
// generate the values
// Generate the values.
std::vector<uint8_t> image(GenerateValues());
// encode the image into memory first
// Encode the image into memory first.
const std::string filename = images_path + "/out_generated2.png";
uint8_t *png;
size_t pngsize;
@ -63,17 +63,17 @@ void EncodeDecodeTwoSteps(const std::string &images_path) {
CHECK(!result);
// write the image into the file (from memory)
// Write the image into the file (from memory).
result = lodepng_save_file(png, pngsize, filename.c_str());
CHECK(!result);
// now, decode the image using the 2 steps in order to compare the values
// Now, decode the image using the 2 steps in order to compare the values.
unsigned int width2, height2;
uint8_t *png2;
size_t pngsize2;
// load the file in memory
// Load the file in memory.
result = lodepng_load_file(&png2, &pngsize2, filename.c_str());
CHECK(!result);
@ -86,8 +86,9 @@ void EncodeDecodeTwoSteps(const std::string &images_path) {
CHECK(width2 == kWidth);
CHECK(height2 == kHeight);
// compare values
CHECK(std::equal(image.begin(), image.end(), image2));
// Compare the values.
CHECK(absl::equal(image.begin(), image.end(), image2, image2 + kImgLen));
free(png);
free(png2);
free(image2);

View File

@ -21,12 +21,12 @@
class SapiLodepngSandbox : public LodepngSandbox {
public:
SapiLodepngSandbox(const std::string &images_path)
explicit SapiLodepngSandbox(const std::string& images_path)
: images_path_(images_path) {}
private:
std::unique_ptr<sandbox2::Policy> ModifyPolicy(
sandbox2::PolicyBuilder *) override {
sandbox2::PolicyBuilder*) override {
return sandbox2::PolicyBuilder()
.AllowRead()
.AllowWrite()