os/ossrv/compressionlibs/ziplib/test/pctools/basicfunctest/src/basicfunctest.cpp
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
sl@0
     1
// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
sl@0
     2
// All rights reserved.
sl@0
     3
// This component and the accompanying materials are made available
sl@0
     4
// under the terms of "Eclipse Public License v1.0"
sl@0
     5
// which accompanies this distribution, and is available
sl@0
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
sl@0
     7
//
sl@0
     8
// Initial Contributors:
sl@0
     9
// Nokia Corporation - initial contribution.
sl@0
    10
//
sl@0
    11
// Contributors:
sl@0
    12
//
sl@0
    13
// Description:
sl@0
    14
//
sl@0
    15
sl@0
    16
#include <iostream>
sl@0
    17
#include <cstdio>
sl@0
    18
#include <fstream>
sl@0
    19
#include <sstream>
sl@0
    20
#include <string>
sl@0
    21
#include <zlib.h>
sl@0
    22
sl@0
    23
using namespace std;
sl@0
    24
sl@0
    25
const unsigned int bufferSize = 1024;
sl@0
    26
const string filePath = "..\\..\\ezlib2_testdata\\";
sl@0
    27
sl@0
    28
/*
sl@0
    29
 * deflateInflateTest() constants
sl@0
    30
 */
sl@0
    31
const int deflateInflateTestDataItems = 24;
sl@0
    32
const string deflateInflateTestFiles[deflateInflateTestDataItems] = {"GifImage.gif", "BigSize.txt", "BitmapImage.bmp", 
sl@0
    33
                                                                      "BigSize.txt", "JpegImage.jpg", "BigSize.txt",
sl@0
    34
                                                                      "SmallSize.txt", "BigSize.txt", "HolyMoley.jar",
sl@0
    35
                                                                      "BigSize.txt", "ExifHeadFile.png", "BigSize.txt",
sl@0
    36
                                                                      "GifImage.gif", "BigSize.doc", "BitmapImage.bmp",
sl@0
    37
                                                                      "BigSize.doc", "JpegImage.jpg", "BigSize.doc",
sl@0
    38
                                                                      "SmallSize.txt", "BigSize.doc", "HolyMoley.jar",
sl@0
    39
                                                                      "BigSize.doc", "ExifHeadFile.png", "BigSize.doc"};
sl@0
    40
sl@0
    41
const int deflateInflateTestLevel[deflateInflateTestDataItems] = {Z_DEFAULT_COMPRESSION, Z_NO_COMPRESSION, Z_BEST_COMPRESSION,
sl@0
    42
                                                                   Z_DEFAULT_COMPRESSION, Z_NO_COMPRESSION, Z_BEST_COMPRESSION,
sl@0
    43
                                                                   Z_BEST_COMPRESSION, Z_DEFAULT_COMPRESSION, Z_NO_COMPRESSION,
sl@0
    44
                                                                   Z_BEST_COMPRESSION, Z_DEFAULT_COMPRESSION, Z_NO_COMPRESSION,
sl@0
    45
                                                                   Z_NO_COMPRESSION, Z_BEST_COMPRESSION, Z_DEFAULT_COMPRESSION,
sl@0
    46
                                                                   Z_NO_COMPRESSION, Z_BEST_COMPRESSION, Z_DEFAULT_COMPRESSION,
sl@0
    47
                                                                   Z_BEST_SPEED, Z_BEST_SPEED, Z_BEST_SPEED,
sl@0
    48
                                                                   Z_BEST_SPEED, Z_BEST_SPEED, Z_BEST_SPEED};
sl@0
    49
sl@0
    50
const int deflateInflateTestWindowBits[deflateInflateTestDataItems] = {8, MAX_WBITS, 8,
sl@0
    51
                                                                        MAX_WBITS, 8, MAX_WBITS,
sl@0
    52
                                                                        8, 8, MAX_WBITS,
sl@0
    53
                                                                        MAX_WBITS, MAX_WBITS, 8,
sl@0
    54
                                                                        MAX_WBITS, 8, 8,
sl@0
    55
                                                                        8, MAX_WBITS, MAX_WBITS,
sl@0
    56
                                                                        8, MAX_WBITS, 8,
sl@0
    57
                                                                        MAX_WBITS, MAX_WBITS, 8};
sl@0
    58
sl@0
    59
const int deflateInflateTestMemLevel[deflateInflateTestDataItems] = {1, 1, 1,
sl@0
    60
                                                                      1, 1, 1,
sl@0
    61
                                                                      MAX_MEM_LEVEL, MAX_MEM_LEVEL, MAX_MEM_LEVEL,
sl@0
    62
                                                                      MAX_MEM_LEVEL, MAX_MEM_LEVEL, MAX_MEM_LEVEL,
sl@0
    63
                                                                      8, 8, 8,
sl@0
    64
                                                                      8, 8, 8,
sl@0
    65
                                                                      1, MAX_MEM_LEVEL, 8,
sl@0
    66
                                                                      1, MAX_MEM_LEVEL, 8};
