/**
  * The constructor method.
  */
 function Test_OX_Dal_Maintenance_Statistics_rejectEmptyVarConversions()
 {
     $this->UnitTestCase();
     // Prepare the MSE DAL for use in the tests
     $oFactory = new OX_Dal_Maintenance_Statistics_Factory();
     $this->oDal = $oFactory->factory();
 }
 /**
  * The constructor method.
  */
 function __construct()
 {
     parent::__construct();
     // Prepare the MSE DAL for use in the tests
     $oFactory = new OX_Dal_Maintenance_Statistics_Factory();
     $this->oDal = $oFactory->factory();
 }
 /**
  * The constructor method.
  */
 function __construct()
 {
     parent::__construct();
     // Prepare the database connection for use in the tests
     $this->oDbh = OA_DB::singleton();
     // Prepare the MSE DAL for use in the tests
     $oFactory = new OX_Dal_Maintenance_Statistics_Factory();
     $this->oDal = $oFactory->factory();
 }
 /**
  * The constructor method.
  */
 function Test_OX_Dal_Maintenance_Statistics_migrateRawData_Complex()
 {
     $this->UnitTestCase();
     // Prepare the database connection for use in the tests
     $this->oDbh = OA_DB::singleton();
     // Prepare the MSE DAL for use in the tests
     $oFactory = new OX_Dal_Maintenance_Statistics_Factory();
     $this->oDal = $oFactory->factory();
 }
 /**
  * Summarise the data from the bucket tables into the stats tables.
  *
  * @param <type> $oStartDate
  * @param <type> $oEndDate
  */
 public function summarise($oStartDate, $oEndDate)
 {
     //        $oComponent =& OX_Component::factory('deliveryLog', 'oxLogCountry', 'logImpressionCountry');
     //        $statisticsTableName = $GLOBALS['_MAX']['CONF']['table']['prefix'] .
     //            $oComponent->getStatisticsName();
     //        $aMigrationMaps = array(
     //            $oComponent->getStatisticsMigration());
     $aRunComponents = $this->prepareMaps($this->locateComponents());
     // TODO: make it work for a range of dates
     $aDates = array('start' => $oStartDate, 'end' => $oEndDate);
     // Prepare the DAL object
     $oFactory = new OX_Dal_Maintenance_Statistics_Factory();
     $oDalMaintenanceStatistics = $oFactory->factory();
     $oNowDate = new Date();
     foreach ($aRunComponents as $statisticsTable => $aMaps) {
         $result = $oDalMaintenanceStatistics->summariseBucketsAggregate($statisticsTable, $aMaps, $aDates);
     }
 }
 /**
  * A method to test the summariseBucketsRawSupplementary() method.
  */
 function testSummariseBucketsRawSupplementary()
 {
     $aConf =& $GLOBALS['_MAX']['CONF'];
     $aConf['maintenance']['operationInterval'] = 60;
     // Prepare standard test parameters
     $statisticsTableName = $aConf['table']['prefix'] . 'data_intermediate_ad_variable_value';
     $aMigrationDetails = array('method' => 'rawSupplementary', 'masterTable' => $aConf['table']['prefix'] . 'data_intermediate_ad_connection', 'masterTablePrimaryKeys' => array(0 => 'data_intermediate_ad_connection_id'), 'bucketTablePrimaryKeys' => array(0 => 'data_intermediate_ad_connection_id'), 'masterTableKeys' => array(0 => 'server_raw_tracker_impression_id', 1 => 'server_raw_ip'), 'bucketTableKeys' => array(0 => 'server_conv_id', 1 => 'server_ip'), 'masterDateTimeColumn' => 'tracker_date_time', 'bucketTable' => $aConf['table']['prefix'] . 'data_bkt_a_var', 'source' => array(0 => 'tracker_variable_id', 1 => 'value'), 'destination' => array(0 => 'tracker_variable_id', 1 => 'value'));
     $aDates = array('start' => new Date('2008-08-21 09:00:00'), 'end' => new Date('2008-08-21 09:59:59'));
     // Prepare the DAL object
     $oFactory = new OX_Dal_Maintenance_Statistics_Factory();
     $oDalMaintenanceStatistics = $oFactory->factory();
     // Test 1: Test with an incorrect method name in the mapping array
     $savedValue = $aMigrationDetails['method'];
     $aMigrationDetails['method'] = 'foo';
     $result = $oDalMaintenanceStatistics->summariseBucketsRawSupplementary($statisticsTableName, $aMigrationDetails, $aDates);
     $this->assertTrue(is_a($result, 'PEAR_Error'));
     $this->assertEqual($result->code, MAX_ERROR_INVALIDARGS);
     $this->assertEqual($result->message, "OX_Dal_Maintenance_Statistics::summariseBucketsRawSupplementary() called with migration map method 'foo' != 'rawSupplementary'.");
     $aMigrationDetails['method'] = $savedValue;
     // Test 2: Test with a different number of masterTablePrimaryKeys and bucketTablePrimaryKeys columns
     $savedValue = $aMigrationDetails['masterTablePrimaryKeys'][0];
     unset($aMigrationDetails['masterTablePrimaryKeys'][0]);
     $result = $oDalMaintenanceStatistics->summariseBucketsRawSupplementary($statisticsTableName, $aMigrationDetails, $aDates);
     $this->assertTrue(is_a($result, 'PEAR_Error'));
     $this->assertEqual($result->code, MAX_ERROR_INVALIDARGS);
     $this->assertEqual($result->message, "OX_Dal_Maintenance_Statistics::summariseBucketsRawSupplementary() called with different number of 'masterTablePrimaryKeys' and 'bucketTablePrimaryKeys' columns.");
     $aMigrationDetails['masterTablePrimaryKeys'][0] = $savedValue;
     // Test 3: Test with a different number of masterTableKeys and bucketTableKeys columns
     $savedValue = $aMigrationDetails['masterTableKeys'][1];
     unset($aMigrationDetails['masterTableKeys'][1]);
     $result = $oDalMaintenanceStatistics->summariseBucketsRawSupplementary($statisticsTableName, $aMigrationDetails, $aDates);
     $this->assertTrue(is_a($result, 'PEAR_Error'));
     $this->assertEqual($result->code, MAX_ERROR_INVALIDARGS);
     $this->assertEqual($result->message, "OX_Dal_Maintenance_Statistics::summariseBucketsRawSupplementary() called with different number of 'masterTableKeys' and 'bucketTableKeys' columns.");
     $aMigrationDetails['masterTableKeys'][1] = $savedValue;
     // Test 4: Test with a different number of source and destination columns
     $savedValue = $aMigrationDetails['destination'][1];
     unset($aMigrationDetails['destination'][1]);
     $result = $oDalMaintenanceStatistics->summariseBucketsRawSupplementary($statisticsTableName, $aMigrationDetails, $aDates);
     $this->assertTrue(is_a($result, 'PEAR_Error'));
     $this->assertEqual($result->code, MAX_ERROR_INVALIDARGS);
     $this->assertEqual($result->message, "OX_Dal_Maintenance_Statistics::summariseBucketsRawSupplementary() called with different number of 'source' and 'destination' columns.");
     $aMigrationDetails['destination'][1] = $savedValue;
     // Test 5: Test with date parameters that are not really dates
     $savedValue = $aDates['start'];
     $aDates['start'] = 'foo';
     $result = $oDalMaintenanceStatistics->summariseBucketsRawSupplementary($statisticsTableName, $aMigrationDetails, $aDates);
     $this->assertTrue(is_a($result, 'PEAR_Error'));
     $this->assertEqual($result->code, MAX_ERROR_INVALIDARGS);
     $this->assertEqual($result->message, "OX_Dal_Maintenance_Statistics::summariseBucketsRawSupplementary() called with invalid start/end date parameters -- not Date objects.");
     $aDates['start'] = $savedValue;
     $savedValue = $aDates['end'];
     $aDates['end'] = 'foo';
     $result = $oDalMaintenanceStatistics->summariseBucketsRawSupplementary($statisticsTableName, $aMigrationDetails, $aDates);
     $this->assertTrue(is_a($result, 'PEAR_Error'));
     $this->assertEqual($result->code, MAX_ERROR_INVALIDARGS);
     $this->assertEqual($result->message, "OX_Dal_Maintenance_Statistics::summariseBucketsRawSupplementary() called with invalid start/end date parameters -- not Date objects.");
     $aDates['end'] = $savedValue;
     // Test 6: Test with invalid start/end dates
     $savedValue = $aDates['start'];
     $aDates['start'] = new Date('2008-08-21 08:00:00');
     $result = $oDalMaintenanceStatistics->summariseBucketsRawSupplementary($statisticsTableName, $aMigrationDetails, $aDates);
     $this->assertTrue(is_a($result, 'PEAR_Error'));
     $this->assertEqual($result->code, MAX_ERROR_INVALIDARGS);
     $this->assertEqual($result->message, "OX_Dal_Maintenance_Statistics::summariseBucketsRawSupplementary() called with invalid start/end date parameters -- not operation interval bounds.");
     $aDates['start'] = $savedValue;
     $savedValue = $aDates['end'];
     $aDates['end'] = new Date('2008-08-22 09:59:59');
     $result = $oDalMaintenanceStatistics->summariseBucketsRawSupplementary($statisticsTableName, $aMigrationDetails, $aDates);
     $this->assertTrue(is_a($result, 'PEAR_Error'));
     $this->assertEqual($result->code, MAX_ERROR_INVALIDARGS);
     $this->assertEqual($result->message, "OX_Dal_Maintenance_Statistics::summariseBucketsRawSupplementary() called with invalid start/end date parameters -- not operation interval bounds.");
     $aDates['end'] = $savedValue;
     // Test 7: Test with an invalid statistics table name
     $savedValue = $statisticsTableName;
     $statisticsTableName = 'foo';
     $result = $oDalMaintenanceStatistics->summariseBucketsRawSupplementary($statisticsTableName, $aMigrationDetails, $aDates);
     $this->assertTrue(is_a($result, 'PEAR_Error'));
     $this->assertEqual($result->code, MAX_ERROR_INVALIDREQUEST);
     $this->assertEqual($result->message, "OX_Dal_Maintenance_Statistics::summariseBucketsRawSupplementary() called with invalid statistics table 'foo'.");
     $statisticsTableName = $savedValue;
     // Test 8: Test with an invalid master statistics table name
     $savedValue = $aMigrationDetails['masterTable'];
     $aMigrationDetails['masterTable'] = 'foo';
     $result = $oDalMaintenanceStatistics->summariseBucketsRawSupplementary($statisticsTableName, $aMigrationDetails, $aDates);
     $this->assertTrue(is_a($result, 'PEAR_Error'));
     $this->assertEqual($result->code, MAX_ERROR_INVALIDREQUEST);
     $this->assertEqual($result->message, "OX_Dal_Maintenance_Statistics::summariseBucketsRawSupplementary() called with invalid master table 'foo'.");
     $aMigrationDetails['masterTable'] = $savedValue;
     // Test 9: Test with no data_bkt_a_var table in the database
     $result = $oDalMaintenanceStatistics->summariseBucketsRawSupplementary($statisticsTableName, $aMigrationDetails, $aDates);
     $this->assertTrue(is_a($result, 'PEAR_Error'));
     $this->assertEqual($result->code, MAX_ERROR_INVALIDREQUEST);
     $this->assertEqual($result->message, "OX_Dal_Maintenance_Statistics::summariseBucketsRawSupplementary() called with invalid bucket table '{$aConf['table']['prefix']}data_bkt_a_var'.");
     // Install the openXDeliveryLog plugin, which will create the
     // data_bkt_a table required for testing
     TestEnv::installPluginPackage('openXDeliveryLog', false);
     // Test 10: Test with all tables present, but no data
     $result = $oDalMaintenanceStatistics->summariseBucketsRawSupplementary($statisticsTableName, $aMigrationDetails, $aDates);
     $this->assertEqual($result, 0);
     // Insert a conversion into the data_intermediate_ad_connection table
     // in the incorrect operation interval
     $oData_intermediate_ad_connection = OA_Dal::factoryDO('data_intermediate_ad_connection');
     $oData_intermediate_ad_connection->server_raw_tracker_impression_id = 1;
     $oData_intermediate_ad_connection->server_raw_ip = 'localhost';
     $oData_intermediate_ad_connection->tracker_id = 2;
     $oData_intermediate_ad_connection->tracker_date_time = '2008-08-21 08:15:00';
     $oData_intermediate_ad_connection->connection_date_time = '2008-08-21 07:15:00';
     $oData_intermediate_ad_connection->ad_id = 3;
     $oData_intermediate_ad_connection->zone_id = 4;
     $oData_intermediate_ad_connection->tracker_ip_address = '127.0.0.1';
     $oData_intermediate_ad_connection->connection_action = MAX_CONNECTION_AD_CLICK;
     $oData_intermediate_ad_connection->connection_window = 3600;
     $oData_intermediate_ad_connection->connection_status = MAX_CONNECTION_STATUS_APPROVED;
     $oData_intermediate_ad_connection->inside_window = 1;
     $conversionId = DataGenerator::generateOne($oData_intermediate_ad_connection);
     // Test 11: Test with data in the incorrect operation interval
     $result = $oDalMaintenanceStatistics->summariseBucketsRawSupplementary($statisticsTableName, $aMigrationDetails, $aDates);
     $this->assertEqual($result, 0);
     // Insert two conversions into the data_intermediate_ad_connection table
     // in the correct operation interval
     $oData_intermediate_ad_connection = OA_Dal::factoryDO('data_intermediate_ad_connection');
     $oData_intermediate_ad_connection->server_raw_tracker_impression_id = 2;
     $oData_intermediate_ad_connection->server_raw_ip = 'localhost';
     $oData_intermediate_ad_connection->tracker_id = 2;
     $oData_intermediate_ad_connection->tracker_date_time = '2008-08-21 09:15:00';
     $oData_intermediate_ad_connection->connection_date_time = '2008-08-21 08:15:00';
     $oData_intermediate_ad_connection->ad_id = 3;
     $oData_intermediate_ad_connection->zone_id = 4;
     $oData_intermediate_ad_connection->tracker_ip_address = '127.0.0.1';
     $oData_intermediate_ad_connection->connection_action = MAX_CONNECTION_AD_CLICK;
     $oData_intermediate_ad_connection->connection_window = 3600;
     $oData_intermediate_ad_connection->connection_status = MAX_CONNECTION_STATUS_APPROVED;
     $oData_intermediate_ad_connection->inside_window = 1;
     $conversionId1 = DataGenerator::generateOne($oData_intermediate_ad_connection);
     $oData_intermediate_ad_connection = OA_Dal::factoryDO('data_intermediate_ad_connection');
     $oData_intermediate_ad_connection->server_raw_tracker_impression_id = 3;
     $oData_intermediate_ad_connection->server_raw_ip = 'localhost';
     $oData_intermediate_ad_connection->tracker_id = 9;
     $oData_intermediate_ad_connection->tracker_date_time = '2008-08-21 09:16:00';
     $oData_intermediate_ad_connection->connection_date_time = '2008-08-21 08:16:00';
     $oData_intermediate_ad_connection->ad_id = 6;
     $oData_intermediate_ad_connection->zone_id = 7;
     $oData_intermediate_ad_connection->tracker_ip_address = '127.0.0.1';
     $oData_intermediate_ad_connection->connection_action = MAX_CONNECTION_AD_VIEW;
     $oData_intermediate_ad_connection->connection_window = 3600;
     $oData_intermediate_ad_connection->connection_status = MAX_CONNECTION_STATUS_APPROVED;
     $oData_intermediate_ad_connection->inside_window = 1;
     $conversionId2 = DataGenerator::generateOne($oData_intermediate_ad_connection);
     // Test 12: Test with data in the correct operation interval, but
     //          no supplementary data
     $result = $oDalMaintenanceStatistics->summariseBucketsRawSupplementary($statisticsTableName, $aMigrationDetails, $aDates);
     $this->assertEqual($result, 0);
     // Add some supplementary data for the conversions above!
     $oData_bkt_a_var = OA_Dal::factoryDO('data_bkt_a_var');
     $oData_bkt_a_var->server_conv_id = 2;
     $oData_bkt_a_var->server_ip = 'localhost';
     $oData_bkt_a_var->tracker_variable_id = 99;
     $oData_bkt_a_var->value = 'foo';
     DataGenerator::generateOne($oData_bkt_a_var);
     $oData_bkt_a_var = OA_Dal::factoryDO('data_bkt_a_var');
     $oData_bkt_a_var->server_conv_id = 2;
     $oData_bkt_a_var->server_ip = 'localhost';
     $oData_bkt_a_var->tracker_variable_id = 100;
     $oData_bkt_a_var->value = '156.99';
     DataGenerator::generateOne($oData_bkt_a_var);
     $oData_bkt_a_var = OA_Dal::factoryDO('data_bkt_a_var');
     $oData_bkt_a_var->server_conv_id = 3;
     $oData_bkt_a_var->server_ip = 'localhost';
     $oData_bkt_a_var->tracker_variable_id = 15;
     $oData_bkt_a_var->value = '123456789';
     DataGenerator::generateOne($oData_bkt_a_var);
     // Test 12: Test with data in the correct operation interval
     $result = $oDalMaintenanceStatistics->summariseBucketsRawSupplementary($statisticsTableName, $aMigrationDetails, $aDates);
     $this->assertEqual($result, 3);
     $oData_intermediate_ad_variable_value = OA_Dal::factoryDO('data_intermediate_ad_variable_value');
     $oData_intermediate_ad_variable_value->data_intermediate_ad_connection_id = $conversionId1;
     $oData_intermediate_ad_variable_value->find();
     $rows = $oData_intermediate_ad_variable_value->getRowCount();
     $this->assertEqual($rows, 2);
     $oData_intermediate_ad_variable_value = OA_Dal::factoryDO('data_intermediate_ad_variable_value');
     $oData_intermediate_ad_variable_value->data_intermediate_ad_connection_id = $conversionId1;
     $oData_intermediate_ad_variable_value->tracker_variable_id = 99;
     $oData_intermediate_ad_variable_value->find();
     $rows = $oData_intermediate_ad_variable_value->getRowCount();
     $this->assertEqual($rows, 1);
     $oData_intermediate_ad_variable_value->fetch();
     $this->assertEqual($oData_intermediate_ad_variable_value->data_intermediate_ad_connection_id, $conversionId1);
     $this->assertEqual($oData_intermediate_ad_variable_value->tracker_variable_id, 99);
     $this->assertEqual($oData_intermediate_ad_variable_value->value, 'foo');
     $oData_intermediate_ad_variable_value = OA_Dal::factoryDO('data_intermediate_ad_variable_value');
     $oData_intermediate_ad_variable_value->data_intermediate_ad_connection_id = $conversionId1;
     $oData_intermediate_ad_variable_value->tracker_variable_id = 100;
     $oData_intermediate_ad_variable_value->find();
     $rows = $oData_intermediate_ad_variable_value->getRowCount();
     $this->assertEqual($rows, 1);
     $oData_intermediate_ad_variable_value->fetch();
     $this->assertEqual($oData_intermediate_ad_variable_value->data_intermediate_ad_connection_id, $conversionId1);
     $this->assertEqual($oData_intermediate_ad_variable_value->tracker_variable_id, 100);
     $this->assertEqual($oData_intermediate_ad_variable_value->value, '156.99');
     $oData_intermediate_ad_variable_value = OA_Dal::factoryDO('data_intermediate_ad_variable_value');
     $oData_intermediate_ad_variable_value->data_intermediate_ad_connection_id = $conversionId2;
     $oData_intermediate_ad_variable_value->find();
     $rows = $oData_intermediate_ad_variable_value->getRowCount();
     $this->assertEqual($rows, 1);
     $oData_intermediate_ad_variable_value = OA_Dal::factoryDO('data_intermediate_ad_variable_value');
     $oData_intermediate_ad_variable_value->data_intermediate_ad_connection_id = $conversionId2;
     $oData_intermediate_ad_variable_value->tracker_variable_id = 15;
     $oData_intermediate_ad_variable_value->find();
     $rows = $oData_intermediate_ad_variable_value->getRowCount();
     $this->assertEqual($rows, 1);
     $oData_intermediate_ad_variable_value->fetch();
     $this->assertEqual($oData_intermediate_ad_variable_value->data_intermediate_ad_connection_id, $conversionId2);
     $this->assertEqual($oData_intermediate_ad_variable_value->tracker_variable_id, 15);
     $this->assertEqual($oData_intermediate_ad_variable_value->value, '123456789');
     // Clean up generated data
     DataGenerator::cleanUp();
     // Also clean up the data migrated into the statistics table
     $oData_intermediate_ad_variable_value = OA_Dal::factoryDO('data_intermediate_ad_connection');
     $oData_intermediate_ad_variable_value->data_intermediate_ad_connection_id = $conversionId1;
     $oData_intermediate_ad_variable_value->find();
     $oData_intermediate_ad_variable_value->delete();
     $oData_intermediate_ad_variable_value = OA_Dal::factoryDO('data_intermediate_ad_connection');
     $oData_intermediate_ad_variable_value->data_intermediate_ad_connection_id = $conversionId2;
     $oData_intermediate_ad_variable_value->find();
     $oData_intermediate_ad_variable_value->delete();
     // Uninstall the installed plugin
     TestEnv::uninstallPluginPackage('openXDeliveryLog', false);
     // Restore the test environment configuration
     TestEnv::restoreConfig();
 }
 /**
  * A method to test the sending of emails from the
  * manageCampaigns() method - tests the sending of
  * the "campaign about to expire" emails.
  */
 function testManageCampaignsEmailsPlacementToExpire()
 {
     // Set the date format
     global $date_format;
     $date_format = '%Y-%m-%d';
     // Set now as 1 week before
     $oDateNow = new Date('2008-01-10');
     $oServiceLocator =& OA_ServiceLocator::instance();
     $oServiceLocator->register('now', $oDateNow);
     // Insert the required preference values for dealing with email warnings
     $warnEmailAdminPreferenceId = $this->_createPreference('warn_email_admin', OA_ACCOUNT_ADMIN);
     $warnEmailAdminPreferenceImpressionLimitId = $this->_createPreference('warn_email_admin_impression_limit', OA_ACCOUNT_ADMIN);
     $warnEmailAdminPreferenceDayLimitId = $this->_createPreference('warn_email_admin_day_limit', OA_ACCOUNT_ADMIN);
     $this->_createPreference('warn_email_manager', OA_ACCOUNT_MANAGER);
     $this->_createPreference('warn_email_manager_impression_limit', OA_ACCOUNT_MANAGER);
     $this->_createPreference('warn_email_manager_day_limit', OA_ACCOUNT_MANAGER);
     $this->_createPreference('warn_email_advertiser', OA_ACCOUNT_ADVERTISER);
     $this->_createPreference('warn_email_advertiser_impression_limit', OA_ACCOUNT_ADVERTISER);
     $this->_createPreference('warn_email_advertiser_day_limit', OA_ACCOUNT_ADVERTISER);
     // Create the required accounts & set the various ID values
     $aValues = $this->_createAccounts();
     $adminAccountId = $aValues['adminAccount'];
     $advertiserClientId = $aValues['advertiserClient'];
     // Create a currently running placement with 100 impressions
     // remaining and set to expire on 2008-01-13
     $aData = array('clientid' => $advertiserClientId, 'status' => OA_ENTITY_STATUS_RUNNING, 'views' => '100', 'expire_time' => '2008-01-13 23:59:59');
     $campaignId = $this->_insertPlacement($aData);
     // Reset now
     $oServiceLocator->remove('now');
     // Insert a banner for the placement
     $aData = array('campaignid' => $campaignId);
     $adId = $this->_insertAd($aData);
     // Create an instance of the mocked OA_Email class, and set
     // expectations on how the class' methods should be called
     // based on the above
     Mock::generate('OA_Email');
     $oEmailMock = new MockOA_Email($this);
     $oEmailMock->expectOnce('sendCampaignImpendingExpiryEmail');
     // Register the mocked OA_Email class in the service locator
     $oServiceLocator =& OA_ServiceLocator::instance();
     $oServiceLocator->register('OA_Email', $oEmailMock);
     // Run the manageCampaigns() method and ensure that the correct
     // calls to OA_Email were made
     $oDate = new Date('2008-01-11 23:00:01');
     $oFactory = new OX_Dal_Maintenance_Statistics_Factory();
     $oDalMaintenanceStatistics = $oFactory->factory();
     $report = $oDalMaintenanceStatistics->manageCampaigns($oDate);
     $oEmailMock->tally();
     // Now set the preference that states that the admin account
     // wants to get email warnings
     $this->_insertPreference($adminAccountId, $warnEmailAdminPreferenceId, 'true');
     // Create a new instance of the mocked OA_Email class, and set
     // expectations on how the class' methods should be called
     // based on the above
     $oEmailMock = new MockOA_Email($this);
     $oEmailMock->expectOnce('sendCampaignImpendingExpiryEmail');
     // Register the mocked OA_Email class in the service locator
     $oServiceLocator =& OA_ServiceLocator::instance();
     $oServiceLocator->register('OA_Email', $oEmailMock);
     // Run the manageCampaigns() method and ensure that the correct
     // calls to OA_Email were made
     $oDate = new Date('2008-01-11 23:00:01');
     $oDalMaintenanceStatistics = $oFactory->factory();
     $report = $oDalMaintenanceStatistics->manageCampaigns($oDate);
     $oEmailMock->tally();
     // Now set the preference that states that the admin account
     // wants to get email warnings if there are less than 50
     // impressions remaining
     $this->_insertPreference($adminAccountId, $warnEmailAdminPreferenceImpressionLimitId, '50');
     // Create a new instance of the mocked OA_Email class, and set
     // expectations on how the class' methods should be called
     // based on the above
     $oEmailMock = new MockOA_Email($this);
     $oEmailMock->expectOnce('sendCampaignImpendingExpiryEmail');
     // Register the mocked OA_Email class in the service locator
     $oServiceLocator =& OA_ServiceLocator::instance();
     $oServiceLocator->register('OA_Email', $oEmailMock);
     // Run the manageCampaigns() method and ensure that the correct
     // calls to OA_Email were made
     $oDate = new Date('2008-01-11 23:00:01');
     $oDalMaintenanceStatistics = $oFactory->factory();
     $report = $oDalMaintenanceStatistics->manageCampaigns($oDate);
     $oEmailMock->tally();
     // Delivery 60 impressions out of the 100, so that only 40 remain
     // (i.e. less than the 50 limit set above)
     $aData = array('operation_interval_id' => 25, 'interval_start' => '2008-01-11 22:00:00', 'interval_end' => '2008-01-11 22:59:59', 'hour' => 0, 'ad_id' => $adId, 'impressions' => 60);
     $this->_insertDataIntermediateAd($aData);
     // Create a new instance of the mocked OA_Email class, and set
     // expectations on how the class' methods should be called
     // based on the above
     $oEmailMock = new MockOA_Email($this);
     $oEmailMock->expectOnce('sendCampaignImpendingExpiryEmail', array($oDate, "{$campaignId}"));
     // Register the mocked OA_Email class in the service locator
     $oServiceLocator =& OA_ServiceLocator::instance();
     $oServiceLocator->register('OA_Email', $oEmailMock);
     // Run the manageCampaigns() method and ensure that the correct
     // calls to OA_Email were made
     $oDate = new Date('2008-01-11 23:00:01');
     $oDalMaintenanceStatistics = $oFactory->factory();
     $report = $oDalMaintenanceStatistics->manageCampaigns($oDate);
     $oEmailMock->tally();
     // Clean up
     DataGenerator::cleanUp();
 }
                     }
                 }
             } else {
                 $plugin = null;
                 $data_summary_table = 'data_summary_ad_hourly';
             }
             // Update "data_intermediate_ad" table
             $dalData_intermediate_ad = OA_Dal::factoryDAL('data_intermediate_ad');
             $dalData_intermediate_ad->addConversion($operation, $basketValue, $numItems, $ad_id, $creative_id, $zone_id, $opDay, $opHour);
             // Update "$data_summary_table" table
             $dalData_intermediate_ad->addConversion($operation, $basketValue, $numItems, $ad_id, $creative_id, $zone_id, $opDay, $opHour, $data_summary_table);
             // Update finance info
             $oServiceLocator =& OA_ServiceLocator::instance();
             $oDal =& $oServiceLocator->get('OX_Dal_Maintenance_Statistics');
             if (!$oDal) {
                 $oFactory = new OX_Dal_Maintenance_Statistics_Factory();
                 $oDal = $oFactory->factory();
             }
             $oStartDate = new Date($oConnectionDate->format('%Y-%m-%d %H:00:00'));
             $oEndDate = new Date($oConnectionDate->format('%Y-%m-%d %H:00:00'));
             $oDal->_saveSummaryUpdateWithFinanceInfo($oStartDate, $oEndDate, $data_summary_table);
             if (!is_null($plugin)) {
                 $plugin->serviceLocatorRemove();
             }
         }
     }
 }
 if ($modified) {
     // Clear cache
     include_once 'Cache/Lite.php';
     $options = array('cacheDir' => MAX_CACHE);
예제 #9
0
 /**
  * The method to run the Maintenance Statistics Engine process.
  *
  * @static
  */
 function run()
 {
     OA::switchLogIdent('maintenance');
     // Get the configuration
     $aConf = $GLOBALS['_MAX']['CONF'];
     // Log the start of the process
     OA::debug('Running Maintenance Statistics Engine', PEAR_LOG_INFO);
     // Set longer time out, and ignore user abort
     if (!ini_get('safe_mode')) {
         @set_time_limit($aConf['maintenance']['timeLimitScripts']);
         @ignore_user_abort(true);
     }
     // Run the following code as the "Maintenance" user
     OA_Permission::switchToSystemProcessUser('Maintenance');
     // Ensure the the current time is registered with the OA_ServiceLocator
     $oServiceLocator =& OA_ServiceLocator::instance();
     $oDate =& $oServiceLocator->get('now');
     if (!$oDate) {
         // Record the current time, and register with the OA_ServiceLocator
         $oDate = new Date();
         $oServiceLocator->register('now', $oDate);
     }
     $this->aComponents = OX_Component::getListOfRegisteredComponentsForHook('addMaintenanceStatisticsTask');
     // addMaintenanceStatisticsTask hook
     if (!empty($this->aComponents) && is_array($this->aComponents)) {
         foreach ($this->aComponents as $componentId) {
             if ($obj = OX_Component::factoryByComponentIdentifier($componentId)) {
                 $obj->beforeMse();
             }
         }
     }
     // Initialise the task runner object, for storing/running the tasks
     $this->oTaskRunner = new OA_Task_Runner();
     // Register this object as the controlling class for the process,
     // so that tasks run by the task runner can locate this class to
     // update the report, etc.
     $oServiceLocator =& OA_ServiceLocator::instance();
     $oServiceLocator->register('Maintenance_Statistics_Controller', $this);
     // Create and register an instance of the OA_Dal_Maintenance_Statistics DAL
     // class for the following tasks to use
     if (!$oServiceLocator->get('OX_Dal_Maintenance_Statistics')) {
         $oFactory = new OX_Dal_Maintenance_Statistics_Factory();
         $oDal = $oFactory->factory();
         $oServiceLocator->register('OX_Dal_Maintenance_Statistics', $oDal);
     }
     // Add the task to set the update requirements
     $oSetUpdateRequirements = new OX_Maintenance_Statistics_Task_SetUpdateRequirements();
     $this->oTaskRunner->addTask($oSetUpdateRequirements);
     // Add the task to migrate the bucket data into the statistics tables
     $oSummariseIntermediate = new OX_Maintenance_Statistics_Task_MigrateBucketData();
     $this->oTaskRunner->addTask($oSummariseIntermediate);
     // Add the task to handle the de-duplication and rejection of empty conversions
     $oDeDuplicateConversions = new OX_Maintenance_Statistics_Task_DeDuplicateConversions();
     $this->oTaskRunner->addTask($oDeDuplicateConversions);
     // Add the task to handle the updating of "intermediate" statistics with
     // conversion information, as a legacy issue until all code obtains
     // conversion data from the standard conversion statistics tables
     $oManageConversions = new OX_Maintenance_Statistics_Task_ManageConversions();
     $this->oTaskRunner->addTask($oManageConversions);
     // Add the task to summarise the intermediate statistics into final form
     $oSummariseFinal = new OX_Maintenance_Statistics_Task_SummariseFinal();
     $this->oTaskRunner->addTask($oSummariseFinal);
     // Add the task to log the completion of the task
     $oLogCompletion = new OX_Maintenance_Statistics_Task_LogCompletion();
     $this->oTaskRunner->addTask($oLogCompletion);
     // Add the task to manage (enable/disable) campaigns
     $oManageCampaigns = new OX_Maintenance_Statistics_Task_ManageCampaigns();
     $this->oTaskRunner->addTask($oManageCampaigns);
     // addMaintenanceStatisticsTask hook
     if (!empty($this->aComponents) && is_array($this->aComponents)) {
         foreach ($this->aComponents as $componentId) {
             if ($obj = OX_Component::factoryByComponentIdentifier($componentId)) {
                 $this->oTaskRunner->addTask($obj->addMaintenanceStatisticsTask(), $obj->getExistingClassName(), $obj->getOrder());
             }
         }
     }
     // Run the MSE process tasks
     $this->oTaskRunner->runTasks();
     // addMaintenanceStatisticsTask hook
     if (!empty($this->aComponents) && is_array($this->aComponents)) {
         foreach ($this->aComponents as $componentId) {
             if ($obj = OX_Component::factoryByComponentIdentifier($componentId)) {
                 $obj->afterMse();
             }
         }
     }
     // Return to the "normal" user
     OA_Permission::switchToSystemProcessUser();
     // Log the end of the process
     OA::debug('Maintenance Statistics Engine Completed (Started at ' . $oDate->format('%Y-%m-%d %H:%M:%S') . ' ' . $oDate->tz->getShortName() . ')', PEAR_LOG_INFO);
     OA::switchLogIdent();
 }
 /**
  * Tests the saveSummary() method.
  *
  * Requirements:
  * Test 1: Test with no data.
  * Test 2: Test a single day summarisation.
  * Test 3: Test multi-day summarisation.
  */
 function testSaveSummary()
 {
     $aConf =& $GLOBALS['_MAX']['CONF'];
     $oDbh =& OA_DB::singleton();
     $oFactory = new OX_Dal_Maintenance_Statistics_Factory();
     $oDalMaintenanceStatistics = $oFactory->factory();
     // Test 1
     $start = new Date('2004-06-06 12:00:00');
     $end = new Date('2004-06-06 12:29:59');
     $aActionTypes = array('types' => array(0 => 'request', 1 => 'impression', 2 => 'click'), 'connections' => array(1 => MAX_CONNECTION_AD_IMPRESSION, 2 => MAX_CONNECTION_AD_CLICK));
     $oDalMaintenanceStatistics->saveSummary($start, $end, $aActionTypes, 'data_intermediate_ad', 'data_summary_ad_hourly');
     $query = "\n            SELECT\n                COUNT(*) AS number\n            FROM\n                " . $oDbh->quoteIdentifier($aConf['table']['prefix'] . $aConf['table']['data_summary_ad_hourly'], true);
     $aRow = $oDbh->queryRow($query);
     $this->assertEqual($aRow['number'], 0);
     // Test 2
     // Insert the test data
     $this->_insertTestSaveSummaryPlacement();
     $this->_insertTestSaveSummaryAd();
     $this->_insertTestSaveSummaryZone();
     $query = "\n            INSERT INTO\n                " . $oDbh->quoteIdentifier($aConf['table']['prefix'] . $aConf['table']['data_intermediate_ad'], true) . "\n                (\n                    date_time, operation_interval, operation_interval_id, interval_start, interval_end,\n                    ad_id, creative_id, zone_id, impressions, clicks, conversions, total_basket_value, total_num_items\n                )\n            VALUES\n                (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
     $aTypes = array('timestamp', 'integer', 'integer', 'timestamp', 'timestamp', 'integer', 'integer', 'integer', 'integer', 'integer', 'integer', 'integer', 'integer');
     $st = $oDbh->prepare($query, $aTypes, MDB2_PREPARE_MANIP);
     $aData = array('2004-06-06 18:00:00', 30, 36, '2004-06-06 18:00:00', '2004-06-06 18:29:59', 1, 1, 1, 1, 1, 1, 1, 0);
     $rows = $st->execute($aData);
     $aData = array('2004-06-06 18:00:00', 30, 36, '2004-06-06 18:00:00', '2004-06-06 18:29:59', 1, 2, 1, 1, 1, 1, 1, 0);
     $rows = $st->execute($aData);
     $aData = array('2004-06-06 18:00:00', 30, 36, '2004-06-06 18:00:00', '2004-06-06 18:29:59', 1, 2, 1, 1, 1, 1, 1, 0);
     $rows = $st->execute($aData);
     $aData = array('2004-06-06 18:00:00', 30, 36, '2004-06-06 18:00:00', '2004-06-06 18:29:59', 2, 1, 1, 1, 1, 0, 0, 0);
     $rows = $st->execute($aData);
     $aData = array('2004-06-06 18:00:00', 30, 36, '2004-06-06 18:00:00', '2004-06-06 18:29:59', 3, 1, 2, 1, 1, 0, 0, 0);
     $rows = $st->execute($aData);
     $aData = array('2004-06-06 18:00:00', 30, 36, '2004-06-06 18:00:00', '2004-06-06 18:29:59', 4, 1, 3, 1, 1, 5, 0, 0);
     $rows = $st->execute($aData);
     $aData = array('2004-06-06 18:00:00', 30, 36, '2004-06-06 18:00:00', '2004-06-06 18:29:59', 4, 1, 4, 1, 1, 5, 0, 0);
     $rows = $st->execute($aData);
     $aData = array('2004-06-06 18:00:00', 30, 36, '2004-06-06 18:00:00', '2004-06-06 18:29:59', 4, 1, 5, 1, 1, 5, 100, 1);
     $rows = $st->execute($aData);
     $aData = array('2004-06-06 18:00:00', 30, 36, '2004-06-06 18:00:00', '2004-06-06 18:29:59', 4, 1, 6, 1, 1, 5, 100, 3);
     $rows = $st->execute($aData);
     // Test
     $start = new Date('2004-06-06 18:00:00');
     $end = new Date('2004-06-06 18:29:59');
     $oDalMaintenanceStatistics->saveSummary($start, $end, $aActionTypes, 'data_intermediate_ad', 'data_summary_ad_hourly');
     $query = "\n            SELECT\n                COUNT(*) AS number\n            FROM\n                " . $oDbh->quoteIdentifier($aConf['table']['prefix'] . $aConf['table']['data_summary_ad_hourly'], true);
     $aRow = $oDbh->queryRow($query);
     $this->assertEqual($aRow['number'], 8);
     $query = "\n            SELECT\n                *\n            FROM\n                " . $oDbh->quoteIdentifier($aConf['table']['prefix'] . $aConf['table']['data_summary_ad_hourly'], true) . "\n            WHERE\n                ad_id = 1\n                AND creative_id = 1";
     $aRow = $oDbh->queryRow($query);
     $this->assertEqual($aRow['date_time'], '2004-06-06 18:00:00');
     $this->assertEqual($aRow['zone_id'], 1);
     $this->assertEqual($aRow['impressions'], 1);
     $this->assertEqual($aRow['clicks'], 1);
     $this->assertEqual($aRow['conversions'], 1);
     $this->assertEqual($aRow['total_basket_value'], 1);
     $this->assertEqual($aRow['total_revenue'], 5);
     $query = "\n            SELECT\n                *\n            FROM\n                " . $oDbh->quoteIdentifier($aConf['table']['prefix'] . $aConf['table']['data_summary_ad_hourly'], true) . "\n            WHERE\n                ad_id = 1\n                AND creative_id = 2";
     $aRow = $oDbh->queryRow($query);
     $this->assertEqual($aRow['date_time'], '2004-06-06 18:00:00');
     $this->assertEqual($aRow['zone_id'], 1);
     $this->assertEqual($aRow['impressions'], 2);
     $this->assertEqual($aRow['clicks'], 2);
     $this->assertEqual($aRow['conversions'], 2);
     $this->assertEqual($aRow['total_basket_value'], 2);
     $this->assertEqual($aRow['total_revenue'], 10);
     $query = "\n            SELECT\n                *\n            FROM\n                " . $oDbh->quoteIdentifier($aConf['table']['prefix'] . $aConf['table']['data_summary_ad_hourly'], true) . "\n            WHERE\n                ad_id = 2";
     $aRow = $oDbh->queryRow($query);
     $this->assertEqual($aRow['date_time'], '2004-06-06 18:00:00');
     $this->assertEqual($aRow['creative_id'], 1);
     $this->assertEqual($aRow['zone_id'], 1);
     $this->assertEqual($aRow['impressions'], 1);
     $this->assertEqual($aRow['clicks'], 1);
     $this->assertEqual($aRow['conversions'], 0);
     $this->assertEqual($aRow['total_basket_value'], 0);
     $this->assertEqual($aRow['total_revenue'], 2);
     $query = "\n            SELECT\n                *\n            FROM\n                " . $oDbh->quoteIdentifier($aConf['table']['prefix'] . $aConf['table']['data_summary_ad_hourly'], true) . "\n            WHERE\n                ad_id = 3";
     $aRow = $oDbh->queryRow($query);
     $this->assertEqual($aRow['date_time'], '2004-06-06 18:00:00');
     $this->assertEqual($aRow['creative_id'], 1);
     $this->assertEqual($aRow['zone_id'], 2);
     $this->assertEqual($aRow['impressions'], 1);
     $this->assertEqual($aRow['clicks'], 1);
     $this->assertEqual($aRow['conversions'], 0);
     $this->assertEqual($aRow['total_basket_value'], 0);
     $this->assertEqual($aRow['total_revenue'], 0);
     $query = "\n            SELECT\n                *\n            FROM\n                " . $oDbh->quoteIdentifier($aConf['table']['prefix'] . $aConf['table']['data_summary_ad_hourly'], true) . "\n            WHERE\n                ad_id = 4\n            ORDER BY\n                zone_id";
     $rc = $oDbh->query($query);
     $this->assertEqual($rc->numRows(), 4);
     $aRow = $rc->fetchRow();
     $this->assertEqual($aRow['date_time'], '2004-06-06 18:00:00');
     $this->assertEqual($aRow['creative_id'], 1);
     $this->assertEqual($aRow['zone_id'], 3);
     $this->assertEqual($aRow['impressions'], 1);
     $this->assertEqual($aRow['clicks'], 1);
     $this->assertEqual($aRow['conversions'], 5);
     $this->assertEqual($aRow['total_basket_value'], 0);
     $this->assertEqual($aRow['total_revenue'], 20);
     $aRow = $rc->fetchRow();
     $this->assertEqual($aRow['date_time'], '2004-06-06 18:00:00');
     $this->assertEqual($aRow['creative_id'], 1);
     $this->assertEqual($aRow['zone_id'], 4);
     $this->assertEqual($aRow['impressions'], 1);
     $this->assertEqual($aRow['clicks'], 1);
     $this->assertEqual($aRow['conversions'], 5);
     $this->assertEqual($aRow['total_basket_value'], 0);
     $this->assertEqual($aRow['total_revenue'], 20);
     $aRow = $rc->fetchRow();
     $this->assertEqual($aRow['date_time'], '2004-06-06 18:00:00');
     $this->assertEqual($aRow['creative_id'], 1);
     $this->assertEqual($aRow['zone_id'], 5);
     $this->assertEqual($aRow['impressions'], 1);
     $this->assertEqual($aRow['clicks'], 1);
     $this->assertEqual($aRow['conversions'], 5);
     $this->assertEqual($aRow['total_basket_value'], 100);
     $this->assertEqual($aRow['total_revenue'], 20);
     $aRow = $rc->fetchRow();
     $this->assertEqual($aRow['date_time'], '2004-06-06 18:00:00');
     $this->assertEqual($aRow['creative_id'], 1);
     $this->assertEqual($aRow['zone_id'], 6);
     $this->assertEqual($aRow['impressions'], 1);
     $this->assertEqual($aRow['clicks'], 1);
     $this->assertEqual($aRow['conversions'], 5);
     $this->assertEqual($aRow['total_basket_value'], 100);
     $this->assertEqual($aRow['total_revenue'], 20);
     TestEnv::restoreEnv();
     // Test 3
     // Insert the test data
     $this->_insertTestSaveSummaryPlacement();
     $this->_insertTestSaveSummaryAd();
     $this->_insertTestSaveSummaryZone();
     $aData = array('2004-06-06 18:00:00', 30, 36, '2004-06-06 18:00:00', '2004-06-06 18:29:59', 1, 1, 1, 1, 1, 1, 1);
     $rows = $st->execute($aData);
     $aData = array('2004-06-07 18:00:00', 30, 36, '2004-06-07 18:00:00', '2004-06-07 18:29:59', 1, 2, 1, 1, 1, 1, 1);
     $rows = $st->execute($aData);
     $aData = array('2004-06-07 18:00:00', 30, 36, '2004-06-07 18:00:00', '2004-06-07 18:29:59', 1, 2, 1, 1, 1, 1, 1);
     $rows = $st->execute($aData);
     $aData = array('2004-06-08 18:00:00', 30, 36, '2004-06-08 18:00:00', '2004-06-08 18:29:59', 2, 1, 1, 1, 1, 0, 0);
     $rows = $st->execute($aData);
     // Test
     $start = new Date('2004-06-06 18:00:00');
     $end = new Date('2004-06-08 18:29:59');
     $oDalMaintenanceStatistics->saveSummary($start, $end, $aActionTypes, 'data_intermediate_ad', 'data_summary_ad_hourly');
     $query = "\n            SELECT\n                COUNT(*) AS number\n            FROM\n                " . $oDbh->quoteIdentifier($aConf['table']['prefix'] . $aConf['table']['data_summary_ad_hourly'], true);
     $aRow = $oDbh->queryRow($query);
     $this->assertEqual($aRow['number'], 3);
     $query = "\n            SELECT\n                *\n            FROM\n                " . $oDbh->quoteIdentifier($aConf['table']['prefix'] . $aConf['table']['data_summary_ad_hourly'], true) . "\n            WHERE\n                ad_id = 1\n                AND creative_id = 1";
     $aRow = $oDbh->queryRow($query);
     $this->assertEqual($aRow['date_time'], '2004-06-06 18:00:00');
     $this->assertEqual($aRow['zone_id'], 1);
     $this->assertEqual($aRow['impressions'], 1);
     $this->assertEqual($aRow['clicks'], 1);
     $this->assertEqual($aRow['conversions'], 1);
     $this->assertEqual($aRow['total_basket_value'], 1);
     $this->assertEqual($aRow['total_revenue'], 5);
     $query = "\n            SELECT\n                *\n            FROM\n                " . $oDbh->quoteIdentifier($aConf['table']['prefix'] . $aConf['table']['data_summary_ad_hourly'], true) . "\n            WHERE\n                ad_id = 1\n                AND creative_id = 2";
     $aRow = $oDbh->queryRow($query);
     $this->assertEqual($aRow['date_time'], '2004-06-07 18:00:00');
     $this->assertEqual($aRow['zone_id'], 1);
     $this->assertEqual($aRow['impressions'], 2);
     $this->assertEqual($aRow['clicks'], 2);
     $this->assertEqual($aRow['conversions'], 2);
     $this->assertEqual($aRow['total_basket_value'], 2);
     $this->assertEqual($aRow['total_revenue'], 10);
     $query = "\n            SELECT\n                *\n            FROM\n                " . $oDbh->quoteIdentifier($aConf['table']['prefix'] . $aConf['table']['data_summary_ad_hourly'], true) . "\n            WHERE\n                ad_id = 2";
     $aRow = $oDbh->queryRow($query);
     $this->assertEqual($aRow['date_time'], '2004-06-08 18:00:00');
     $this->assertEqual($aRow['creative_id'], 1);
     $this->assertEqual($aRow['zone_id'], 1);
     $this->assertEqual($aRow['impressions'], 1);
     $this->assertEqual($aRow['clicks'], 1);
     $this->assertEqual($aRow['conversions'], 0);
     $this->assertEqual($aRow['total_basket_value'], 0);
     $this->assertEqual($aRow['total_revenue'], 2);
     TestEnv::restoreEnv();
     TestEnv::restoreConfig();
 }
 /**
  * Test the creation.
  */
 function testCreate()
 {
     $oFactory = new OX_Dal_Maintenance_Statistics_Factory();
     $classname = $oFactory->deriveClassName();
     $this->assertEqual($classname, 'OX_Dal_Maintenance_Statistics_' . ucfirst(strtolower($this->dbType)));
 }
 /**
  * A method to test the summariseBucketsAggregate() method.
  */
 function testSummariseBucketsAggregate()
 {
     $aConf =& $GLOBALS['_MAX']['CONF'];
     $aConf['maintenance']['operationInterval'] = 60;
     // Prepare standard test parameters
     $statisticsTableName = $aConf['table']['prefix'] . 'data_intermediate_ad';
     $aMigrationMaps = array(0 => array('method' => 'aggregate', 'bucketTable' => $aConf['table']['prefix'] . 'data_bkt_r', 'dateTimeColumn' => 'interval_start', 'groupSource' => array(0 => 'interval_start', 1 => 'creative_id', 2 => 'zone_id'), 'groupDestination' => array(0 => 'date_time', 1 => 'ad_id', 2 => 'zone_id'), 'sumSource' => array(0 => 'count'), 'sumDestination' => array(0 => 'requests'), 'sumDefault' => array(0 => 0)), 1 => array('method' => 'aggregate', 'bucketTable' => $aConf['table']['prefix'] . 'data_bkt_m', 'dateTimeColumn' => 'interval_start', 'groupSource' => array(0 => 'interval_start', 1 => 'creative_id', 2 => 'zone_id'), 'groupDestination' => array(0 => 'date_time', 1 => 'ad_id', 2 => 'zone_id'), 'sumSource' => array(0 => 'count'), 'sumDestination' => array(0 => 'impressions'), 'sumDefault' => array(0 => 0)), 2 => array('method' => 'aggregate', 'bucketTable' => $aConf['table']['prefix'] . 'data_bkt_c', 'dateTimeColumn' => 'interval_start', 'groupSource' => array(0 => 'interval_start', 1 => 'creative_id', 2 => 'zone_id'), 'groupDestination' => array(0 => 'date_time', 1 => 'ad_id', 2 => 'zone_id'), 'sumSource' => array(0 => 'count'), 'sumDestination' => array(0 => 'clicks'), 'sumDefault' => array(0 => 0)));
     $aDates = array('start' => new Date('2008-08-21 09:00:00'), 'end' => new Date('2008-08-21 09:59:59'));
     // Prepare the DAL object
     $oFactory = new OX_Dal_Maintenance_Statistics_Factory();
     $oDalMaintenanceStatistics = $oFactory->factory();
     $oNowDate = new Date();
     $aExtras = array('operation_interval' => $aConf['maintenance']['operationInterval'], 'operation_interval_id' => OX_OperationInterval::convertDateToOperationIntervalID($aDates['start']), 'interval_start' => $oDalMaintenanceStatistics->oDbh->quote($aDates['start']->format('%Y-%m-%d %H:%M:%S'), 'timestamp') . $oDalMaintenanceStatistics->timestampCastString, 'interval_end' => $oDalMaintenanceStatistics->oDbh->quote($aDates['end']->format('%Y-%m-%d %H:%M:%S'), 'timestamp') . $oDalMaintenanceStatistics->timestampCastString, 'creative_id' => 0, 'updated' => $oDalMaintenanceStatistics->oDbh->quote($oNowDate->format('%Y-%m-%d %H:%M:%S'), 'timestamp') . $oDalMaintenanceStatistics->timestampCastString);
     // Test 1: Test with an incorrect method name in the mapping array
     $savedValue = $aMigrationMaps[0]['method'];
     $aMigrationMaps[0]['method'] = 'foo';
     $result = $oDalMaintenanceStatistics->summariseBucketsAggregate($statisticsTableName, $aMigrationMaps, $aDates, $aExtras);
     $this->assertTrue(is_a($result, 'PEAR_Error'));
     $this->assertEqual($result->code, MAX_ERROR_INVALIDARGS);
     $this->assertEqual($result->message, "OX_Dal_Maintenance_Statistics::summariseBucketsAggregate() called with migration map index '0' having method 'foo' != 'aggregate'.");
     $aMigrationMaps[0]['method'] = $savedValue;
     // Test 2: Test with a different number of groupSource and groupDestination columns
     $savedValue = $aMigrationMaps[0]['groupSource'][1];
     unset($aMigrationMaps[0]['groupSource'][1]);
     $result = $oDalMaintenanceStatistics->summariseBucketsAggregate($statisticsTableName, $aMigrationMaps, $aDates, $aExtras);
     $this->assertTrue(is_a($result, 'PEAR_Error'));
     $this->assertEqual($result->code, MAX_ERROR_INVALIDARGS);
     $this->assertEqual($result->message, "OX_Dal_Maintenance_Statistics::summariseBucketsAggregate() called with migration map index '0' having different number of 'groupSource' and 'groupDestination' columns.");
     $aMigrationMaps[0]['groupSource'][1] = $savedValue;
     // Test 3: Test with a different number of sumSource and sumDestination columns
     $savedValue = $aMigrationMaps[1]['sumSource'][0];
     unset($aMigrationMaps[1]['sumSource'][0]);
     $result = $oDalMaintenanceStatistics->summariseBucketsAggregate($statisticsTableName, $aMigrationMaps, $aDates, $aExtras);
     $this->assertTrue(is_a($result, 'PEAR_Error'));
     $this->assertEqual($result->code, MAX_ERROR_INVALIDARGS);
     $this->assertEqual($result->message, "OX_Dal_Maintenance_Statistics::summariseBucketsAggregate() called with migration map index '1' having different number of 'sumSource' and 'sumDestination' columns.");
     $aMigrationMaps[1]['sumSource'][0] = $savedValue;
     // Test 4: Test with a different number of sumSource and sumDefault columns
     $savedValue = $aMigrationMaps[2]['sumDefault'][0];
     unset($aMigrationMaps[2]['sumDefault'][0]);
     $result = $oDalMaintenanceStatistics->summariseBucketsAggregate($statisticsTableName, $aMigrationMaps, $aDates, $aExtras);
     $this->assertTrue(is_a($result, 'PEAR_Error'));
     $this->assertEqual($result->code, MAX_ERROR_INVALIDARGS);
     $this->assertEqual($result->message, "OX_Dal_Maintenance_Statistics::summariseBucketsAggregate() called with migration map index '2' having different number of 'sumSource' and 'sumDefault' columns.");
     $aMigrationMaps[2]['sumDefault'][0] = $savedValue;
     // Test 5: Test with a different groupDestination sets
     $savedValue = $aMigrationMaps[2]['groupDestination'][0];
     $aMigrationMaps[2]['groupDestination'][0] = 'foo';
     $result = $oDalMaintenanceStatistics->summariseBucketsAggregate($statisticsTableName, $aMigrationMaps, $aDates, $aExtras);
     $this->assertTrue(is_a($result, 'PEAR_Error'));
     $this->assertEqual($result->code, MAX_ERROR_INVALIDARGS);
     $this->assertEqual($result->message, "OX_Dal_Maintenance_Statistics::summariseBucketsAggregate() called with migration map indexes '0' and '2' having different 'groupDestination' arrays.");
     $aMigrationMaps[2]['groupDestination'][0] = $savedValue;
     // Test 6: Test with date parameters that are not really dates
     $savedValue = $aDates['start'];
     $aDates['start'] = 'foo';
     $result = $oDalMaintenanceStatistics->summariseBucketsAggregate($statisticsTableName, $aMigrationMaps, $aDates, $aExtras);
     $this->assertTrue(is_a($result, 'PEAR_Error'));
     $this->assertEqual($result->code, MAX_ERROR_INVALIDARGS);
     $this->assertEqual($result->message, "OX_Dal_Maintenance_Statistics::summariseBucketsAggregate() called with invalid start/end date parameters -- not Date objects.");
     $aDates['start'] = $savedValue;
     $savedValue = $aDates['end'];
     $aDates['end'] = 'foo';
     $result = $oDalMaintenanceStatistics->summariseBucketsAggregate($statisticsTableName, $aMigrationMaps, $aDates, $aExtras);
     $this->assertTrue(is_a($result, 'PEAR_Error'));
     $this->assertEqual($result->code, MAX_ERROR_INVALIDARGS);
     $this->assertEqual($result->message, "OX_Dal_Maintenance_Statistics::summariseBucketsAggregate() called with invalid start/end date parameters -- not Date objects.");
     $aDates['end'] = $savedValue;
     // Test 7: Test with invalid start/end dates
     $savedValue = $aDates['start'];
     $aDates['start'] = new Date('2008-08-21 08:00:00');
     $result = $oDalMaintenanceStatistics->summariseBucketsAggregate($statisticsTableName, $aMigrationMaps, $aDates, $aExtras);
     $this->assertTrue(is_a($result, 'PEAR_Error'));
     $this->assertEqual($result->code, MAX_ERROR_INVALIDARGS);
     $this->assertEqual($result->message, "OX_Dal_Maintenance_Statistics::summariseBucketsAggregate() called with invalid start/end date parameters -- not operation interval bounds.");
     $aDates['start'] = $savedValue;
     $savedValue = $aDates['end'];
     $aDates['end'] = new Date('2008-08-22 09:59:59');
     $result = $oDalMaintenanceStatistics->summariseBucketsAggregate($statisticsTableName, $aMigrationMaps, $aDates, $aExtras);
     $this->assertTrue(is_a($result, 'PEAR_Error'));
     $this->assertEqual($result->code, MAX_ERROR_INVALIDARGS);
     $this->assertEqual($result->message, "OX_Dal_Maintenance_Statistics::summariseBucketsAggregate() called with invalid start/end date parameters -- not operation interval bounds.");
     $aDates['end'] = $savedValue;
     // Test 8: Test with an invalid statistics table name
     $savedValue = $statisticsTableName;
     $statisticsTableName = 'foo';
     $result = $oDalMaintenanceStatistics->summariseBucketsAggregate($statisticsTableName, $aMigrationMaps, $aDates, $aExtras);
     $this->assertTrue(is_a($result, 'PEAR_Error'));
     $this->assertEqual($result->code, MAX_ERROR_INVALIDREQUEST);
     $this->assertEqual($result->message, "OX_Dal_Maintenance_Statistics::summariseBucketsAggregate() called with invalid statistics table 'foo'.");
     $statisticsTableName = $savedValue;
     // Test 9: Test with no data_bkt_r table in the database
     $result = $oDalMaintenanceStatistics->summariseBucketsAggregate($statisticsTableName, $aMigrationMaps, $aDates, $aExtras);
     $this->assertTrue(is_a($result, 'PEAR_Error'));
     $this->assertEqual($result->code, MAX_ERROR_INVALIDREQUEST);
     $this->assertEqual($result->message, "OX_Dal_Maintenance_Statistics::summariseBucketsAggregate() called with migration map index '0' having invalid bucket table '{$aConf['table']['prefix']}data_bkt_r'.");
     // Install the openXDeliveryLog plugin, which will create the
     // data_bkt_r, data_bkt_m and data_bkt_c tables required for testing
     TestEnv::installPluginPackage('openXDeliveryLog', false);
     // Test 10: Test with all tables present, but no data
     $result = $oDalMaintenanceStatistics->summariseBucketsAggregate($statisticsTableName, $aMigrationMaps, $aDates, $aExtras);
     $this->assertEqual($result, 0);
     // Insert some data into the data_bkt_r, data_bkt_m and
     // data_bkt_c tables in the incorrect operation interval
     $oData_bkt_r = OA_Dal::factoryDO('data_bkt_r');
     $oData_bkt_r->interval_start = '2008-08-21 08:00:00';
     $oData_bkt_r->creative_id = 1;
     $oData_bkt_r->zone_id = 2;
     $oData_bkt_r->count = 10;
     DataGenerator::generateOne($oData_bkt_r);
     $oData_bkt_m = OA_Dal::factoryDO('data_bkt_m');
     $oData_bkt_m->interval_start = '2008-08-21 08:00:00';
     $oData_bkt_m->creative_id = 1;
     $oData_bkt_m->zone_id = 2;
     $oData_bkt_m->count = 9;
     DataGenerator::generateOne($oData_bkt_m);
     $oData_bkt_c = OA_Dal::factoryDO('data_bkt_c');
     $oData_bkt_c->interval_start = '2008-08-21 08:00:00';
     $oData_bkt_c->creative_id = 1;
     $oData_bkt_c->zone_id = 2;
     $oData_bkt_c->count = 1;
     DataGenerator::generateOne($oData_bkt_c);
     // Test 11: Test with data in the incorrect operation interval
     $result = $oDalMaintenanceStatistics->summariseBucketsAggregate($statisticsTableName, $aMigrationMaps, $aDates, $aExtras);
     $this->assertEqual($result, 0);
     // Insert some data into the data_bkt_r, data_bkt_m and
     // data_bkt_c tables in the incorrect operation interval
     $oData_bkt_r = OA_Dal::factoryDO('data_bkt_r');
     $oData_bkt_r->interval_start = '2008-08-21 09:00:00';
     $oData_bkt_r->creative_id = 1;
     $oData_bkt_r->zone_id = 2;
     $oData_bkt_r->count = 10;
     DataGenerator::generateOne($oData_bkt_r);
     $oData_bkt_m = OA_Dal::factoryDO('data_bkt_m');
     $oData_bkt_m->interval_start = '2008-08-21 09:00:00';
     $oData_bkt_m->creative_id = 1;
     $oData_bkt_m->zone_id = 2;
     $oData_bkt_m->count = 9;
     DataGenerator::generateOne($oData_bkt_m);
     $oData_bkt_c = OA_Dal::factoryDO('data_bkt_c');
     $oData_bkt_c->interval_start = '2008-08-21 09:00:00';
     $oData_bkt_c->creative_id = 1;
     $oData_bkt_c->zone_id = 2;
     $oData_bkt_c->count = 1;
     DataGenerator::generateOne($oData_bkt_c);
     // Test 12: Test with data in the correct operation interval
     $result = $oDalMaintenanceStatistics->summariseBucketsAggregate($statisticsTableName, $aMigrationMaps, $aDates, $aExtras);
     $this->assertEqual($result, 1);
     $oData_intermediate_ad = OA_Dal::factoryDO('data_intermediate_ad');
     $oData_intermediate_ad->find();
     $rows = $oData_intermediate_ad->getRowCount();
     $this->assertEqual($rows, 1);
     $oData_intermediate_ad = OA_Dal::factoryDO('data_intermediate_ad');
     $oData_intermediate_ad->ad_id = 1;
     $oData_intermediate_ad->find();
     $rows = $oData_intermediate_ad->getRowCount();
     $this->assertEqual($rows, 1);
     $oData_intermediate_ad->fetch();
     $this->assertEqual($oData_intermediate_ad->date_time, '2008-08-21 09:00:00');
     $this->assertEqual($oData_intermediate_ad->operation_interval, $aConf['maintenance']['operationInterval']);
     $this->assertEqual($oData_intermediate_ad->operation_interval_id, OX_OperationInterval::convertDateToOperationIntervalID($aDates['start']));
     $this->assertEqual($oData_intermediate_ad->interval_start, '2008-08-21 09:00:00');
     $this->assertEqual($oData_intermediate_ad->interval_end, '2008-08-21 09:59:59');
     $this->assertEqual($oData_intermediate_ad->ad_id, 1);
     $this->assertEqual($oData_intermediate_ad->creative_id, 0);
     $this->assertEqual($oData_intermediate_ad->zone_id, 2);
     $this->assertEqual($oData_intermediate_ad->requests, 10);
     $this->assertEqual($oData_intermediate_ad->impressions, 9);
     $this->assertEqual($oData_intermediate_ad->clicks, 1);
     // Clean up generated data
     DataGenerator::cleanUp();
     // Insert some new data into the data_bkt_r, data_bkt_m and
     // data_bkt_c tables in the incorrect operation interval
     $oData_bkt_r = OA_Dal::factoryDO('data_bkt_r');
     $oData_bkt_r->interval_start = '2008-08-21 09:00:00';
     $oData_bkt_r->creative_id = 2;
     $oData_bkt_r->zone_id = 2;
     $oData_bkt_r->count = 10;
     DataGenerator::generateOne($oData_bkt_r);
     $oData_bkt_m = OA_Dal::factoryDO('data_bkt_m');
     $oData_bkt_m->interval_start = '2008-08-21 09:00:00';
     $oData_bkt_m->creative_id = 2;
     $oData_bkt_m->zone_id = 2;
     $oData_bkt_m->count = 9;
     DataGenerator::generateOne($oData_bkt_m);
     $oData_bkt_c = OA_Dal::factoryDO('data_bkt_c');
     $oData_bkt_c->interval_start = '2008-08-21 09:00:00';
     $oData_bkt_c->creative_id = 2;
     $oData_bkt_c->zone_id = 2;
     $oData_bkt_c->count = 1;
     DataGenerator::generateOne($oData_bkt_c);
     $oData_bkt_r = OA_Dal::factoryDO('data_bkt_r');
     $oData_bkt_r->interval_start = '2008-08-21 09:00:00';
     $oData_bkt_r->creative_id = 11;
     $oData_bkt_r->zone_id = 12;
     $oData_bkt_r->count = 10000;
     DataGenerator::generateOne($oData_bkt_r);
     $oData_bkt_m = OA_Dal::factoryDO('data_bkt_m');
     $oData_bkt_m->interval_start = '2008-08-21 09:00:00';
     $oData_bkt_m->creative_id = 11;
     $oData_bkt_m->zone_id = 12;
     $oData_bkt_m->count = 9960;
     DataGenerator::generateOne($oData_bkt_m);
     $oData_bkt_c = OA_Dal::factoryDO('data_bkt_c');
     $oData_bkt_c->interval_start = '2008-08-21 09:00:00';
     $oData_bkt_c->creative_id = 11;
     $oData_bkt_c->zone_id = 12;
     $oData_bkt_c->count = 500;
     DataGenerator::generateOne($oData_bkt_c);
     // Test 13: Test with new data in the correct operation interval
     $result = $oDalMaintenanceStatistics->summariseBucketsAggregate($statisticsTableName, $aMigrationMaps, $aDates, $aExtras);
     $this->assertEqual($result, 2);
     $oData_intermediate_ad = OA_Dal::factoryDO('data_intermediate_ad');
     $oData_intermediate_ad->find();
     $rows = $oData_intermediate_ad->getRowCount();
     $this->assertEqual($rows, 3);
     $oData_intermediate_ad = OA_Dal::factoryDO('data_intermediate_ad');
     $oData_intermediate_ad->ad_id = 1;
     $oData_intermediate_ad->find();
     $rows = $oData_intermediate_ad->getRowCount();
     $this->assertEqual($rows, 1);
     $oData_intermediate_ad->fetch();
     $this->assertEqual($oData_intermediate_ad->date_time, '2008-08-21 09:00:00');
     $this->assertEqual($oData_intermediate_ad->operation_interval, $aConf['maintenance']['operationInterval']);
     $this->assertEqual($oData_intermediate_ad->operation_interval_id, OX_OperationInterval::convertDateToOperationIntervalID($aDates['start']));
     $this->assertEqual($oData_intermediate_ad->interval_start, '2008-08-21 09:00:00');
     $this->assertEqual($oData_intermediate_ad->interval_end, '2008-08-21 09:59:59');
     $this->assertEqual($oData_intermediate_ad->ad_id, 1);
     $this->assertEqual($oData_intermediate_ad->creative_id, 0);
     $this->assertEqual($oData_intermediate_ad->zone_id, 2);
     $this->assertEqual($oData_intermediate_ad->requests, 10);
     $this->assertEqual($oData_intermediate_ad->impressions, 9);
     $this->assertEqual($oData_intermediate_ad->clicks, 1);
     $oData_intermediate_ad = OA_Dal::factoryDO('data_intermediate_ad');
     $oData_intermediate_ad->ad_id = 2;
     $oData_intermediate_ad->find();
     $rows = $oData_intermediate_ad->getRowCount();
     $this->assertEqual($rows, 1);
     $oData_intermediate_ad->fetch();
     $this->assertEqual($oData_intermediate_ad->date_time, '2008-08-21 09:00:00');
     $this->assertEqual($oData_intermediate_ad->operation_interval, $aConf['maintenance']['operationInterval']);
     $this->assertEqual($oData_intermediate_ad->operation_interval_id, OX_OperationInterval::convertDateToOperationIntervalID($aDates['start']));
     $this->assertEqual($oData_intermediate_ad->interval_start, '2008-08-21 09:00:00');
     $this->assertEqual($oData_intermediate_ad->interval_end, '2008-08-21 09:59:59');
     $this->assertEqual($oData_intermediate_ad->ad_id, 2);
     $this->assertEqual($oData_intermediate_ad->creative_id, 0);
     $this->assertEqual($oData_intermediate_ad->zone_id, 2);
     $this->assertEqual($oData_intermediate_ad->requests, 10);
     $this->assertEqual($oData_intermediate_ad->impressions, 9);
     $this->assertEqual($oData_intermediate_ad->clicks, 1);
     $oData_intermediate_ad = OA_Dal::factoryDO('data_intermediate_ad');
     $oData_intermediate_ad->ad_id = 11;
     $oData_intermediate_ad->find();
     $rows = $oData_intermediate_ad->getRowCount();
     $this->assertEqual($rows, 1);
     $oData_intermediate_ad->fetch();
     $this->assertEqual($oData_intermediate_ad->date_time, '2008-08-21 09:00:00');
     $this->assertEqual($oData_intermediate_ad->operation_interval, $aConf['maintenance']['operationInterval']);
     $this->assertEqual($oData_intermediate_ad->operation_interval_id, OX_OperationInterval::convertDateToOperationIntervalID($aDates['start']));
     $this->assertEqual($oData_intermediate_ad->interval_start, '2008-08-21 09:00:00');
     $this->assertEqual($oData_intermediate_ad->interval_end, '2008-08-21 09:59:59');
     $this->assertEqual($oData_intermediate_ad->ad_id, 11);
     $this->assertEqual($oData_intermediate_ad->creative_id, 0);
     $this->assertEqual($oData_intermediate_ad->zone_id, 12);
     $this->assertEqual($oData_intermediate_ad->requests, 10000);
     $this->assertEqual($oData_intermediate_ad->impressions, 9960);
     $this->assertEqual($oData_intermediate_ad->clicks, 500);
     // Clean up generated data
     DataGenerator::cleanUp();
     // Also clean up the data migrated into the statistics table
     $oData_intermediate_ad = OA_Dal::factoryDO('data_intermediate_ad');
     $oData_intermediate_ad->data_intermediate_ad_id = 1;
     $oData_intermediate_ad->find();
     $oData_intermediate_ad->delete();
     $oData_intermediate_ad = OA_Dal::factoryDO('data_intermediate_ad');
     $oData_intermediate_ad->data_intermediate_ad_id = 2;
     $oData_intermediate_ad->find();
     $oData_intermediate_ad->delete();
     $oData_intermediate_ad = OA_Dal::factoryDO('data_intermediate_ad');
     $oData_intermediate_ad->data_intermediate_ad_id = 3;
     $oData_intermediate_ad->find();
     $oData_intermediate_ad->delete();
     // Uninstall the installed plugin
     TestEnv::uninstallPluginPackage('openXDeliveryLog', false);
     // Restore the test environment configuration
     TestEnv::restoreConfig();
 }
 /**
  * A method to test the main run() method.
  */
 function testRun()
 {
     $aConf =& $GLOBALS['_MAX']['CONF'];
     $aConf['maintenance']['operationInterval'] = 60;
     $oServiceLocator =& OA_ServiceLocator::instance();
     $oFactory = new OX_Dal_Maintenance_Statistics_Factory();
     $oDalMaintenanceStatsticsClassName = $oFactory->deriveClassName();
     // Test 1: Run, with the migration required but with no plugins installed
     $oNowDate = new Date('2008-08-28 09:01:00');
     $oServiceLocator->register('now', $oNowDate);
     $oMaintenanceStatistics = new OX_Maintenance_Statistics();
     $oMaintenanceStatistics->updateIntermediate = true;
     $oMaintenanceStatistics->oLastDateIntermediate = new Date('2008-08-28 07:59:59');
     $oMaintenanceStatistics->oUpdateIntermediateToDate = new Date('2008-08-28 08:59:59');
     Mock::generatePartial($oDalMaintenanceStatsticsClassName, 'MockOX_Dal_Maintenance_Statistics_Test_1', array('summariseBucketsRaw', 'summariseBucketsRawSupplementary', 'summariseBucketsAggregate', 'migrateRawRequests', 'migrateRawImpressions', 'migrateRawClicks'));
     $oDal = new MockOX_Dal_Maintenance_Statistics_Test_1($this);
     $oDal->expectNever('summariseBucketsRaw');
     $oDal->expectNever('summariseBucketsRawSupplementary');
     $oDal->expectNever('summariseBucketsAggregate');
     $oDal->expectNever('migrateRawRequests');
     $oDal->expectNever('migrateRawImpressions');
     $oDal->expectNever('migrateRawClicks');
     $oDal->OX_Dal_Maintenance_Statistics();
     $oServiceLocator->register('OX_Dal_Maintenance_Statistics', $oDal);
     $oSummariseIntermediate = new OX_Maintenance_Statistics_Task_MigrateBucketData();
     $oSummariseIntermediate->run();
     $oDal =& $oServiceLocator->get('OX_Dal_Maintenance_Statistics');
     $oDal->tally();
     // Create the "application_variable" table required for installing the plugin
     $oTables =& OA_DB_Table_Core::singleton();
     $oTables->createTable('application_variable');
     // Setup the default OpenX delivery logging plugin for the next test
     TestEnv::installPluginPackage('openXDeliveryLog', false);
     // Test 2: Run, with plugins installed, but with the migration not required
     $oNowDate = new Date('2008-08-28 09:01:00');
     $oServiceLocator->register('now', $oNowDate);
     $oMaintenanceStatistics = new OX_Maintenance_Statistics();
     $oMaintenanceStatistics->updateIntermediate = false;
     $oServiceLocator->register('Maintenance_Statistics_Controller', $oMaintenanceStatistics);
     Mock::generatePartial($oDalMaintenanceStatsticsClassName, 'MockOX_Dal_Maintenance_Statistics_Test_2', array('summariseBucketsRaw', 'summariseBucketsRawSupplementary', 'summariseBucketsAggregate', 'migrateRawRequests', 'migrateRawImpressions', 'migrateRawClicks'));
     $oDal = new MockOX_Dal_Maintenance_Statistics_Test_2($this);
     $oDal->expectNever('summariseBucketsRaw');
     $oDal->expectNever('summariseBucketsRawSupplementary');
     $oDal->expectNever('summariseBucketsAggregate');
     $oDal->expectNever('migrateRawRequests');
     $oDal->expectNever('migrateRawImpressions');
     $oDal->expectNever('migrateRawClicks');
     $oDal->OX_Dal_Maintenance_Statistics();
     $oServiceLocator->register('OX_Dal_Maintenance_Statistics', $oDal);
     $oSummariseIntermediate = new OX_Maintenance_Statistics_Task_MigrateBucketData();
     $oSummariseIntermediate->run();
     $oDal =& $oServiceLocator->get('OX_Dal_Maintenance_Statistics');
     $oDal->tally();
     // Test 3: Run, with plugins installed and with the migration required for a single
     //         operation interval
     $oNowDate = new Date('2008-08-28 09:01:00');
     $oServiceLocator->register('now', $oNowDate);
     $oMaintenanceStatistics = new OX_Maintenance_Statistics();
     $oMaintenanceStatistics->updateIntermediate = true;
     $oMaintenanceStatistics->oLastDateIntermediate = new Date('2008-08-28 07:59:59');
     $oMaintenanceStatistics->oUpdateIntermediateToDate = new Date('2008-08-28 08:59:59');
     $oServiceLocator->register('Maintenance_Statistics_Controller', $oMaintenanceStatistics);
     Mock::generatePartial($oDalMaintenanceStatsticsClassName, 'MockOX_Dal_Maintenance_Statistics_Test_3', array('summariseBucketsRaw', 'summariseBucketsRawSupplementary', 'summariseBucketsAggregate', 'migrateRawRequests', 'migrateRawImpressions', 'migrateRawClicks'));
     $oDal = new MockOX_Dal_Maintenance_Statistics_Test_3($this);
     $oComponent =& OX_Component::factory('deliveryLog', 'oxLogConversion', 'logConversion');
     $oStartDate = new Date('2008-08-28 07:59:59');
     $oStartDate->addSeconds(1);
     $oEndDate = new Date('2008-08-28 09:00:00');
     $oEndDate->subtractSeconds(1);
     $oDal->expectOnce('summariseBucketsRaw', array($aConf['table']['prefix'] . 'data_intermediate_ad_connection', $oComponent->getStatisticsMigration(), array('start' => $oStartDate, 'end' => $oEndDate)));
     $oComponent =& OX_Component::factory('deliveryLog', 'oxLogConversion', 'logConversionVariable');
     $oStartDate = new Date('2008-08-28 07:59:59');
     $oStartDate->addSeconds(1);
     $oEndDate = new Date('2008-08-28 09:00:00');
     $oEndDate->subtractSeconds(1);
     $oDal->expectOnce('summariseBucketsRawSupplementary', array($aConf['table']['prefix'] . 'data_intermediate_ad_variable_value', $oComponent->getStatisticsMigration(), array('start' => $oStartDate, 'end' => $oEndDate)));
     $aMap = array();
     $oComponent =& OX_Component::factory('deliveryLog', 'oxLogClick', 'logClick');
     $aMap[get_class($oComponent)] = $oComponent->getStatisticsMigration();
     $oComponent =& OX_Component::factory('deliveryLog', 'oxLogImpression', 'logImpression');
     $aMap[get_class($oComponent)] = $oComponent->getStatisticsMigration();
     $oComponent =& OX_Component::factory('deliveryLog', 'oxLogRequest', 'logRequest');
     $aMap[get_class($oComponent)] = $oComponent->getStatisticsMigration();
     $oStartDate = new Date('2008-08-28 07:59:59');
     $oStartDate->addSeconds(1);
     $oEndDate = new Date('2008-08-28 09:00:00');
     $oEndDate->subtractSeconds(1);
     $oDal->expectOnce('summariseBucketsAggregate', array($aConf['table']['prefix'] . 'data_intermediate_ad', $aMap, array('start' => $oStartDate, 'end' => $oEndDate), array('operation_interval' => '60', 'operation_interval_id' => OX_OperationInterval::convertDateToOperationIntervalID($oStartDate), 'interval_start' => "'2008-08-28 08:00:00'", 'interval_end' => "'2008-08-28 08:59:59'", 'creative_id' => 0, 'updated' => "'2008-08-28 09:01:00'")));
     $oDal->expectNever('migrateRawRequests');
     $oDal->expectNever('migrateRawImpressions');
     $oDal->expectNever('migrateRawClicks');
     $oDal->OX_Dal_Maintenance_Statistics();
     $oServiceLocator->register('OX_Dal_Maintenance_Statistics', $oDal);
     $oSummariseIntermediate = new OX_Maintenance_Statistics_Task_MigrateBucketData();
     $oSummariseIntermediate->run();
     $oDal =& $oServiceLocator->get('OX_Dal_Maintenance_Statistics');
     $oDal->tally();
     // Test 4: Run, with plugins installed and with the migration required for a single
     //         operation interval + migration of raw data set to occur
     $doApplication_variable = OA_Dal::factoryDO('application_variable');
     $doApplication_variable->name = 'mse_process_raw';
     $doApplication_variable->value = '1';
     $doApplication_variable->insert();
     $oNowDate = new Date('2008-08-28 09:01:00');
     $oServiceLocator->register('now', $oNowDate);
     $oMaintenanceStatistics = new OX_Maintenance_Statistics();
     $oMaintenanceStatistics->updateIntermediate = true;
     $oMaintenanceStatistics->oLastDateIntermediate = new Date('2008-08-28 07:59:59');
     $oMaintenanceStatistics->oUpdateIntermediateToDate = new Date('2008-08-28 08:59:59');
     $oServiceLocator->register('Maintenance_Statistics_Controller', $oMaintenanceStatistics);
     Mock::generatePartial($oDalMaintenanceStatsticsClassName, 'MockOX_Dal_Maintenance_Statistics_Test_4', array('summariseBucketsRaw', 'summariseBucketsRawSupplementary', 'summariseBucketsAggregate', 'migrateRawRequests', 'migrateRawImpressions', 'migrateRawClicks'));
     $oDal = new MockOX_Dal_Maintenance_Statistics_Test_4($this);
     $oComponent =& OX_Component::factory('deliveryLog', 'oxLogConversion', 'logConversion');
     $oStartDate = new Date('2008-08-28 07:59:59');
     $oStartDate->addSeconds(1);
     $oEndDate = new Date('2008-08-28 09:00:00');
     $oEndDate->subtractSeconds(1);
     $oDal->expectOnce('summariseBucketsRaw', array($aConf['table']['prefix'] . 'data_intermediate_ad_connection', $oComponent->getStatisticsMigration(), array('start' => $oStartDate, 'end' => $oEndDate)));
     $oComponent =& OX_Component::factory('deliveryLog', 'oxLogConversion', 'logConversionVariable');
     $oStartDate = new Date('2008-08-28 07:59:59');
     $oStartDate->addSeconds(1);
     $oEndDate = new Date('2008-08-28 09:00:00');
     $oEndDate->subtractSeconds(1);
     $oDal->expectOnce('summariseBucketsRawSupplementary', array($aConf['table']['prefix'] . 'data_intermediate_ad_variable_value', $oComponent->getStatisticsMigration(), array('start' => $oStartDate, 'end' => $oEndDate)));
     $aMap = array();
     $oComponent =& OX_Component::factory('deliveryLog', 'oxLogClick', 'logClick');
     $aMap[get_class($oComponent)] = $oComponent->getStatisticsMigration();
     $oComponent =& OX_Component::factory('deliveryLog', 'oxLogImpression', 'logImpression');
     $aMap[get_class($oComponent)] = $oComponent->getStatisticsMigration();
     $oComponent =& OX_Component::factory('deliveryLog', 'oxLogRequest', 'logRequest');
     $aMap[get_class($oComponent)] = $oComponent->getStatisticsMigration();
     $oStartDate = new Date('2008-08-28 07:59:59');
     $oStartDate->addSeconds(1);
     $oEndDate = new Date('2008-08-28 09:00:00');
     $oEndDate->subtractSeconds(1);
     $oDal->expectOnce('summariseBucketsAggregate', array($aConf['table']['prefix'] . 'data_intermediate_ad', $aMap, array('start' => $oStartDate, 'end' => $oEndDate), array('operation_interval' => '60', 'operation_interval_id' => OX_OperationInterval::convertDateToOperationIntervalID($oStartDate), 'interval_start' => "'2008-08-28 08:00:00'", 'interval_end' => "'2008-08-28 08:59:59'", 'creative_id' => 0, 'updated' => "'2008-08-28 09:01:00'")));
     $oDal->expectOnce('migrateRawRequests', array($oStartDate, $oEndDate));
     $oDal->expectOnce('migrateRawImpressions', array($oStartDate, $oEndDate));
     $oDal->expectOnce('migrateRawClicks', array($oStartDate, $oEndDate));
     $oDal->OX_Dal_Maintenance_Statistics();
     $oServiceLocator->register('OX_Dal_Maintenance_Statistics', $oDal);
     $oSummariseIntermediate = new OX_Maintenance_Statistics_Task_MigrateBucketData();
     $oSummariseIntermediate->run();
     $oDal =& $oServiceLocator->get('OX_Dal_Maintenance_Statistics');
     $oDal->tally();
     $doApplication_variable = OA_Dal::factoryDO('application_variable');
     $doApplication_variable->name = 'mse_process_raw';
     $doApplication_variable->value = '1';
     $doApplication_variable->find();
     $rows = $doApplication_variable->getRowCount();
     $this->assertEqual($rows, 0);
     // Test 5: Run, with plugins installed and with the migration required for multiple
     //         operation intervals
     $oNowDate = new Date('2008-08-28 11:01:00');
     $oServiceLocator->register('now', $oNowDate);
     $oMaintenanceStatistics = new OX_Maintenance_Statistics();
     $oMaintenanceStatistics->updateIntermediate = true;
     $oMaintenanceStatistics->oLastDateIntermediate = new Date('2008-08-28 07:59:59');
     $oMaintenanceStatistics->oUpdateIntermediateToDate = new Date('2008-08-28 10:59:59');
     $oServiceLocator->register('Maintenance_Statistics_Controller', $oMaintenanceStatistics);
     Mock::generatePartial($oDalMaintenanceStatsticsClassName, 'MockOX_Dal_Maintenance_Statistics_Test_5', array('summariseBucketsRaw', 'summariseBucketsRawSupplementary', 'summariseBucketsAggregate', 'migrateRawRequests', 'migrateRawImpressions', 'migrateRawClicks'));
     $oDal = new MockOX_Dal_Maintenance_Statistics_Test_5($this);
     $oDal->expectCallCount('summariseBucketsRaw', 3);
     $oDal->expectCallCount('summariseBucketsRawSupplementary', 3);
     $oDal->expectCallCount('summariseBucketsAggregate', 3);
     $oComponent =& OX_Component::factory('deliveryLog', 'oxLogConversion', 'logConversion');
     $oStartDate = new Date('2008-08-28 07:59:59');
     $oStartDate->addSeconds(1);
     $oEndDate = new Date('2008-08-28 09:00:00');
     $oEndDate->subtractSeconds(1);
     $oDal->expectAt(0, 'summariseBucketsRaw', array($aConf['table']['prefix'] . 'data_intermediate_ad_connection', $oComponent->getStatisticsMigration(), array('start' => $oStartDate, 'end' => $oEndDate)));
     $oStartDate = new Date('2008-08-28 08:59:59');
     $oStartDate->addSeconds(1);
     $oEndDate = new Date('2008-08-28 10:00:00');
     $oEndDate->subtractSeconds(1);
     $oDal->expectAt(1, 'summariseBucketsRaw', array($aConf['table']['prefix'] . 'data_intermediate_ad_connection', $oComponent->getStatisticsMigration(), array('start' => $oStartDate, 'end' => $oEndDate)));
     $oStartDate = new Date('2008-08-28 09:59:59');
     $oStartDate->addSeconds(1);
     $oEndDate = new Date('2008-08-28 11:00:00');
     $oEndDate->subtractSeconds(1);
     $oDal->expectAt(2, 'summariseBucketsRaw', array($aConf['table']['prefix'] . 'data_intermediate_ad_connection', $oComponent->getStatisticsMigration(), array('start' => $oStartDate, 'end' => $oEndDate)));
     $oComponent =& OX_Component::factory('deliveryLog', 'oxLogConversion', 'logConversionVariable');
     $oStartDate = new Date('2008-08-28 07:59:59');
     $oStartDate->addSeconds(1);
     $oEndDate = new Date('2008-08-28 09:00:00');
     $oEndDate->subtractSeconds(1);
     $oDal->expectAt(0, 'summariseBucketsRawSupplementary', array($aConf['table']['prefix'] . 'data_intermediate_ad_variable_value', $oComponent->getStatisticsMigration(), array('start' => $oStartDate, 'end' => $oEndDate)));
     $oStartDate = new Date('2008-08-28 08:59:59');
     $oStartDate->addSeconds(1);
     $oEndDate = new Date('2008-08-28 10:00:00');
     $oEndDate->subtractSeconds(1);
     $oDal->expectAt(1, 'summariseBucketsRawSupplementary', array($aConf['table']['prefix'] . 'data_intermediate_ad_variable_value', $oComponent->getStatisticsMigration(), array('start' => $oStartDate, 'end' => $oEndDate)));
     $oStartDate = new Date('2008-08-28 09:59:59');
     $oStartDate->addSeconds(1);
     $oEndDate = new Date('2008-08-28 11:00:00');
     $oEndDate->subtractSeconds(1);
     $oDal->expectAt(2, 'summariseBucketsRawSupplementary', array($aConf['table']['prefix'] . 'data_intermediate_ad_variable_value', $oComponent->getStatisticsMigration(), array('start' => $oStartDate, 'end' => $oEndDate)));
     $aMap = array();
     $oComponent =& OX_Component::factory('deliveryLog', 'oxLogClick', 'logClick');
     $aMap[get_class($oComponent)] = $oComponent->getStatisticsMigration();
     $oComponent =& OX_Component::factory('deliveryLog', 'oxLogImpression', 'logImpression');
     $aMap[get_class($oComponent)] = $oComponent->getStatisticsMigration();
     $oComponent =& OX_Component::factory('deliveryLog', 'oxLogRequest', 'logRequest');
     $aMap[get_class($oComponent)] = $oComponent->getStatisticsMigration();
     $oStartDate = new Date('2008-08-28 07:59:59');
     $oStartDate->addSeconds(1);
     $oEndDate = new Date('2008-08-28 09:00:00');
     $oEndDate->subtractSeconds(1);
     $oDal->expectAt(0, 'summariseBucketsAggregate', array($aConf['table']['prefix'] . 'data_intermediate_ad', $aMap, array('start' => $oStartDate, 'end' => $oEndDate), array('operation_interval' => '60', 'operation_interval_id' => OX_OperationInterval::convertDateToOperationIntervalID($oStartDate), 'interval_start' => "'2008-08-28 08:00:00'", 'interval_end' => "'2008-08-28 08:59:59'", 'creative_id' => 0, 'updated' => "'2008-08-28 11:01:00'")));
     $oStartDate = new Date('2008-08-28 08:59:59');
     $oStartDate->addSeconds(1);
     $oEndDate = new Date('2008-08-28 10:00:00');
     $oEndDate->subtractSeconds(1);
     $oDal->expectAt(1, 'summariseBucketsAggregate', array($aConf['table']['prefix'] . 'data_intermediate_ad', $aMap, array('start' => $oStartDate, 'end' => $oEndDate), array('operation_interval' => '60', 'operation_interval_id' => OX_OperationInterval::convertDateToOperationIntervalID($oStartDate), 'interval_start' => "'2008-08-28 09:00:00'", 'interval_end' => "'2008-08-28 09:59:59'", 'creative_id' => 0, 'updated' => "'2008-08-28 11:01:00'")));
     $oStartDate = new Date('2008-08-28 09:59:59');
     $oStartDate->addSeconds(1);
     $oEndDate = new Date('2008-08-28 11:00:00');
     $oEndDate->subtractSeconds(1);
     $oDal->expectAt(2, 'summariseBucketsAggregate', array($aConf['table']['prefix'] . 'data_intermediate_ad', $aMap, array('start' => $oStartDate, 'end' => $oEndDate), array('operation_interval' => '60', 'operation_interval_id' => OX_OperationInterval::convertDateToOperationIntervalID($oStartDate), 'interval_start' => "'2008-08-28 10:00:00'", 'interval_end' => "'2008-08-28 10:59:59'", 'creative_id' => 0, 'updated' => "'2008-08-28 11:01:00'")));
     $oDal->expectNever('migrateRawRequests');
     $oDal->expectNever('migrateRawImpressions');
     $oDal->expectNever('migrateRawClicks');
     $oDal->OX_Dal_Maintenance_Statistics();
     $oServiceLocator->register('OX_Dal_Maintenance_Statistics', $oDal);
     $oSummariseIntermediate = new OX_Maintenance_Statistics_Task_MigrateBucketData();
     $oSummariseIntermediate->run();
     $oDal =& $oServiceLocator->get('OX_Dal_Maintenance_Statistics');
     $oDal->tally();
     // Test 6: Run, with plugins installed and with the migration required for multiple
     //         operation intervals + migration of raw data set to occur
     $doApplication_variable = OA_Dal::factoryDO('application_variable');
     $doApplication_variable->name = 'mse_process_raw';
     $doApplication_variable->value = '1';
     $doApplication_variable->insert();
     $oNowDate = new Date('2008-08-28 11:01:00');
     $oServiceLocator->register('now', $oNowDate);
     $oMaintenanceStatistics = new OX_Maintenance_Statistics();
     $oMaintenanceStatistics->updateIntermediate = true;
     $oMaintenanceStatistics->oLastDateIntermediate = new Date('2008-08-28 07:59:59');
     $oMaintenanceStatistics->oUpdateIntermediateToDate = new Date('2008-08-28 10:59:59');
     $oServiceLocator->register('Maintenance_Statistics_Controller', $oMaintenanceStatistics);
     Mock::generatePartial($oDalMaintenanceStatsticsClassName, 'MockOX_Dal_Maintenance_Statistics_Test_6', array('summariseBucketsRaw', 'summariseBucketsRawSupplementary', 'summariseBucketsAggregate', 'migrateRawRequests', 'migrateRawImpressions', 'migrateRawClicks'));
     $oDal = new MockOX_Dal_Maintenance_Statistics_Test_6($this);
     $oDal->expectCallCount('summariseBucketsRaw', 3);
     $oDal->expectCallCount('summariseBucketsRawSupplementary', 3);
     $oDal->expectCallCount('summariseBucketsAggregate', 3);
     $oComponent =& OX_Component::factory('deliveryLog', 'oxLogConversion', 'logConversion');
     $oStartDate = new Date('2008-08-28 07:59:59');
     $oStartDate->addSeconds(1);
     $oEndDate = new Date('2008-08-28 09:00:00');
     $oEndDate->subtractSeconds(1);
     $oDal->expectAt(0, 'summariseBucketsRaw', array($aConf['table']['prefix'] . 'data_intermediate_ad_connection', $oComponent->getStatisticsMigration(), array('start' => $oStartDate, 'end' => $oEndDate)));
     $oStartDate = new Date('2008-08-28 08:59:59');
     $oStartDate->addSeconds(1);
     $oEndDate = new Date('2008-08-28 10:00:00');
     $oEndDate->subtractSeconds(1);
     $oDal->expectAt(1, 'summariseBucketsRaw', array($aConf['table']['prefix'] . 'data_intermediate_ad_connection', $oComponent->getStatisticsMigration(), array('start' => $oStartDate, 'end' => $oEndDate)));
     $oStartDate = new Date('2008-08-28 09:59:59');
     $oStartDate->addSeconds(1);
     $oEndDate = new Date('2008-08-28 11:00:00');
     $oEndDate->subtractSeconds(1);
     $oDal->expectAt(2, 'summariseBucketsRaw', array($aConf['table']['prefix'] . 'data_intermediate_ad_connection', $oComponent->getStatisticsMigration(), array('start' => $oStartDate, 'end' => $oEndDate)));
     $oComponent =& OX_Component::factory('deliveryLog', 'oxLogConversion', 'logConversionVariable');
     $oStartDate = new Date('2008-08-28 07:59:59');
     $oStartDate->addSeconds(1);
     $oEndDate = new Date('2008-08-28 09:00:00');
     $oEndDate->subtractSeconds(1);
     $oDal->expectAt(0, 'summariseBucketsRawSupplementary', array($aConf['table']['prefix'] . 'data_intermediate_ad_variable_value', $oComponent->getStatisticsMigration(), array('start' => $oStartDate, 'end' => $oEndDate)));
     $oStartDate = new Date('2008-08-28 08:59:59');
     $oStartDate->addSeconds(1);
     $oEndDate = new Date('2008-08-28 10:00:00');
     $oEndDate->subtractSeconds(1);
     $oDal->expectAt(1, 'summariseBucketsRawSupplementary', array($aConf['table']['prefix'] . 'data_intermediate_ad_variable_value', $oComponent->getStatisticsMigration(), array('start' => $oStartDate, 'end' => $oEndDate)));
     $oStartDate = new Date('2008-08-28 09:59:59');
     $oStartDate->addSeconds(1);
     $oEndDate = new Date('2008-08-28 11:00:00');
     $oEndDate->subtractSeconds(1);
     $oDal->expectAt(2, 'summariseBucketsRawSupplementary', array($aConf['table']['prefix'] . 'data_intermediate_ad_variable_value', $oComponent->getStatisticsMigration(), array('start' => $oStartDate, 'end' => $oEndDate)));
     $aMap = array();
     $oComponent =& OX_Component::factory('deliveryLog', 'oxLogClick', 'logClick');
     $aMap[get_class($oComponent)] = $oComponent->getStatisticsMigration();
     $oComponent =& OX_Component::factory('deliveryLog', 'oxLogImpression', 'logImpression');
     $aMap[get_class($oComponent)] = $oComponent->getStatisticsMigration();
     $oComponent =& OX_Component::factory('deliveryLog', 'oxLogRequest', 'logRequest');
     $aMap[get_class($oComponent)] = $oComponent->getStatisticsMigration();
     $oStartDate = new Date('2008-08-28 07:59:59');
     $oStartDate->addSeconds(1);
     $oEndDate = new Date('2008-08-28 09:00:00');
     $oEndDate->subtractSeconds(1);
     $oDal->expectAt(0, 'summariseBucketsAggregate', array($aConf['table']['prefix'] . 'data_intermediate_ad', $aMap, array('start' => $oStartDate, 'end' => $oEndDate), array('operation_interval' => '60', 'operation_interval_id' => OX_OperationInterval::convertDateToOperationIntervalID($oStartDate), 'interval_start' => "'2008-08-28 08:00:00'", 'interval_end' => "'2008-08-28 08:59:59'", 'creative_id' => 0, 'updated' => "'2008-08-28 11:01:00'")));
     $oStartDate = new Date('2008-08-28 08:59:59');
     $oStartDate->addSeconds(1);
     $oEndDate = new Date('2008-08-28 10:00:00');
     $oEndDate->subtractSeconds(1);
     $oDal->expectAt(1, 'summariseBucketsAggregate', array($aConf['table']['prefix'] . 'data_intermediate_ad', $aMap, array('start' => $oStartDate, 'end' => $oEndDate), array('operation_interval' => '60', 'operation_interval_id' => OX_OperationInterval::convertDateToOperationIntervalID($oStartDate), 'interval_start' => "'2008-08-28 09:00:00'", 'interval_end' => "'2008-08-28 09:59:59'", 'creative_id' => 0, 'updated' => "'2008-08-28 11:01:00'")));
     $oStartDate = new Date('2008-08-28 09:59:59');
     $oStartDate->addSeconds(1);
     $oEndDate = new Date('2008-08-28 11:00:00');
     $oEndDate->subtractSeconds(1);
     $oDal->expectAt(2, 'summariseBucketsAggregate', array($aConf['table']['prefix'] . 'data_intermediate_ad', $aMap, array('start' => $oStartDate, 'end' => $oEndDate), array('operation_interval' => '60', 'operation_interval_id' => OX_OperationInterval::convertDateToOperationIntervalID($oStartDate), 'interval_start' => "'2008-08-28 10:00:00'", 'interval_end' => "'2008-08-28 10:59:59'", 'creative_id' => 0, 'updated' => "'2008-08-28 11:01:00'")));
     $oStartDate = new Date('2008-08-28 07:59:59');
     $oStartDate->addSeconds(1);
     $oEndDate = new Date('2008-08-28 09:00:00');
     $oEndDate->subtractSeconds(1);
     $oDal->expectAt(0, 'migrateRawRequests', array($oStartDate, $oEndDate));
     $oDal->expectAt(0, 'migrateRawImpressions', array($oStartDate, $oEndDate));
     $oDal->expectAt(0, 'migrateRawClicks', array($oStartDate, $oEndDate));
     $oStartDate = new Date('2008-08-28 08:59:59');
     $oStartDate->addSeconds(1);
     $oEndDate = new Date('2008-08-28 10:00:00');
     $oEndDate->subtractSeconds(1);
     $oDal->expectAt(1, 'migrateRawRequests', array($oStartDate, $oEndDate));
     $oDal->expectAt(1, 'migrateRawImpressions', array($oStartDate, $oEndDate));
     $oDal->expectAt(1, 'migrateRawClicks', array($oStartDate, $oEndDate));
     $oStartDate = new Date('2008-08-28 09:59:59');
     $oStartDate->addSeconds(1);
     $oEndDate = new Date('2008-08-28 11:00:00');
     $oEndDate->subtractSeconds(1);
     $oDal->expectAt(2, 'migrateRawRequests', array($oStartDate, $oEndDate));
     $oDal->expectAt(2, 'migrateRawImpressions', array($oStartDate, $oEndDate));
     $oDal->expectAt(2, 'migrateRawClicks', array($oStartDate, $oEndDate));
     $oDal->OX_Dal_Maintenance_Statistics();
     $oServiceLocator->register('OX_Dal_Maintenance_Statistics', $oDal);
     $oSummariseIntermediate = new OX_Maintenance_Statistics_Task_MigrateBucketData();
     $oSummariseIntermediate->run();
     $oDal =& $oServiceLocator->get('OX_Dal_Maintenance_Statistics');
     $oDal->tally();
     $doApplication_variable = OA_Dal::factoryDO('application_variable');
     $doApplication_variable->name = 'mse_process_raw';
     $doApplication_variable->value = '1';
     $doApplication_variable->find();
     $rows = $doApplication_variable->getRowCount();
     $this->assertEqual($rows, 0);
     // Uninstall the installed plugins
     TestEnv::uninstallPluginPackage('openXDeliveryLog', false);
     // Reset the testing environment
     TestEnv::restoreEnv();
 }
 /**
  * The method to test the manageConversions() method.
  */
 function testManageConversions()
 {
     // Test 0: Test that there is no data in the data_intermediate_ad table
     $doData_intermediate_ad = OA_Dal::factoryDO('data_intermediate_ad');
     $doData_intermediate_ad->find();
     $rows = $doData_intermediate_ad->getRowCount();
     $this->assertEqual($rows, 0);
     // Insert a variable tracker with no special purpose
     // Hacks the DB_DataObject so that the DataGenerator will not override
     // the NULL value that should be inserted into the database with an
     // auto generated value...
     $doVariables = OA_Dal::factoryDO('variables');
     $doVariables->defaultValues['purpose'] = OX_DATAOBJECT_NULL;
     $variableId1 = DataGenerator::generateOne($doVariables);
     // Insert a basket value variable tracker
     $doVariables = OA_Dal::factoryDO('variables');
     $doVariables->purpose = 'basket_value';
     $variableId2 = DataGenerator::generateOne($doVariables);
     // Insert a number of items variable tracker
     $doVariables = OA_Dal::factoryDO('variables');
     $doVariables->purpose = 'num_items';
     $variableId3 = DataGenerator::generateOne($doVariables);
     // Test 1: Test with no data
     $aConf =& $GLOBALS['_MAX']['CONF'];
     $oDbh =& OA_DB::singleton();
     $oFactory = new OX_Dal_Maintenance_Statistics_Factory();
     $oDalMaintenanceStatistics = $oFactory->factory();
     // Test 1
     $oStart = new Date('2004-06-06 12:00:00');
     $oEnd = new Date('2004-06-06 12:59:59');
     $oDalMaintenanceStatistics->manageConversions($oStart, $oEnd);
     $doData_intermediate_ad = OA_Dal::factoryDO('data_intermediate_ad');
     $doData_intermediate_ad->find();
     $rows = $doData_intermediate_ad->getRowCount();
     $this->assertEqual($rows, 0);
     // Test 2: Test with data that is outside the range to manage
     $doData_intermediate_ad_connection = OA_Dal::factoryDO('data_intermediate_ad_connection');
     $doData_intermediate_ad_connection->server_raw_tracker_impression_id = 1;
     $doData_intermediate_ad_connection->server_raw_ip = 'singleDB';
     $doData_intermediate_ad_connection->tracker_date_time = '2004-06-06 11:10:00';
     $doData_intermediate_ad_connection->connection_date_time = '2004-06-06 11:05:00';
     $doData_intermediate_ad_connection->tracker_id = 500;
     $doData_intermediate_ad_connection->ad_id = 600;
     $doData_intermediate_ad_connection->zone_id = 100;
     $doData_intermediate_ad_connection->tracker_ip_address = '127.0.0.1';
     $doData_intermediate_ad_connection->connection_action = MAX_CONNECTION_AD_CLICK;
     $doData_intermediate_ad_connection->connection_window = 3600;
     $doData_intermediate_ad_connection->connection_status = MAX_CONNECTION_STATUS_APPROVED;
     $doData_intermediate_ad_connection->inside_window = 1;
     $connectionId1 = DataGenerator::generateOne($doData_intermediate_ad_connection);
     $doData_intermediate_ad_variable_value = OA_Dal::factoryDO('data_intermediate_ad_variable_value');
     $doData_intermediate_ad_variable_value->data_intermediate_ad_connection_id = $connectionId1;
     $doData_intermediate_ad_variable_value->tracker_variable_id = $variableId1;
     $doData_intermediate_ad_variable_value->value = '12345';
     DataGenerator::generateOne($doData_intermediate_ad_variable_value);
     $oStart = new Date('2004-06-06 12:00:00');
     $oEnd = new Date('2004-06-06 12:59:59');
     $oDalMaintenanceStatistics->manageConversions($oStart, $oEnd);
     $doData_intermediate_ad = OA_Dal::factoryDO('data_intermediate_ad');
     $doData_intermediate_ad->find();
     $rows = $doData_intermediate_ad->getRowCount();
     $this->assertEqual($rows, 0);
     // Test 3: Test with data that is inside the range to manage,
     //         but with no corresponding data_intermediate_ad rows
     $doData_intermediate_ad_connection = OA_Dal::factoryDO('data_intermediate_ad_connection');
     $doData_intermediate_ad_connection->server_raw_tracker_impression_id = 2;
     $doData_intermediate_ad_connection->server_raw_ip = 'singleDB';
     $doData_intermediate_ad_connection->tracker_date_time = '2004-06-06 12:10:00';
     $doData_intermediate_ad_connection->connection_date_time = '2004-06-06 12:05:00';
     $doData_intermediate_ad_connection->tracker_id = 500;
     $doData_intermediate_ad_connection->ad_id = 600;
     $doData_intermediate_ad_connection->zone_id = 100;
     $doData_intermediate_ad_connection->tracker_ip_address = '127.0.0.1';
     $doData_intermediate_ad_connection->connection_action = MAX_CONNECTION_AD_CLICK;
     $doData_intermediate_ad_connection->connection_window = 3600;
     $doData_intermediate_ad_connection->connection_status = MAX_CONNECTION_STATUS_APPROVED;
     $doData_intermediate_ad_connection->inside_window = 1;
     $connectionId2 = DataGenerator::generateOne($doData_intermediate_ad_connection);
     $doData_intermediate_ad_connection = OA_Dal::factoryDO('data_intermediate_ad_connection');
     $doData_intermediate_ad_connection->server_raw_tracker_impression_id = 3;
     $doData_intermediate_ad_connection->server_raw_ip = 'singleDB';
     $doData_intermediate_ad_connection->tracker_date_time = '2004-06-06 12:15:00';
     $doData_intermediate_ad_connection->connection_date_time = '2004-06-06 12:10:00';
     $doData_intermediate_ad_connection->tracker_id = 500;
     $doData_intermediate_ad_connection->ad_id = 600;
     $doData_intermediate_ad_connection->zone_id = 100;
     $doData_intermediate_ad_connection->tracker_ip_address = '127.0.0.1';
     $doData_intermediate_ad_connection->connection_action = MAX_CONNECTION_AD_CLICK;
     $doData_intermediate_ad_connection->connection_window = 3600;
     $doData_intermediate_ad_connection->connection_status = MAX_CONNECTION_STATUS_APPROVED;
     $doData_intermediate_ad_connection->inside_window = 1;
     $connectionId3 = DataGenerator::generateOne($doData_intermediate_ad_connection);
     $doData_intermediate_ad_variable_value = OA_Dal::factoryDO('data_intermediate_ad_variable_value');
     $doData_intermediate_ad_variable_value->data_intermediate_ad_connection_id = $connectionId3;
     $doData_intermediate_ad_variable_value->tracker_variable_id = $variableId1;
     $doData_intermediate_ad_variable_value->value = 'foo';
     DataGenerator::generateOne($doData_intermediate_ad_variable_value);
     $doData_intermediate_ad_connection = OA_Dal::factoryDO('data_intermediate_ad_connection');
     $doData_intermediate_ad_connection->server_raw_tracker_impression_id = 4;
     $doData_intermediate_ad_connection->server_raw_ip = 'singleDB';
     $doData_intermediate_ad_connection->tracker_date_time = '2004-06-06 12:15:00';
     $doData_intermediate_ad_connection->connection_date_time = '2004-06-06 12:10:00';
     $doData_intermediate_ad_connection->tracker_id = 500;
     $doData_intermediate_ad_connection->ad_id = 600;
     $doData_intermediate_ad_connection->zone_id = 100;
     $doData_intermediate_ad_connection->tracker_ip_address = '127.0.0.1';
     $doData_intermediate_ad_connection->connection_action = MAX_CONNECTION_AD_CLICK;
     $doData_intermediate_ad_connection->connection_window = 3600;
     $doData_intermediate_ad_connection->connection_status = MAX_CONNECTION_STATUS_APPROVED;
     $doData_intermediate_ad_connection->inside_window = 1;
     $connectionId4 = DataGenerator::generateOne($doData_intermediate_ad_connection);
     $doData_intermediate_ad_variable_value = OA_Dal::factoryDO('data_intermediate_ad_variable_value');
     $doData_intermediate_ad_variable_value->data_intermediate_ad_connection_id = $connectionId4;
     $doData_intermediate_ad_variable_value->tracker_variable_id = $variableId2;
     $doData_intermediate_ad_variable_value->value = '15.67';
     DataGenerator::generateOne($doData_intermediate_ad_variable_value);
     $doData_intermediate_ad_connection = OA_Dal::factoryDO('data_intermediate_ad_connection');
     $doData_intermediate_ad_connection->server_raw_tracker_impression_id = 5;
     $doData_intermediate_ad_connection->server_raw_ip = 'singleDB';
     $doData_intermediate_ad_connection->tracker_date_time = '2004-06-06 12:15:00';
     $doData_intermediate_ad_connection->connection_date_time = '2004-06-06 12:10:00';
     $doData_intermediate_ad_connection->tracker_id = 501;
     $doData_intermediate_ad_connection->ad_id = 601;
     $doData_intermediate_ad_connection->zone_id = 101;
     $doData_intermediate_ad_connection->tracker_ip_address = '127.0.0.1';
     $doData_intermediate_ad_connection->connection_action = MAX_CONNECTION_AD_CLICK;
     $doData_intermediate_ad_connection->connection_window = 3600;
     $doData_intermediate_ad_connection->connection_status = MAX_CONNECTION_STATUS_APPROVED;
     $doData_intermediate_ad_connection->inside_window = 1;
     $connectionId5 = DataGenerator::generateOne($doData_intermediate_ad_connection);
     $doData_intermediate_ad_variable_value = OA_Dal::factoryDO('data_intermediate_ad_variable_value');
     $doData_intermediate_ad_variable_value->data_intermediate_ad_connection_id = $connectionId5;
     $doData_intermediate_ad_variable_value->tracker_variable_id = $variableId3;
     $doData_intermediate_ad_variable_value->value = '37';
     DataGenerator::generateOne($doData_intermediate_ad_variable_value);
     $doData_intermediate_ad_connection = OA_Dal::factoryDO('data_intermediate_ad_connection');
     $doData_intermediate_ad_connection->server_raw_tracker_impression_id = 6;
     $doData_intermediate_ad_connection->server_raw_ip = 'singleDB';
     $doData_intermediate_ad_connection->tracker_date_time = '2004-06-06 12:15:00';
     $doData_intermediate_ad_connection->connection_date_time = '2004-06-06 12:10:00';
     $doData_intermediate_ad_connection->tracker_id = 500;
     $doData_intermediate_ad_connection->ad_id = 600;
     $doData_intermediate_ad_connection->zone_id = 100;
     $doData_intermediate_ad_connection->tracker_ip_address = '127.0.0.1';
     $doData_intermediate_ad_connection->connection_action = MAX_CONNECTION_AD_CLICK;
     $doData_intermediate_ad_connection->connection_window = 3600;
     $doData_intermediate_ad_connection->connection_status = MAX_CONNECTION_STATUS_APPROVED;
     $doData_intermediate_ad_connection->inside_window = 1;
     $connectionId6 = DataGenerator::generateOne($doData_intermediate_ad_connection);
     $doData_intermediate_ad_variable_value = OA_Dal::factoryDO('data_intermediate_ad_variable_value');
     $doData_intermediate_ad_variable_value->data_intermediate_ad_connection_id = $connectionId6;
     $doData_intermediate_ad_variable_value->tracker_variable_id = $variableId2;
     $doData_intermediate_ad_variable_value->value = '20';
     DataGenerator::generateOne($doData_intermediate_ad_variable_value);
     $doData_intermediate_ad_variable_value = OA_Dal::factoryDO('data_intermediate_ad_variable_value');
     $doData_intermediate_ad_variable_value->data_intermediate_ad_connection_id = $connectionId6;
     $doData_intermediate_ad_variable_value->tracker_variable_id = $variableId3;
     $doData_intermediate_ad_variable_value->value = '3';
     DataGenerator::generateOne($doData_intermediate_ad_variable_value);
     $oStart = new Date('2004-06-06 12:00:00');
     $oEnd = new Date('2004-06-06 12:59:59');
     $oDalMaintenanceStatistics->manageConversions($oStart, $oEnd);
     $doData_intermediate_ad = OA_Dal::factoryDO('data_intermediate_ad');
     $doData_intermediate_ad->find();
     $rows = $doData_intermediate_ad->getRowCount();
     $this->assertEqual($rows, 2);
     $doData_intermediate_ad = OA_Dal::factoryDO('data_intermediate_ad');
     $doData_intermediate_ad->ad_id = 600;
     $doData_intermediate_ad->find();
     $rows = $doData_intermediate_ad->getRowCount();
     $this->assertEqual($rows, 1);
     $doData_intermediate_ad->fetch();
     $this->assertEqual($doData_intermediate_ad->date_time, '2004-06-06 12:00:00');
     $this->assertEqual($doData_intermediate_ad->operation_interval, 60);
     $this->assertEqual($doData_intermediate_ad->operation_interval_id, 12);
     $this->assertEqual($doData_intermediate_ad->interval_start, '2004-06-06 12:00:00');
     $this->assertEqual($doData_intermediate_ad->interval_end, '2004-06-06 12:59:59');
     $this->assertEqual($doData_intermediate_ad->ad_id, 600);
     $this->assertEqual($doData_intermediate_ad->zone_id, 100);
     $this->assertEqual($doData_intermediate_ad->requests, 0);
     $this->assertEqual($doData_intermediate_ad->impressions, 0);
     $this->assertEqual($doData_intermediate_ad->clicks, 0);
     $this->assertEqual($doData_intermediate_ad->conversions, 4);
     $this->assertEqual($doData_intermediate_ad->total_basket_value, 35.67);
     $this->assertEqual($doData_intermediate_ad->total_num_items, 3);
     $doData_intermediate_ad = OA_Dal::factoryDO('data_intermediate_ad');
     $doData_intermediate_ad->ad_id = 601;
     $doData_intermediate_ad->find();
     $rows = $doData_intermediate_ad->getRowCount();
     $this->assertEqual($rows, 1);
     $doData_intermediate_ad->fetch();
     $this->assertEqual($doData_intermediate_ad->date_time, '2004-06-06 12:00:00');
     $this->assertEqual($doData_intermediate_ad->operation_interval, 60);
     $this->assertEqual($doData_intermediate_ad->operation_interval_id, 12);
     $this->assertEqual($doData_intermediate_ad->interval_start, '2004-06-06 12:00:00');
     $this->assertEqual($doData_intermediate_ad->interval_end, '2004-06-06 12:59:59');
     $this->assertEqual($doData_intermediate_ad->ad_id, 601);
     $this->assertEqual($doData_intermediate_ad->zone_id, 101);
     $this->assertEqual($doData_intermediate_ad->requests, 0);
     $this->assertEqual($doData_intermediate_ad->impressions, 0);
     $this->assertEqual($doData_intermediate_ad->clicks, 0);
     $this->assertEqual($doData_intermediate_ad->conversions, 1);
     $this->assertEqual($doData_intermediate_ad->total_basket_value, 0);
     $this->assertEqual($doData_intermediate_ad->total_num_items, 37);
     // Clean Up
     DataGenerator::cleanUp();
     // Re-insert a number of items variable tracker
     $doVariables = OA_Dal::factoryDO('variables');
     $doVariables->purpose = 'num_items';
     $variableId4 = DataGenerator::generateOne($doVariables);
     // Test 4: Test with data that is inside the range to manage,
     //         with corresponding data_intermediate_ad rows
     $doData_intermediate_ad_connection = OA_Dal::factoryDO('data_intermediate_ad_connection');
     $doData_intermediate_ad_connection->server_raw_tracker_impression_id = 7;
     $doData_intermediate_ad_connection->server_raw_ip = 'singleDB';
     $doData_intermediate_ad_connection->tracker_date_time = '2004-06-06 12:15:00';
     $doData_intermediate_ad_connection->connection_date_time = '2004-06-06 12:10:00';
     $doData_intermediate_ad_connection->tracker_id = 501;
     $doData_intermediate_ad_connection->ad_id = 601;
     $doData_intermediate_ad_connection->zone_id = 101;
     $doData_intermediate_ad_connection->tracker_ip_address = '127.0.0.1';
     $doData_intermediate_ad_connection->connection_action = MAX_CONNECTION_AD_CLICK;
     $doData_intermediate_ad_connection->connection_window = 3600;
     $doData_intermediate_ad_connection->connection_status = MAX_CONNECTION_STATUS_APPROVED;
     $doData_intermediate_ad_connection->inside_window = 1;
     $connectionId7 = DataGenerator::generateOne($doData_intermediate_ad_connection);
     $doData_intermediate_ad_variable_value = OA_Dal::factoryDO('data_intermediate_ad_variable_value');
     $doData_intermediate_ad_variable_value->data_intermediate_ad_connection_id = $connectionId7;
     $doData_intermediate_ad_variable_value->tracker_variable_id = $variableId4;
     $doData_intermediate_ad_variable_value->value = '3';
     DataGenerator::generateOne($doData_intermediate_ad_variable_value);
     $oStart = new Date('2004-06-06 12:00:00');
     $oEnd = new Date('2004-06-06 12:59:59');
     $oDalMaintenanceStatistics->manageConversions($oStart, $oEnd);
     $doData_intermediate_ad = OA_Dal::factoryDO('data_intermediate_ad');
     $doData_intermediate_ad->find();
     $rows = $doData_intermediate_ad->getRowCount();
     $this->assertEqual($rows, 2);
     $doData_intermediate_ad = OA_Dal::factoryDO('data_intermediate_ad');
     $doData_intermediate_ad->ad_id = 600;
     $doData_intermediate_ad->find();
     $rows = $doData_intermediate_ad->getRowCount();
     $this->assertEqual($rows, 1);
     $doData_intermediate_ad->fetch();
     $this->assertEqual($doData_intermediate_ad->date_time, '2004-06-06 12:00:00');
     $this->assertEqual($doData_intermediate_ad->operation_interval, 60);
     $this->assertEqual($doData_intermediate_ad->operation_interval_id, 12);
     $this->assertEqual($doData_intermediate_ad->interval_start, '2004-06-06 12:00:00');
     $this->assertEqual($doData_intermediate_ad->interval_end, '2004-06-06 12:59:59');
     $this->assertEqual($doData_intermediate_ad->ad_id, 600);
     $this->assertEqual($doData_intermediate_ad->zone_id, 100);
     $this->assertEqual($doData_intermediate_ad->requests, 0);
     $this->assertEqual($doData_intermediate_ad->impressions, 0);
     $this->assertEqual($doData_intermediate_ad->clicks, 0);
     $this->assertEqual($doData_intermediate_ad->conversions, 4);
     $this->assertEqual($doData_intermediate_ad->total_basket_value, 35.67);
     $this->assertEqual($doData_intermediate_ad->total_num_items, 3);
     $doData_intermediate_ad = OA_Dal::factoryDO('data_intermediate_ad');
     $doData_intermediate_ad->ad_id = 601;
     $doData_intermediate_ad->find();
     $rows = $doData_intermediate_ad->getRowCount();
     $this->assertEqual($rows, 1);
     $doData_intermediate_ad->fetch();
     $this->assertEqual($doData_intermediate_ad->date_time, '2004-06-06 12:00:00');
     $this->assertEqual($doData_intermediate_ad->operation_interval, 60);
     $this->assertEqual($doData_intermediate_ad->operation_interval_id, 12);
     $this->assertEqual($doData_intermediate_ad->interval_start, '2004-06-06 12:00:00');
     $this->assertEqual($doData_intermediate_ad->interval_end, '2004-06-06 12:59:59');
     $this->assertEqual($doData_intermediate_ad->ad_id, 601);
     $this->assertEqual($doData_intermediate_ad->zone_id, 101);
     $this->assertEqual($doData_intermediate_ad->requests, 0);
     $this->assertEqual($doData_intermediate_ad->impressions, 0);
     $this->assertEqual($doData_intermediate_ad->clicks, 0);
     $this->assertEqual($doData_intermediate_ad->conversions, 2);
     $this->assertEqual($doData_intermediate_ad->total_basket_value, 0);
     $this->assertEqual($doData_intermediate_ad->total_num_items, 40);
     // Clean Up
     DataGenerator::cleanUp();
 }
 /**
  * A method to test the summariseBucketsRaw() method.
  */
 function testSummariseBucketsRaw()
 {
     $aConf =& $GLOBALS['_MAX']['CONF'];
     $aConf['maintenance']['operationInterval'] = 60;
     // Prepare standard test parameters
     $statisticsTableName = $aConf['table']['prefix'] . 'data_intermediate_ad_connection';
     $aMigrationDetails = array('method' => 'raw', 'bucketTable' => $aConf['table']['prefix'] . 'data_bkt_a', 'dateTimeColumn' => 'date_time', 'source' => array(0 => 'server_conv_id', 1 => 'server_ip', 2 => 'tracker_id', 3 => 'date_time', 4 => 'action_date_time', 5 => 'creative_id', 6 => 'zone_id', 7 => 'ip_address', 8 => 'action', 9 => 'window', 10 => 'status'), 'destination' => array(0 => 'server_raw_tracker_impression_id', 1 => 'server_raw_ip', 2 => 'tracker_id', 3 => 'tracker_date_time', 4 => 'connection_date_time', 5 => 'ad_id', 6 => 'zone_id', 7 => 'tracker_ip_address', 8 => 'connection_action', 9 => 'connection_window', 10 => 'connection_status'), 'extrasDestination' => array(11 => 'creative_id', 12 => 'inside_window'), 'extrasValue' => array(11 => '0', 12 => '1'));
     $aDates = array('start' => new Date('2008-08-21 09:00:00'), 'end' => new Date('2008-08-21 09:59:59'));
     // Prepare the DAL object
     $oFactory = new OX_Dal_Maintenance_Statistics_Factory();
     $oDalMaintenanceStatistics = $oFactory->factory();
     // Test 1: Test with an incorrect method name in the mapping array
     $savedValue = $aMigrationDetails['method'];
     $aMigrationDetails['method'] = 'foo';
     $result = $oDalMaintenanceStatistics->summariseBucketsRaw($statisticsTableName, $aMigrationDetails, $aDates);
     $this->assertTrue(is_a($result, 'PEAR_Error'));
     $this->assertEqual($result->code, MAX_ERROR_INVALIDARGS);
     $this->assertEqual($result->message, "OX_Dal_Maintenance_Statistics::summariseBucketsRaw() called with migration map method 'foo' != 'raw'.");
     $aMigrationDetails['method'] = $savedValue;
     // Test 2: Test with a different number of source and destination columns
     $savedValue = $aMigrationDetails['destination'][1];
     unset($aMigrationDetails['destination'][1]);
     $result = $oDalMaintenanceStatistics->summariseBucketsRaw($statisticsTableName, $aMigrationDetails, $aDates);
     $this->assertTrue(is_a($result, 'PEAR_Error'));
     $this->assertEqual($result->code, MAX_ERROR_INVALIDARGS);
     $this->assertEqual($result->message, "OX_Dal_Maintenance_Statistics::summariseBucketsRaw() called with different number of 'source' and 'destination' columns.");
     $aMigrationDetails['destination'][1] = $savedValue;
     // Test 3: Test with a different number of extrasDestination and extrasValue columns
     $savedValue = $aMigrationDetails['extrasDestination'][11];
     unset($aMigrationDetails['extrasDestination'][11]);
     $result = $oDalMaintenanceStatistics->summariseBucketsRaw($statisticsTableName, $aMigrationDetails, $aDates);
     $this->assertTrue(is_a($result, 'PEAR_Error'));
     $this->assertEqual($result->code, MAX_ERROR_INVALIDARGS);
     $this->assertEqual($result->message, "OX_Dal_Maintenance_Statistics::summariseBucketsRaw() called with different number of 'extrasDestination' and 'extrasValue' columns.");
     $aMigrationDetails['extrasDestination'][11] = $savedValue;
     // Test 4: Test with date parameters that are not really dates
     $savedValue = $aDates['start'];
     $aDates['start'] = 'foo';
     $result = $oDalMaintenanceStatistics->summariseBucketsRaw($statisticsTableName, $aMigrationDetails, $aDates);
     $this->assertTrue(is_a($result, 'PEAR_Error'));
     $this->assertEqual($result->code, MAX_ERROR_INVALIDARGS);
     $this->assertEqual($result->message, "OX_Dal_Maintenance_Statistics::summariseBucketsRaw() called with invalid start/end date parameters -- not Date objects.");
     $aDates['start'] = $savedValue;
     $savedValue = $aDates['end'];
     $aDates['end'] = 'foo';
     $result = $oDalMaintenanceStatistics->summariseBucketsRaw($statisticsTableName, $aMigrationDetails, $aDates);
     $this->assertTrue(is_a($result, 'PEAR_Error'));
     $this->assertEqual($result->code, MAX_ERROR_INVALIDARGS);
     $this->assertEqual($result->message, "OX_Dal_Maintenance_Statistics::summariseBucketsRaw() called with invalid start/end date parameters -- not Date objects.");
     $aDates['end'] = $savedValue;
     // Test 5: Test with invalid start/end dates
     $savedValue = $aDates['start'];
     $aDates['start'] = new Date('2008-08-21 08:00:00');
     $result = $oDalMaintenanceStatistics->summariseBucketsRaw($statisticsTableName, $aMigrationDetails, $aDates);
     $this->assertTrue(is_a($result, 'PEAR_Error'));
     $this->assertEqual($result->code, MAX_ERROR_INVALIDARGS);
     $this->assertEqual($result->message, "OX_Dal_Maintenance_Statistics::summariseBucketsRaw() called with invalid start/end date parameters -- not operation interval bounds.");
     $aDates['start'] = $savedValue;
     $savedValue = $aDates['end'];
     $aDates['end'] = new Date('2008-08-22 09:59:59');
     $result = $oDalMaintenanceStatistics->summariseBucketsRaw($statisticsTableName, $aMigrationDetails, $aDates);
     $this->assertTrue(is_a($result, 'PEAR_Error'));
     $this->assertEqual($result->code, MAX_ERROR_INVALIDARGS);
     $this->assertEqual($result->message, "OX_Dal_Maintenance_Statistics::summariseBucketsRaw() called with invalid start/end date parameters -- not operation interval bounds.");
     $aDates['end'] = $savedValue;
     // Test 6: Test with an invalid statistics table name
     $savedValue = $statisticsTableName;
     $statisticsTableName = 'foo';
     $result = $oDalMaintenanceStatistics->summariseBucketsRaw($statisticsTableName, $aMigrationDetails, $aDates);
     $this->assertTrue(is_a($result, 'PEAR_Error'));
     $this->assertEqual($result->code, MAX_ERROR_INVALIDREQUEST);
     $this->assertEqual($result->message, "OX_Dal_Maintenance_Statistics::summariseBucketsRaw() called with invalid statistics table 'foo'.");
     $statisticsTableName = $savedValue;
     // Test 7: Test with no data_bkt_a table in the database
     $result = $oDalMaintenanceStatistics->summariseBucketsRaw($statisticsTableName, $aMigrationDetails, $aDates);
     $this->assertTrue(is_a($result, 'PEAR_Error'));
     $this->assertEqual($result->code, MAX_ERROR_INVALIDREQUEST);
     $this->assertEqual($result->message, "OX_Dal_Maintenance_Statistics::summariseBucketsRaw() called with invalid bucket table '{$aConf['table']['prefix']}data_bkt_a'.");
     // Install the openXDeliveryLog plugin, which will create the
     // data_bkt_a table required for testing
     TestEnv::installPluginPackage('openXDeliveryLog', false);
     // Test 8: Test with all tables present, but no data
     $result = $oDalMaintenanceStatistics->summariseBucketsRaw($statisticsTableName, $aMigrationDetails, $aDates);
     $this->assertEqual($result, 0);
     // Insert some data into the data_bkt_a table in the incorrect
     // operation interval
     $oData_bkt_a = OA_Dal::factoryDO('data_bkt_a');
     $oData_bkt_a->server_conv_id = 1;
     $oData_bkt_a->server_ip = 'localhost';
     $oData_bkt_a->tracker_id = 2;
     $oData_bkt_a->date_time = '2008-08-21 08:15:00';
     $oData_bkt_a->action_date_time = '2008-08-21 07:15:00';
     $oData_bkt_a->creative_id = 3;
     $oData_bkt_a->zone_id = 4;
     $oData_bkt_a->ip_address = '127.0.0.1';
     $oData_bkt_a->action = MAX_CONNECTION_AD_CLICK;
     $oData_bkt_a->window = 3600;
     $oData_bkt_a->status = MAX_CONNECTION_STATUS_APPROVED;
     $conversionId = DataGenerator::generateOne($oData_bkt_a);
     // Test 9: Test with data in the incorrect operation interval
     $result = $oDalMaintenanceStatistics->summariseBucketsRaw($statisticsTableName, $aMigrationDetails, $aDates);
     $this->assertEqual($result, 0);
     // Insert some data into the data_bkt_a table in the correct
     // operation interval
     $oData_bkt_a = OA_Dal::factoryDO('data_bkt_a');
     $oData_bkt_a->server_conv_id = 2;
     $oData_bkt_a->server_ip = 'localhost';
     $oData_bkt_a->tracker_id = 2;
     $oData_bkt_a->date_time = '2008-08-21 09:15:00';
     $oData_bkt_a->action_date_time = '2008-08-21 08:15:00';
     $oData_bkt_a->creative_id = 3;
     $oData_bkt_a->zone_id = 4;
     $oData_bkt_a->ip_address = '127.0.0.1';
     $oData_bkt_a->action = MAX_CONNECTION_AD_CLICK;
     $oData_bkt_a->window = 3600;
     $oData_bkt_a->status = MAX_CONNECTION_STATUS_APPROVED;
     $conversionId = DataGenerator::generateOne($oData_bkt_a);
     // Test 10: Test with data in the correct operation interval
     $result = $oDalMaintenanceStatistics->summariseBucketsRaw($statisticsTableName, $aMigrationDetails, $aDates);
     $this->assertEqual($result, 1);
     $oData_intermediate_ad_connection = OA_Dal::factoryDO('data_intermediate_ad_connection');
     $oData_intermediate_ad_connection->find();
     $rows = $oData_intermediate_ad_connection->getRowCount();
     $this->assertEqual($rows, 1);
     $oData_intermediate_ad_connection = OA_Dal::factoryDO('data_intermediate_ad_connection');
     $oData_intermediate_ad_connection->server_raw_tracker_impression_id = 2;
     $oData_intermediate_ad_connection->server_raw_ip = 'localhost';
     $oData_intermediate_ad_connection->find();
     $rows = $oData_intermediate_ad_connection->getRowCount();
     $this->assertEqual($rows, 1);
     $oData_intermediate_ad_connection->fetch();
     $this->assertEqual($oData_intermediate_ad_connection->data_intermediate_ad_connection_id, 1);
     $this->assertEqual($oData_intermediate_ad_connection->server_raw_tracker_impression_id, 2);
     $this->assertEqual($oData_intermediate_ad_connection->server_raw_ip, 'localhost');
     $this->assertEqual($oData_intermediate_ad_connection->tracker_id, 2);
     $this->assertEqual($oData_intermediate_ad_connection->tracker_date_time, '2008-08-21 09:15:00');
     $this->assertEqual($oData_intermediate_ad_connection->connection_date_time, '2008-08-21 08:15:00');
     $this->assertEqual($oData_intermediate_ad_connection->ad_id, 3);
     $this->assertEqual($oData_intermediate_ad_connection->zone_id, 4);
     $this->assertEqual($oData_intermediate_ad_connection->tracker_ip_address, '127.0.0.1');
     $this->assertEqual($oData_intermediate_ad_connection->connection_action, MAX_CONNECTION_AD_CLICK);
     $this->assertEqual($oData_intermediate_ad_connection->connection_window, 3600);
     $this->assertEqual($oData_intermediate_ad_connection->connection_status, MAX_CONNECTION_STATUS_APPROVED);
     $this->assertEqual($oData_intermediate_ad_connection->inside_window, 1);
     // Clean up generated data
     DataGenerator::cleanUp();
     // Insert some (new) data into the data_bkt_a table in the
     // correct operation interval
     $oData_bkt_a = OA_Dal::factoryDO('data_bkt_a');
     $oData_bkt_a->server_conv_id = 3;
     $oData_bkt_a->server_ip = 'localhost';
     $oData_bkt_a->tracker_id = 5;
     $oData_bkt_a->date_time = '2008-08-21 09:30:00';
     $oData_bkt_a->action_date_time = '2008-08-21 08:59:00';
     $oData_bkt_a->creative_id = 8;
     $oData_bkt_a->zone_id = 9;
     $oData_bkt_a->ip_address = '127.0.0.1';
     $oData_bkt_a->action = MAX_CONNECTION_AD_IMPRESSION;
     $oData_bkt_a->window = 1920;
     $oData_bkt_a->status = MAX_CONNECTION_STATUS_PENDING;
     $conversionId = DataGenerator::generateOne($oData_bkt_a);
     // Test 11: Test again with data in the correct operation interval
     $result = $oDalMaintenanceStatistics->summariseBucketsRaw($statisticsTableName, $aMigrationDetails, $aDates);
     $this->assertEqual($result, 1);
     $oData_intermediate_ad_connection = OA_Dal::factoryDO('data_intermediate_ad_connection');
     $oData_intermediate_ad_connection->find();
     $rows = $oData_intermediate_ad_connection->getRowCount();
     $this->assertEqual($rows, 2);
     $oData_intermediate_ad_connection = OA_Dal::factoryDO('data_intermediate_ad_connection');
     $oData_intermediate_ad_connection->server_raw_tracker_impression_id = 2;
     $oData_intermediate_ad_connection->server_raw_ip = 'localhost';
     $oData_intermediate_ad_connection->find();
     $rows = $oData_intermediate_ad_connection->getRowCount();
     $this->assertEqual($rows, 1);
     $oData_intermediate_ad_connection->fetch();
     $this->assertEqual($oData_intermediate_ad_connection->data_intermediate_ad_connection_id, 1);
     $this->assertEqual($oData_intermediate_ad_connection->server_raw_tracker_impression_id, 2);
     $this->assertEqual($oData_intermediate_ad_connection->server_raw_ip, 'localhost');
     $this->assertEqual($oData_intermediate_ad_connection->tracker_id, 2);
     $this->assertEqual($oData_intermediate_ad_connection->tracker_date_time, '2008-08-21 09:15:00');
     $this->assertEqual($oData_intermediate_ad_connection->connection_date_time, '2008-08-21 08:15:00');
     $this->assertEqual($oData_intermediate_ad_connection->ad_id, 3);
     $this->assertEqual($oData_intermediate_ad_connection->zone_id, 4);
     $this->assertEqual($oData_intermediate_ad_connection->tracker_ip_address, '127.0.0.1');
     $this->assertEqual($oData_intermediate_ad_connection->connection_action, MAX_CONNECTION_AD_CLICK);
     $this->assertEqual($oData_intermediate_ad_connection->connection_window, 3600);
     $this->assertEqual($oData_intermediate_ad_connection->connection_status, MAX_CONNECTION_STATUS_APPROVED);
     $this->assertEqual($oData_intermediate_ad_connection->inside_window, 1);
     $oData_intermediate_ad_connection = OA_Dal::factoryDO('data_intermediate_ad_connection');
     $oData_intermediate_ad_connection->server_raw_tracker_impression_id = 3;
     $oData_intermediate_ad_connection->server_raw_ip = 'localhost';
     $oData_intermediate_ad_connection->find();
     $rows = $oData_intermediate_ad_connection->getRowCount();
     $this->assertEqual($rows, 1);
     $oData_intermediate_ad_connection->fetch();
     $this->assertEqual($oData_intermediate_ad_connection->data_intermediate_ad_connection_id, 2);
     $this->assertEqual($oData_intermediate_ad_connection->server_raw_tracker_impression_id, 3);
     $this->assertEqual($oData_intermediate_ad_connection->server_raw_ip, 'localhost');
     $this->assertEqual($oData_intermediate_ad_connection->tracker_id, 5);
     $this->assertEqual($oData_intermediate_ad_connection->tracker_date_time, '2008-08-21 09:30:00');
     $this->assertEqual($oData_intermediate_ad_connection->connection_date_time, '2008-08-21 08:59:00');
     $this->assertEqual($oData_intermediate_ad_connection->ad_id, 8);
     $this->assertEqual($oData_intermediate_ad_connection->zone_id, 9);
     $this->assertEqual($oData_intermediate_ad_connection->tracker_ip_address, '127.0.0.1');
     $this->assertEqual($oData_intermediate_ad_connection->connection_action, MAX_CONNECTION_AD_IMPRESSION);
     $this->assertEqual($oData_intermediate_ad_connection->connection_window, 1920);
     $this->assertEqual($oData_intermediate_ad_connection->connection_status, MAX_CONNECTION_STATUS_PENDING);
     $this->assertEqual($oData_intermediate_ad_connection->inside_window, 1);
     // Clean up generated data
     DataGenerator::cleanUp();
     // Also clean up the data migrated into the statistics table
     $oData_intermediate_ad_connection = OA_Dal::factoryDO('data_intermediate_ad_connection');
     $oData_intermediate_ad_connection->server_raw_tracker_impression_id = 2;
     $oData_intermediate_ad_connection->find();
     $oData_intermediate_ad_connection->delete();
     $oData_intermediate_ad_connection = OA_Dal::factoryDO('data_intermediate_ad_connection');
     $oData_intermediate_ad_connection->server_raw_tracker_impression_id = 3;
     $oData_intermediate_ad_connection->find();
     $oData_intermediate_ad_connection->delete();
     // Uninstall the installed plugin
     TestEnv::uninstallPluginPackage('openXDeliveryLog', false);
     // Restore the test environment configuration
     TestEnv::restoreConfig();
 }