| /* |
| * Copyright (C) 2006, 2007, 2009 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 <http://www.gnu.org/licenses/>. |
| * |
| */ |
| |
| |
| /*****************************************************/ |
| /* File: Test_parser.c */ |
| /* Description: Test sequences for these functions: */ |
| /* asn1_parser_asn1, */ |
| /*****************************************************/ |
| |
| #include <stdio.h> |
| #include <string.h> |
| #include <stdlib.h> |
| #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); |
| asn1_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",asn1_strerror(test->errorNumber), |
| test->errorDescription); |
| printf(" Error detected: %s - %s\n\n",asn1_strerror(result), |
| errorDescription); |
| } |
| |
| test++; |
| } |
| |
| |
| printf("Total tests : %d\n",testCounter); |
| printf("Total errors: %d\n",errorCounter); |
| |
| if(errorCounter > 0) |
| return 1; |
| |
| exit(0); |
| } |
| |
| |
| |
| |
| |
| |
| |