RTBKit
0.9
Open-source framework to create real-time ad bidding systems.
|
00001 /* configuration_agent_test.cc 00002 Jeremy Barnes, 27 November 2012 00003 Copyright (c) 2012 Datacratic Inc. All rights reserved. 00004 00005 Test for the configuration agent. 00006 */ 00007 00008 #define BOOST_TEST_MAIN 00009 #define BOOST_TEST_DYN_LINK 00010 00011 #include <boost/test/unit_test.hpp> 00012 00013 #include "rtbkit/core/router/router.h" 00014 #include "rtbkit/core/post_auction/post_auction_loop.h" 00015 #include "rtbkit/core/agent_configuration/agent_configuration_service.h" 00016 #include "rtbkit/core/agent_configuration/agent_configuration_listener.h" 00017 #include "jml/utils/pair_utils.h" 00018 #include "jml/arch/timers.h" 00019 #include "jml/arch/futex.h" 00020 #include "test_agent.h" 00021 00022 using namespace std; 00023 using namespace ML; 00024 using namespace Datacratic; 00025 using namespace RTBKIT; 00026 00027 00028 BOOST_AUTO_TEST_CASE( test_agent_configuration ) 00029 { 00030 std::shared_ptr<ServiceProxies> proxies(new ServiceProxies()); 00031 00032 AgentConfigurationService config(proxies); 00033 00034 config.init(); 00035 config.bindTcp(); 00036 config.start(); 00037 00038 proxies->config->dump(cerr); 00039 00040 TestAgent agent(proxies, "bidding_agent"); 00041 00042 AgentConfigurationListener listener(proxies->zmqContext); 00043 00044 int numConfigurations = 0; 00045 std::shared_ptr<const AgentConfig> currentConfig; 00046 std::string currentName; 00047 00048 listener.onConfigChange = [&] (std::string agent, 00049 std::shared_ptr<const AgentConfig> config) 00050 { 00051 currentName = agent; 00052 //ExcAssertEqual(agent, "bidding_agent"); 00053 cerr << "got new configuration for agent " << agent << endl; 00054 currentConfig = config; 00055 ++numConfigurations; 00056 ML::futex_wake(numConfigurations); 00057 }; 00058 00059 listener.init(proxies->config); 00060 listener.start(); 00061 00062 agent.agentName = "bidding_agent"; 00063 agent.init(); 00064 agent.start(); 00065 agent.configure(); 00066 00067 while (numConfigurations == 0) 00068 futex_wait(numConfigurations, 0); 00069 00070 BOOST_CHECK_EQUAL(numConfigurations, 1); 00071 BOOST_CHECK_EQUAL(currentConfig->toJson(), agent.config.toJson()); 00072 00073 BOOST_CHECK_EQUAL(listener.getAgentEntry("bidding_agent").config, 00074 currentConfig); 00075 BOOST_CHECK_EQUAL(currentName, "bidding_agent"); 00076 00077 // Check that a second configuration with the same parameters doesn't cause a new 00078 // message to be broadcast 00079 agent.configure(); 00080 00081 ML::sleep(0.1); 00082 00083 BOOST_CHECK_EQUAL(numConfigurations, 1); 00084 00085 // Now modify the configuration 00086 agent.config.maxInFlight = 10000; 00087 00088 agent.configure(); 00089 00090 while (numConfigurations == 1) 00091 futex_wait(numConfigurations, 1); 00092 00093 BOOST_CHECK_EQUAL(numConfigurations, 2); 00094 BOOST_CHECK_EQUAL(currentConfig->toJson(), agent.config.toJson()); 00095 00096 BOOST_CHECK_EQUAL(listener.getAgentEntry("bidding_agent").config, 00097 currentConfig); 00098 BOOST_CHECK_EQUAL(currentName, "bidding_agent"); 00099 00100 TestAgent agent2(proxies, "bidding_agent2"); 00101 agent2.agentName = "bidding_agent2"; 00102 agent2.init(); 00103 agent2.start(); 00104 agent2.configure(); 00105 00106 while (numConfigurations == 2) 00107 futex_wait(numConfigurations, 2); 00108 00109 BOOST_CHECK_EQUAL(numConfigurations, 3); 00110 BOOST_CHECK_EQUAL(currentConfig->toJson(), agent2.config.toJson()); 00111 00112 BOOST_CHECK_EQUAL(listener.getAgentEntry("bidding_agent2").config, 00113 currentConfig); 00114 BOOST_CHECK_EQUAL(currentName, "bidding_agent2"); 00115 00116 cerr << "tests done" << endl; 00117 } 00118