data_parallel_test.cc (2950B)
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 "lib/jxl/test_utils.h" 9 #include "lib/jxl/testing.h" 10 11 namespace jxl { 12 namespace { 13 14 class DataParallelTest : public ::testing::Test { 15 protected: 16 // A fake class to verify that DataParallel is properly calling the 17 // client-provided runner functions. 18 static int FakeRunner(void* runner_opaque, void* jpegxl_opaque, 19 JxlParallelRunInit init, JxlParallelRunFunction func, 20 uint32_t start_range, uint32_t end_range) { 21 DataParallelTest* self = static_cast<DataParallelTest*>(runner_opaque); 22 self->runner_called_++; 23 self->jpegxl_opaque_ = jpegxl_opaque; 24 self->init_ = init; 25 self->func_ = func; 26 self->start_range_ = start_range; 27 self->end_range_ = end_range; 28 return self->runner_return_; 29 } 30 31 ThreadPool pool_{&DataParallelTest::FakeRunner, this}; 32 33 // Number of times FakeRunner() was called. 34 int runner_called_ = 0; 35 36 // Parameters passed to FakeRunner. 37 void* jpegxl_opaque_ = nullptr; 38 JxlParallelRunInit init_ = nullptr; 39 JxlParallelRunFunction func_ = nullptr; 40 uint32_t start_range_ = -1; 41 uint32_t end_range_ = -1; 42 43 // Return value that FakeRunner will return. 44 int runner_return_ = 0; 45 }; 46 47 // JxlParallelRunInit interface. 48 typedef int (*JxlParallelRunInit)(); 49 50 } // namespace 51 52 TEST_F(DataParallelTest, RunnerCalledParameters) { 53 EXPECT_TRUE(pool_.Run( 54 1234, 5678, [](size_t /* num_threads */) { return true; }, 55 [](uint32_t /* task */, size_t /* thread */) { return; })); 56 EXPECT_EQ(1, runner_called_); 57 EXPECT_NE(nullptr, init_); 58 EXPECT_NE(nullptr, func_); 59 EXPECT_NE(nullptr, jpegxl_opaque_); 60 EXPECT_EQ(1234u, start_range_); 61 EXPECT_EQ(5678u, end_range_); 62 } 63 64 TEST_F(DataParallelTest, RunnerFailurePropagates) { 65 runner_return_ = -1; // FakeRunner return value. 66 EXPECT_FALSE(pool_.Run( 67 1234, 5678, [](size_t /* num_threads */) { return false; }, 68 [](uint32_t /* task */, size_t /* thread */) { return; })); 69 EXPECT_FALSE(RunOnPool( 70 nullptr, 1234, 5678, [](size_t /* num_threads */) { return false; }, 71 [](uint32_t /* task */, size_t /* thread */) { return; }, "Test")); 72 } 73 74 TEST_F(DataParallelTest, RunnerNotCalledOnEmptyRange) { 75 runner_return_ = -1; // FakeRunner return value. 76 EXPECT_TRUE(pool_.Run( 77 123, 123, [](size_t /* num_threads */) { return false; }, 78 [](uint32_t /* task */, size_t /* thread */) { return; })); 79 EXPECT_TRUE(RunOnPool( 80 nullptr, 123, 123, [](size_t /* num_threads */) { return false; }, 81 [](uint32_t /* task */, size_t /* thread */) { return; }, "Test")); 82 // We don't call the external runner when the range is empty. We don't even 83 // need to call the init function. 84 EXPECT_EQ(0, runner_called_); 85 } 86 87 } // namespace jxl