diff --git a/tests/bufr_compare.sh b/tests/bufr_compare.sh index 6a804f4af..2fa007941 100755 --- a/tests/bufr_compare.sh +++ b/tests/bufr_compare.sh @@ -35,7 +35,7 @@ fRules=${label}.filter f="syno_1.bufr" echo "Test: comparing the same files" >> $fLog echo "file: $f" >> $fLog -${tools_dir}//bufr_compare $f $f >> $fLog +${tools_dir}/bufr_compare $f $f >> $fLog #---------------------------------------------------- # Test: comparing two completely different files @@ -45,7 +45,7 @@ f1="syno_1.bufr" f2="aaen_55.bufr" echo "Test: comparing two completely different files" >> $fLog echo "file: $f" >> $fLog -${tools_dir}//bufr_compare $f1 $f2 >> $fLog +${tools_dir}/bufr_compare $f1 $f2 >> $fLog if [ $? -eq 0 ]; then echo "bufr_compare should have failed if files are completely different" >&2 exit 1 @@ -60,10 +60,10 @@ echo "Test: comparing with and witout the -b switch" >> $fLog echo "file: $f" >> $fLog #Alter a key in the file -${tools_dir}//bufr_set -s dataCategory=2 $f ${fBufrTmp} >> $fLog +${tools_dir}/bufr_set -s dataCategory=2 $f ${fBufrTmp} >> $fLog set +e -${tools_dir}//bufr_compare $f ${fBufrTmp}>> $fLog +${tools_dir}/bufr_compare $f ${fBufrTmp}>> $fLog if [ $? -eq 0 ]; then echo "bufr_compare should have failed if files are different" >&2 exit 1 @@ -71,7 +71,7 @@ fi set -e # Now compare with -b switch. No difference should be found. -${tools_dir}//bufr_compare -b dataCategory $f ${fBufrTmp}>> $fLog +${tools_dir}/bufr_compare -b dataCategory $f ${fBufrTmp}>> $fLog #---------------------------------------------------- # Test: comparing with the -r switch @@ -81,13 +81,13 @@ ${tools_dir}//bufr_compare -b dataCategory $f ${fBufrTmp}>> $fLog #cat temp_101.bufr syno_multi.bufr > $fBufrInput2 #set +e -#${tools_dir}//bufr_compare ${fBufrInput1} ${fBufrInput2} >> $fLog +#${tools_dir}/bufr_compare ${fBufrInput1} ${fBufrInput2} >> $fLog #if [ $? -eq 0 ]; then # echo "bufr_compare should have failed if the message order in the files is different" >&2 # exit 1 #fi #set -e -#${tools_dir}//bufr_compare -r ${fBufrInput1} ${fBufrInput2}>> $fLog +#${tools_dir}/bufr_compare -r ${fBufrInput1} ${fBufrInput2}>> $fLog #---------------------------------------------------- # Change subCentre and compare @@ -138,5 +138,22 @@ ${tools_dir}/codes_bufr_filter -o $fBufrTmp $fRules $f # Header keys have not changed ${tools_dir}/bufr_compare -H $f $fBufrTmp -#Clean up +#---------------------------------------------------- +# Compare two-way (symmetric mode) +#---------------------------------------------------- +f=$ECCODES_SAMPLES_PATH/BUFR3.tmpl +# Add a local section +${tools_dir}/bufr_set -s section2Present=1 $f $fBufrTmp +# Compare A with B will pass +${tools_dir}/bufr_compare $f $fBufrTmp +# Compare with -2 option +set +e +${tools_dir}/bufr_compare -2 $f $fBufrTmp > $fLog 2>&1 +status=$? +set -e +[ $status -eq 1 ] + + +# Clean up +# ------------- rm -f $fLog $fBufrTmp $fBufrInput1 $fBufrInput2 $fRules diff --git a/tests/grib_compare.sh b/tests/grib_compare.sh index c4d8b66e2..a87898383 100755 --- a/tests/grib_compare.sh +++ b/tests/grib_compare.sh @@ -20,6 +20,7 @@ rm -f $outfile ${tools_dir}/grib_set -s shortName=2d $infile $outfile ${tools_dir}/grib_compare -b indicatorOfParameter,paramId,shortName $infile $outfile > $REDIRECT +# ---------------------------------------- # Test the -r switch # ---------------------------------------- infile=${data_dir}/v.grib2 @@ -34,6 +35,7 @@ ${tools_dir}/grib_compare -r temp_comp.123 temp_comp.321 rm -f temp_comp.1 temp_comp.2 temp_comp.3 temp_comp.123 temp_comp.321 +# ---------------------------------------- # GRIB-797: test last argument being a directory # ---------------------------------------- temp_dir=tempdir.grib_compare @@ -42,6 +44,7 @@ cp $infile $temp_dir ${tools_dir}/grib_compare $infile $temp_dir rm -rf $temp_dir +# ---------------------------------------- # ECC-245: blacklist and 2nd order packing # ---------------------------------------- temp1=grib_compare_temp1.grib @@ -67,6 +70,7 @@ set -e [ $status -eq 1 ] +# ---------------------------------------- # ECC-355: -R with "all" option # ---------------------------------------- ${tools_dir}/grib_copy -w count=1 ${data_dir}/tigge_cf_ecmwf.grib2 $temp1 @@ -77,6 +81,56 @@ ${tools_dir}/grib_compare -b $BLACKLIST -R referenceValue=0.03,codedValues=2 $te # Now try the "all" option with the highest relative diff value ${tools_dir}/grib_compare -b $BLACKLIST -R all=2 $temp1 $temp2 +# ---------------------------------------- +# ECC-651: Two-way (symmetric) comparison +# ---------------------------------------- +sample_g1=$ECCODES_SAMPLES_PATH/GRIB1.tmpl +temp_nold=$temp1 +${tools_dir}/grib_set -s deleteLocalDefinition=1 $sample_g1 $temp_nold +# Now the sample has a local definition but $temp_nold does not +set +e +${tools_dir}/grib_compare $temp_nold $sample_g1 > $outfile +status=$? +set -e +[ $status -eq 1 ] +reffile=grib_compare_temp1.ref +cat > $reffile < $outfile +status=$? +set -e +[ $status -eq 1 ] +cat > $reffile <context; + char* first_str = (handles_swapped==0? "1st" : "2nd"); + char* second_str = (handles_swapped==0? "2nd" : "1st"); type1=type; type2=type; @@ -619,7 +650,7 @@ static int compare_values(grib_runtime_options* options, grib_handle* handle1, g if( type1==GRIB_TYPE_UNDEFINED && (err = grib_get_native_type(handle1,name,&type1)) != GRIB_SUCCESS) { printInfo(handle1); - printf("Oops... cannot get type of [%s] in 1st field: %s\n",name,grib_get_error_message(err)); + printf("Oops... cannot get type of [%s] in %s field: %s\n",name, first_str, grib_get_error_message(err)); save_error(c,name); return err; } @@ -629,12 +660,12 @@ static int compare_values(grib_runtime_options* options, grib_handle* handle1, g if(err == GRIB_NOT_FOUND) { printInfo(handle1); - printf("[%s] not found in 2nd field\n",name); + printf("[%s] not found in %s field\n",name, second_str); save_error(c,name); return err; } printInfo(handle1); - printf("Oops... cannot get type of [%s] in 2nd field: %s\n",name,grib_get_error_message(err)); + printf("Oops... cannot get type of [%s] in %s field: %s\n",name, second_str, grib_get_error_message(err)); save_error(c,name); return err; } @@ -655,7 +686,7 @@ static int compare_values(grib_runtime_options* options, grib_handle* handle1, g if((err = grib_get_size(handle1,name,&len1)) != GRIB_SUCCESS) { printInfo(handle1); - printf("Oops... cannot get size of [%s] in 1st field: %s\n",name,grib_get_error_message(err)); + printf("Oops... cannot get size of [%s] in %s field: %s\n",name, first_str, grib_get_error_message(err)); save_error(c,name); return err; } @@ -665,17 +696,21 @@ static int compare_values(grib_runtime_options* options, grib_handle* handle1, g if(err == GRIB_NOT_FOUND) { printInfo(handle1); - printf("[%s] not found in 2nd field\n",name); + printf("[%s] not found in %s field\n",name,second_str); save_error(c,name); return err; } printInfo(handle1); - printf("Oops... cannot get size of [%s] in 2nd field: %s\n",name,grib_get_error_message(err)); + printf("Oops... cannot get size of [%s] in %s field: %s\n",name, second_str, grib_get_error_message(err)); save_error(c,name); return err; } - + + if (handles_swapped) { + /* Comparing a second time with handles swapped. Do not compare keys common to both handles */ + return GRIB_SUCCESS; + } /* if(len1 != len2 && type1 != GRIB_TYPE_STRING) { printInfo(handle1); printf("[%s] has different size: 1st field: %ld, 2nd field: %ld\n",name,(long)len1,(long)len2); @@ -695,18 +730,18 @@ static int compare_values(grib_runtime_options* options, grib_handle* handle1, g } if (isMissing1==1) { - if (verbose) printf(" is set to missing in 1st field\n"); + if (verbose) printf(" is set to missing in %s field\n", first_str); printInfo(handle1); - printf("%s is set to missing in 1st field is not missing in 2nd field\n",name); + printf("%s is set to missing in %s field is not missing in %s field\n",name,first_str,second_str); err1 = GRIB_VALUE_MISMATCH; save_error(c,name); return GRIB_VALUE_MISMATCH; } if (isMissing2==1) { - if (verbose) printf(" is set to missing in 1st field\n"); + if (verbose) printf(" is set to missing in %s field\n", first_str); printInfo(handle1); - printf("%s is set to missing in 2nd field is not missing in 1st field\n",name); + printf("%s is set to missing in %s field is not missing in %s field\n",name, second_str, first_str); err1 = GRIB_VALUE_MISMATCH; save_error(c,name); return GRIB_VALUE_MISMATCH; @@ -724,16 +759,16 @@ static int compare_values(grib_runtime_options* options, grib_handle* handle1, g if((err1 = grib_get_string(handle1,name,sval1,&len1)) != GRIB_SUCCESS) { printInfo(handle1); - printf("Oops... cannot get string value of [%s] in 1st field: %s\n", - name,grib_get_error_message(err1)); + printf("Oops... cannot get string value of [%s] in %s field: %s\n", + name, first_str, grib_get_error_message(err1)); save_error(c,name); } if((err2 = grib_get_string(handle2,name,sval2,&len2)) != GRIB_SUCCESS) { printInfo(handle1); - printf("Oops... cannot get string value of [%s] in 2nd field: %s\n", - name,grib_get_error_message(err2)); + printf("Oops... cannot get string value of [%s] in %s field: %s\n", + name, second_str, grib_get_error_message(err2)); save_error(c,name); } @@ -777,16 +812,16 @@ static int compare_values(grib_runtime_options* options, grib_handle* handle1, g if((err1 = grib_get_long_array(handle1,name,lval1,&len1)) != GRIB_SUCCESS) { printInfo(handle1); - printf("Oops... cannot get long value of [%s] in 1st field: %s\n", - name,grib_get_error_message(err1)); + printf("Oops... cannot get long value of [%s] in %s field: %s\n", + name, first_str, grib_get_error_message(err1)); save_error(c,name); } if((err2 = grib_get_long_array(handle2,name,lval2,&len2)) != GRIB_SUCCESS) { printInfo(handle1); - printf("Oops... cannot get long value of [%s] in 2nd field: %s\n", - name,grib_get_error_message(err2)); + printf("Oops... cannot get long value of [%s] in %s field: %s\n", + name,second_str,grib_get_error_message(err2)); save_error(c,name); } @@ -869,16 +904,16 @@ static int compare_values(grib_runtime_options* options, grib_handle* handle1, g if((err1 = grib_get_double_array(handle1,name,dval1,&len1)) != GRIB_SUCCESS) { printInfo(handle1); - printf("Oops... cannot get double value of [%s] in 1st field: %s\n", - name,grib_get_error_message(err1)); + printf("Oops... cannot get double value of [%s] in %s field: %s\n", + name, first_str, grib_get_error_message(err1)); save_error(c,name); } if((err2 = grib_get_double_array(handle2,name,dval2,&len2)) != GRIB_SUCCESS) { printInfo(handle1); - printf("Oops... cannot get double value of [%s] in 2nd field: %s\n", - name,grib_get_error_message(err2)); + printf("Oops... cannot get double value of [%s] in %s field: %s\n", + name,second_str,grib_get_error_message(err2)); save_error(c,name); } @@ -987,16 +1022,16 @@ static int compare_values(grib_runtime_options* options, grib_handle* handle1, g { printInfo(handle1); save_error(c,name); - printf("Oops... cannot get bytes value of [%s] in 1st field: %s\n", - name,grib_get_error_message(err1)); + printf("Oops... cannot get bytes value of [%s] in %s field: %s\n", + name,first_str,grib_get_error_message(err1)); } if((err2 = grib_get_bytes(handle2,name,uval2,&len2)) != GRIB_SUCCESS) { printInfo(handle1); save_error(c,name); - printf("Oops... cannot get bytes value of [%s] in 2nd field: %s\n", - name,grib_get_error_message(err2)); + printf("Oops... cannot get bytes value of [%s] in %s field: %s\n", + name,second_str,grib_get_error_message(err2)); } if(err1 == GRIB_SUCCESS && err2 == GRIB_SUCCESS) @@ -1249,7 +1284,6 @@ static int compare_handles(grib_handle* handle1, grib_handle* handle2, grib_runt } #endif - if ( listFromCommandLine ) { for (i=0; i< options->compare_count; i++) { if (blacklisted(name)) continue; diff --git a/tools/grib_compare.c b/tools/grib_compare.c index 76dee6a54..e94540779 100644 --- a/tools/grib_compare.c +++ b/tools/grib_compare.c @@ -52,6 +52,15 @@ int error=0; int count=0; int lastPrint=0; int force=0; + +/* ECC-651: Boolean 'two_way' set to 1 when '-2' option used */ +int two_way=0; +/* Boolean 'handles_swapped' relevant in 'two_way' mode: + * 0 means: h1 is first file, h2 is second file + * 1 means: h1 is second file, h2 is first file + */ +int handles_swapped=0; + double maxAbsoluteError = 1e-19; int onlyListed=1; int headerMode=0; @@ -119,6 +128,7 @@ grib_option grib_options[]={ {"r",0,"Compare files in which the messages are not in the same order. This option is time expensive.\n",0,1,0}, {"b:",0,0,0,1,0}, {"e",0,"Edition independent compare. It is used to compare grib edition 1 and 2.\n",0,1,0}, + {"2",0,"Enable two-way comparison.\n",0,1,0}, {"c:",0,0,0,1,0}, {"S:","start","First field to be processed.\n",0,1,0}, {"E:","end","Last field to be processed.\n",0,1,0}, @@ -183,6 +193,9 @@ int grib_tool_init(grib_runtime_options* options) if (grib_options_on("f")) force=1; else force=0; + if (grib_options_on("2")) two_way=1; + else two_way=0; + verbose = grib_options_on("v"); listFromCommandLine=0; @@ -431,7 +444,23 @@ int grib_tool_new_handle_action(grib_runtime_options* options, grib_handle* h) if(compare_handles(global_handle,h,options)) { error++; - if (!force) exit(1); + if (!two_way) { + /* If two_way mode: Don't exit yet. Show further differences */ + if (!force) exit(1); + } + } + if (two_way) { + /* ECC-651 and ECC-431 */ + handles_swapped = 1; + if(compare_handles(h, global_handle, options)) { + error++; + if (!force) exit(1); + } else { + if (error) { + /* Error from first pass */ + if (!force) exit(1); + } + } } grib_handle_delete(global_handle); @@ -562,6 +591,8 @@ static int compare_values(grib_runtime_options* options,grib_handle* h1,grib_han double packingError1=0,packingError2=0; double value_tolerance=0; grib_context* c=h1->context; + char* first_str = (handles_swapped==0? "1st" : "2nd"); + char* second_str = (handles_swapped==0? "2nd" : "1st"); type1=type; type2=type; @@ -573,7 +604,7 @@ static int compare_values(grib_runtime_options* options,grib_handle* h1,grib_han if( type1==GRIB_TYPE_UNDEFINED && (err = grib_get_native_type(h1,name,&type1)) != GRIB_SUCCESS) { printInfo(h1); - printf("Oops... cannot get type of [%s] in 1st field: %s\n",name,grib_get_error_message(err)); + printf("Oops... cannot get type of [%s] in %s field: %s\n",name,first_str,grib_get_error_message(err)); save_error(c,name); return err; } @@ -583,24 +614,22 @@ static int compare_values(grib_runtime_options* options,grib_handle* h1,grib_han if(err == GRIB_NOT_FOUND) { printInfo(h1); - printf("[%s] not found in 2nd field\n",name); + printf("[%s] not found in %s field\n",name,second_str); save_error(c,name); return err; } printInfo(h1); - printf("Oops... cannot get type of [%s] in 2nd field: %s\n",name,grib_get_error_message(err)); + printf("Oops... cannot get type of [%s] in %s field: %s\n",name,second_str,grib_get_error_message(err)); save_error(c,name); return err; } - /* - if(type1 != type2) - { - printInfo(h1); - printf("Warning, [%s] has different types: 1st field: [%s], 2nd field: [%s]\n", - name,grib_get_type_name(type1),grib_get_type_name(type2)); - return GRIB_TYPE_MISMATCH; - } + /* if(type1 != type2) { + printInfo(h1); + printf("Warning, [%s] has different types: 1st field: [%s], 2nd field: [%s]\n", + name,grib_get_type_name(type1),grib_get_type_name(type2)); + return GRIB_TYPE_MISMATCH; + } */ if(type1 == GRIB_TYPE_LABEL) @@ -613,7 +642,7 @@ static int compare_values(grib_runtime_options* options,grib_handle* h1,grib_han if((err = grib_get_size(h1,name,&len1)) != GRIB_SUCCESS) { printInfo(h1); - printf("Oops... cannot get size of [%s] in 1st field: %s\n",name,grib_get_error_message(err)); + printf("Oops... cannot get size of [%s] in %s field: %s\n",name,first_str,grib_get_error_message(err)); save_error(c,name); return err; } @@ -623,25 +652,28 @@ static int compare_values(grib_runtime_options* options,grib_handle* h1,grib_han if(err == GRIB_NOT_FOUND) { printInfo(h1); - printf("[%s] not found in 2nd field\n",name); + printf("[%s] not found in %s field\n",name,second_str); save_error(c,name); return err; } printInfo(h1); - printf("Oops... cannot get size of [%s] in 2nd field: %s\n",name,grib_get_error_message(err)); + printf("Oops... cannot get size of [%s] in %s field: %s\n",name,second_str,grib_get_error_message(err)); save_error(c,name); return err; } - /* - if(len1 != len2 && type1 != GRIB_TYPE_STRING) - { - printInfo(h1); - printf("[%s] has different size: 1st field: %ld, 2nd field: %ld\n",name,(long)len1,(long)len2); - save_error(c,name); - return GRIB_COUNT_MISMATCH; - } + if (handles_swapped) { + /* Comparing a second time with handles swapped. Do not compare keys common to both handles */ + return GRIB_SUCCESS; + } + + /* if(len1 != len2 && type1 != GRIB_TYPE_STRING) { + printInfo(h1); + printf("[%s] has different size: 1st field: %ld, 2nd field: %ld\n",name,(long)len1,(long)len2); + save_error(c,name); + return GRIB_COUNT_MISMATCH; + } */ isMissing1= ( (grib_is_missing(h1,name,&err1)==1) && (err1 == 0) ) ? 1 : 0; @@ -653,18 +685,18 @@ static int compare_values(grib_runtime_options* options,grib_handle* h1,grib_han } if (isMissing1==1) { - if (verbose) printf(" is set to missing in 1st field\n"); + if (verbose) printf(" is set to missing in %s field\n",first_str); printInfo(h1); - printf("%s is set to missing in 1st field is not missing in 2nd field\n",name); + printf("%s is set to missing in %s field is not missing in %s field\n",name,first_str,second_str); err1 = GRIB_VALUE_MISMATCH; save_error(c,name); return GRIB_VALUE_MISMATCH; } if (isMissing2==1) { - if (verbose) printf(" is set to missing in 1st field\n"); + if (verbose) printf(" is set to missing in %s field\n",first_str); printInfo(h1); - printf("%s is set to missing in 2nd field is not missing in 1st field\n",name); + printf("%s is set to missing in %s field is not missing in %s field\n",name,second_str,first_str); err1 = GRIB_VALUE_MISMATCH; save_error(c,name); return GRIB_VALUE_MISMATCH; @@ -682,16 +714,16 @@ static int compare_values(grib_runtime_options* options,grib_handle* h1,grib_han if((err1 = grib_get_string(h1,name,sval1,&len1)) != GRIB_SUCCESS) { printInfo(h1); - printf("Oops... cannot get string value of [%s] in 1st field: %s\n", - name,grib_get_error_message(err1)); + printf("Oops... cannot get string value of [%s] in %s field: %s\n", + name,first_str,grib_get_error_message(err1)); save_error(c,name); } if((err2 = grib_get_string(h2,name,sval2,&len2)) != GRIB_SUCCESS) { printInfo(h1); - printf("Oops... cannot get string value of [%s] in 2nd field: %s\n", - name,grib_get_error_message(err2)); + printf("Oops... cannot get string value of [%s] in %s field: %s\n", + name,second_str,grib_get_error_message(err2)); save_error(c,name); } @@ -724,16 +756,16 @@ static int compare_values(grib_runtime_options* options,grib_handle* h1,grib_han if((err1 = grib_get_long_array(h1,name,lval1,&len1)) != GRIB_SUCCESS) { printInfo(h1); - printf("Oops... cannot get long value of [%s] in 1st field: %s\n", - name,grib_get_error_message(err1)); + printf("Oops... cannot get long value of [%s] in %s field: %s\n", + name,first_str,grib_get_error_message(err1)); save_error(c,name); } if((err2 = grib_get_long_array(h2,name,lval2,&len2)) != GRIB_SUCCESS) { printInfo(h1); - printf("Oops... cannot get long value of [%s] in 2nd field: %s\n", - name,grib_get_error_message(err2)); + printf("Oops... cannot get long value of [%s] in %s field: %s\n", + name,second_str,grib_get_error_message(err2)); save_error(c,name); } @@ -837,16 +869,16 @@ static int compare_values(grib_runtime_options* options,grib_handle* h1,grib_han if((err1 = grib_get_double_array(h1,name,dval1,&len1)) != GRIB_SUCCESS) { printInfo(h1); - printf("Oops... cannot get double value of [%s] in 1st field: %s\n", - name,grib_get_error_message(err1)); + printf("Oops... cannot get double value of [%s] in %s field: %s\n", + name,first_str,grib_get_error_message(err1)); save_error(c,name); } if((err2 = grib_get_double_array(h2,name,dval2,&len2)) != GRIB_SUCCESS) { printInfo(h1); - printf("Oops... cannot get double value of [%s] in 2nd field: %s\n", - name,grib_get_error_message(err2)); + printf("Oops... cannot get double value of [%s] in %s field: %s\n", + name,second_str,grib_get_error_message(err2)); save_error(c,name); } @@ -945,16 +977,16 @@ static int compare_values(grib_runtime_options* options,grib_handle* h1,grib_han { printInfo(h1); save_error(c,name); - printf("Oops... cannot get bytes value of [%s] in 1st field: %s\n", - name,grib_get_error_message(err1)); + printf("Oops... cannot get bytes value of [%s] in %s field: %s\n", + name,first_str,grib_get_error_message(err1)); } if((err2 = grib_get_bytes(h2,name,uval2,&len2)) != GRIB_SUCCESS) { printInfo(h1); save_error(c,name); - printf("Oops... cannot get bytes value of [%s] in 2nd field: %s\n", - name,grib_get_error_message(err2)); + printf("Oops... cannot get bytes value of [%s] in %s field: %s\n", + name,second_str,grib_get_error_message(err2)); } if(err1 == GRIB_SUCCESS && err2 == GRIB_SUCCESS)