sl@0
    67
sl@0
    68
const int deflateInflateTestStrategy[deflateInflateTestDataItems] = {Z_DEFAULT_STRATEGY, Z_DEFAULT_STRATEGY, Z_FILTERED,
sl@0
    69
                                                                      Z_FILTERED, Z_HUFFMAN_ONLY, Z_HUFFMAN_ONLY,
sl@0
    70
                                                                      Z_DEFAULT_STRATEGY, Z_DEFAULT_STRATEGY, Z_FILTERED,
sl@0
    71
                                                                      Z_FILTERED, Z_HUFFMAN_ONLY, Z_HUFFMAN_ONLY,
sl@0
    72
                                                                      Z_DEFAULT_STRATEGY, Z_DEFAULT_STRATEGY, Z_FILTERED,
sl@0
    73
                                                                      Z_FILTERED, Z_HUFFMAN_ONLY, Z_HUFFMAN_ONLY,
sl@0
    74
                                                                      Z_DEFAULT_STRATEGY, Z_DEFAULT_STRATEGY, Z_FILTERED,
sl@0
    75
                                                                      Z_FILTERED, Z_HUFFMAN_ONLY, Z_HUFFMAN_ONLY};
sl@0
    76
sl@0
    77
/*
sl@0
    78
 * inflateOldZlibFilesTest() constants
sl@0
    79
 */
sl@0
    80
const int inflateOldZlibFilesTestDataItems = 24;
sl@0
    81
const string inflateOldZlibFilesTestFiles[inflateOldZlibFilesTestDataItems] = {"GifImage.gif", "BigSize.txt", "BitmapImage.bmp", 
sl@0
    82
                                                                                "BigSize.txt", "JpegImage.jpg", "BigSize.txt",
sl@0
    83
                                                                                "SmallSize.txt", "BigSize.txt", "HolyMoley.jar",
sl@0
    84
                                                                                "BigSize.txt", "ExifHeadFile.png", "BigSize.txt",
sl@0
    85
                                                                                "GifImage.gif", "BigSize.doc", "BitmapImage.bmp",
sl@0
    86
                                                                                "BigSize.doc", "JpegImage.jpg", "BigSize.doc",
sl@0
    87
                                                                                "SmallSize.txt", "BigSize.doc", "HolyMoley.jar",
sl@0
    88
                                                                                "BigSize.doc", "ExifHeadFile.png", "BigSize.doc"};
sl@0
    89
sl@0
    90
/*
sl@0
    91
 * Global variables
sl@0
    92
 */
sl@0
    93
ofstream *outputFile = NULL;
sl@0
    94
int totalPassed = 0;
sl@0
    95
sl@0
    96
/*
sl@0
    97
 * HELPER FUNCTION DECLARATIONS
sl@0
    98
 */
sl@0
    99
void closeOutputFile();
sl@0
   100
void deleteFile(const string fileLocation);
sl@0
   101
int deflateCompress(z_stream &aStream, ifstream &input, ofstream &output);
sl@0
   102
bool deflateFile(const string &aInputFileName, const string &aOutputFileName, int aLevel, int aMethod, int aWindowBits, int aMemLevel, int aStrategy);
sl@0
   103
bool doFilesMatch(const string &aFileName1, const string &aFileName2);
sl@0
   104
unsigned int getFileLength(ifstream &file);
sl@0
   105
int inflateDecompress(z_stream &aStream, ifstream &input, ofstream &output);
sl@0
   106
bool inflateFile(const string &aInputFileName, const string &aOutputFileName, int aWindowBits = 15);
sl@0
   107
bool openOutputFile(const string &aOutputFileName);
sl@0
   108
void printTestResults();
sl@0
   109
sl@0
   110
/*
sl@0
   111
 * TEST FUNCTION DECLARATIONS
sl@0
   112
 */
sl@0
   113
bool deflateInflateTest();
sl@0
   114
bool inflateOldZlibFilesTest();
sl@0
   115
sl@0
   116
sl@0
   117
/*
sl@0
   118
 * Closes the results output file and frees the memory.
sl@0
   119
 */
sl@0
   120
void closeOutputFile()
sl@0
   121
    {
sl@0
   122
    *outputFile << "\t</body>" << endl;
sl@0
   123
    *outputFile << "</html>" << endl;
sl@0
   124
    outputFile->close();
sl@0
   125
    
sl@0
   126
    delete outputFile;
sl@0
   127
    }
sl@0
   128
sl@0
   129
