#!/bin/bash 
 | 
#/******************************************************************/ 
 | 
#/*  Copyright (C)  ROCK-CHIPS . All Rights Reserved.       */ 
 | 
#/******************************************************************* 
 | 
#File    :   flash_stress_test.sh 
 | 
#Desc    :   flash write and read stress test tools 
 | 
#Author  :   ZYF 
 | 
#Date    :   2020-07-16 
 | 
#Notes   :     
 | 
# Revision Data       Author                                Note. 
 | 
# 1.00     2017/05/05 Zhaoyifeng                            1.First version 
 | 
# 1.10     2020/06/28 Dingqiang Lin(jon.lin@rock-chips.com) 1.Simplify test_log 2.Add more introduction 
 | 
# 1.20     2020/07/16 Hans Yang                             1.use /dev/urandom to generate test data 
 | 
#Introduction. 
 | 
#********************************************************************/ 
 | 
# usage£º 
 | 
# sudo flash_stress_test.sh dirnum testcount 
 | 
# example  £º 
 | 
#     count for script command: 
 | 
#        SLC Nand 128MB, 100K P/E cycles, normaly we test 5K P/E ¡ª¡ª 128MB * 5000 
 | 
#       src file size 5MB, totle test data 128MB * 5000, testcount = 128MB * 5000 / 5MB * 5(dirnum) = 20600 
 | 
#   command: 
 | 
#        sudo flash_stress_test.sh 5 20000 
 | 
#    available space need: 
 | 
#        src file size: 5MB 
 | 
#        des file size: 5MB * dirnum = 25MB 
 | 
#       log file size: 189B(log item size) * 20000 = 3691KB 
 | 
#                total: about 34MB 
 | 
#   result analyze: 
 | 
#        success: 
 | 
#            1. shell progress stop; 
 | 
#            2. print "-------copy and check success------------" 
 | 
#        fail: 
 | 
#            1. shell progress stop; 
 | 
#            2. any printing with "error" tag 
 | 
# 
 | 
#********************************************************************/ 
 | 
  
 | 
test_dir=/userdata/rockchip-test/flash_test 
 | 
source_dir=$test_dir/src_test_data 
 | 
dest_dir=$test_dir/des_test_data 
 | 
md5_dir=$test_dir/md5_data 
 | 
  
 | 
usage() 
 | 
{ 
 | 
echo "Usage: flash_stress_test.sh [dirnum] [looptime]" 
 | 
echo "flash_stress_test.sh 5 20000" 
 | 
} 
 | 
  
 | 
test_max_count=200 
 | 
test_max_dir=5 
 | 
if [ $1 -ne 0 ] ;then 
 | 
    test_max_dir=$1 
 | 
fi 
 | 
  
 | 
if [ $2 -ne 0 ] ;then 
 | 
    test_max_count=$2 
 | 
fi 
 | 
  
 | 
echo "Test Max dir Num = ${test_max_dir}" 
 | 
echo "Test Max count = ${test_max_count}" 
 | 
  
 | 
count=0 
 | 
dir_loop=0 
 | 
rm -rf  $test_dir/test_log.txt 
 | 
mkdir -p $dest_dir 
 | 
mkdir -p $md5_dir 
 | 
mkdir -p $source_dir 
 | 
  
 | 
#generate 5MB random file  
 | 
