ROOT logo
// $Id$

/**************************************************************************
 * This file is property of and copyright by the ALICE HLT Project        * 
 * ALICE Experiment at CERN, All rights reserved.                         *
 *                                                                        *
 * Primary Authors: Matthias Richter <Matthias.Richter@ift.uib.no>        *
 *                  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   testAliHLTFileWriter.C
    @author Matthias Richter
    @date   
    @brief  Test macro/program for the AliHLTFileWriter
 */

#ifndef __CINT__
#include <ostream>
#include <vector>
#include "AliHLTComponent.h"
#include "AliHLTComponentHandler.h"
#include "AliHLTConfiguration.h"
#include "TString.h"
#include "TFile.h"
#include "TSystem.h"
#else
#define EINVAL 22
#define EPROTO 71
#endif //__CINT__

typedef AliHLTUInt32_t TestElement_t;
const char* testDirectory="/tmp/testAliHLTFileWriter";

int SetEvent(unsigned eventNo, vector<TestElement_t>& testData)
{
  unsigned shift=(sizeof(TestElement_t)-1)*8;
  AliHLTUInt32_t mask=0xf<<shift;
  for (unsigned i=0; i<testData.size(); i++) {
    testData[i]&=~mask;
    testData[i]|=eventNo<<shift;
  }
  return 0;
}

int TestCycle(AliHLTComponent* pComponent, const char* arguments, AliHLTComponentBlockDataList blocks,
	      vector<TestElement_t>& testData, unsigned int nofEvents=1)
{
  int iResult=0;
  vector<char*> argList;
  if ((iResult=AliHLTConfiguration::InterpreteString(arguments, argList))<0) {
    cerr << "failed: chopping arguments \"" << arguments << "\"" << endl;
  }

  // notepad for generalized unit test class
  // - test component for outputsize==0 if no blocks are added

  // init FileWriter component
  if ((iResult=pComponent->Init(NULL, NULL, argList.size(), const_cast<const char**>(&(argList[0]))))!=0) {
    cerr << "failed: initializing component" << endl;
    return iResult;
  }

  // process event
  AliHLTComponentBlockData eventTypeBlock;
  AliHLTComponent::FillBlockData(eventTypeBlock);
  eventTypeBlock.fDataType=kAliHLTDataTypeEvent;
  eventTypeBlock.fSpecification=gkAliEventTypeData;
  blocks.push_back(eventTypeBlock);

  AliHLTComponentEventData evtData;
  memset(&evtData, 0, sizeof(AliHLTComponentEventData));
  evtData.fStructSize=sizeof(AliHLTComponentEventData);
  evtData.fEventID=0;
  evtData.fBlockCnt=blocks.size();
  
  AliHLTComponentTriggerData trigData;
  memset(&trigData, 0, sizeof(AliHLTComponentTriggerData));
  trigData.fStructSize=sizeof(AliHLTComponentTriggerData);

  AliHLTUInt32_t size=0;
  AliHLTUInt32_t outputBlockCnt=0;
  AliHLTComponentBlockData* outputBlocks=NULL;
  AliHLTComponentEventDoneData* edd=NULL;

  for (unsigned eventNo=0; eventNo<nofEvents; eventNo++) {
    SetEvent(eventNo, testData);
    evtData.fEventID=eventNo;
    if ((iResult=pComponent->ProcessEvent(evtData, &(blocks[0]), trigData, NULL, size, outputBlockCnt, outputBlocks, edd))!=0) {
      cerr << "failed: event processing" << endl;
      break;
    }
  }
  blocks.pop_back();

  // cleanup FileWriter component
  if ((iResult=pComponent->Deinit())!=0) {
    cerr << "failed: deinit component" << endl;
  }

  // cleanup argument vector
  for (vector<char*>::iterator element=argList.begin();
       element!=argList.end(); element++) {
    delete *element;
  }
  argList.clear();

  return iResult;
}

int BuildFileName(unsigned eventNo, unsigned blockID,
		  const AliHLTComponentDataType& dataType,
		  const AliHLTUInt32_t /*specification*/,
		  bool bConcatenateEvents, bool bConcatenateBlocks,
		  TString& filename)
{
  int iResult=0;
  filename="";

  filename+=testDirectory;
  if (!filename.EndsWith("/")) {
    filename+="/";
  }

  filename+="event";
  if (!bConcatenateEvents) {
    filename+=Form("_0x%08x", eventNo);
  }
  if (!bConcatenateBlocks && !bConcatenateEvents) {
    filename+=Form("_0x%02x", blockID);
    if (dataType!=kAliHLTVoidDataType) {
      filename+="_";
      filename+=AliHLTComponent::DataType2Text(dataType).data();
    }
    //filename+=Form("", specification);
  }
  return iResult;
}

