openjpeg/OPJ_Validate/OPJ_Validate.c

245 lines
7.6 KiB
C

/*
* 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
#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 // #ifndef WIN32
printf("\n%s\n", command_line);
system(command_line);
return 0;
#endif
}
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);
}