rm -rf  $source_dir/* 
 | 
file_path=$source_dir 
 | 
file_size=(512 1024 3456 512 1024 3456)   
 | 
file_radio=(5 5 5 5 5 5)   
 | 
   
 | 
function random()   
 | 
{   
 | 
    min=$1   
 | 
    max=$2   
 | 
    num=`date +%s`   
 | 
    ((value=$num%($max-$min)+$min+1))   
 | 
    echo $value   
 | 
}   
 | 
   
 | 
file_size_count=${#file_size[*]}   
 | 
file_radio_count=${#file_radio[*]}   
 | 
   
 | 
if [ $file_size_count=$file_radio_count  ]    
 | 
then    
 | 
    for ((i=0;i <$file_size_count;i++))   
 | 
    do   
 | 
        for  ((n=0;n <${file_radio[$i]};n++))   
 | 
        do   
 | 
            if [ $i==0 ]   
 | 
            then   
 | 
                rand=$(random 0 ${file_size[$i]})   
 | 
            else   
 | 
                rand=$(random ${file_size[$i-1]} ${file_size[$i]})   
 | 
            fi   
 | 
            dd if=/dev/urandom of=$file_path/test.$i.$rand.bin bs=$rand count=1024 
 | 
        done   
 | 
        echo ===========   
 | 
    done   
 | 
fi   
 | 
  
 | 
cd $source_dir 
 | 
  
 | 
#find ./ -type f -print0 | xargs -0 md5sum | sort > $md5_dir/source.md5 
 | 
md5sum ./* > $md5_dir/source.md5 
 | 
cd / 
 | 
while [ $count -lt $test_max_count ]; do 
 | 
    echo $count 
 | 
    echo $count >> $test_dir/test_log.txt 
 | 
    dir_loop=0 
 | 
    while [ $dir_loop -lt $test_max_dir ]; do 
 | 
    echo "$count test $source_dir to $dest_dir/${dir_loop}" 
 | 
        rm -rf  $dest_dir/$dir_loop 
 | 
        if [ $? == 0 ]; then 
 | 
            echo "$count clean $dest_dir/${dir_loop} success" 
 | 
        echo "$count clean ${dir_loop}" >> $test_dir/test_log.txt 
 | 
        else 
 | 
            echo "$count clean $dest_dir/${dir_loop} error" 
 | 
            echo "$count clean $dest_dir/${dir_loop} error" >> $test_dir/test_log.txt 
 | 
            exit 0 
 | 
        fi 
 | 
        #sync 
 | 
        #sleep 1 
 | 
        #start copy data 
 | 
        echo "$count $dir_loop start copy data" 
 | 
        cp  -rf   $source_dir $dest_dir/$dir_loop 
 | 
        if [ $? == 0 ]; then 
 | 
            echo "$count cp  $source_dir to $dest_dir/${dir_loop} success" 
 | 
        echo "$count cp ${dir_loop}" >> $test_dir/test_log.txt 
 | 
        else 
 | 
            echo "$count cp  $source_dir to $dest_dir/${dir_loop} error" 
 | 
            echo "$count cp  $source_dir to $dest_dir/${dir_loop} error" >> $test_dir/test_log.txt 
 | 
        fi 
 | 
        #sync 
 | 
        #sleep 1 
 | 
        dir_loop=$(($dir_loop+1)) 
 | 
    done 
 | 
    dir_loop=0 
 | 
    sync && echo 3 > /proc/sys/vm/drop_caches 
 | 
    sleep 5 
 | 
    sync 
 | 
    echo 3 > /proc/sys/vm/drop_caches 
 | 
    sleep 5 
 | 
    while [ $dir_loop -lt $test_max_dir ]; do 
 | 
    #calc dir md5 
 | 
        echo "$count calc $dest_dir/${dir_loop} md5 start" 
 | 
        echo "$count calc $dest_dir/${dir_loop} md5 start" >> $test_dir/test_log.txt 
 | 
        cd $dest_dir/${dir_loop} 
 | 
        #find ./ -type f -print0 | xargs -0 md5sum | sort > $md5_dir/dest${dir_loop}.md5 
 | 
        md5sum ./* > $md5_dir/dest${dir_loop}.md5 
 | 
        cd / 
 | 
        #cmp with src md5 
 | 
        diff $md5_dir/source.md5 $md5_dir/dest${dir_loop}.md5 
 | 
        if [ $? == 0 ]; then 
 | 
            echo "$count check source to $dest_dir/${dir_loop} success" 
 | 
        echo "$count check ${dir_loop}" >> $test_dir/test_log.txt 
 | 
            rm  $md5_dir/dest${dir_loop}.md5 
 | 
            rm -rf  $dest_dir/$dir_loop 
 | 
        else 
 | 
            echo "$count check source to $dest_dir/${dir_loop} error" 
 | 
            echo "$count check source to $dest_dir/${dir_loop} error" >> $test_dir/test_log.txt 
 | 
            exit 0 
 | 
        fi 
 | 
        dir_loop=$(($dir_loop+1)) 
 | 
    done 
 | 
    count=$(($count+1)) 
 | 
        #if test fail, we can save file for debug 
 | 
    #rm -rf  $test_dir/$dest_dir/* 
 | 
    echo ----------------------------------------- 
 | 
    echo "-------========You can see the result at and $test_dir/test_log.txt file=======------------" 
 | 
    echo -----------------------------------------  >> $test_dir/test_log.txt 
 | 
done 
 | 
  
 | 
    echo "-------copy and check success------------" 
 | 
    echo "-------copy and check success------------"  >> $test_dir/test_log.txt 
 | 
    echo "-------========You can see the result at and $test_dir/test_log.txt file=======------------" 
 |