RTBKit  0.9
Open-source framework to create real-time ad bidding systems.
testing/agent_configuration_test.cc
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 
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator