1// Copyright 2013 The Flutter Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "testing.h"
6
7#include <utility>
8
9#include "flutter/fml/file.h"
10#include "flutter/fml/paths.h"
11
12namespace flutter {
13namespace testing {
14
15std::string GetCurrentTestName() {
16 return ::testing::UnitTest::GetInstance()->current_test_info()->name();
17}
18
19std::string GetDefaultKernelFilePath() {
20 return fml::paths::JoinPaths(components: {GetFixturesPath(), "kernel_blob.bin"});
21}
22
23fml::UniqueFD OpenFixturesDirectory() {
24 auto fixtures_directory =
25 OpenDirectory(path: GetFixturesPath(), // path
26 create_if_necessary: false, // create
27 permission: fml::FilePermission::kRead // permission
28 );
29
30 if (!fixtures_directory.is_valid()) {
31 FML_LOG(ERROR) << "Could not open fixtures directory.";
32 return {};
33 }
34 return fixtures_directory;
35}
36
37fml::UniqueFD OpenFixture(const std::string& fixture_name) {
38 if (fixture_name.size() == 0) {
39 FML_LOG(ERROR) << "Invalid fixture name.";
40 return {};
41 }
42
43 auto fixtures_directory = OpenFixturesDirectory();
44
45 auto fixture_fd = fml::OpenFile(base_directory: fixtures_directory, // base directory
46 path: fixture_name.c_str(), // path
47 create_if_necessary: false, // create
48 permission: fml::FilePermission::kRead // permission
49 );
50 if (!fixture_fd.is_valid()) {
51 FML_LOG(ERROR) << "Could not open fixture for path: " << GetFixturesPath()
52 << "/" << fixture_name << ".";
53 return {};
54 }
55
56 return fixture_fd;
57}
58
59std::unique_ptr<fml::Mapping> OpenFixtureAsMapping(
60 const std::string& fixture_name) {
61 return fml::FileMapping::CreateReadOnly(base_fd: OpenFixture(fixture_name));
62}
63
64bool MemsetPatternSetOrCheck(uint8_t* buffer, size_t size, MemsetPatternOp op) {
65 if (buffer == nullptr) {
66 return false;
67 }
68
69 auto pattern = reinterpret_cast<const uint8_t*>("dErP");
70 constexpr auto pattern_length = 4;
71
72 uint8_t* start = buffer;
73 uint8_t* p = buffer;
74
75 while ((start + size) - p >= pattern_length) {
76 switch (op) {
77 case MemsetPatternOp::kMemsetPatternOpSetBuffer:
78 memmove(dest: p, src: pattern, n: pattern_length);
79 break;
80 case MemsetPatternOp::kMemsetPatternOpCheckBuffer:
81 if (memcmp(s1: pattern, s2: p, n: pattern_length) != 0) {
82 return false;
83 }
84 break;
85 };
86 p += pattern_length;
87 }
88
89 if ((start + size) - p != 0) {
90 switch (op) {
91 case MemsetPatternOp::kMemsetPatternOpSetBuffer:
92 memmove(dest: p, src: pattern, n: (start + size) - p);
93 break;
94 case MemsetPatternOp::kMemsetPatternOpCheckBuffer:
95 if (memcmp(s1: pattern, s2: p, n: (start + size) - p) != 0) {
96 return false;
97 }
98 break;
99 }
100 }
101
102 return true;
103}
104
105bool MemsetPatternSetOrCheck(std::vector<uint8_t>& buffer, MemsetPatternOp op) {
106 return MemsetPatternSetOrCheck(buffer: buffer.data(), size: buffer.size(), op);
107}
108
109} // namespace testing
110} // namespace flutter
111

source code of flutter_engine/flutter/testing/testing.cc

Morty Proxy This is a proxified and sanitized view of the page, visit original site.