blob: 42b107357aeabfc0a359a8a3d034293c0283458e [file] [log] [blame]
// Copyright 2017 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <memory>
#include <string>
#include <utility>
#include <vector>
#include "base/files/file_util.h"
#include "base/functional/bind.h"
#include "base/functional/callback.h"
#include "base/path_service.h"
#include "base/run_loop.h"
#include "base/test/task_environment.h"
#include "base/win/scoped_com_initializer.h"
#include "mojo/public/cpp/bindings/remote.h"
#include "services/shape_detection/face_detection_provider_win.h"
#include "services/shape_detection/public/mojom/facedetection_provider.mojom.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/gfx/codec/jpeg_codec.h"
namespace shape_detection {
namespace {
void DetectCallback(base::OnceClosure quit_closure,
uint32_t* num_faces,
std::vector<mojom::FaceDetectionResultPtr> results) {
*num_faces = results.size();
std::move(quit_closure).Run();
}
} // namespace
class FaceDetectionImplWinTest : public testing::Test {
public:
FaceDetectionImplWinTest(const FaceDetectionImplWinTest&) = delete;
FaceDetectionImplWinTest& operator=(const FaceDetectionImplWinTest&) = delete;
protected:
FaceDetectionImplWinTest() = default;
~FaceDetectionImplWinTest() override = default;
void SetUp() override {
scoped_com_initializer_ = std::make_unique<base::win::ScopedCOMInitializer>(
base::win::ScopedCOMInitializer::kMTA);
ASSERT_TRUE(scoped_com_initializer_->Succeeded());
}
mojo::Remote<mojom::FaceDetection> ConnectToFaceDetector() {
mojo::Remote<mojom::FaceDetectionProvider> provider;
mojo::Remote<mojom::FaceDetection> face_service;
FaceDetectionProviderWin::Create(provider.BindNewPipeAndPassReceiver());
auto options = shape_detection::mojom::FaceDetectorOptions::New();
provider->CreateFaceDetection(face_service.BindNewPipeAndPassReceiver(),
std::move(options));
return face_service;
}
std::unique_ptr<SkBitmap> LoadTestImage() {
// Load image data from test directory.
base::FilePath image_path;
EXPECT_TRUE(
base::PathService::Get(base::DIR_SRC_TEST_DATA_ROOT, &image_path));
image_path = image_path.Append(FILE_PATH_LITERAL("services"))
.Append(FILE_PATH_LITERAL("test"))
.Append(FILE_PATH_LITERAL("data"))
.Append(FILE_PATH_LITERAL("mona_lisa.jpg"));
EXPECT_TRUE(base::PathExists(image_path));
std::string image_data;
EXPECT_TRUE(base::ReadFileToString(image_path, &image_data));
std::unique_ptr<SkBitmap> image = gfx::JPEGCodec::Decode(
reinterpret_cast<const uint8_t*>(image_data.data()), image_data.size());
if (image) {
const gfx::Size size(image->width(), image->height());
const uint32_t num_bytes = size.GetArea() * 4 /* bytes per pixel */;
EXPECT_EQ(num_bytes, image->computeByteSize());
}
return image;
}
private:
std::unique_ptr<base::win::ScopedCOMInitializer> scoped_com_initializer_;
base::test::TaskEnvironment task_environment_;
};
TEST_F(FaceDetectionImplWinTest, ScanOneFace) {
mojo::Remote<mojom::FaceDetection> face_detector = ConnectToFaceDetector();
std::unique_ptr<SkBitmap> image = LoadTestImage();
ASSERT_TRUE(image);
base::RunLoop run_loop;
uint32_t num_faces = 0;
face_detector->Detect(
*image,
base::BindOnce(&DetectCallback, run_loop.QuitClosure(), &num_faces));
run_loop.Run();
EXPECT_EQ(1u, num_faces);
}
} // namespace shape_detection