void deleteFile(const string fileLocation)
sl@0
   130
    {
sl@0
   131
    int err = remove(fileLocation.c_str());
sl@0
   132
    if(err != 0)
sl@0
   133
        {
sl@0
   134
        *outputFile << "\t\t" << err << " - Error deleting file: " << fileLocation << "<br />" << endl;
sl@0
   135
        cout << "Error deleting file: " << fileLocation << endl;
sl@0
   136
        }
sl@0
   137
    }
sl@0
   138
sl@0
   139
/*
sl@0
   140
 * Compresses data using the deflate function.
sl@0
   141
 */
sl@0
   142
int deflateCompress(z_stream &aStream, ifstream &input, ofstream &output)
sl@0
   143
    {
sl@0
   144
    int err = Z_OK;
sl@0
   145
    int flush = Z_NO_FLUSH;
sl@0
   146
    unsigned char in[bufferSize];
sl@0
   147
    unsigned char out[bufferSize];
sl@0
   148
    unsigned int fileSize = getFileLength(input);
sl@0
   149
sl@0
   150
    do
sl@0
   151
        {
sl@0
   152
        input.read(reinterpret_cast<char *>(in), bufferSize);
sl@0
   153
sl@0
   154
        aStream.avail_in = ((aStream.total_in + bufferSize) > fileSize) ? fileSize - aStream.total_in : bufferSize;
sl@0
   155
        aStream.next_in = in;
sl@0
   156
sl@0
   157
        flush = input.eof() ? Z_FINISH : Z_NO_FLUSH;
sl@0
   158
sl@0
   159
        // Call deflate() on input until output buffer not full
sl@0
   160
        // Finish compression if all of input buffer has been read in
sl@0
   161
        do
sl@0
   162
            {
sl@0
   163
            aStream.avail_out = bufferSize;
sl@0
   164
            aStream.next_out = out;
sl@0
   165
sl@0
   166
            err = deflate(&aStream, flush);
sl@0
   167
            if(err != Z_OK && err != Z_STREAM_END)
sl@0
   168
            {
sl@0
   169
                return err;
sl@0
   170
            }
sl@0
   171
            output.write(reinterpret_cast<char *>(out), bufferSize - aStream.avail_out);
sl@0
   172
sl@0
   173
            } while(aStream.avail_out == 0 && err == Z_OK);
sl@0
   174
        } while(err != Z_STREAM_END);
sl@0
   175
sl@0
   176
    return Z_OK;
sl@0
   177
    }
sl@0
   178
sl@0
   179
/*
sl@0
   180
 * Reads in the data from the input file, compresses it and creates a new output file for the compressed data
sl@0
   181
 */
sl@0
   182
bool deflateFile(const string &aInputFileName, const string &aOutputFileName, int aLevel, int aMethod, int aWindowBits, int aMemLevel, int aStrategy)
sl@0
   183
    {
sl@0
   184
    int err = Z_OK;
sl@0
   185
sl@0
   186
    ifstream input(aInputFileName.c_str(), ios::in | ios::binary);
sl@0
   187
    ofstream output(aOutputFileName.c_str(), ios::out | ios::trunc | ios::binary);
sl@0
   188
    z_stream stream;
sl@0
   189
sl@0
   190
    if(input.is_open() && output.is_open())
sl@0
   191
        {
sl@0
   192
        stream.zalloc = Z_NULL;
sl@0
   193
        stream.zfree = Z_NULL;
sl@0
   194
        stream.opaque = Z_NULL;
sl@0
   195
sl@0
   196
        deflateInit2(&stream, aLevel, aMethod, aWindowBits, aMemLevel, aStrategy);
sl@0
   197
        err = deflateCompress(stream, input, output);
sl@0
   198
        deflateEnd(&stream);
sl@0
   199
sl@0
   200
        if(err != Z_OK)
sl@0
   201
            {
sl@0
   202
            *outputFile << "\t\t" << err << " - Error deflating!<br />" << endl;
sl@0
   203
            output.close();
sl@0
   204
            input.close();
sl@0
   205
            return false;
sl@0
   206
            }
sl@0
   207
        }
sl@0
   208
    else
sl@0
   209
        {
sl@0
   210
        if(!input.is_open())
sl@0
   211
            {
sl@0
   212
            *outputFile << "\t\tDeflate could not complete due to not being able to open the input file!<br />" << endl;
sl@0
   213
            }
sl@0
   214
        else
sl@0
   215
            {
sl@0
   216
            input.close();
sl@0
   217
            }
sl@0
   218
sl@0
   219
        if(!output.is_open())
sl@0
   220
            {
sl@0
   221
            *outputFile << "\t\tDeflate could not complete due to not being able to open the output file!<br />" << endl;
sl@0
   222
            }
sl@0
   223
        else
sl@0
   224
            {
sl@0
   225
            output.close();
sl@0
   226
            }
sl@0
   227
sl@0
   228
        return false;
sl@0
   229
        }
sl@0
   230
sl@0
   231
    input.close();
sl@0
   232
    output.close();
sl@0
   233
sl@0
   234
    *outputFile << "\t\tDeflate complete!<br />" << endl;
sl@0
   235
    return true;
sl@0
   236
    }
