summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--AudioManagerCore/test/AmRoutingInterfaceTest/CAmRoutingInterfaceTest.cpp118
-rw-r--r--AudioManagerCore/test/MockIAmControlSend.h4
-rw-r--r--AudioManagerCore/test/MockIAmRoutingSend.h6
3 files changed, 128 insertions, 0 deletions
diff --git a/AudioManagerCore/test/AmRoutingInterfaceTest/CAmRoutingInterfaceTest.cpp b/AudioManagerCore/test/AmRoutingInterfaceTest/CAmRoutingInterfaceTest.cpp
index e5e9636..e2df6e7 100644
--- a/AudioManagerCore/test/AmRoutingInterfaceTest/CAmRoutingInterfaceTest.cpp
+++ b/AudioManagerCore/test/AmRoutingInterfaceTest/CAmRoutingInterfaceTest.cpp
@@ -643,6 +643,124 @@ TEST_F(CAmRoutingInterfaceTest,handleOverflowAbsolute)
ASSERT_EQ(handleOverflowCheck1.handle,0);
}
+/**
+ * Validate handling of early connection announcement and transfer
+ */
+TEST_F(CAmRoutingInterfaceTest, registerEarlyConnection)
+{
+ // prepare additional domain
+ am_Domain_s domain;
+ pCF.createDomain(domain);
+ domain.name = "mock";
+ domain.busname = "mock";
+
+ am_SourceClass_s sourceclass;
+ sourceclass.name="sClass";
+ sourceclass.sourceClassID=5;
+ ASSERT_EQ(E_OK, pDatabaseHandler.enterSourceClassDB(sourceclass.sourceClassID,sourceclass));
+ am_Source_s source;
+ pCF.createSource(source);
+ source.sourceID=1;
+
+ ASSERT_EQ(E_OK, pDatabaseHandler.enterDomainDB(domain, domain.domainID));
+ ASSERT_EQ(E_OK,pRoutingSender.addDomainLookup(domain));
+ ASSERT_EQ(E_OK, pDatabaseHandler.enterSourceDB(source, source.sourceID));
+
+ am_sinkID_t sinkID;
+ ASSERT_EQ(E_OK, pRoutingReceiver.peekSink("AnySink", sinkID));
+
+ am_Route_s route;
+ route.sourceID = source.sourceID;
+ route.sinkID = sinkID;
+ route.route.push_back({source.sourceID, sinkID, domain.domainID, CF_GENIVI_STEREO});
+ EXPECT_CALL(pMockControlInterface, hookSystemRegisterEarlyMainConnection(_, _, _))
+ .WillOnce(Return(E_OK));
+ ASSERT_EQ(E_OK, pRoutingReceiver.registerEarlyConnection(domain.domainID, route, CS_CONNECTED));
+
+ std::vector<am::am_MainConnection_s> listMainConnections;
+ ASSERT_EQ(E_OK, pControlReceiver.getListMainConnections(listMainConnections));
+
+ ASSERT_EQ(1, listMainConnections.size());
+ EXPECT_EQ(CS_CONNECTED, listMainConnections[0].connectionState);
+}
+
+TEST_F(CAmRoutingInterfaceTest, transferConnection)
+{
+ // prepare additional domain
+ am_Domain_s domain;
+ pCF.createDomain(domain);
+ domain.name = "mock";
+ domain.busname = "mock";
+
+ am_SinkClass_s sinkclass;
+ sinkclass.sinkClassID=5;
+ sinkclass.name="sname";
+ ASSERT_EQ(E_OK, pDatabaseHandler.enterSinkClassDB(sinkclass,sinkclass.sinkClassID));
+
+ am_Sink_s sink;
+ pCF.createSink(sink);
+ sink.sinkID = 2;
+ sink.domainID = DYNAMIC_ID_BOUNDARY;
+
+ am_SourceClass_s sourceclass;
+ sourceclass.name="sClass";
+ sourceclass.sourceClassID=5;
+ ASSERT_EQ(E_OK, pDatabaseHandler.enterSourceClassDB(sourceclass.sourceClassID,sourceclass));
+ am_Source_s source;
+ pCF.createSource(source);
+ source.sourceID=1;
+
+ ASSERT_EQ(E_OK, pDatabaseHandler.enterDomainDB(domain, domain.domainID));
+ ASSERT_EQ(E_OK,pRoutingSender.addDomainLookup(domain));
+ ASSERT_EQ(E_OK, pDatabaseHandler.enterSinkDB(sink, sink.sinkID));
+ ASSERT_EQ(E_OK, pDatabaseHandler.enterSourceDB(source,source.sourceID));
+
+ am_Connection_s con;
+ con.connectionID = 0;
+ con.sourceID = source.sourceID;
+ con.sinkID = sink.sinkID;
+ con.delay = 0;
+ con.connectionFormat = CF_GENIVI_STEREO;
+ ASSERT_EQ(E_OK, pDatabaseHandler.enterConnectionDB(con, con.connectionID));
+
+ am_MainConnection_s mainConnection;
+ mainConnection.mainConnectionID = 0;
+ mainConnection.connectionState = CS_CONNECTED;
+ mainConnection.sinkID = sink.sinkID;
+ mainConnection.sourceID = source.sourceID;
+ mainConnection.delay = 0;
+ mainConnection.listConnectionID.push_back(con.connectionID);
+ ASSERT_EQ(E_OK, pDatabaseHandler.enterMainConnectionDB(mainConnection, mainConnection.mainConnectionID));
+
+ // execute
+ EXPECT_CALL(pMockInterface, asyncTransferConnection(_, _, _, CS_CONNECTED))
+ .WillOnce(Invoke(&pMockInterface, &MockIAmRoutingSend::defaultAsyncTransferConnection));
+ am_Handle_s handle;
+ EXPECT_EQ(E_NOT_POSSIBLE, pControlReceiver.transferConnection(handle, mainConnection.mainConnectionID, domain.domainID));
+
+ // validate that all handles have vanished
+ std::vector<am_Handle_s> listHandles;
+ ASSERT_EQ(E_OK, pControlReceiver.getListHandles(listHandles));
+ EXPECT_TRUE(listHandles.empty());
+
+ // prepare routing side to accept the transfer and try again
+ EXPECT_CALL(pMockInterface, asyncTransferConnection(_, _, _, CS_CONNECTED))
+ .WillOnce(Return(E_OK));
+ EXPECT_EQ(E_OK, pControlReceiver.transferConnection(handle, mainConnection.mainConnectionID, domain.domainID));
+
+ // validate that a proper handle is memorized
+ EXPECT_EQ(E_OK, pControlReceiver.getListHandles(listHandles));
+ EXPECT_EQ(1, listHandles.size());
+ EXPECT_EQ(H_TRANSFERCONNECTION, listHandles[0].handleType);
+
+ // inject acknowledgment
+ EXPECT_CALL(pMockControlInterface, cbAckTransferConnection(_, E_OK));
+ pRoutingReceiver.ackTransferConnection(listHandles[0], E_OK);
+
+ // validate that all handles have vanished
+ ASSERT_EQ(E_OK, pControlReceiver.getListHandles(listHandles));
+ ASSERT_TRUE(listHandles.empty());
+}
int main(int argc, char **argv)
diff --git a/AudioManagerCore/test/MockIAmControlSend.h b/AudioManagerCore/test/MockIAmControlSend.h
index 9115d00..74ccc4f 100644
--- a/AudioManagerCore/test/MockIAmControlSend.h
+++ b/AudioManagerCore/test/MockIAmControlSend.h
@@ -105,10 +105,14 @@ class MockIAmControlSend : public IAmControlSend {
void(const am_speed_t speed));
MOCK_METHOD2(hookSystemTimingInformationChanged,
void(const am_mainConnectionID_t mainConnectionID, const am_timeSync_t time));
+ MOCK_METHOD3(hookSystemRegisterEarlyMainConnection,
+ am_Error_e(am_domainID_t domainID, const am_MainConnection_s &mainConnectionData, const am_Route_s &route));
MOCK_METHOD2(cbAckConnect,
void(const am_Handle_s handle, const am_Error_e errorID));
MOCK_METHOD2(cbAckDisconnect,
void(const am_Handle_s handle, const am_Error_e errorID));
+ MOCK_METHOD2(cbAckTransferConnection,
+ void(const am_Handle_s handle, const am_Error_e errorID));
MOCK_METHOD3(cbAckCrossFade,
void(const am_Handle_s handle, const am_HotSink_e hostsink, const am_Error_e error));
MOCK_METHOD3(cbAckSetSinkVolumeChange,
diff --git a/AudioManagerCore/test/MockIAmRoutingSend.h b/AudioManagerCore/test/MockIAmRoutingSend.h
index 748e64e..21ea8f1 100644
--- a/AudioManagerCore/test/MockIAmRoutingSend.h
+++ b/AudioManagerCore/test/MockIAmRoutingSend.h
@@ -45,6 +45,12 @@ class MockIAmRoutingSend : public IAmRoutingSend {
am_Error_e(const am_Handle_s handle, const am_connectionID_t connectionID, const am_sourceID_t sourceID, const am_sinkID_t sinkID, const am_CustomAvailabilityReason_t connectionFormat));
MOCK_METHOD2(asyncDisconnect,
am_Error_e(const am_Handle_s handle, const am_connectionID_t connectionID));
+ MOCK_METHOD4(asyncTransferConnection,
+ am_Error_e(const am_Handle_s handle, am_domainID_t domainID, const std::vector<std::pair<std::string, std::string>> &route, am_ConnectionState_e state));
+ am_Error_e defaultAsyncTransferConnection(const am_Handle_s handle, am_domainID_t domainID
+ , const std::vector<std::pair<std::string, std::string>> &route
+ , am_ConnectionState_e state) // allow usage of default implementation from IAmRoutingSend
+ { return IAmRoutingSend::asyncTransferConnection(handle, domainID, route, state); }
MOCK_METHOD5(asyncSetSinkVolume,
am_Error_e(const am_Handle_s handle, const am_sinkID_t sinkID, const am_volume_t volume, const am_CustomRampType_t ramp, const am_time_t time));
MOCK_METHOD5(asyncSetSourceVolume,