0,0 → 1,244 |
/* |
* 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 |
|
int exit=STILL_ACTIVE; |
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; |
|
exit=STILL_ACTIVE; |
while(exit==STILL_ACTIVE) { |
Sleep(1000); |
GetExitCodeProcess(piProcessInfo.hProcess,&exit); |
} |
|
return 0; |
|
#else /* !_WIN32 */ |
printf("\n%s\n", command_line); |
system(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); |
|
fclose(input_file); |
fclose(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); |
fclose(input_file); |
fclose(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 |
sscanf(line, "%s", temp); |
word_pointer = 0; |
sprintf(input_cmdline,""); |
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) |
strcpy(output_filename, ch); |
word_pointer += strlen(ch)+1; |
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) { |
fclose(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++; |
} |
remove(tempmd5_filename); |
} |
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); |
fclose(param_file); |
fclose(report_file); |
|
} |