sl@0
   237
sl@0
   238
/*
sl@0
   239
 * Checks that the two files are identical
sl@0
   240
 */
sl@0
   241
bool doFilesMatch(const string &aFileName1, const string &aFileName2)
sl@0
   242
    {
sl@0
   243
    ifstream file1(aFileName1.c_str(), ios::in | ios::binary);
sl@0
   244
    ifstream file2(aFileName2.c_str(), ios::in | ios::binary);
sl@0
   245
sl@0
   246
    if(file1.is_open() && file2.is_open())
sl@0
   247
        {
sl@0
   248
        int file1Size = getFileLength(file1);
sl@0
   249
        int file2Size = getFileLength(file2);
sl@0
   250
sl@0
   251
        if(file1Size != file2Size)
sl@0
   252
            {
sl@0
   253
            *outputFile << "\t\t" << aFileName1 << " is not the same as " << aFileName2 << " because they have different file sizes!<br />" << endl;
sl@0
   254
            return false;
sl@0
   255
            }
sl@0
   256
        else
sl@0
   257
            {
sl@0
   258
            char fileBuffer1[bufferSize];
sl@0
   259
            char fileBuffer2[bufferSize];
sl@0
   260
sl@0
   261
            for(int totalSpaceProvided = bufferSize; !file1.eof(); totalSpaceProvided += bufferSize)
sl@0
   262
                {
sl@0
   263
                file1.read(fileBuffer1, bufferSize);
sl@0
   264
                file2.read(fileBuffer2, bufferSize);
sl@0
   265
sl@0
   266
                int read = (totalSpaceProvided > file1Size) ? bufferSize - (totalSpaceProvided - file1Size) : bufferSize;
sl@0
   267
                if(memcmp(fileBuffer1, fileBuffer2, read) != 0)
sl@0
   268
                    {
sl@0
   269
                    *outputFile << "\t\t" << aFileName1 << " is not the same as " << aFileName2 << "<br />" << endl;
sl@0
   270
                    return false;
sl@0
   271
                    }
sl@0
   272
                }
sl@0
   273
            }
sl@0
   274
        }
sl@0
   275
    else
sl@0
   276
        {
sl@0
   277
        if(!file1.is_open())
sl@0
   278
            {
sl@0
   279
            *outputFile << "\t\tCould not check if files matched because " << aFileName1 << " could not be opened!<br />" << endl;
sl@0
   280
            }
sl@0
   281
        else
sl@0
   282
            {
sl@0
   283
            file1.close();
sl@0
   284
            }
sl@0
   285
sl@0
   286
        if(!file2.is_open())
sl@0
   287
            {
sl@0
   288
            *outputFile << "\t\tCould not check if files matched because " << aFileName2 << " could not be opened!<br />" << endl;
sl@0
   289
            }
sl@0
   290
        else
sl@0
   291
            {
sl@0
   292
            file2.close();
sl@0
   293
            }
sl@0
   294
sl@0
   295
        return false;
sl@0
   296
        }
sl@0
   297
sl@0
   298
    file1.close();
sl@0
   299
    file2.close();
sl@0
   300
sl@0
   301
    return true;
sl@0
   302
    }
sl@0
   303
sl@0
   304
/*
sl@0
   305
 * Returns a files size in bytes
sl@0
   306
 */
sl@0
   307
unsigned int getFileLength(ifstream &file)
sl@0
   308
    {
sl@0
   309
    file.seekg (0, ios::end);
sl@0
   310
    unsigned int fileSize = file.tellg();
sl@0
   311
    file.seekg (0, ios::beg);
sl@0
   312
sl@0
   313
    return fileSize;
sl@0
   314
    }
sl@0
   315
sl@0
   316
/*
sl@0
   317
 * Decompresses data using the inflate function.
sl@0
   318
 */
sl@0
   319