int CheckOutputFiles(AliHLTComponentBlockDataList blocks, vector<TestElement_t>& testData, 
		     bool bConcatenateEvents, bool bConcatenateBlocks,
		     unsigned int nofEvents=1)
{
  int iResult=0;
  AliHLTUInt32_t fileOffset=0;
  TString lastFileName;
  TFile* pFile=NULL;
  TArrayC buffer;
  for (unsigned eventNo=0; eventNo<nofEvents && iResult>=0; eventNo++) {
    SetEvent(eventNo, testData);
    for (unsigned blockNo=0; blockNo<blocks.size(); blockNo++) {
      TString fileName;
      BuildFileName(eventNo, blockNo, blocks[blockNo].fDataType, blocks[blockNo].fSpecification, bConcatenateEvents, bConcatenateBlocks, fileName);
      if (pFile && !fileName.IsNull() && fileName!=lastFileName) {
	pFile->Close();
	delete pFile;
	pFile=NULL;
	fileOffset=0;
      }
      lastFileName=fileName;
      fileName+="?filetype=raw";
      if (!pFile) pFile=new TFile(fileName);
      if (!pFile || pFile->IsZombie()) {
	cerr << "failed: can not open file " << fileName.ReplaceAll("?filetype=raw", "") << endl;
	iResult=-ENOENT;
	break;
      }
      if (buffer.GetSize()<(int)blocks[blockNo].fSize) {
	buffer.Set(blocks[blockNo].fSize);
      }
      if ((pFile->ReadBuffer((char*)buffer.GetArray(), blocks[blockNo].fSize))!=0) {
	cerr << "failed: reading " << blocks[blockNo].fSize << " at offset " << fileOffset << " from file " << fileName.ReplaceAll("?filetype=raw", "") << endl;
	iResult=-EIO;
	break;
      }
      AliHLTUInt8_t* origin=(AliHLTUInt8_t*)blocks[blockNo].fPtr;
      AliHLTUInt8_t* processed=(AliHLTUInt8_t*)buffer.GetArray();
      if (memcmp(origin, processed, blocks[blockNo].fSize)!=0) {
	cerr << "failed: data missmatch in event " << eventNo << " block " << blockNo << endl;
	iResult=-EFAULT;
	break;
      }
      cout << "checked: file " << fileName.ReplaceAll("?filetype=raw", "") << " offset " << fileOffset << endl;
      fileOffset+=blocks[blockNo].fSize;
    }
  }
  if (pFile) {
    pFile->Close();
    delete pFile;
    pFile=NULL;
  }
  return iResult;
}

int testAliHLTFileWriter()
{
  int iResult=0;
  AliHLTComponentHandler chandler;
  if ((iResult=chandler.LoadLibrary("libAliHLTUtil.so"))<0) {
    cerr << "failed: loading libAliHLTUtil" << endl;
    return iResult;
  }

  if ((iResult=chandler.LoadLibrary("libHLTrec.so"))<0) {
    cerr << "failed: loading libHLTrec" << endl;
    return iResult;
  }

  // create FileWriter component
  AliHLTComponent* pComponent=NULL;
  if ((iResult=chandler.CreateComponent("FileWriter", pComponent))<0) {
    cerr << "failed: can not create component \"FileWriter\"" << endl;
    return iResult;
  }

  AliHLTComponentBlockDataList blocks;
  const unsigned testDataSize=500;
  vector<TestElement_t> testData;
  testData.assign(testDataSize, 0);
  unsigned int i=0;
  for (; i<testDataSize; i++) testData[i]=i;

  const unsigned elementsPerBlock=100;
  AliHLTComponentBlockData bd;
  AliHLTComponent::FillBlockData(bd);
  for (i=0; i*elementsPerBlock<testData.size(); i++) {
    bd.fPtr=&(testData[i*elementsPerBlock]);
    bd.fSize=elementsPerBlock*sizeof(TestElement_t);
    bd.fSpecification=i;
    AliHLTComponent::SetDataType(bd.fDataType, "DUMMYDAT", "TEST");
    blocks.push_back(bd);
  }
  
  const char* testArguments[]={
    "",
    "-concatenate-blocks ",
    "-concatenate-blocks -concatenate-events ",
    // not currently working   "-burst-buffer 10000 ",
    // not currently working   "-burst-buffer 5000 ",
    // not currently working   "-burst-buffer 10000 -concatenate-blocks ",
    "-burst-buffer 10000 -concatenate-blocks -concatenate-events ",
    "-burst-buffer 5000 -concatenate-blocks -concatenate-events ",
    NULL
  };

  for (const char** currentTest=testArguments; *currentTest!=NULL; currentTest++) {
    TString arguments=*currentTest;
      arguments+=" -directory "; arguments+=testDirectory;
    if (!gSystem->AccessPathName(testDirectory)) {
      TString command="rm -r "; command+=testDirectory;
      gSystem->Exec(command);
    }
    cout << arguments.Data() << endl;
    if ((iResult=TestCycle(pComponent, arguments.Data(), blocks, testData, 4))<0) {
      break;
    }
    if ((iResult=CheckOutputFiles(blocks, testData, arguments.Contains("-concatenate-events "), arguments.Contains("-concatenate-blocks"), 4))<0) {
      break;
    }
  };

  delete pComponent;

  return iResult;
}

