/* * Copyright (C) 2006, 2007 Free Software Foundation * Copyright (C) 2002 Fabio Fiorina * * This file is part of LIBTASN1. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * */ /*****************************************************/ /* File: Test_parser.c */ /* Description: Test sequences for these functions: */ /* asn1_parser_asn1, */ /*****************************************************/ #include #include #include #include "libtasn1.h" typedef struct{ int lineNumber; char *line; int errorNumber; char *errorDescription; } test_type; char *fileCorrectName; char fileErroredName[]="Test_parser_ERROR.asn"; #define _FILE_ "Test_parser_ERROR.asn" test_type test_array[]={ /* Test DEFINITIONS syntax */ {5,"TEST_PARSER2 { } DEFINITIONS IMPLICIT TAGS ::= BEGIN int1 ::= INTEGER END", ASN1_SYNTAX_ERROR,_FILE_":6: parse error near 'TEST_PARSER'"}, {6,"TEST_PARSER { }",ASN1_SUCCESS,""}, /* Test ASN1_MAX_NAME_SIZE (128) */ {12,"a1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567 ::= INTEGER", ASN1_SUCCESS,""}, {12,"a12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 ::= INTEGER", ASN1_NAME_TOO_LONG,_FILE_":12: name too long (more than 128 characters)"}, /* Test 'check identifier' function */ {12,"ident1 ::= ident2 ident2 ::= INTEGER", ASN1_SUCCESS,""}, {12,"ident1 ::= ident2", ASN1_IDENTIFIER_NOT_FOUND,_FILE_":: identifier 'ident2' not found"}, {12,"obj1 OBJECT IDENTIFIER ::= {pkix 0 5 4} " "pkix OBJECT IDENTIFIER ::= {1 2}", ASN1_SUCCESS,""}, {12,"obj1 OBJECT IDENTIFIER ::= {pkix 0 5 4}", ASN1_IDENTIFIER_NOT_FOUND,_FILE_":: identifier 'pkix' not found"}, /* Test INTEGER */ {14,"int1 INTEGER OPTIONAL,",ASN1_SUCCESS,""}, {14,"int1 INTEGER DEFAULT 1,",ASN1_SUCCESS,""}, {14,"int1 INTEGER DEFAULT -1,",ASN1_SUCCESS,""}, {14,"int1 INTEGER DEFAULT v1,",ASN1_SUCCESS,""}, {14,"int1 [1] INTEGER,",ASN1_SUCCESS,""}, {14,"int1 [1] EXPLICIT INTEGER,",ASN1_SUCCESS,""}, {14,"int1 [1] IMPLICIT INTEGER,",ASN1_SUCCESS,""}, {12,"Integer ::= [1] EXPLICIT INTEGER {v1(-1), v2(1)}",ASN1_SUCCESS,""}, {12,"Integer ::= INTEGER {v1(0), v2}", ASN1_SYNTAX_ERROR,_FILE_":12: parse error near '}'"}, {12,"Integer ::= INTEGER {v1(0), 1}", ASN1_SYNTAX_ERROR,_FILE_":12: parse error near '1'"}, {12,"const1 INTEGER ::= -1",ASN1_SUCCESS,""}, {12,"const1 INTEGER ::= 1",ASN1_SUCCESS,""}, {12,"const1 INTEGER ::= v1", ASN1_SYNTAX_ERROR,_FILE_":12: parse error near 'v1'"}, {16," generic generalstring", ASN1_IDENTIFIER_NOT_FOUND,_FILE_":: identifier 'generalstring' not found"}, /* Test: OID */ {20," oid1 OBJECT IDENTIFIER DEFAULT Oid-type", ASN1_IDENTIFIER_NOT_FOUND,_FILE_":: identifier 'Oid-type' not found"}, {20," oid1 OBJECT IDENTIFIER DEFAULT 1", ASN1_IDENTIFIER_NOT_FOUND,_FILE_":: identifier '1' not found"}, {20," oid1 OBJECT IDENTIFIER DEFAULT", ASN1_SYNTAX_ERROR,_FILE_":21: parse error near '}'"}, {20," oid1 OBJECT IDENTIFIER DEFAULT Oid-type1", ASN1_SUCCESS,""}, /* end */ {0} }; int readLine(FILE *file,char *line) { int c; while(((c=fgetc(file))!=EOF) && (c!='\n')){ *line=c; line++; } *line=0; return c; } void createFile(int lineNumber,char *line) { FILE *fileIn,*fileOut; char lineRead[1024]; int fileInLineNumber=0; fileIn=fopen(fileCorrectName,"r"); fileOut=fopen(fileErroredName,"w"); while(readLine(fileIn,lineRead) != EOF){ fileInLineNumber++; if(fileInLineNumber==lineNumber) fprintf(fileOut,"%s\n",line); else fprintf(fileOut,"%s\n",lineRead); } fclose(fileOut); fclose(fileIn); } int main(int argc,char *argv[]) { asn1_retCode result; ASN1_TYPE definitions=ASN1_TYPE_EMPTY; char errorDescription[ASN1_MAX_ERROR_DESCRIPTION_SIZE]; test_type *test; int errorCounter=0,testCounter=0; fileCorrectName = getenv ("ASN1PARSER"); if (!fileCorrectName) fileCorrectName="Test_parser.asn"; printf("\n\n/****************************************/\n"); printf( "/* Test sequence : Test_parser */\n"); printf( "/****************************************/\n\n"); printf("ASN1PARSER: %s\n", fileCorrectName); result=asn1_parser2tree(fileCorrectName,&definitions,errorDescription); if(result!=ASN1_SUCCESS){ printf("File '%s' not correct\n",fileCorrectName); libtasn1_perror(result); printf("ErrorDescription = %s\n\n",errorDescription); exit(1); } /* Only for Test */ /* asn1_visit_tree(stdout,definitions,"TEST_PARSER",ASN1_PRINT_ALL); */ /* Clear the definitions structures */ asn1_delete_structure(&definitions); test=test_array; while(test->lineNumber != 0){ testCounter++; createFile(test->lineNumber,test->line); result=asn1_parser2tree(fileErroredName,&definitions,errorDescription); asn1_delete_structure(&definitions); if((result != test->errorNumber) || (strcmp(errorDescription,test->errorDescription))){ errorCounter++; printf("ERROR N. %d:\n",errorCounter); printf(" Line %d - %s\n",test->lineNumber,test->line); printf(" Error expected: %s - %s\n",libtasn1_strerror(test->errorNumber), test->errorDescription); printf(" Error detected: %s - %s\n\n",libtasn1_strerror(result), errorDescription); } test++; } printf("Total tests : %d\n",testCounter); printf("Total errors: %d\n",errorCounter); if(errorCounter > 0) return 1; exit(0); }