ROOT logo
/**************************************************************************
 * This file is property of and copyright by the ALICE HLT Project        *
 * ALICE Experiment at CERN, All rights reserved.                         *
 *                                                                        *
 * Primary Authors: Artur Szostak <artursz@iafrica.com>                   *
 *                  for The ALICE HLT Project.                            *
 *                                                                        *
 * Permission to use, copy, modify and distribute this software and its   *
 * documentation strictly for non-commercial purposes is hereby granted   *
 * without fee, provided that the above copyright notice appears in all   *
 * copies and that both the copyright notice and this permission notice   *
 * appear in the supporting documentation. The authors make no claims     *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/

/**
 * @file   testAliHLTTPCDataCheckerComponent.C
 * @author Artur Szostak <artursz@iafrica.com>
 * @date   9 Aug 2010
 *
 * This macro is used to test the basic functionality of the
 * AliHLTTPCDataCheckerComponent class.
 */

#if !defined(__CINT__) || defined(__MAKECINT__)
#include "Riostream.h"
#include "TSystem.h"
#include "TClassTable.h"
#include "AliLog.h"
#include "AliHLTSystem.h"
#include "AliHLTConfiguration.h"
#include <fstream>
#include <cstdlib>
#endif

/**
 * Creates the input data for the test.
 * It is just a file of 256 bytes with all zeros.
 */
void GenerateInputData(bool debug = false)
{
	using namespace std;
	const char* filename = "dataCheckerInputTestFile.dat";
	fstream file(filename, ios::trunc | ios::out | ios::binary);
	if (! file)
	{
		if (debug) cerr << "ERROR: Could not create file " << filename << endl;
		return;
	}
	
	char buffer[256];
	memset(buffer, 0x0, sizeof(buffer));
	AliHLTUInt32_t* words = reinterpret_cast<AliHLTUInt32_t*>(buffer);
	words[0] = 0xFFFFFFFF;
	words[3] = 0x03000000;  // RCU version 3 in CDH block attributes field.
	
	file.write(buffer, sizeof(buffer));
	if (! file)
	{
		if (debug) cerr << "ERROR: I/O error when writing to file " << filename << endl;
		return;
	}
	file.close();
}

/**
 * Routine to run a HLT chain with the data checker component to generate output
 * which we can later check. The chain will only test basic functionality of the
 * component.
 */
void RunChainToCheckComponent(bool debug = false)
{
	// Done before to prevent output from AliHLTSystem.
	if (debug)
	{
		AliLog::SetGlobalLogLevel(AliLog::kMaxType);
	}
	else
	{
		AliLog::SetGlobalLogLevel(AliLog::kFatal);
	}
	AliHLTSystem sys;
	sys.LoadComponentLibraries("libAliHLTUtil.so");
	sys.LoadComponentLibraries("libAliHLTTPC.so");
	if (debug)
	{
		sys.SetGlobalLoggingLevel(kHLTLogAll);
	}
	else
	{
		sys.SetGlobalLoggingLevel(kHLTLogNone);
	}
	
	AliHLTConfiguration src(
		"source",
		"FilePublisher",
		"",
		"-datatype 'DDL_RAW ' 'TPC ' -dataspec 0x01010202 -datafile dataCheckerInputTestFile.dat"
	);
	AliHLTConfiguration prc(
		"processor",
		"TPCDataChecker",
		"source",
		"-filter forwardbad -ignoretype"
	);
	AliHLTConfiguration snk(
		"sink",
		"FileWriter",
		"processor",
		"-specfmt -datafile dataCheckerOutputTestFile.dat"
	);
	
	sys.BuildTaskList("sink");
	sys.Run(1); // Run for 1 event.
}

/**
 * Checks the output data generated by the chain.
 * There should be one data block corresponding to the invalid input data block.
 */
