blob: dd1462c8f3d26a4a969d6c9715cac45aeca46b13 [file] [log] [blame]
// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "flutter/shell/platform/embedder/embedder.h"
#include <set>
#include "flutter/testing/testing.h"
#ifdef _WIN32
// winbase.h defines GetCurrentTime as a macro.
#undef GetCurrentTime
#endif
namespace flutter {
namespace testing {
// Verifies that the proc table is fully populated.
TEST(EmbedderProcTable, AllPointersProvided) {
FlutterEngineProcTable procs = {};
procs.struct_size = sizeof(FlutterEngineProcTable);
ASSERT_EQ(FlutterEngineGetProcAddresses(&procs), kSuccess);
void (**proc)() = reinterpret_cast<void (**)()>(&procs.CreateAOTData);
const uintptr_t end_address =
reinterpret_cast<uintptr_t>(&procs) + procs.struct_size;
while (reinterpret_cast<uintptr_t>(proc) < end_address) {
EXPECT_NE(*proc, nullptr);
++proc;
}
}
// Ensures that there are no duplicate pointers in the proc table, to catch
// copy/paste mistakes when adding a new entry to FlutterEngineGetProcAddresses.
TEST(EmbedderProcTable, NoDuplicatePointers) {
FlutterEngineProcTable procs = {};
procs.struct_size = sizeof(FlutterEngineProcTable);
ASSERT_EQ(FlutterEngineGetProcAddresses(&procs), kSuccess);
void (**proc)() = reinterpret_cast<void (**)()>(&procs.CreateAOTData);
const uintptr_t end_address =
reinterpret_cast<uintptr_t>(&procs) + procs.struct_size;
std::set<void (*)()> seen_procs;
while (reinterpret_cast<uintptr_t>(proc) < end_address) {
auto result = seen_procs.insert(*proc);
EXPECT_TRUE(result.second);
++proc;
}
}
// Spot-checks that calling one of the function pointers works.
TEST(EmbedderProcTable, CallProc) {
FlutterEngineProcTable procs = {};
procs.struct_size = sizeof(FlutterEngineProcTable);
ASSERT_EQ(FlutterEngineGetProcAddresses(&procs), kSuccess);
EXPECT_NE(procs.GetCurrentTime(), 0ULL);
}
} // namespace testing
} // namespace flutter