int inflateDecompress(z_stream &aStream, ifstream &input, ofstream &output)
sl@0
   320
    {
sl@0
   321
    int err = Z_OK;
sl@0
   322
    unsigned char in[bufferSize];
sl@0
   323
    unsigned char out[bufferSize];
sl@0
   324
    unsigned int fileSize = getFileLength(input);
sl@0
   325
sl@0
   326
    // Keep providing input data and output space for deflate()
sl@0
   327
    do
sl@0
   328
        {
sl@0
   329
        input.read(reinterpret_cast<char *>(in), bufferSize);
sl@0
   330
sl@0
   331
        aStream.avail_in = ((aStream.total_in + bufferSize) > fileSize) ? fileSize - aStream.total_in : bufferSize;
sl@0
   332
        aStream.next_in = in;
sl@0
   333
sl@0
   334
        // Call inflate() on input until output buffer not full
sl@0
   335
        // Finish compression if all of input buffer has been read in
sl@0
   336
        do
sl@0
   337
            {
sl@0
   338
            aStream.avail_out = bufferSize;
sl@0
   339
            aStream.next_out = out;
sl@0
   340
sl@0
   341
            err = inflate(&aStream, Z_NO_FLUSH);
sl@0
   342
            if(err != Z_OK && err != Z_STREAM_END && err != Z_BUF_ERROR)
sl@0
   343
                {
sl@0
   344
                return err;
sl@0
   345
                }
sl@0
   346
            output.write(reinterpret_cast<char *>(out), bufferSize - aStream.avail_out);
sl@0
   347
sl@0
   348
            } while(aStream.avail_out == 0);
sl@0
   349
        } while(err != Z_STREAM_END);
sl@0
   350
sl@0
   351
    return Z_OK;
sl@0
   352
    }
sl@0
   353
sl@0
   354
/*
sl@0
   355
 * Reads in the data from the input file, decompresses it and creates a new output file for the decompressed data
sl@0
   356
 *
sl@0
   357
 * NOTE: Inflate fails when windowBits is set to 8. This is because deflateInit2() changes windowBits from 8 to 9
sl@0
   358
 * due to an error in zlib. However, inflateInit2() does not make the same change and this results in the
sl@0
   359
 * inflate failing with a Z_DATA_ERROR.
sl@0
   360
 */
sl@0
   361
bool inflateFile(const string &aInputFileName, const string &aOutputFileName, int aWindowBits)
sl@0
   362
    {
sl@0
   363
    int err = Z_OK;
sl@0
   364
    
sl@0
   365
    ifstream input(aInputFileName.c_str(), ios::in | ios::binary);
sl@0
   366
    ofstream output(aOutputFileName.c_str(), ios::out | ios::binary | ios::trunc);
sl@0
   367
    z_stream stream;
sl@0
   368
sl@0
   369
    if(input.is_open() && output.is_open())
sl@0
   370
        {
sl@0
   371
        stream.zalloc = Z_NULL;
sl@0
   372
        stream.zfree = Z_NULL;
sl@0
   373
        stream.opaque = Z_NULL;
sl@0
   374
sl@0
   375
        inflateInit2(&stream, aWindowBits);
sl@0
   376
        err = inflateDecompress(stream, input, output);
sl@0
   377
        inflateEnd(&stream);
sl@0
   378
sl@0
   379
        if(err != Z_OK)
sl@0
   380
            {
sl@0
   381
            *outputFile << "\t\t" << err << " - Error inflating!<br />" << endl;
sl@0
   382
            output.close();
sl@0
   383
            input.close();
sl@0
   384
            return false;
sl@0
   385
            }
sl@0
   386
        }
sl@0
   387
    else
sl@0
   388
        {
sl@0
   389
        if(!input.is_open())
sl@0
   390
            {
sl@0
   391
            *outputFile << "\t\tInflate could not complete due to not being able to open the input file!<br />" << endl;
sl@0
   392
            }
sl@0
   393
        else
sl@0
   394
            {
sl@0
   395
            input.close();
sl@0
   396
            }
sl@0
   397
sl@0
   398
        if(!output.is_open())
sl@0
   399
            {
sl@0
   400
            *outputFile << "\t\tInflate could not complete due to not being able to open the output file!<br />" << endl;
sl@0
   401
            }
sl@0
   402
        else
sl@0
   403
            {
sl@0
   404
            output.close();
sl@0
   405
            }
sl@0
   406
sl@0
   407
        return false;
sl@0
   408
        }
sl@0
   409
sl@0
   410
    output.close();
sl@0
   411
    input.close();
sl@0
   412
sl@0
   413
    *outputFile << "\t\tInflate complete!<br />" << endl;
sl@0
   414
    return true;
sl@0
   415
    }
sl@0
   416
sl@0
   417
/*
sl@0
   418
 * Creates and opens the results output file.
sl@0
   419
 */
sl@0
   420
bool openOutputFile(const string &aOutputFileName)
sl@0
   421
    {
sl@0
   422
    outputFile = new ofstream((aOutputFileName + ".html").c_str(), ios::out | ios::trunc);
sl@0
   423
    
sl@0
   424
    if(outputFile != NULL)
sl@0
   425
        {
sl@0
   426
        *outputFile << "<html>" << endl;
sl@0
   427
        *outputFile << "\t<body>" << endl;
sl@0
   428
        
sl@0
   429
        return true;
sl@0
   430
        }
sl@0
   431
sl@0
   432
    return false;
sl@0
   433
    }
sl@0
   434
sl@0
   435
/*
sl@0
   436
 * Outputs the test results to the results output file.
sl@0
   437
 */