bool CheckOutput()
{
	if (gSystem->Exec("test -f dataCheckerOutputTestFile_0x00000000_0x00_TPC:DDL_RAW_0x01010202.dat") != 0)
	{
		cerr << "ERROR: The AliHLTTPCDataCheckerComponent did not generate the expected"
			" output data block when given a corrupt input data block." << endl;
		return false;
	}
	if (gSystem->Exec("diff dataCheckerInputTestFile.dat dataCheckerOutputTestFile_0x00000000_0x00_TPC:DDL_RAW_0x01010202.dat") != 0)
	{
		cerr << "ERROR: The AliHLTTPCDataCheckerComponent forwarded the"
			" wrong data block when checking for errors." << endl;
		return false;
	}
	return true;
}

/**
 * This is the top level testing method which calls individual tests.
 * \returns true if all tests succeeded and false otherwise.
 */
bool testAliHLTTPCDataCheckerComponent(bool debug = false)
{
	if (gClassTable->GetID("AliHLTTPCDataCheckerComponent") < 0)
	{
		gSystem->Load("libAliHLTUtil.so");
	}
	GenerateInputData(debug);
	RunChainToCheckComponent(debug);
	if (! CheckOutput()) return false;
	
	// Cleanup all temporary files generated.
	gSystem->Exec("rm -f dataCheckerInputTestFile.dat dataCheckerOutputTestFile*.dat");
	return true;
}

#ifndef __MAKECINT__

int main(int /*argc*/, const char** /*argv*/)
{
	bool resultOk = testAliHLTTPCDataCheckerComponent();
	if (not resultOk) return 1;
	return 0;
}

