/*
* Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
* Copyright (c) 2002-2007, Professor Benoit Macq
* Copyright (c) 2003-2007, Francois-Olivier Devaux
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifdef _WIN32
#include <windows.h>
#endif /* _WIN32 */
#include <stdio.h>
#include <string.h>
#include "md5.h"
#define OPJ_Bin_Dir "OPJ_Binaries"
int doprocess(char programme[4096],char command_line[4096]) {
#ifdef _WIN32
STARTUPINFO siStartupInfo;
PROCESS_INFORMATION piProcessInfo;
memset(&siStartupInfo
, 0, sizeof(siStartupInfo
));
memset(&piProcessInfo
, 0, sizeof(piProcessInfo
));
siStartupInfo.cb = sizeof(siStartupInfo);
if(CreateProcess(programme, // Application name
command_line, // Application arguments
0,
0,
FALSE,
CREATE_DEFAULT_ERROR_MODE,
0,
0, // Working directory
&siStartupInfo,
&piProcessInfo) == FALSE)
return 1;
while(exit==STILL_ACTIVE
) {
Sleep(1000);
GetExitCodeProcess
(piProcessInfo.
hProcess,&exit);
}
return 0;
#else /* !_WIN32 */
printf("\n%s\n", command_line
);
return 0;
#endif /* _WIN32 */
}
char MD5_process(char *input_filename, char *md5_filename) {
MD5_CTX mdContext;
int bytes;
unsigned char data[1024];
FILE *input_file, *md5_file;
input_file
= fopen(input_filename
, "rb");
if (!input_file) {
printf("Error opening file %s\n", input_filename
);
return 1;
}
md5_file
= fopen(md5_filename
, "wb");
if (!md5_file) {
printf("Error opening file %s\n", md5_filename
);
return 1;
}
MD5Init (&mdContext);
while ((bytes
= fread (data
, 1, 1024, input_file
)) != 0)
MD5Update (&mdContext, data, bytes);
MD5Final (&mdContext);
fwrite(mdContext.
digest,16,1,md5_file
);
return 0;
}
char fcompare(char *input_filename, char *output_filename) {
FILE *input_file, *output_file;
unsigned char input_buffer[17], output_buffer[17];
char comparison;
input_file
= fopen(input_filename
, "rb");
if (!input_file) {
printf("Error opening file %s\n", input_filename
);
return -1;
}
output_file
= fopen(output_filename
, "rb");
if (!output_file) {
printf("Error opening file %s\n", output_filename
);
return -1;
}
fread(input_buffer
,16,1,input_file
);
fread(output_buffer
,16,1,output_file
);
input_buffer[16] = 0;
output_buffer[16] = 0;
comparison
= strcmp(input_buffer
, output_buffer
);
if (comparison)
return 1;
return 0;
}
int main(int argc, char* argv[]) {
FILE *param_file, *md5_file;
FILE *report_file;
char line[4096];
char md5_filename[4096], tempmd5_filename[4096], temp[4096], report_filename[4096];
char output_filename[4096];
char input_cmdline[4096];
char command_line[4096], exefile[4096];
int task_counter = 0, word_counter;
char bin_dir[4096];
unsigned int word_pointer;
char ch[4096];
char comparison;
int num_failed = 0;
int num_inexistant = 0;
int num_passed = 0;
if (argc != 3) {
printf("Error with command line. \nExpected: OPJ_Validate parameter_filename bin_directory\n Example: OPJ_Validate parameters_01.txt version1.1.a\n\n");
return 1;
}
param_file
= fopen(argv
[1],"rb");
if (!param_file) {
printf("Error opening parameter file %s\n",argv
[1]);
return 1;
}
sprintf(bin_dir
,"%s/%s",OPJ_Bin_Dir
,argv
[2]);
sprintf(tempmd5_filename
,"temp/tempmd5.txt");
sprintf(report_filename
,"%s/report.txt",bin_dir
);
report_file
= fopen(report_filename
, "wb");
if (!report_file) {
printf("Unable to open report file %s", report_filename
);
return 1;
}
while (fgets(line
, 4096, param_file
) != NULL
) {
if (line[0] != '#' && line[0] != 0x0d) { // If not a comment line
word_pointer = 0;
sscanf(line
+word_pointer
,"%s",ch
);
sprintf(exefile
,"%s/%s",bin_dir
,ch
);
word_counter = 0;
while (sscanf(line
+word_pointer
,"%s",ch
) > 0) {
if (word_counter == 4)
sprintf(input_cmdline
,"%s%s ",input_cmdline
, ch
);
word_counter++;
}
sprintf(md5_filename
,"%s.md5",output_filename
);
task_counter++;
sprintf(command_line
,"%s/%s",bin_dir
,input_cmdline
);
printf("Task %d\nMD5 file: %s\nCommand line: \"%s\"\n",task_counter
, md5_filename
,command_line
);
fprintf(report_file
,"Task %d\n MD5 file: %s\n Command line: \"%s\"\n",task_counter
, md5_filename
,command_line
);
if (doprocess(exefile,command_line)) {
printf("Error executing: \"%s\" \n", command_line
);
fprintf(report_file
,"Task %d failed because command line is not valid.\n\n", task_counter
);
}
else {
// Check if MD5 reference exists
md5_file
= fopen(md5_filename
,"rb");
if (md5_file) {
if (MD5_process(output_filename, tempmd5_filename))
return 1;
comparison = fcompare(tempmd5_filename, md5_filename);
if (comparison == -1)
return 1;
else if (comparison) {
printf("ERROR: %s and %s are different.\nThe codec seems to behave differently.\n\n", tempmd5_filename
, md5_filename
);
fprintf(report_file
,"ERROR: %s and %s are different.\nThe codec seems to behave differently.\n\n", tempmd5_filename
, md5_filename
);
num_failed++;
}
else {
printf("%s and %s are the same.\nTask %d OK\n\n",tempmd5_filename
, md5_filename
, task_counter
);
fprintf(report_file
," %s and %s are the same.\nTask %d OK\n\n",tempmd5_filename
, md5_filename
, task_counter
);
num_passed++;
}
}
else {
if (MD5_process(output_filename, md5_filename))
return 1;
printf("... MD5 of %s was inexistant. It has been created\n\n", output_filename
);
fprintf(report_file
,"MD5 of %s was inexistant. It has been created\n\n", output_filename
);
num_inexistant++;
}
}
}
}
printf("\nREPORT;\n%d tests num_passed\n%d tests num_failed\n%d MD5 were num_inexistant\n", num_passed
, num_failed
, num_inexistant
);
fprintf(report_file
,"\nREPORT;\n%d tests num_passed\n%d tests num_failed\n%d MD5 were num_inexistant\n", num_passed
, num_failed
, num_inexistant
);
}