sl@0
   438
void printTestResults()
sl@0
   439
    {
sl@0
   440
    int totalFailed = deflateInflateTestDataItems + inflateOldZlibFilesTestDataItems - totalPassed;
sl@0
   441
sl@0
   442
    *outputFile << "\t\tTEST RESULTS:<br />" << endl;
sl@0
   443
    *outputFile << "\t\t<font color=00AF00>Passed = " << totalPassed << "</font><br />" << endl;
sl@0
   444
    *outputFile << "\t\t<font color=FF0000>Failed = " << totalFailed << "</font><br />" << endl;
sl@0
   445
    }
sl@0
   446
sl@0
   447
/**
sl@0
   448
@SYMTestCaseID       	SYSLIB-EZLIB2-CT-4312
sl@0
   449
@SYMTestCaseDesc     	Check files can be deflated and inflated.
sl@0
   450
@SYMTestPriority     	High
sl@0
   451
@SYMTestActions      	1.	Open the input file for reading and create a compressed output 
sl@0
   452
                            file for writing. 
sl@0
   453
                        2.	Create a deflate stream and initialise it using deflateInit2() 
sl@0
   454
                            passing it the specified compression parameters.
sl@0
   455
                        3.	Deflate the input using deflate(), writing the deflated data 
sl@0
   456
                            to the compressed output file.
sl@0
   457
                        4.	Cleanup the deflate stream and close the input and compressed 
sl@0
   458
                            output files.
sl@0
   459
                        5.	Open the compressed file for reading and create a decompressed 
sl@0
   460
                            output file for writing
sl@0
   461
                        6.	Create an inflate stream and initialise it using inflateInit2().
sl@0
   462
                        7.	Inflate the input using inflate(), writing the inflated data to 
sl@0
   463
                            the decompressed output file.
sl@0
   464
                        8.	Cleanup the inflate stream and close the compressed input and 
sl@0
   465
                            decompressed output files.
sl@0
   466
                        9.	Open the original file (that was compressed) and the 
sl@0
   467
                            decompressed file for reading.
sl@0
   468
                        10.	Compare the contents of each file using memcmp().
sl@0
   469
                        11.	Close both the files.
sl@0
   470
                        12.	Cleanup any files created during the test.
sl@0
   471
                        
sl@0
   472
                        Note: The test should be repeated for different types of input 
sl@0
   473
                              files as well as different size of input file e.g.:
sl@0
   474
                            •	TXT
sl@0
   475
                            •	PNG
sl@0
   476
                            •	JAR
sl@0
   477
                            •	JPG
sl@0
   478
                            •	BMP
sl@0
   479
                            •	DOC
sl@0
   480
                            •	GIF
sl@0
   481
                            •	Varying sizes of each input file should be tested starting 
sl@0
   482
                                from a couple of kilobytes up to several megabytes.
sl@0
   483
                            
sl@0
   484
                        And with compression parameters as:
sl@0
   485
                            •	Z_DEFAULT_COMPRESSION, Z_NO_COMPRESSION, Z_BEST_COMPRESSION 
sl@0
   486
                                and Z_BEST_SPEED for level 
sl@0
   487
                            •	8 and MAX_WBITS for windowBits
sl@0
   488
                            •	1, 8 (default memory level) and MAX_MEM_LEVEL for memLevel
sl@0
   489
                            •	Z_DEFAULT_STRATEGY, Z_FILTERED and Z_HUFFMAN_ONLY for strategy
sl@0
   490
@SYMTestExpectedResults The input file used for deflating should be identical to the 
sl@0
   491
                        inflated output file.
sl@0
   492
*/
sl@0
   493
