PHP Classes

File: test.php

Recommend this page to a friend!
  Classes of Cesar D. Rodas   MongoFS   test.php   Download  
File: test.php
Role: Unit test script
Content type: text/plain
Description: Testing file
Class: MongoFS
Store and get data in MongoDB GridFS like files
Author: By
Last change:
Date: 14 years ago
Size: 7,003 bytes
 

Contents

Class file image Download
<?php
/*
  +---------------------------------------------------------------------------------+
  | Copyright (c) 2010 ActiveMongo |
  +---------------------------------------------------------------------------------+
  | 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. |
  | |
  | 3. All advertising materials mentioning features or use of this software |
  | must display the following acknowledgement: |
  | This product includes software developed by César D. Rodas. |
  | |
  | 4. Neither the name of the César D. Rodas nor the |
  | names of its contributors may be used to endorse or promote products |
  | derived from this software without specific prior written permission. |
  | |
  | THIS SOFTWARE IS PROVIDED BY CÉSAR D. RODAS ''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 CÉSAR D. RODAS 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 |
  +---------------------------------------------------------------------------------+
  | Authors: César Rodas <crodas@php.net> |
  +---------------------------------------------------------------------------------+
*/

require "MongoFS.php";

/* Ejemplo */
MongoFS::connect("mongofs", "localhost");

define("RAND_OPERATIONS", 30000);

try {
   
$localfile = generate_test_file();
   
$remotefile = "gridfs://testing.bin";
   
$tmpfile = tempnam("/tmp/", "mongofs");

    print
"Uploading file to MongoDB\n";
   
do_stream_copy($localfile, $remotefile);
    print
"\tOK\n";

    print
"Downloading file\n";
   
do_stream_copy($remotefile, $tmpfile);
    print
"\tOK\n";

    print
"Comparing local and remote files\n";
   
stream_cmp($tmpfile, $localfile);
    print
"\tOK\n";


    print
"Random reading\n";
   
partial_reading($tmpfile, $remotefile);
    print
"\tOK\n";

    print
"Random writing\n";
   
partial_writing($tmpfile, $remotefile);
    print
"\tOK\n";

} catch (
Exception $e) {
    echo
"\tFAILED:";
    echo
$e->getMessage()."\n";
}

/* delete files */
unlink($remotefile);
unlink($tmpfile);
unlink($localfile);

// do_stream_copy($source, $dest) {{{
function do_stream_copy($source, $dest)
{
   
$f1 = fopen($source, "r");
   
$f2 = fopen($dest, "w");

    while (
$data = fread($f1, 8096)) {
       
fwrite($f2, $data);
    }
   
fclose($f1);
   
fclose($f2);
}
// }}}

// bool partial_reading(string $file1, string $file2) {{{
function partial_reading($file1, $file2)
{
   
$fi = fopen($file1, "r");
   
$fp = fopen($file2, "r");

   
$max = filesize($file1);

    for (
$i=0; $i < RAND_OPERATIONS; $i++) {
       
/* random offset */
       
$offset = rand(0, $max);
       
fseek($fp, $offset, SEEK_SET);
       
fseek($fi, $offset, SEEK_SET);
      
       
/* random data */
       
$bytes = rand(1, 1024);
       
$data1 = fread($fp, $bytes);
       
$data2 = fread($fi, $bytes);
        if (
$data1 !== $data2) {
            throw new
Exception("File mismatch at position $offset");
        }
    }
   
fclose($fp);
   
fclose($fi);
}
// }}}

// bool partial_writing(string $file1, string $file2) {{{
function partial_writing($file1, $file2)
{
   
$fi = fopen($file1, "r+");
   
$fp = fopen($file2, "r+");

   
$max = filesize($file1);

    for (
$i=0; $i < RAND_OPERATIONS; $i++) {
       
/* random offset */
       
$offset = rand(0, $max);
       
fseek($fp, $offset, SEEK_SET);
       
fseek($fi, $offset, SEEK_SET);
      
       
/* random data */
       
$data = strtoupper(sha1(microtime()));
       
$data .= strtoupper(sha1(microtime()));

       
fwrite($fi, $data);
       
fwrite($fp, $data);

    }

   
fclose($fp);
   
fclose($fi);

    return
stream_cmp($file1, $file2, 50);
}
// }}}

// bool stream_cmp($file1, $file2, $bytes) {{{
function stream_cmp($file1, $file2, $bytes = 8096)
{
   
$size1 = filesize($file1);
   
$size2 = filesize($file2);
    if (
$size1 != $size2) {
        throw new
Exception("file size mismatch {$size1} != {$size2}");
    }

   
$f1 = fopen($file1, "r");
   
$f2 = fopen($file2, "r");

    while (!
feof($f2) && !feof($f1)) {
       
$data2 = fread($f2, $bytes);
       
$data1 = fread($f1, $bytes);
        if (
$data1 !== $data2) {
            for (
$i=0; $i < $bytes; $i++) {
                if (
$data1[$i] != $data2[$i]) {
                    break;
                }
            }
           
var_dump(array($data1, $data2));
            throw new
exception("File mismatch at position ".(ftell($f1)+$i));
        }
    }

    if (
feof($f2) !== feof($f1)) {
       
var_dump("Unexpected offset error");
       
//throw new Exception("Unexpected offset error");
   
}
    if (
sha1_file($file1) !== sha1_file($file2)) {
        throw new
Exception("SHA1 mismatch");
    }
   
fclose($f2);
   
fclose($f1);
}
// }}}

// string generate_test_file() {{{
function generate_test_file()
{
    echo
"Creating random file\n\t";
   
$fname = tempnam("/tmp/", "mongofs");
   
$fp = fopen($fname, "w");
    if (!
$fp) {
        throw new
Exception("Error while creating testing file");
    }
   
$size = rand(40000, 1000000);
    for (
$i=0; $i < $size; $i++) {
       
fwrite($fp, sha1(($i * $size)));
    }
   
fclose($fp);
    echo
"Done\n";
    return
$fname;
}
// }}}

/*
 * Local variables:
 * tab-width: 4
 * c-basic-offset: 4
 * End:
 * vim600: sw=4 ts=4 fdm=marker
 * vim<600: sw=4 ts=4
 */