| #!/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=======------------" |