Login   Register  
PHP Classes
elePHPant
Icontem

File: test.php

Recommend this page to a friend!
Stumble It! Stumble It! Bookmark in del.icio.us Bookmark in del.icio.us
  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: 2010-03-15 20:04
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($f18096)) {
        
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$offsetSEEK_SET);
        
fseek($fi$offsetSEEK_SET);
       
        
/* random data */
        
$bytes rand(11024);
        
$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$offsetSEEK_SET);
        
fseek($fi$offsetSEEK_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$file250);
}
// }}}

// 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(400001000000);
    for (
$i=0$i $size$i++) {
        
fwrite($fpsha1(($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
 */