#endif // __MAKECINT__

 testAliHLTTPCDataCheckerComponent.C:1
 testAliHLTTPCDataCheckerComponent.C:2
 testAliHLTTPCDataCheckerComponent.C:3
 testAliHLTTPCDataCheckerComponent.C:4
 testAliHLTTPCDataCheckerComponent.C:5
 testAliHLTTPCDataCheckerComponent.C:6
 testAliHLTTPCDataCheckerComponent.C:7
 testAliHLTTPCDataCheckerComponent.C:8
 testAliHLTTPCDataCheckerComponent.C:9
 testAliHLTTPCDataCheckerComponent.C:10
 testAliHLTTPCDataCheckerComponent.C:11
 testAliHLTTPCDataCheckerComponent.C:12
 testAliHLTTPCDataCheckerComponent.C:13
 testAliHLTTPCDataCheckerComponent.C:14
 testAliHLTTPCDataCheckerComponent.C:15
 testAliHLTTPCDataCheckerComponent.C:16
 testAliHLTTPCDataCheckerComponent.C:17
 testAliHLTTPCDataCheckerComponent.C:18
 testAliHLTTPCDataCheckerComponent.C:19
 testAliHLTTPCDataCheckerComponent.C:20
 testAliHLTTPCDataCheckerComponent.C:21
 testAliHLTTPCDataCheckerComponent.C:22
 testAliHLTTPCDataCheckerComponent.C:23
 testAliHLTTPCDataCheckerComponent.C:24
 testAliHLTTPCDataCheckerComponent.C:25
 testAliHLTTPCDataCheckerComponent.C:26
 testAliHLTTPCDataCheckerComponent.C:27
 testAliHLTTPCDataCheckerComponent.C:28
 testAliHLTTPCDataCheckerComponent.C:29
 testAliHLTTPCDataCheckerComponent.C:30
 testAliHLTTPCDataCheckerComponent.C:31
 testAliHLTTPCDataCheckerComponent.C:32
 testAliHLTTPCDataCheckerComponent.C:33
 testAliHLTTPCDataCheckerComponent.C:34
 testAliHLTTPCDataCheckerComponent.C:35
 testAliHLTTPCDataCheckerComponent.C:36
 testAliHLTTPCDataCheckerComponent.C:37
 testAliHLTTPCDataCheckerComponent.C:38
 testAliHLTTPCDataCheckerComponent.C:39
 testAliHLTTPCDataCheckerComponent.C:40
 testAliHLTTPCDataCheckerComponent.C:41
 testAliHLTTPCDataCheckerComponent.C:42
 testAliHLTTPCDataCheckerComponent.C:43
 testAliHLTTPCDataCheckerComponent.C:44
 testAliHLTTPCDataCheckerComponent.C:45
 testAliHLTTPCDataCheckerComponent.C:46
 testAliHLTTPCDataCheckerComponent.C:47
 testAliHLTTPCDataCheckerComponent.C:48
 testAliHLTTPCDataCheckerComponent.C:49
 testAliHLTTPCDataCheckerComponent.C:50
 testAliHLTTPCDataCheckerComponent.C:51
 testAliHLTTPCDataCheckerComponent.C:52
 testAliHLTTPCDataCheckerComponent.C:53
 testAliHLTTPCDataCheckerComponent.C:54
 testAliHLTTPCDataCheckerComponent.C:55
 testAliHLTTPCDataCheckerComponent.C:56
 testAliHLTTPCDataCheckerComponent.C:57
 testAliHLTTPCDataCheckerComponent.C:58
 testAliHLTTPCDataCheckerComponent.C:59
 testAliHLTTPCDataCheckerComponent.C:60
 testAliHLTTPCDataCheckerComponent.C:61
 testAliHLTTPCDataCheckerComponent.C:62
 testAliHLTTPCDataCheckerComponent.C:63
 testAliHLTTPCDataCheckerComponent.C:64
 testAliHLTTPCDataCheckerComponent.C:65
 testAliHLTTPCDataCheckerComponent.C:66
 testAliHLTTPCDataCheckerComponent.C:67
 testAliHLTTPCDataCheckerComponent.C:68
 testAliHLTTPCDataCheckerComponent.C:69
 testAliHLTTPCDataCheckerComponent.C:70
 testAliHLTTPCDataCheckerComponent.C:71
 testAliHLTTPCDataCheckerComponent.C:72
 testAliHLTTPCDataCheckerComponent.C:73
 testAliHLTTPCDataCheckerComponent.C:74
 testAliHLTTPCDataCheckerComponent.C:75
 testAliHLTTPCDataCheckerComponent.C:76
 testAliHLTTPCDataCheckerComponent.C:77
 testAliHLTTPCDataCheckerComponent.C:78
 testAliHLTTPCDataCheckerComponent.C:79
 testAliHLTTPCDataCheckerComponent.C:80
 testAliHLTTPCDataCheckerComponent.C:81
 testAliHLTTPCDataCheckerComponent.C:82
 testAliHLTTPCDataCheckerComponent.C:83
 testAliHLTTPCDataCheckerComponent.C:84
 testAliHLTTPCDataCheckerComponent.C:85
 testAliHLTTPCDataCheckerComponent.C:86
 testAliHLTTPCDataCheckerComponent.C:87
 testAliHLTTPCDataCheckerComponent.C:88
 testAliHLTTPCDataCheckerComponent.C:89
 testAliHLTTPCDataCheckerComponent.C:90
 testAliHLTTPCDataCheckerComponent.C:91
 testAliHLTTPCDataCheckerComponent.C:92
 testAliHLTTPCDataCheckerComponent.C:93
 testAliHLTTPCDataCheckerComponent.C:94
 testAliHLTTPCDataCheckerComponent.C:95
 testAliHLTTPCDataCheckerComponent.C:96
 testAliHLTTPCDataCheckerComponent.C:97
 testAliHLTTPCDataCheckerComponent.C:98
 testAliHLTTPCDataCheckerComponent.C:99
 testAliHLTTPCDataCheckerComponent.C:100
 testAliHLTTPCDataCheckerComponent.C:101
 testAliHLTTPCDataCheckerComponent.C:102
 testAliHLTTPCDataCheckerComponent.C:103
 testAliHLTTPCDataCheckerComponent.C:104
 testAliHLTTPCDataCheckerComponent.C:105
 testAliHLTTPCDataCheckerComponent.C:106
 testAliHLTTPCDataCheckerComponent.C:107
 testAliHLTTPCDataCheckerComponent.C:108
 testAliHLTTPCDataCheckerComponent.C:109
 testAliHLTTPCDataCheckerComponent.C:110
 testAliHLTTPCDataCheckerComponent.C:111
 testAliHLTTPCDataCheckerComponent.C:112
 testAliHLTTPCDataCheckerComponent.C:113
 testAliHLTTPCDataCheckerComponent.C:114
 testAliHLTTPCDataCheckerComponent.C:115
 testAliHLTTPCDataCheckerComponent.C:116
 testAliHLTTPCDataCheckerComponent.C:117
 testAliHLTTPCDataCheckerComponent.C:118
 testAliHLTTPCDataCheckerComponent.C:119
 testAliHLTTPCDataCheckerComponent.C:120
 testAliHLTTPCDataCheckerComponent.C:121
 testAliHLTTPCDataCheckerComponent.C:122
 testAliHLTTPCDataCheckerComponent.C:123
 testAliHLTTPCDataCheckerComponent.C:124
 testAliHLTTPCDataCheckerComponent.C:125
 testAliHLTTPCDataCheckerComponent.C:126
 testAliHLTTPCDataCheckerComponent.C:127
 testAliHLTTPCDataCheckerComponent.C:128
 testAliHLTTPCDataCheckerComponent.C:129
 testAliHLTTPCDataCheckerComponent.C:130
 testAliHLTTPCDataCheckerComponent.C:131
 testAliHLTTPCDataCheckerComponent.C:132
 testAliHLTTPCDataCheckerComponent.C:133
 testAliHLTTPCDataCheckerComponent.C:134
 testAliHLTTPCDataCheckerComponent.C:135
 testAliHLTTPCDataCheckerComponent.C:136
 testAliHLTTPCDataCheckerComponent.C:137
 testAliHLTTPCDataCheckerComponent.C:138
 testAliHLTTPCDataCheckerComponent.C:139
 testAliHLTTPCDataCheckerComponent.C:140
 testAliHLTTPCDataCheckerComponent.C:141
 testAliHLTTPCDataCheckerComponent.C:142
 testAliHLTTPCDataCheckerComponent.C:143
 testAliHLTTPCDataCheckerComponent.C:144
 testAliHLTTPCDataCheckerComponent.C:145
 testAliHLTTPCDataCheckerComponent.C:146
 testAliHLTTPCDataCheckerComponent.C:147
 testAliHLTTPCDataCheckerComponent.C:148
 testAliHLTTPCDataCheckerComponent.C:149
 testAliHLTTPCDataCheckerComponent.C:150
 testAliHLTTPCDataCheckerComponent.C:151
 testAliHLTTPCDataCheckerComponent.C:152
 testAliHLTTPCDataCheckerComponent.C:153
 testAliHLTTPCDataCheckerComponent.C:154
 testAliHLTTPCDataCheckerComponent.C:155
 testAliHLTTPCDataCheckerComponent.C:156
 testAliHLTTPCDataCheckerComponent.C:157
 testAliHLTTPCDataCheckerComponent.C:158
 testAliHLTTPCDataCheckerComponent.C:159
 testAliHLTTPCDataCheckerComponent.C:160
 testAliHLTTPCDataCheckerComponent.C:161
 testAliHLTTPCDataCheckerComponent.C:162
 testAliHLTTPCDataCheckerComponent.C:163
 testAliHLTTPCDataCheckerComponent.C:164
 testAliHLTTPCDataCheckerComponent.C:165
 testAliHLTTPCDataCheckerComponent.C:166
 testAliHLTTPCDataCheckerComponent.C:167
 testAliHLTTPCDataCheckerComponent.C:168
 testAliHLTTPCDataCheckerComponent.C:169