TEST_F(SessionManagerTest, CDFFailureTest) { LocalStore* memstore = new LocalStore(); SessionStore* store = new SessionStore(memstore); DummyErrorPeerMessageSenderFactory* factory = new DummyErrorPeerMessageSenderFactory(BILLING_REALM); MockChronosConnection* fake_chronos = new MockChronosConnection("http://localhost:1234"); SessionManager* mgr = new SessionManager(store, _dict, factory, fake_chronos, _diameter_stack); SessionStore::Session* sess = NULL; Message* start_msg = new Message("CALL_ID_FOUR", ORIGINATING, SCSCF, NULL, Rf::AccountingRecordType(2), 300, FAKE_TRAIL_ID); Message* interim_msg = new Message("CALL_ID_FOUR", ORIGINATING, SCSCF, NULL, Rf::AccountingRecordType(3), 300, FAKE_TRAIL_ID); // When a START message fails, we should not store the session or handle any subsequent messages mgr->handle(start_msg); sess = store->get_session_data("CALL_ID_FOUR", ORIGINATING, SCSCF, FAKE_TRAIL_ID); ASSERT_EQ(NULL, sess); mgr->handle(interim_msg); sess = store->get_session_data("CALL_ID_FOUR", ORIGINATING, SCSCF, FAKE_TRAIL_ID); ASSERT_EQ(NULL, sess); delete mgr; delete factory; delete fake_chronos; delete store; delete memstore; }
TEST_F(SessionManagerTest, NewCallTest) { LocalStore* memstore = new LocalStore(); SessionStore* store = new SessionStore(memstore); DummyPeerMessageSenderFactory* factory = new DummyPeerMessageSenderFactory(BILLING_REALM); MockChronosConnection* fake_chronos = new MockChronosConnection("http://localhost:1234"); SessionManager* mgr = new SessionManager(store, _dict, factory, fake_chronos, _diameter_stack); SessionStore::Session* sess = NULL; Message* start_msg = new Message("CALL_ID_TWO", ORIGINATING, SCSCF, NULL, Rf::AccountingRecordType(2), 300, FAKE_TRAIL_ID); Message* stop_msg = new Message("CALL_ID_TWO", ORIGINATING, SCSCF, NULL, Rf::AccountingRecordType(4), 300, FAKE_TRAIL_ID); Message* start_msg_2 = new Message("CALL_ID_TWO", ORIGINATING, SCSCF, NULL, Rf::AccountingRecordType(2), 300, FAKE_TRAIL_ID); mgr->handle(start_msg); sess = store->get_session_data("CALL_ID_TWO", ORIGINATING, SCSCF, FAKE_TRAIL_ID); delete sess; mgr->handle(stop_msg); sess = store->get_session_data("CALL_ID_TWO", ORIGINATING, SCSCF, FAKE_TRAIL_ID); ASSERT_EQ(NULL, sess); mgr->handle(start_msg_2); // Re-using call-IDs should just work sess = store->get_session_data("CALL_ID_TWO", ORIGINATING, SCSCF, FAKE_TRAIL_ID); ASSERT_EQ(1u, sess->acct_record_number); delete sess; sess = NULL; delete mgr; delete factory; delete fake_chronos; delete store; delete memstore; }
TEST_F(SessionManagerTest, TimerIDTest) { LocalStore* memstore = new LocalStore(); SessionStore* store = new SessionStore(memstore); DummyPeerMessageSenderFactory* factory = new DummyPeerMessageSenderFactory(BILLING_REALM); MockChronosConnection* fake_chronos = new MockChronosConnection("http://localhost:1234"); SessionManager* mgr = new SessionManager(store, _dict, factory, fake_chronos, _diameter_stack); SessionStore::Session* sess = NULL; Message* start_msg = new Message("CALL_ID_ONE", ORIGINATING, SCSCF, NULL, Rf::AccountingRecordType(2), 300, FAKE_TRAIL_ID); start_msg->ccfs.push_back("10.0.0.1"); Message* interim_msg = new Message("CALL_ID_ONE", ORIGINATING, SCSCF, NULL, Rf::AccountingRecordType(3), 0, FAKE_TRAIL_ID); Message* stop_msg = new Message("CALL_ID_ONE", ORIGINATING, SCSCF, NULL, Rf::AccountingRecordType(4), 0, FAKE_TRAIL_ID); // START should put a session in the store mgr->handle(start_msg); sess = store->get_session_data("CALL_ID_ONE", ORIGINATING, SCSCF, FAKE_TRAIL_ID); ASSERT_NE((SessionStore::Session*)NULL, sess); EXPECT_EQ(1u, sess->acct_record_number); // Change the stored timer - this means that the chronos PUT will return a // clashing timer, triggering the session manager to update the stored timer ID sess->timer_id = "NEW_TIMER"; store->set_session_data("CALL_ID_ONE", ORIGINATING, SCSCF, sess, FAKE_TRAIL_ID); delete sess; sess = NULL; // INTERIM should keep that session in the store mgr->handle(interim_msg); sess = store->get_session_data("CALL_ID_ONE", ORIGINATING, SCSCF, FAKE_TRAIL_ID); ASSERT_NE((SessionStore::Session*)NULL, sess); EXPECT_EQ(2u, sess->acct_record_number); // The timer id should have been updated to match the id returned from the PUT. EXPECT_EQ("TIMER_ID", sess->timer_id); delete sess; sess = NULL; // STOP should remove the session from the store mgr->handle(stop_msg); sess = store->get_session_data("CALL_ID_ONE", ORIGINATING, SCSCF, FAKE_TRAIL_ID); ASSERT_EQ(NULL, sess); delete mgr; delete factory; delete fake_chronos; delete store; delete memstore; }
TEST_F(SessionManagerTest, CDFInterimUnknownTest) { LocalStore* memstore = new LocalStore(); SessionStore* store = new SessionStore(memstore); DummyPeerMessageSenderFactory* factory = new DummyPeerMessageSenderFactory(BILLING_REALM); MockChronosConnection* fake_chronos = new MockChronosConnection("http://localhost:1234"); SessionManager* mgr = new SessionManager(store, _dict, factory, fake_chronos, _diameter_stack); DummyUnknownErrorPeerMessageSenderFactory* fail_factory = new DummyUnknownErrorPeerMessageSenderFactory(BILLING_REALM); SessionManager* fail_mgr = new SessionManager(store, _dict, fail_factory, fake_chronos, _diameter_stack); SessionStore::Session* sess = NULL; Message* start_msg = new Message("CALL_ID_FOUR", ORIGINATING, SCSCF, NULL, Rf::AccountingRecordType(2), 300, FAKE_TRAIL_ID); Message* interim_msg = new Message("CALL_ID_FOUR", ORIGINATING, SCSCF, NULL, Rf::AccountingRecordType(3), 300, FAKE_TRAIL_ID); mgr->handle(start_msg); sess = store->get_session_data("CALL_ID_FOUR", ORIGINATING, SCSCF, FAKE_TRAIL_ID); ASSERT_NE((SessionStore::Session*)NULL, sess); EXPECT_EQ(1u, sess->acct_record_number); delete sess; sess = NULL; // When an INTERIM message fails with a 5002 "Session unknown" error, we should delete the session fail_mgr->handle(interim_msg); sess = store->get_session_data("CALL_ID_FOUR", ORIGINATING, SCSCF, FAKE_TRAIL_ID); ASSERT_EQ(NULL, sess); delete mgr; delete factory; delete fail_mgr; delete fail_factory; delete fake_chronos; delete store; delete memstore; }
TEST_F(SessionManagerTest, SimpleTest) { LocalStore* memstore = new LocalStore(); SessionStore* store = new SessionStore(memstore); DummyPeerMessageSenderFactory* factory = new DummyPeerMessageSenderFactory(BILLING_REALM); MockChronosConnection* fake_chronos = new MockChronosConnection("http://localhost:1234"); SessionManager* mgr = new SessionManager(store, _dict, factory, fake_chronos, _diameter_stack); SessionStore::Session* sess = NULL; Message* start_msg = new Message("CALL_ID_ONE", ORIGINATING, SCSCF, NULL, Rf::AccountingRecordType(2), 300, FAKE_TRAIL_ID); start_msg->ccfs.push_back("10.0.0.1"); Message* interim_msg = new Message("CALL_ID_ONE", ORIGINATING, SCSCF, NULL, Rf::AccountingRecordType(3), 0, FAKE_TRAIL_ID); Message* stop_msg = new Message("CALL_ID_ONE", ORIGINATING, SCSCF, NULL, Rf::AccountingRecordType(4), 0, FAKE_TRAIL_ID); // START should put a session in the store mgr->handle(start_msg); sess = store->get_session_data("CALL_ID_ONE", ORIGINATING, SCSCF, FAKE_TRAIL_ID); ASSERT_NE((SessionStore::Session*)NULL, sess); EXPECT_EQ(1u, sess->acct_record_number); delete sess; sess = NULL; // INTERIM should keep that session in the store mgr->handle(interim_msg); sess = store->get_session_data("CALL_ID_ONE", ORIGINATING, SCSCF, FAKE_TRAIL_ID); ASSERT_NE((SessionStore::Session*)NULL, sess); EXPECT_EQ(2u, sess->acct_record_number); delete sess; sess = NULL; // STOP should remove the session from the store mgr->handle(stop_msg); sess = store->get_session_data("CALL_ID_ONE", ORIGINATING, SCSCF, FAKE_TRAIL_ID); ASSERT_EQ(NULL, sess); delete mgr; delete factory; delete fake_chronos; delete store; delete memstore; }
TEST_F(SessionManagerTest, CDFInterimFailureWithTimerIdChangeTest) { LocalStore* memstore = new LocalStore(); SessionStore* store = new SessionStore(memstore); DummyPeerMessageSenderFactory* factory = new DummyPeerMessageSenderFactory(BILLING_REALM); MockChronosConnection* fake_chronos = new MockChronosConnection("http://localhost:1234"); SessionManager* mgr = new SessionManager(store, _dict, factory, fake_chronos, _diameter_stack); DummyErrorPeerMessageSenderFactory* fail_factory = new DummyErrorPeerMessageSenderFactory(BILLING_REALM); SessionManager* fail_mgr = new SessionManager(store, _dict, fail_factory, fake_chronos, _diameter_stack); SessionStore::Session* sess = NULL; Message* start_msg = new Message("CALL_ID_FOUR", ORIGINATING, SCSCF, NULL, Rf::AccountingRecordType(2), 300, FAKE_TRAIL_ID); Message* interim_msg = new Message("CALL_ID_FOUR", ORIGINATING, SCSCF, NULL, Rf::AccountingRecordType(3), 300, FAKE_TRAIL_ID); mgr->handle(start_msg); sess = store->get_session_data("CALL_ID_FOUR", ORIGINATING, SCSCF, FAKE_TRAIL_ID); ASSERT_NE((SessionStore::Session*)NULL, sess); EXPECT_EQ(1u, sess->acct_record_number); // Change the stored timer - this means that the chronos PUT will return a // clashing timer, triggering the session manager to update the stored timer ID sess->timer_id = "NEW_TIMER"; store->set_session_data("CALL_ID_FOUR", ORIGINATING, SCSCF, sess, FAKE_TRAIL_ID); delete sess; sess = NULL; // When an INTERIM message fails with an error other than 5002 "Session unknown", we should still keep the session fail_mgr->handle(interim_msg); sess = store->get_session_data("CALL_ID_FOUR", ORIGINATING, SCSCF, FAKE_TRAIL_ID); ASSERT_NE((SessionStore::Session*)NULL, sess); EXPECT_EQ(2u, sess->acct_record_number); // The timer id should have been updated to match the id returned from the PUT. EXPECT_EQ("TIMER_ID", sess->timer_id); delete sess; sess = NULL; delete mgr; delete factory; delete fail_mgr; delete fail_factory; delete fake_chronos; delete store; delete memstore; }
TEST_F(SessionManagerTest, UnknownCallTest) { LocalStore* memstore = new LocalStore(); SessionStore* store = new SessionStore(memstore); DummyPeerMessageSenderFactory* factory = new DummyPeerMessageSenderFactory(BILLING_REALM); MockChronosConnection* fake_chronos = new MockChronosConnection("http://localhost:1234"); SessionManager* mgr = new SessionManager(store, _dict, factory, fake_chronos, _diameter_stack); SessionStore::Session* sess = NULL; Message* interim_msg = new Message("CALL_ID_THREE", ORIGINATING, SCSCF, NULL, Rf::AccountingRecordType(3), 300, FAKE_TRAIL_ID); // If we receive an INTERIM for a call not in the store, we should ignore it mgr->handle(interim_msg); sess = store->get_session_data("CALL_ID_THREE", ORIGINATING, SCSCF, FAKE_TRAIL_ID); ASSERT_EQ(NULL, sess); delete mgr; delete factory; delete fake_chronos; delete store; delete memstore; }