data_parallel_test.cc (3319B)
1 // Copyright (c) the JPEG XL Project Authors. All rights reserved. 2 // 3 // Use of this source code is governed by a BSD-style 4 // license that can be found in the LICENSE file. 5 6 #include "lib/jxl/base/data_parallel.h" 7 8 #include <jxl/parallel_runner.h> 9 10 #include <cstddef> 11 #include <cstdint> 12 13 #include "lib/jxl/base/status.h" 14 #include "lib/jxl/test_utils.h" 15 #include "lib/jxl/testing.h" 16 17 namespace jxl { 18 namespace { 19 20 class DataParallelTest : public ::testing::Test { 21 protected: 22 // A fake class to verify that DataParallel is properly calling the 23 // client-provided runner functions. 24 static int FakeRunner(void* runner_opaque, void* jpegxl_opaque, 25 JxlParallelRunInit init, JxlParallelRunFunction func, 26 uint32_t start_range, uint32_t end_range) { 27 DataParallelTest* self = static_cast<DataParallelTest*>(runner_opaque); 28 self->runner_called_++; 29 self->jpegxl_opaque_ = jpegxl_opaque; 30 self->init_ = init; 31 self->func_ = func; 32 self->start_range_ = start_range; 33 self->end_range_ = end_range; 34 return self->runner_return_; 35 } 36 37 ThreadPool pool_{&DataParallelTest::FakeRunner, this}; 38 39 // Number of times FakeRunner() was called. 40 int runner_called_ = 0; 41 42 // Parameters passed to FakeRunner. 43 void* jpegxl_opaque_ = nullptr; 44 JxlParallelRunInit init_ = nullptr; 45 JxlParallelRunFunction func_ = nullptr; 46 uint32_t start_range_ = -1; 47 uint32_t end_range_ = -1; 48 49 // Return value that FakeRunner will return. 50 int runner_return_ = 0; 51 }; 52 53 // JxlParallelRunInit interface. 54 typedef int (*JxlParallelRunInit)(); 55 56 } // namespace 57 58 TEST_F(DataParallelTest, RunnerCalledParameters) { 59 EXPECT_TRUE(pool_.Run( 60 1234, 5678, [](size_t /* num_threads */) -> Status { return true; }, 61 [](uint32_t /* task */, size_t /* thread */) -> Status { return true; }, 62 "Test")); 63 EXPECT_EQ(1, runner_called_); 64 EXPECT_NE(nullptr, init_); 65 EXPECT_NE(nullptr, func_); 66 EXPECT_NE(nullptr, jpegxl_opaque_); 67 EXPECT_EQ(1234u, start_range_); 68 EXPECT_EQ(5678u, end_range_); 69 } 70 71 TEST_F(DataParallelTest, RunnerFailurePropagates) { 72 runner_return_ = -1; // FakeRunner return value. 73 EXPECT_FALSE(pool_.Run( 74 1234, 5678, 75 [](size_t /* num_threads */) -> Status { return JXL_FAILURE("init"); }, 76 [](uint32_t /* task */, size_t /* thread */) -> Status { return true; }, 77 "TestA")); 78 EXPECT_FALSE(RunOnPool( 79 nullptr, 1234, 5678, 80 [](size_t /* num_threads */) -> Status { return JXL_FAILURE("init"); }, 81 [](uint32_t /* task */, size_t /* thread */) -> Status { return true; }, 82 "TestB")); 83 } 84 85 TEST_F(DataParallelTest, RunnerNotCalledOnEmptyRange) { 86 runner_return_ = -1; // FakeRunner return value. 87 EXPECT_TRUE(pool_.Run( 88 123, 123, 89 [](size_t /* num_threads */) -> Status { return JXL_FAILURE("init"); }, 90 [](uint32_t /* task */, size_t /* thread */) -> Status { return true; }, 91 "TestA")); 92 EXPECT_TRUE(RunOnPool( 93 nullptr, 123, 123, 94 [](size_t /* num_threads */) -> Status { return JXL_FAILURE("init"); }, 95 [](uint32_t /* task */, size_t /* thread */) -> Status { return true; }, 96 "TestB")); 97 // We don't call the external runner when the range is empty. We don't even 98 // need to call the init function. 99 EXPECT_EQ(0, runner_called_); 100 } 101 102 } // namespace jxl