bool deflateInflateTest()
sl@0
   494
    {
sl@0
   495
    bool passed = true;
sl@0
   496
sl@0
   497
    cout << endl << "Starting test case deflateInflateTest:" << endl;
sl@0
   498
    for(int i = 0; i < deflateInflateTestDataItems ; i++)
sl@0
   499
        {
sl@0
   500
        stringstream ss;
sl@0
   501
        string testNum;
sl@0
   502
        ss << (i + 1);
sl@0
   503
        ss >> testNum;
sl@0
   504
sl@0
   505
        cout << "Starting test " << testNum << " - File: " << deflateInflateTestFiles[i];
sl@0
   506
sl@0
   507
        int extBegin = deflateInflateTestFiles[i].find_last_of(".", deflateInflateTestFiles[i].length());
sl@0
   508
        string fileName = deflateInflateTestFiles[i].substr(0, extBegin);
sl@0
   509
        string fileExt = deflateInflateTestFiles[i].substr(extBegin + 1);
sl@0
   510
        
sl@0
   511
        string uncompressedFileName(filePath + deflateInflateTestFiles[i]);
sl@0
   512
        string compressedFileName(filePath + fileName + testNum + ".zip");
sl@0
   513
        string decompressedFileName(filePath + "ezlib2_" + fileName + testNum + "_decompressed" + "." + fileExt);
sl@0
   514
sl@0
   515
        if(deflateFile(uncompressedFileName, compressedFileName, deflateInflateTestLevel[i], Z_DEFLATED, deflateInflateTestWindowBits[i], deflateInflateTestMemLevel[i], deflateInflateTestStrategy[i]) == false)
sl@0
   516
            {
sl@0
   517
            passed = false;
sl@0
   518
            *outputFile << "\t\t<font color=FF0000>FAILED for file: " << deflateInflateTestFiles[i] << "</font><p />" << endl << endl;
sl@0
   519
            cout << " - FAILED" << endl;
sl@0
   520
            continue;
sl@0
   521
            }
sl@0
   522
sl@0
   523
        if(inflateFile(compressedFileName, decompressedFileName, deflateInflateTestWindowBits[i]) == false)
sl@0
   524
            {
sl@0
   525
            passed = false;
sl@0
   526
            *outputFile << "\t\t<font color=FF0000>FAILED for file: " << uncompressedFileName << "</font><p />" << endl << endl;
sl@0
   527
            cout << " - FAILED" << endl;
sl@0
   528
            
sl@0
   529
            deleteFile(compressedFileName);
sl@0
   530
            deleteFile(decompressedFileName);
sl@0
   531
            continue;
sl@0
   532
            }
sl@0
   533
sl@0
   534
        if(doFilesMatch(uncompressedFileName, decompressedFileName) == false)
sl@0
   535
            {
sl@0
   536
            passed = false;
sl@0
   537
            *outputFile << "\t\t<font color=FF0000>FAILED for file: " << uncompressedFileName << "</font><p />" << endl << endl;
sl@0
   538
            cout << " - FAILED" << endl;
sl@0
   539
            
sl@0
   540
            deleteFile(compressedFileName);
sl@0
   541
            deleteFile(decompressedFileName);
sl@0
   542
            continue;
sl@0
   543
            }
sl@0
   544
sl@0
   545
        totalPassed++;
sl@0
   546
        *outputFile << "\t\t<font color=00AF00>PASSED for file: " << uncompressedFileName << "</font><p />" << endl << endl;
sl@0
   547
        cout << " - PASSED" << endl;
sl@0
   548
        
sl@0
   549
        deleteFile(compressedFileName);
sl@0
   550
        deleteFile(decompressedFileName);
sl@0
   551
        }
sl@0
   552
    cout << "Finished test case case deflateInflateTest." << endl;
sl@0
   553
    
sl@0
   554
    return passed;
sl@0
   555
    }
sl@0
   556
sl@0
   557
/**
sl@0
   558
@SYMTestCaseID       	SYSLIB-EZLIB2-CT-4313
sl@0
   559
@SYMTestCaseDesc     	Check files deflated with EZlib can be inflated using EZlib2.
sl@0
   560
@SYMTestPriority     	High
sl@0
   561
@SYMTestActions      	1.	Open the compressed input file, which was compressed using EZlib, 
sl@0
   562
                            for reading and create a decompressed output file for writing
sl@0
   563
                        2.	Create an inflate stream and initialise it using inflateInit2().
sl@0
   564
                        3.	Inflate the input using inflate(), writing the inflated data 
sl@0
   565
                            to the decompressed output file.
sl@0
   566
                        4.	Cleanup the inflate stream and close the compressed input and 
sl@0
   567
                            decompressed output files.
sl@0
   568
                        5.	Open the compressed input file and the decompressed output 
sl@0
   569
                            file for reading.
sl@0
   570
                        6.	Compare the contents of each file using memcmp().
sl@0
   571
                        7.	Close both the files.
sl@0
   572
                        8.	Cleanup any files created during the test.
sl@0
   573
                        
sl@0
   574
                        Note: The test should be repeated for different types of files as 
sl@0
   575
                              well as different size of file e.g.:
sl@0
   576
                            •	TXT
sl@0
   577
                            •	PNG
sl@0
   578
                            •	JAR
sl@0
   579
                            •	JPG
sl@0
   580
                            •	BMP
sl@0
   581
                            •	DOC
sl@0
   582
                            •	GIF
sl@0
   583
                            •	Varying sizes of each input file should be tested starting 
sl@0
   584
                                from a couple of kilobytes up to several megabytes.
sl@0
   585
sl@0
   586
@SYMTestExpectedResults The input file used for deflating should be identical to the 
sl@0
   587
                        inflated output file.
sl@0
   588
*/
sl@0
   589
