shell_unittests.cc 8.6 KB
Newer Older
M
Michael Goderbauer 已提交
1
// Copyright 2013 The Flutter Authors. All rights reserved.
2 3 4 5 6 7 8 9 10
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#define FML_USED_ON_EMBEDDER

#include <functional>
#include <future>
#include <memory>

11
#include "flutter/fml/make_copyable.h"
12
#include "flutter/fml/message_loop.h"
13
#include "flutter/fml/synchronization/waitable_event.h"
14 15 16
#include "flutter/shell/common/platform_view.h"
#include "flutter/shell/common/rasterizer.h"
#include "flutter/shell/common/shell.h"
17
#include "flutter/shell/common/shell_test.h"
18
#include "flutter/shell/common/thread_host.h"
19
#include "flutter/shell/gpu/gpu_surface_software.h"
20
#include "flutter/testing/testing.h"
21 22
#include "gtest/gtest.h"

23
namespace flutter {
24
namespace testing {
25

26 27 28
class TestPlatformView : public PlatformView,
                         public GPUSurfaceSoftwareDelegate {
 public:
29
  TestPlatformView(PlatformView::Delegate& delegate, TaskRunners task_runners)
30 31 32 33 34 35 36 37 38 39
      : PlatformView(delegate, std::move(task_runners)) {}

 private:
  // |PlatformView|
  std::unique_ptr<Surface> CreateRenderingSurface() override {
    return std::make_unique<GPUSurfaceSoftware>(this);
  }

  // |GPUSurfaceSoftwareDelegate|
  virtual sk_sp<SkSurface> AcquireBackingStore(const SkISize& size) override {
40 41 42
    SkImageInfo image_info = SkImageInfo::MakeN32Premul(
        size.width(), size.height(), SkColorSpace::MakeSRGB());
    return SkSurface::MakeRaster(image_info);
43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
  }

  // |GPUSurfaceSoftwareDelegate|
  virtual bool PresentBackingStore(sk_sp<SkSurface> backing_store) override {
    return true;
  }

  FML_DISALLOW_COPY_AND_ASSIGN(TestPlatformView);
};

static bool ValidateShell(Shell* shell) {
  if (!shell) {
    return false;
  }

  if (!shell->IsSetup()) {
    return false;
  }

  {
    fml::AutoResetWaitableEvent latch;
    fml::TaskRunner::RunNowOrPostTask(
        shell->GetTaskRunners().GetPlatformTaskRunner(), [shell, &latch]() {
          shell->GetPlatformView()->NotifyCreated();
          latch.Signal();
        });
    latch.Wait();
  }

  {
    fml::AutoResetWaitableEvent latch;
    fml::TaskRunner::RunNowOrPostTask(
        shell->GetTaskRunners().GetPlatformTaskRunner(), [shell, &latch]() {
          shell->GetPlatformView()->NotifyDestroyed();
          latch.Signal();
        });
    latch.Wait();
  }

  return true;
}

85
TEST_F(ShellTest, InitializeWithInvalidThreads) {
86 87
  Settings settings = CreateSettingsForFixture();
  TaskRunners task_runners("test", nullptr, nullptr, nullptr, nullptr);
88 89 90
  auto shell = Shell::Create(
      std::move(task_runners), settings,
      [](Shell& shell) {
91 92
        return std::make_unique<TestPlatformView>(shell,
                                                  shell.GetTaskRunners());
93 94 95 96 97 98 99
      },
      [](Shell& shell) {
        return std::make_unique<Rasterizer>(shell.GetTaskRunners());
      });
  ASSERT_FALSE(shell);
}

100
TEST_F(ShellTest, InitializeWithDifferentThreads) {
101
  Settings settings = CreateSettingsForFixture();
102 103 104 105
  ThreadHost thread_host(
      "io.flutter.test." + ::testing::GetCurrentTestName() + ".",
      ThreadHost::Type::Platform | ThreadHost::Type::GPU |
          ThreadHost::Type::IO | ThreadHost::Type::UI);
106 107 108 109
  TaskRunners task_runners("test", thread_host.platform_thread->GetTaskRunner(),
                           thread_host.gpu_thread->GetTaskRunner(),
                           thread_host.ui_thread->GetTaskRunner(),
                           thread_host.io_thread->GetTaskRunner());
110 111 112
  auto shell = Shell::Create(
      std::move(task_runners), settings,
      [](Shell& shell) {
113 114
        return std::make_unique<TestPlatformView>(shell,
                                                  shell.GetTaskRunners());
115 116 117 118
      },
      [](Shell& shell) {
        return std::make_unique<Rasterizer>(shell.GetTaskRunners());
      });
119
  ASSERT_TRUE(ValidateShell(shell.get()));
120 121
}

122
TEST_F(ShellTest, InitializeWithSingleThread) {
123
  Settings settings = CreateSettingsForFixture();
124 125 126
  ThreadHost thread_host(
      "io.flutter.test." + ::testing::GetCurrentTestName() + ".",
      ThreadHost::Type::Platform);
127
  auto task_runner = thread_host.platform_thread->GetTaskRunner();
128 129
  TaskRunners task_runners("test", task_runner, task_runner, task_runner,
                           task_runner);
130 131 132
  auto shell = Shell::Create(
      std::move(task_runners), settings,
      [](Shell& shell) {
133 134
        return std::make_unique<TestPlatformView>(shell,
                                                  shell.GetTaskRunners());
135 136 137 138
      },
      [](Shell& shell) {
        return std::make_unique<Rasterizer>(shell.GetTaskRunners());
      });
139
  ASSERT_TRUE(ValidateShell(shell.get()));
140 141
}

142
TEST_F(ShellTest, InitializeWithSingleThreadWhichIsTheCallingThread) {
143
  Settings settings = CreateSettingsForFixture();
144 145
  fml::MessageLoop::EnsureInitializedForCurrentThread();
  auto task_runner = fml::MessageLoop::GetCurrent().GetTaskRunner();
146 147
  TaskRunners task_runners("test", task_runner, task_runner, task_runner,
                           task_runner);
148 149 150
  auto shell = Shell::Create(
      std::move(task_runners), settings,
      [](Shell& shell) {
151 152
        return std::make_unique<TestPlatformView>(shell,
                                                  shell.GetTaskRunners());
153 154 155 156
      },
      [](Shell& shell) {
        return std::make_unique<Rasterizer>(shell.GetTaskRunners());
      });
157
  ASSERT_TRUE(ValidateShell(shell.get()));
158 159
}

160 161
TEST_F(ShellTest,
       InitializeWithMultipleThreadButCallingThreadAsPlatformThread) {
162
  Settings settings = CreateSettingsForFixture();
163
  ThreadHost thread_host(
164
      "io.flutter.test." + ::testing::GetCurrentTestName() + ".",
165 166
      ThreadHost::Type::GPU | ThreadHost::Type::IO | ThreadHost::Type::UI);
  fml::MessageLoop::EnsureInitializedForCurrentThread();
167 168 169 170 171
  TaskRunners task_runners("test",
                           fml::MessageLoop::GetCurrent().GetTaskRunner(),
                           thread_host.gpu_thread->GetTaskRunner(),
                           thread_host.ui_thread->GetTaskRunner(),
                           thread_host.io_thread->GetTaskRunner());
172 173 174
  auto shell = Shell::Create(
      std::move(task_runners), settings,
      [](Shell& shell) {
175 176 177 178 179 180 181 182 183
        return std::make_unique<TestPlatformView>(shell,
                                                  shell.GetTaskRunners());
      },
      [](Shell& shell) {
        return std::make_unique<Rasterizer>(shell.GetTaskRunners());
      });
  ASSERT_TRUE(ValidateShell(shell.get()));
}

184
TEST_F(ShellTest, InitializeWithGPUAndPlatformThreadsTheSame) {
185
  Settings settings = CreateSettingsForFixture();
186
  ThreadHost thread_host(
187
      "io.flutter.test." + ::testing::GetCurrentTestName() + ".",
188
      ThreadHost::Type::Platform | ThreadHost::Type::IO | ThreadHost::Type::UI);
189
  TaskRunners task_runners(
190 191 192 193 194 195 196 197 198 199 200
      "test",
      thread_host.platform_thread->GetTaskRunner(),  // platform
      thread_host.platform_thread->GetTaskRunner(),  // gpu
      thread_host.ui_thread->GetTaskRunner(),        // ui
      thread_host.io_thread->GetTaskRunner()         // io
  );
  auto shell = Shell::Create(
      std::move(task_runners), settings,
      [](Shell& shell) {
        return std::make_unique<TestPlatformView>(shell,
                                                  shell.GetTaskRunners());
201 202 203 204
      },
      [](Shell& shell) {
        return std::make_unique<Rasterizer>(shell.GetTaskRunners());
      });
205
  ASSERT_TRUE(ValidateShell(shell.get()));
206 207
}

208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244
TEST_F(ShellTest, FixturesAreFunctional) {
  const auto settings = CreateSettingsForFixture();
  auto shell = Shell::Create(
      GetTaskRunnersForFixture(), settings,
      [](Shell& shell) {
        return std::make_unique<TestPlatformView>(shell,
                                                  shell.GetTaskRunners());
      },
      [](Shell& shell) {
        return std::make_unique<Rasterizer>(shell.GetTaskRunners());
      });
  ASSERT_TRUE(ValidateShell(shell.get()));

  auto configuration = RunConfiguration::InferFromSettings(settings);
  ASSERT_TRUE(configuration.IsValid());
  configuration.SetEntrypoint("fixturesAreFunctionalMain");

  fml::AutoResetWaitableEvent main_latch;
  AddNativeCallback(
      "SayHiFromFixturesAreFunctionalMain",
      CREATE_NATIVE_ENTRY([&main_latch](auto args) { main_latch.Signal(); }));

  fml::AutoResetWaitableEvent latch;
  fml::TaskRunner::RunNowOrPostTask(
      shell->GetTaskRunners().GetUITaskRunner(),
      fml::MakeCopyable([&latch, config = std::move(configuration),
                         engine = shell->GetEngine()]() mutable {
        ASSERT_TRUE(engine);
        ASSERT_EQ(engine->Run(std::move(config)), Engine::RunStatus::Success);
        latch.Signal();
      }));

  latch.Wait();
  main_latch.Wait();
}

}  // namespace testing
245
}  // namespace flutter