int main(int /*argc*/, const char** /*argv*/)
{
  int iResult=0;
  if ((iResult=testAliHLTFileWriter())<0) {
  }
  return iResult;
}
 testAliHLTFileWriter.C:1
 testAliHLTFileWriter.C:2
 testAliHLTFileWriter.C:3
 testAliHLTFileWriter.C:4
 testAliHLTFileWriter.C:5
 testAliHLTFileWriter.C:6
 testAliHLTFileWriter.C:7
 testAliHLTFileWriter.C:8
 testAliHLTFileWriter.C:9
 testAliHLTFileWriter.C:10
 testAliHLTFileWriter.C:11
 testAliHLTFileWriter.C:12
 testAliHLTFileWriter.C:13
 testAliHLTFileWriter.C:14
 testAliHLTFileWriter.C:15
 testAliHLTFileWriter.C:16
 testAliHLTFileWriter.C:17
 testAliHLTFileWriter.C:18
 testAliHLTFileWriter.C:19
 testAliHLTFileWriter.C:20
 testAliHLTFileWriter.C:21
 testAliHLTFileWriter.C:22
 testAliHLTFileWriter.C:23
 testAliHLTFileWriter.C:24
 testAliHLTFileWriter.C:25
 testAliHLTFileWriter.C:26
 testAliHLTFileWriter.C:27
 testAliHLTFileWriter.C:28
 testAliHLTFileWriter.C:29
 testAliHLTFileWriter.C:30
 testAliHLTFileWriter.C:31
 testAliHLTFileWriter.C:32
 testAliHLTFileWriter.C:33
 testAliHLTFileWriter.C:34
 testAliHLTFileWriter.C:35
 testAliHLTFileWriter.C:36
 testAliHLTFileWriter.C:37
 testAliHLTFileWriter.C:38
 testAliHLTFileWriter.C:39
 testAliHLTFileWriter.C:40
 testAliHLTFileWriter.C:41
 testAliHLTFileWriter.C:42
 testAliHLTFileWriter.C:43
 testAliHLTFileWriter.C:44
 testAliHLTFileWriter.C:45
 testAliHLTFileWriter.C:46
 testAliHLTFileWriter.C:47
 testAliHLTFileWriter.C:48
 testAliHLTFileWriter.C:49
 testAliHLTFileWriter.C:50
 testAliHLTFileWriter.C:51
 testAliHLTFileWriter.C:52
 testAliHLTFileWriter.C:53
 testAliHLTFileWriter.C:54
 testAliHLTFileWriter.C:55
 testAliHLTFileWriter.C:56
 testAliHLTFileWriter.C:57
 testAliHLTFileWriter.C:58
 testAliHLTFileWriter.C:59
 testAliHLTFileWriter.C:60
 testAliHLTFileWriter.C:61
 testAliHLTFileWriter.C:62
 testAliHLTFileWriter.C:63
 testAliHLTFileWriter.C:64
 testAliHLTFileWriter.C:65
 testAliHLTFileWriter.C:66
 testAliHLTFileWriter.C:67
 testAliHLTFileWriter.C:68
 testAliHLTFileWriter.C:69
 testAliHLTFileWriter.C:70
 testAliHLTFileWriter.C:71
 testAliHLTFileWriter.C:72
 testAliHLTFileWriter.C:73
 testAliHLTFileWriter.C:74
 testAliHLTFileWriter.C:75
 testAliHLTFileWriter.C:76
 testAliHLTFileWriter.C:77
 testAliHLTFileWriter.C:78
 testAliHLTFileWriter.C:79
 testAliHLTFileWriter.C:80
 testAliHLTFileWriter.C:81
 testAliHLTFileWriter.C:82
 testAliHLTFileWriter.C:83
 testAliHLTFileWriter.C:84
 testAliHLTFileWriter.C:85
 testAliHLTFileWriter.C:86
 testAliHLTFileWriter.C:87
 testAliHLTFileWriter.C:88
 testAliHLTFileWriter.C:89
 testAliHLTFileWriter.C:90
 testAliHLTFileWriter.C:91
 testAliHLTFileWriter.C:92
 testAliHLTFileWriter.C:93
 testAliHLTFileWriter.C:94
 testAliHLTFileWriter.C:95
 testAliHLTFileWriter.C:96
 testAliHLTFileWriter.C:97
 testAliHLTFileWriter.C:98
 testAliHLTFileWriter.C:99
 testAliHLTFileWriter.C:100
 testAliHLTFileWriter.C:101
 testAliHLTFileWriter.C:102
 testAliHLTFileWriter.C:103
 testAliHLTFileWriter.C:104
 testAliHLTFileWriter.C:105
 testAliHLTFileWriter.C:106
 testAliHLTFileWriter.C:107
 testAliHLTFileWriter.C:108
 testAliHLTFileWriter.C:109
 testAliHLTFileWriter.C:110
 testAliHLTFileWriter.C:111
 testAliHLTFileWriter.C:112
 testAliHLTFileWriter.C:113
 testAliHLTFileWriter.C:114
 testAliHLTFileWriter.C:115
 testAliHLTFileWriter.C:116
 testAliHLTFileWriter.C:117
 testAliHLTFileWriter.C:118
 testAliHLTFileWriter.C:119
 testAliHLTFileWriter.C:120
 testAliHLTFileWriter.C:121
 testAliHLTFileWriter.C:122
 testAliHLTFileWriter.C:123
 testAliHLTFileWriter.C:124
 testAliHLTFileWriter.C:125
 testAliHLTFileWriter.C:126
 testAliHLTFileWriter.C:127
 testAliHLTFileWriter.C:128
 testAliHLTFileWriter.C:129
 testAliHLTFileWriter.C:130
 testAliHLTFileWriter.C:131
 testAliHLTFileWriter.C:132
 testAliHLTFileWriter.C:133
 testAliHLTFileWriter.C:134
 testAliHLTFileWriter.C:135
 testAliHLTFileWriter.C:136
 testAliHLTFileWriter.C:137
 testAliHLTFileWriter.C:138
 testAliHLTFileWriter.C:139
 testAliHLTFileWriter.C:140
 testAliHLTFileWriter.C:141
 testAliHLTFileWriter.C:142
 testAliHLTFileWriter.C:143
 testAliHLTFileWriter.C:144
 testAliHLTFileWriter.C:145
 testAliHLTFileWriter.C:146
 testAliHLTFileWriter.C:147
 testAliHLTFileWriter.C:148
 testAliHLTFileWriter.C:149
 testAliHLTFileWriter.C:150
 testAliHLTFileWriter.C:151
 testAliHLTFileWriter.C:152
 testAliHLTFileWriter.C:153
 testAliHLTFileWriter.C:154
 testAliHLTFileWriter.C:155
 testAliHLTFileWriter.C:156
 testAliHLTFileWriter.C:157
 testAliHLTFileWriter.C:158
 testAliHLTFileWriter.C:159
 testAliHLTFileWriter.C:160
 testAliHLTFileWriter.C:161
 testAliHLTFileWriter.C:162
 testAliHLTFileWriter.C:163
 testAliHLTFileWriter.C:164
 testAliHLTFileWriter.C:165
 testAliHLTFileWriter.C:166
 testAliHLTFileWriter.C:167
 testAliHLTFileWriter.C:168
 testAliHLTFileWriter.C:169
 testAliHLTFileWriter.C:170
 testAliHLTFileWriter.C:171
 testAliHLTFileWriter.C:172
 testAliHLTFileWriter.C:173
 testAliHLTFileWriter.C:174
 testAliHLTFileWriter.C:175
 testAliHLTFileWriter.C:176
 testAliHLTFileWriter.C:177
 testAliHLTFileWriter.C:178
 testAliHLTFileWriter.C:179
 testAliHLTFileWriter.C:180
 testAliHLTFileWriter.C:181
 testAliHLTFileWriter.C:182
 testAliHLTFileWriter.C:183
 testAliHLTFileWriter.C:184
 testAliHLTFileWriter.C:185
 testAliHLTFileWriter.C:186
 testAliHLTFileWriter.C:187
 testAliHLTFileWriter.C:188
 testAliHLTFileWriter.C:189
 testAliHLTFileWriter.C:190
 testAliHLTFileWriter.C:191
 testAliHLTFileWriter.C:192
 testAliHLTFileWriter.C:193
 testAliHLTFileWriter.C:194
 testAliHLTFileWriter.C:195
 testAliHLTFileWriter.C:196
 testAliHLTFileWriter.C:197
 testAliHLTFileWriter.C:198
 testAliHLTFileWriter.C:199
 testAliHLTFileWriter.C:200
 testAliHLTFileWriter.C:201
 testAliHLTFileWriter.C:202
 testAliHLTFileWriter.C:203
 testAliHLTFileWriter.C:204
 testAliHLTFileWriter.C:205
 testAliHLTFileWriter.C:206
 testAliHLTFileWriter.C:207
 testAliHLTFileWriter.C:208
 testAliHLTFileWriter.C:209
 testAliHLTFileWriter.C:210
 testAliHLTFileWriter.C:211
 testAliHLTFileWriter.C:212
 testAliHLTFileWriter.C:213
 testAliHLTFileWriter.C:214
 testAliHLTFileWriter.C:215
 testAliHLTFileWriter.C:216
 testAliHLTFileWriter.C:217
 testAliHLTFileWriter.C:218
 testAliHLTFileWriter.C:219
 testAliHLTFileWriter.C:220
 testAliHLTFileWriter.C:221
 testAliHLTFileWriter.C:222
 testAliHLTFileWriter.C:223
 testAliHLTFileWriter.C:224
 testAliHLTFileWriter.C:225
 testAliHLTFileWriter.C:226
 testAliHLTFileWriter.C:227
 testAliHLTFileWriter.C:228
 testAliHLTFileWriter.C:229
 testAliHLTFileWriter.C:230
 testAliHLTFileWriter.C:231
 testAliHLTFileWriter.C:232
 testAliHLTFileWriter.C:233
 testAliHLTFileWriter.C:234
 testAliHLTFileWriter.C:235
 testAliHLTFileWriter.C:236
 testAliHLTFileWriter.C:237
 testAliHLTFileWriter.C:238
 testAliHLTFileWriter.C:239
 testAliHLTFileWriter.C:240
 testAliHLTFileWriter.C:241
 testAliHLTFileWriter.C:242
 testAliHLTFileWriter.C:243
 testAliHLTFileWriter.C:244
 testAliHLTFileWriter.C:245
 testAliHLTFileWriter.C:246
 testAliHLTFileWriter.C:247
 testAliHLTFileWriter.C:248
 testAliHLTFileWriter.C:249
 testAliHLTFileWriter.C:250
 testAliHLTFileWriter.C:251
 testAliHLTFileWriter.C:252
 testAliHLTFileWriter.C:253
 testAliHLTFileWriter.C:254
 testAliHLTFileWriter.C:255
 testAliHLTFileWriter.C:256
 testAliHLTFileWriter.C:257
 testAliHLTFileWriter.C:258
 testAliHLTFileWriter.C:259
 testAliHLTFileWriter.C:260
 testAliHLTFileWriter.C:261
 testAliHLTFileWriter.C:262
 testAliHLTFileWriter.C:263
 testAliHLTFileWriter.C:264
 testAliHLTFileWriter.C:265
 testAliHLTFileWriter.C:266
 testAliHLTFileWriter.C:267
 testAliHLTFileWriter.C:268
 testAliHLTFileWriter.C:269
 testAliHLTFileWriter.C:270
 testAliHLTFileWriter.C:271
 testAliHLTFileWriter.C:272
 testAliHLTFileWriter.C:273
 testAliHLTFileWriter.C:274
 testAliHLTFileWriter.C:275
 testAliHLTFileWriter.C:276
 testAliHLTFileWriter.C:277
 testAliHLTFileWriter.C:278
 testAliHLTFileWriter.C:279
 testAliHLTFileWriter.C:280
 testAliHLTFileWriter.C:281