• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 #define FML_USED_ON_EMBEDDER
6 
7 #include <functional>
8 #include <future>
9 #include <memory>
10 
11 #include "flutter/shell/common/pipeline.h"
12 #include "gtest/gtest.h"
13 
14 namespace flutter {
15 namespace testing {
16 
17 using IntPipeline = Pipeline<int>;
18 using Continuation = IntPipeline::ProducerContinuation;
19 
TEST(PipelineTest,ConsumeOneVal)20 TEST(PipelineTest, ConsumeOneVal) {
21   fml::RefPtr<IntPipeline> pipeline = fml::MakeRefCounted<IntPipeline>(2);
22 
23   Continuation continuation = pipeline->Produce();
24 
25   const int test_val = 1;
26   continuation.Complete(std::make_unique<int>(test_val));
27 
28   PipelineConsumeResult consume_result = pipeline->Consume(
29       [&test_val](std::unique_ptr<int> v) { ASSERT_EQ(*v, test_val); });
30 
31   ASSERT_EQ(consume_result, PipelineConsumeResult::Done);
32 }
33 
TEST(PipelineTest,ContinuationCanOnlyBeUsedOnce)34 TEST(PipelineTest, ContinuationCanOnlyBeUsedOnce) {
35   fml::RefPtr<IntPipeline> pipeline = fml::MakeRefCounted<IntPipeline>(2);
36 
37   Continuation continuation = pipeline->Produce();
38 
39   const int test_val = 1;
40   continuation.Complete(std::make_unique<int>(test_val));
41 
42   PipelineConsumeResult consume_result_1 = pipeline->Consume(
43       [&test_val](std::unique_ptr<int> v) { ASSERT_EQ(*v, test_val); });
44 
45   continuation.Complete(std::make_unique<int>(test_val));
46   ASSERT_EQ(consume_result_1, PipelineConsumeResult::Done);
47 
48   PipelineConsumeResult consume_result_2 =
49       pipeline->Consume([](std::unique_ptr<int> v) { FAIL(); });
50 
51   continuation.Complete(std::make_unique<int>(test_val));
52   ASSERT_EQ(consume_result_2, PipelineConsumeResult::NoneAvailable);
53 }
54 
TEST(PipelineTest,PushingMoreThanDepthCompletesFirstSubmission)55 TEST(PipelineTest, PushingMoreThanDepthCompletesFirstSubmission) {
56   const int depth = 1;
57   fml::RefPtr<IntPipeline> pipeline = fml::MakeRefCounted<IntPipeline>(depth);
58 
59   Continuation continuation_1 = pipeline->Produce();
60   Continuation continuation_2 = pipeline->Produce();
61 
62   const int test_val_1 = 1, test_val_2 = 2;
63   continuation_1.Complete(std::make_unique<int>(test_val_1));
64   continuation_2.Complete(std::make_unique<int>(test_val_2));
65 
66   PipelineConsumeResult consume_result_1 = pipeline->Consume(
67       [&test_val_1](std::unique_ptr<int> v) { ASSERT_EQ(*v, test_val_1); });
68 
69   ASSERT_EQ(consume_result_1, PipelineConsumeResult::Done);
70 }
71 
TEST(PipelineTest,PushingMultiProcessesInOrder)72 TEST(PipelineTest, PushingMultiProcessesInOrder) {
73   const int depth = 2;
74   fml::RefPtr<IntPipeline> pipeline = fml::MakeRefCounted<IntPipeline>(depth);
75 
76   Continuation continuation_1 = pipeline->Produce();
77   Continuation continuation_2 = pipeline->Produce();
78 
79   const int test_val_1 = 1, test_val_2 = 2;
80   continuation_1.Complete(std::make_unique<int>(test_val_1));
81   continuation_2.Complete(std::make_unique<int>(test_val_2));
82 
83   PipelineConsumeResult consume_result_1 = pipeline->Consume(
84       [&test_val_1](std::unique_ptr<int> v) { ASSERT_EQ(*v, test_val_1); });
85   ASSERT_EQ(consume_result_1, PipelineConsumeResult::MoreAvailable);
86 
87   PipelineConsumeResult consume_result_2 = pipeline->Consume(
88       [&test_val_2](std::unique_ptr<int> v) { ASSERT_EQ(*v, test_val_2); });
89   ASSERT_EQ(consume_result_2, PipelineConsumeResult::Done);
90 }
91 
TEST(PipelineTest,PushingToFrontOverridesOrder)92 TEST(PipelineTest, PushingToFrontOverridesOrder) {
93   const int depth = 2;
94   fml::RefPtr<IntPipeline> pipeline = fml::MakeRefCounted<IntPipeline>(depth);
95 
96   Continuation continuation_1 = pipeline->Produce();
97   Continuation continuation_2 = pipeline->ProduceToFront();
98 
99   const int test_val_1 = 1, test_val_2 = 2;
100   continuation_1.Complete(std::make_unique<int>(test_val_1));
101   continuation_2.Complete(std::make_unique<int>(test_val_2));
102 
103   PipelineConsumeResult consume_result_1 = pipeline->Consume(
104       [&test_val_2](std::unique_ptr<int> v) { ASSERT_EQ(*v, test_val_2); });
105   ASSERT_EQ(consume_result_1, PipelineConsumeResult::MoreAvailable);
106 
107   PipelineConsumeResult consume_result_2 = pipeline->Consume(
108       [&test_val_1](std::unique_ptr<int> v) { ASSERT_EQ(*v, test_val_1); });
109   ASSERT_EQ(consume_result_2, PipelineConsumeResult::Done);
110 }
111 
TEST(PipelineTest,PushingToFrontDropsLastResource)112 TEST(PipelineTest, PushingToFrontDropsLastResource) {
113   const int depth = 2;
114   fml::RefPtr<IntPipeline> pipeline = fml::MakeRefCounted<IntPipeline>(depth);
115 
116   Continuation continuation_1 = pipeline->Produce();
117   Continuation continuation_2 = pipeline->Produce();
118   Continuation continuation_3 = pipeline->ProduceToFront();
119 
120   const int test_val_1 = 1, test_val_2 = 2, test_val_3 = 3;
121   continuation_1.Complete(std::make_unique<int>(test_val_1));
122   continuation_2.Complete(std::make_unique<int>(test_val_2));
123   continuation_3.Complete(std::make_unique<int>(test_val_3));
124 
125   PipelineConsumeResult consume_result_1 = pipeline->Consume(
126       [&test_val_3](std::unique_ptr<int> v) { ASSERT_EQ(*v, test_val_3); });
127   ASSERT_EQ(consume_result_1, PipelineConsumeResult::MoreAvailable);
128 
129   PipelineConsumeResult consume_result_2 = pipeline->Consume(
130       [&test_val_1](std::unique_ptr<int> v) { ASSERT_EQ(*v, test_val_1); });
131   ASSERT_EQ(consume_result_2, PipelineConsumeResult::Done);
132 }
133 
134 }  // namespace testing
135 }  // namespace flutter
136