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