bool inflateOldZlibFilesTest()
sl@0
   590
    {
sl@0
   591
    bool passed = true;
sl@0
   592
sl@0
   593
    cout << endl << "Starting test case inflateOldZlibFilesTest:" << endl;
sl@0
   594
    for(int i = 0; i < inflateOldZlibFilesTestDataItems ; i++)
sl@0
   595
        {
sl@0
   596
        stringstream ss;
sl@0
   597
        string testNum;
sl@0
   598
        ss << (i + 1);
sl@0
   599
        ss >> testNum;
sl@0
   600
        
sl@0
   601
        cout << "Starting test " << testNum << " - File: " << inflateOldZlibFilesTestFiles[i];
sl@0
   602
        
sl@0
   603
        int extBegin = inflateOldZlibFilesTestFiles[i].find_last_of(".", inflateOldZlibFilesTestFiles[i].length());
sl@0
   604
        string fileName = inflateOldZlibFilesTestFiles[i].substr(0, extBegin);
sl@0
   605
        string fileExt = inflateOldZlibFilesTestFiles[i].substr(extBegin + 1);
sl@0
   606
        
sl@0
   607
        string uncompressedFileName(filePath + inflateOldZlibFilesTestFiles[i]);
sl@0
   608
        string compressedFileName(filePath + "ezlib_" + fileName + testNum + ".zip");
sl@0
   609
        string decompressedFileName(filePath + "ezlib_" + fileName + testNum + "_decompressed" + "." + fileExt);
sl@0
   610
sl@0
   611
        if(inflateFile(compressedFileName, decompressedFileName, 15) == false)
sl@0
   612
            {
sl@0
   613
            passed = false;
sl@0
   614
            *outputFile << "\t\t<font color=FF0000>FAILED for file: " << compressedFileName << "</font><p />" << endl << endl;
sl@0
   615
            cout << " - FAILED" << endl;
sl@0
   616
            
sl@0
   617
            deleteFile(decompressedFileName);
sl@0
   618
            continue;
sl@0
   619
            }
sl@0
   620
sl@0
   621
        if(doFilesMatch(uncompressedFileName, decompressedFileName) == false)
sl@0
   622
            {
sl@0
   623
            passed = false;
sl@0
   624
            *outputFile << "\t\t<font color=FF0000>FAILED for file: " << compressedFileName << "</font><p />" << endl << endl;
sl@0
   625
            cout << " - FAILED" << endl;
sl@0
   626
            
sl@0
   627
            deleteFile(decompressedFileName);
sl@0
   628
            continue;
sl@0
   629
            }
sl@0
   630
sl@0
   631
        totalPassed++;
sl@0
   632
        *outputFile << "\t\t<font color=00AF00>PASSED for file: " << compressedFileName << "</font><p />" << endl << endl;
sl@0
   633
        cout << " - PASSED" << endl;
sl@0
   634
        
sl@0
   635
        deleteFile(decompressedFileName);
sl@0
   636
        }
sl@0
   637
    cout << "Finished test case inflateOldZlibFilesTest." << endl;
sl@0
   638
sl@0
   639
    return passed;
sl@0
   640
    }
sl@0
   641
sl@0
   642
int main()
sl@0
   643
    {
sl@0
   644
    if(openOutputFile("basicfunctest"))
sl@0
   645
        {
sl@0
   646
        *outputFile << "\t\t<b>START TEST deflateInflateTest()</b><br />" << endl;
sl@0
   647
        if(deflateInflateTest() == false)
sl@0
   648
            {
sl@0
   649
            *outputFile << "\t\t<font color=FF0000>deflateInflateTest() FAILED!</font><br />" << endl;
sl@0
   650
            }
sl@0
   651
        else
sl@0
   652
            {
sl@0
   653
            *outputFile << "\t\t<font color=00AF00>deflateInflateTest() PASSED!</font><br />" << endl;
sl@0
   654
            }
sl@0
   655
        *outputFile << "\t\t<b>END TEST deflateInflateTest()</b><p />" << endl << endl;;
sl@0
   656
sl@0
   657
        *outputFile << "\t\t<b>START TEST inflateOldZlibFilesTest()</b><br />" << endl;
sl@0
   658
        if(inflateOldZlibFilesTest() == false)
sl@0
   659
            {
sl@0
   660
            *outputFile << "\t\t<font color=FF0000>inflateOldZlibFilesTest() FAILED!</font><br />" << endl;
sl@0
   661
            }
sl@0
   662
        else
sl@0
   663
            {
sl@0
   664
            *outputFile << "\t\t<font color=00AF00>inflateOldZlibFilesTest()  PASSED!</font><br />" << endl;
sl@0
   665
            }
sl@0
   666
        *outputFile << "\t\t<b>END TEST inflateOldZlibFilesTest()</b><p />" << endl << endl;
sl@0
   667
sl@0
   668
        printTestResults();
sl@0
   669
sl@0
   670
        closeOutputFile();
sl@0
   671
        }
sl@0
   672
sl@0
   673
    return 0;
sl@0
   674
    }