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 23
#include "gtest/gtest.h"

namespace shell {
24
namespace testing {
25

26 27 28 29
class TestPlatformView : public PlatformView,
                         public GPUSurfaceSoftwareDelegate {
 public:
  TestPlatformView(PlatformView::Delegate& delegate,
30
                   flutter::TaskRunners task_runners)
31 32 33 34 35 36 37 38 39 40
      : 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 {
41 42 43
    SkImageInfo image_info = SkImageInfo::MakeN32Premul(
        size.width(), size.height(), SkColorSpace::MakeSRGB());
    return SkSurface::MakeRaster(image_info);
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 85
  }

  // |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;
}

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

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

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

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

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

186
TEST_F(ShellTest, InitializeWithGPUAndPlatformThreadsTheSame) {
187
  flutter::Settings settings = CreateSettingsForFixture();
188
  ThreadHost thread_host(
189
      "io.flutter.test." + ::testing::GetCurrentTestName() + ".",
190
      ThreadHost::Type::Platform | ThreadHost::Type::IO | ThreadHost::Type::UI);
191
  flutter::TaskRunners task_runners(
192 193 194 195 196 197 198 199 200 201 202
      "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());
203 204 205 206
      },
      [](Shell& shell) {
        return std::make_unique<Rasterizer>(shell.GetTaskRunners());
      });
207
  ASSERT_TRUE(ValidateShell(shell.get()));
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 245 246
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
247
}  // namespace shell