/* * Copyright (C) 2016 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include <algorithm> #include "gtest/gtest.h" #include "chre/core/request_multiplexer.h" using chre::RequestMultiplexer; class DummyRequest { public: DummyRequest() : DummyRequest(0) {} DummyRequest(int priority) : mPriority(priority) {} bool isEquivalentTo(const DummyRequest& request) const { return (mPriority == request.mPriority); } bool mergeWith(const DummyRequest& request) { bool newMaximal = false; if (request.mPriority > mPriority) { mPriority = request.mPriority; newMaximal = true; } return newMaximal; } int getPriority() const { return mPriority; } private: int mPriority; }; TEST(RequestMultiplexer, DefaultRequestDoesNotCauseNewMaximal) { RequestMultiplexer<DummyRequest> multiplexer; DummyRequest request; size_t index; bool maximalRequestChanged; ASSERT_TRUE(multiplexer.addRequest(request, &index, &maximalRequestChanged)); EXPECT_FALSE(maximalRequestChanged); EXPECT_EQ(multiplexer.getCurrentMaximalRequest().getPriority(), 0); } TEST(RequestMultiplexer, FirstHighPriorityRequestCausesNewMaximal) { RequestMultiplexer<DummyRequest> multiplexer; DummyRequest request(10); size_t index; bool maximalRequestChanged; ASSERT_TRUE(multiplexer.addRequest(request, &index, &maximalRequestChanged)); EXPECT_TRUE(maximalRequestChanged); EXPECT_EQ(multiplexer.getCurrentMaximalRequest().getPriority(), 10); } TEST(RequestMultiplexer, NewLowerPriorityRequestDoesNotCauseNewMaximal) { RequestMultiplexer<DummyRequest> multiplexer; size_t index; { DummyRequest request(10); bool maximalRequestChanged; ASSERT_TRUE(multiplexer.addRequest(request, &index, &maximalRequestChanged)); EXPECT_TRUE(maximalRequestChanged); EXPECT_EQ(multiplexer.getCurrentMaximalRequest().getPriority(), 10); } { DummyRequest request(5); bool maximalRequestChanged; ASSERT_TRUE(multiplexer.addRequest(request, &index, &maximalRequestChanged)); EXPECT_FALSE(maximalRequestChanged); EXPECT_EQ(multiplexer.getCurrentMaximalRequest().getPriority(), 10); } } TEST(RequestMultiplexer, AddOneRemoveMaximal) { RequestMultiplexer<DummyRequest> multiplexer; DummyRequest request(10); size_t index; bool maximalRequestChanged; ASSERT_TRUE(multiplexer.addRequest(request, &index, &maximalRequestChanged)); EXPECT_TRUE(maximalRequestChanged); EXPECT_EQ(multiplexer.getRequests()[index].getPriority(), 10); EXPECT_EQ(multiplexer.getCurrentMaximalRequest().getPriority(), 10); DummyRequest defaultRequest; multiplexer.removeRequest(0, &maximalRequestChanged); EXPECT_TRUE(maximalRequestChanged); EXPECT_TRUE(multiplexer.getCurrentMaximalRequest() .isEquivalentTo(defaultRequest)); EXPECT_TRUE(multiplexer.getRequests().empty()); } TEST(RequestMultiplexer, AddManyRemoveMaximal) { RequestMultiplexer<DummyRequest> multiplexer; size_t index; { DummyRequest request(10); bool maximalRequestChanged; ASSERT_TRUE(multiplexer.addRequest(request, &index, &maximalRequestChanged)); EXPECT_TRUE(maximalRequestChanged); EXPECT_EQ(multiplexer.getRequests()[index].getPriority(), 10); EXPECT_EQ(multiplexer.getCurrentMaximalRequest().getPriority(), 10); } { DummyRequest request(5); bool maximalRequestChanged; ASSERT_TRUE(multiplexer.addRequest(request, &index, &maximalRequestChanged)); EXPECT_FALSE(maximalRequestChanged); EXPECT_EQ(multiplexer.getRequests()[index].getPriority(), 5); EXPECT_EQ(multiplexer.getCurrentMaximalRequest().getPriority(), 10); } { DummyRequest request(10); bool maximalRequestChanged; ASSERT_TRUE(multiplexer.addRequest(request, &index, &maximalRequestChanged)); EXPECT_FALSE(maximalRequestChanged); EXPECT_EQ(multiplexer.getRequests()[index].getPriority(), 10); EXPECT_EQ(multiplexer.getCurrentMaximalRequest().getPriority(), 10); } bool maximalRequestChanged; multiplexer.removeRequest(0, &maximalRequestChanged); EXPECT_FALSE(maximalRequestChanged); EXPECT_EQ(multiplexer.getCurrentMaximalRequest().getPriority(), 10); EXPECT_EQ(multiplexer.getRequests()[0].getPriority(), 5); EXPECT_EQ(multiplexer.getRequests()[1].getPriority(), 10); } TEST(RequestMultiplexer, AddManyRemoveBeforeMaximalThenRemoveMaximal) { RequestMultiplexer<DummyRequest> multiplexer; size_t index; { DummyRequest request(1); bool maximalRequestChanged; ASSERT_TRUE(multiplexer.addRequest(request, &index, &maximalRequestChanged)); EXPECT_TRUE(maximalRequestChanged); EXPECT_EQ(multiplexer.getRequests()[index].getPriority(), 1); EXPECT_EQ(multiplexer.getCurrentMaximalRequest().getPriority(), 1); } { DummyRequest request(5); bool maximalRequestChanged; ASSERT_TRUE(multiplexer.addRequest(request, &index, &maximalRequestChanged)); EXPECT_TRUE(maximalRequestChanged); EXPECT_EQ(multiplexer.getRequests()[index].getPriority(), 5); EXPECT_EQ(multiplexer.getCurrentMaximalRequest().getPriority(), 5); } { DummyRequest request(10); bool maximalRequestChanged; ASSERT_TRUE(multiplexer.addRequest(request, &index, &maximalRequestChanged)); EXPECT_TRUE(maximalRequestChanged); EXPECT_EQ(multiplexer.getRequests()[index].getPriority(), 10); EXPECT_EQ(multiplexer.getCurrentMaximalRequest().getPriority(), 10); } bool maximalRequestChanged; multiplexer.removeRequest(0, &maximalRequestChanged); EXPECT_FALSE(maximalRequestChanged); EXPECT_EQ(multiplexer.getCurrentMaximalRequest().getPriority(), 10); EXPECT_EQ(multiplexer.getRequests()[0].getPriority(), 5); EXPECT_EQ(multiplexer.getRequests()[1].getPriority(), 10); multiplexer.removeRequest(1, &maximalRequestChanged); EXPECT_TRUE(maximalRequestChanged); EXPECT_EQ(multiplexer.getCurrentMaximalRequest().getPriority(), 5); EXPECT_EQ(multiplexer.getRequests()[0].getPriority(), 5); } TEST(RequestMultiplexer, AddManyRemoveAfterMaximalThenRemoveMaximal) { RequestMultiplexer<DummyRequest> multiplexer; size_t index; { DummyRequest request(1); bool maximalRequestChanged; ASSERT_TRUE(multiplexer.addRequest(request, &index, &maximalRequestChanged)); EXPECT_TRUE(maximalRequestChanged); EXPECT_EQ(multiplexer.getRequests()[index].getPriority(), 1); EXPECT_EQ(multiplexer.getCurrentMaximalRequest().getPriority(), 1); } { DummyRequest request(5); bool maximalRequestChanged; ASSERT_TRUE(multiplexer.addRequest(request, &index, &maximalRequestChanged)); EXPECT_TRUE(maximalRequestChanged); EXPECT_EQ(multiplexer.getRequests()[index].getPriority(), 5); EXPECT_EQ(multiplexer.getCurrentMaximalRequest().getPriority(), 5); } { DummyRequest request(10); bool maximalRequestChanged; ASSERT_TRUE(multiplexer.addRequest(request, &index, &maximalRequestChanged)); EXPECT_TRUE(maximalRequestChanged); EXPECT_EQ(multiplexer.getRequests()[index].getPriority(), 10); EXPECT_EQ(multiplexer.getCurrentMaximalRequest().getPriority(), 10); } { DummyRequest request(5); bool maximalRequestChanged; ASSERT_TRUE(multiplexer.addRequest(request, &index, &maximalRequestChanged)); EXPECT_FALSE(maximalRequestChanged); EXPECT_EQ(multiplexer.getRequests()[index].getPriority(), 5); EXPECT_EQ(multiplexer.getCurrentMaximalRequest().getPriority(), 10); } bool maximalRequestChanged; multiplexer.removeRequest(3, &maximalRequestChanged); EXPECT_FALSE(maximalRequestChanged); EXPECT_EQ(multiplexer.getCurrentMaximalRequest().getPriority(), 10); EXPECT_EQ(multiplexer.getRequests()[0].getPriority(), 1); EXPECT_EQ(multiplexer.getRequests()[1].getPriority(), 5); EXPECT_EQ(multiplexer.getRequests()[2].getPriority(), 10); multiplexer.removeRequest(2, &maximalRequestChanged); EXPECT_TRUE(maximalRequestChanged); EXPECT_EQ(multiplexer.getCurrentMaximalRequest().getPriority(), 5); EXPECT_EQ(multiplexer.getRequests()[0].getPriority(), 1); EXPECT_EQ(multiplexer.getRequests()[1].getPriority(), 5); } TEST(RequestMultiplexer, AddManyUpdateWithLowerPriority) { RequestMultiplexer<DummyRequest> multiplexer; size_t index; { DummyRequest request(1); bool maximalRequestChanged; ASSERT_TRUE(multiplexer.addRequest(request, &index, &maximalRequestChanged)); EXPECT_TRUE(maximalRequestChanged); EXPECT_EQ(multiplexer.getRequests()[index].getPriority(), 1); EXPECT_EQ(multiplexer.getCurrentMaximalRequest().getPriority(), 1); } { DummyRequest request(5); bool maximalRequestChanged; ASSERT_TRUE(multiplexer.addRequest(request, &index, &maximalRequestChanged)); EXPECT_TRUE(maximalRequestChanged); EXPECT_EQ(multiplexer.getRequests()[index].getPriority(), 5); EXPECT_EQ(multiplexer.getCurrentMaximalRequest().getPriority(), 5); } { DummyRequest request(10); bool maximalRequestChanged; ASSERT_TRUE(multiplexer.addRequest(request, &index, &maximalRequestChanged)); EXPECT_TRUE(maximalRequestChanged); EXPECT_EQ(multiplexer.getRequests()[index].getPriority(), 10); EXPECT_EQ(multiplexer.getCurrentMaximalRequest().getPriority(), 10); } { DummyRequest request(8); bool maximalRequestChanged; multiplexer.updateRequest(1, request, &maximalRequestChanged); EXPECT_FALSE(maximalRequestChanged); EXPECT_EQ(multiplexer.getRequests()[1].getPriority(), 8); EXPECT_EQ(multiplexer.getCurrentMaximalRequest().getPriority(), 10); } } TEST(RequestMultiplexer, AddManyUpdateWithNewMaximalLowerPriority) { RequestMultiplexer<DummyRequest> multiplexer; size_t index; { DummyRequest request(1); bool maximalRequestChanged; ASSERT_TRUE(multiplexer.addRequest(request, &index, &maximalRequestChanged)); EXPECT_TRUE(maximalRequestChanged); EXPECT_EQ(multiplexer.getRequests()[index].getPriority(), 1); EXPECT_EQ(multiplexer.getCurrentMaximalRequest().getPriority(), 1); } { DummyRequest request(5); bool maximalRequestChanged; ASSERT_TRUE(multiplexer.addRequest(request, &index, &maximalRequestChanged)); EXPECT_TRUE(maximalRequestChanged); EXPECT_EQ(multiplexer.getRequests()[index].getPriority(), 5); EXPECT_EQ(multiplexer.getCurrentMaximalRequest().getPriority(), 5); } { DummyRequest request(10); bool maximalRequestChanged; ASSERT_TRUE(multiplexer.addRequest(request, &index, &maximalRequestChanged)); EXPECT_TRUE(maximalRequestChanged); EXPECT_EQ(multiplexer.getRequests()[index].getPriority(), 10); EXPECT_EQ(multiplexer.getCurrentMaximalRequest().getPriority(), 10); } { DummyRequest request(8); bool maximalRequestChanged; multiplexer.updateRequest(2, request, &maximalRequestChanged); EXPECT_TRUE(maximalRequestChanged); EXPECT_EQ(multiplexer.getRequests()[2].getPriority(), 8); EXPECT_EQ(multiplexer.getCurrentMaximalRequest().getPriority(), 8); } } TEST(RequestMultiplexer, AddManyUpdateNewMaximal) { RequestMultiplexer<DummyRequest> multiplexer; size_t index; { DummyRequest request(1); bool maximalRequestChanged; ASSERT_TRUE(multiplexer.addRequest(request, &index, &maximalRequestChanged)); EXPECT_TRUE(maximalRequestChanged); EXPECT_EQ(multiplexer.getRequests()[index].getPriority(), 1); EXPECT_EQ(multiplexer.getCurrentMaximalRequest().getPriority(), 1); } { DummyRequest request(5); bool maximalRequestChanged; ASSERT_TRUE(multiplexer.addRequest(request, &index, &maximalRequestChanged)); EXPECT_TRUE(maximalRequestChanged); EXPECT_EQ(multiplexer.getRequests()[index].getPriority(), 5); EXPECT_EQ(multiplexer.getCurrentMaximalRequest().getPriority(), 5); } { DummyRequest request(10); bool maximalRequestChanged; ASSERT_TRUE(multiplexer.addRequest(request, &index, &maximalRequestChanged)); EXPECT_TRUE(maximalRequestChanged); EXPECT_EQ(multiplexer.getRequests()[index].getPriority(), 10); EXPECT_EQ(multiplexer.getCurrentMaximalRequest().getPriority(), 10); } { DummyRequest request(20); bool maximalRequestChanged; multiplexer.updateRequest(1, request, &maximalRequestChanged); EXPECT_TRUE(maximalRequestChanged); EXPECT_EQ(multiplexer.getRequests()[1].getPriority(), 20); EXPECT_EQ(multiplexer.getCurrentMaximalRequest().getPriority(), 20); } } TEST(RequestMultiplexer, RemoveAllRequestsEmpty) { RequestMultiplexer<DummyRequest> multiplexer; bool maximalRequestChanged; multiplexer.removeAllRequests(&maximalRequestChanged); EXPECT_FALSE(maximalRequestChanged); EXPECT_EQ(multiplexer.getCurrentMaximalRequest().getPriority(), 0); } TEST(RequestMultiplexer, RemoveAllRequestsNonEmpty) { RequestMultiplexer<DummyRequest> multiplexer; size_t index; { DummyRequest request(1); bool maximalRequestChanged; ASSERT_TRUE(multiplexer.addRequest(request, &index, &maximalRequestChanged)); } bool maximalRequestChanged; multiplexer.removeAllRequests(&maximalRequestChanged); EXPECT_TRUE(maximalRequestChanged); EXPECT_EQ(multiplexer.getCurrentMaximalRequest().getPriority(), 0); }