288 lines
		
	
	
		
			9.5 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			288 lines
		
	
	
		
			9.5 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
#!/bin/bash
 | 
						|
#  Copyright (C) 2015 The Android Open Source Project
 | 
						|
#
 | 
						|
#  Licensed under the Apache License, Version 2.0 (the "License");
 | 
						|
#  you may not use this file except in compliance with the License.
 | 
						|
#  You may obtain a copy of the License at
 | 
						|
#
 | 
						|
#       http://www.apache.org/licenses/LICENSE-2.0
 | 
						|
#
 | 
						|
#  Unless required by applicable law or agreed to in writing, software
 | 
						|
#  distributed under the License is distributed on an "AS IS" BASIS,
 | 
						|
#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
						|
#  See the License for the specific language governing permissions and
 | 
						|
#  limitations under the License.
 | 
						|
###################################################################
 | 
						|
## Script that generates SMS and MMS messages and fills the Android
 | 
						|
## telephony provider mmssms.db. This is used for testing SMS/MMS.
 | 
						|
###################################################################
 | 
						|
 | 
						|
AREA_CODE=605
 | 
						|
 | 
						|
TABLE_CANONICAL_ADDRESSES_START_ID=100
 | 
						|
TABLE_THREADS_START_ID=100
 | 
						|
TABLE_SMS_START_ID=1000
 | 
						|
 | 
						|
START_TIMESTAMP_IN_SECONDS=1357683093 # 1/8/2013 2:11:33 PM
 | 
						|
TIMESTAMP_INC_IN_SECONDS=120
 | 
						|
 | 
						|
PART_DIR="/data/data/com.android.providers.telephony/app_parts"
 | 
						|
 | 
						|
USAGE='fillsms [-f] [-x] <device_phone_number> <# of threads> <# of sms per thread> <# of mms per thread> <image list file> <sql file>
 | 
						|
    -f -- Only generates the SQL file, do not push to the device
 | 
						|
    -x -- Only execute a SQL file
 | 
						|
    -g -- For GB devices
 | 
						|
Examples:
 | 
						|
    # Generate 2 threads each with 10 SMSes and 10 MMSes on device with phone
 | 
						|
    # number +16508619525. MMS messages use images listed in ./images, which list
 | 
						|
    # *.jpg and *.gif files in local directory. The SQL commands are in sql.txt
 | 
						|
    fillsms +16508619525 2 10 10 images sql.txt
 | 
						|
 | 
						|
    # Same as above but only creating the SQL command file without pushing to
 | 
						|
    # device
 | 
						|
    fillsms -f +16508619525 2 10 10 images sql.txt
 | 
						|
 | 
						|
    # Just push the sql.txt to device without generating new SQLs
 | 
						|
    fillsms -x +16508619525 2 10 10 images sql.txt
 | 
						|
'
 | 
						|
 | 
						|
SMIL='<smil> <head> <layout> <root-layout height="%dpx" width="%dpx"> <region fit="meet" height="%dpx" id="Image" left="0" top="0" width="%dpx"/></root-layout> </layout> </head> <body> <par dur="5000ms"> <img region="Image" src="%s"/> </par> </body> </smil>'
 | 
						|
 | 
						|
MAX_WORDS_PER_MESSAGE=15
 | 
						|
 | 
						|
DICT=american-english
 | 
						|
 | 
						|
# don't actually run the sql on device
 | 
						|
opt_sql_only=0
 | 
						|
opt_exec_only=0
 | 
						|
opt_for_gb=0
 | 
						|
 | 
						|
while test $# -gt 0
 | 
						|
do
 | 
						|
  case $1 in
 | 
						|
    -f)
 | 
						|
      opt_sql_only=1
 | 
						|
      shift
 | 
						|
      ;;
 | 
						|
    -x)
 | 
						|
      opt_exec_only=1
 | 
						|
      shift
 | 
						|
      ;;
 | 
						|
    -g)
 | 
						|
      opt_for_gb=1
 | 
						|
      shift
 | 
						|
      ;;
 | 
						|
    *)
 | 
						|
      break;
 | 
						|
  esac
 | 
						|
done
 | 
						|
 | 
						|
 | 
						|
if [ $opt_sql_only -eq "1" -a $opt_exec_only -eq "1" ]; then
 | 
						|
  echo "-f and -x can not coexist"
 | 
						|
  echo "$USAGE"
 | 
						|
  exit 1
 | 
						|
fi
 | 
						|
 | 
						|
if [ $# -lt 6 ]; then
 | 
						|
  echo "$USAGE"
 | 
						|
  exit 1
 | 
						|
fi
 | 
						|
device_phone=$1
 | 
						|
shift
 | 
						|
num_of_threads=$1
 | 
						|
shift
 | 
						|
sms_per_thread=$1
 | 
						|
shift
 | 
						|
mms_per_thread=$1
 | 
						|
shift
 | 
						|
image_list_file=$1
 | 
						|
shift
 | 
						|
sql_file=$1
 | 
						|
shift
 | 
						|
 | 
						|
dict_lines=`wc -l < $DICT`
 | 
						|
image_files=`wc -l < $image_list_file`
 | 
						|
 | 
						|
if [ $mms_per_thread -gt "0" ]; then
 | 
						|
  if [ ! -f $image_list_file ]; then
 | 
						|
    echo "No image files for creating MMS messages"
 | 
						|
    exit 1
 | 
						|
  fi
 | 
						|
fi
 | 
						|
 | 
						|
echoerr ()
 | 
						|
{
 | 
						|
  echo "$@" 1>&2;
 | 
						|
}
 | 
						|
 | 
						|
random_value ()
 | 
						|
{
 | 
						|
  echo $(( $RANDOM % $1 + 1 ))
 | 
						|
}
 | 
						|
 | 
						|
dict_word ()
 | 
						|
{
 | 
						|
  local v=$(random_value 30000)
 | 
						|
  sed $v"q;d" $DICT
 | 
						|
}
 | 
						|
 | 
						|
gen_message ()
 | 
						|
{
 | 
						|
  local words=$(random_value $MAX_WORDS_PER_MESSAGE)
 | 
						|
  local message=
 | 
						|
  for k in `seq 1 $words`;
 | 
						|
  do
 | 
						|
    local word=$(dict_word)
 | 
						|
    message="$message $word"
 | 
						|
  done
 | 
						|
  echo $message | sed -e "s/'//g"
 | 
						|
}
 | 
						|
 | 
						|
random_image ()
 | 
						|
{
 | 
						|
  local v=$(random_value $image_files)
 | 
						|
  sed $v"q;d" $image_list_file
 | 
						|
}
 | 
						|
 | 
						|
add_sql ()
 | 
						|
{
 | 
						|
  echo $1 >> $sql_file
 | 
						|
}
 | 
						|
 | 
						|
adb_sql ()
 | 
						|
{
 | 
						|
  echo $1
 | 
						|
  adb shell sqlite3 data/data/com.android.providers.telephony/databases/mmssms.db "$1"
 | 
						|
}
 | 
						|
 | 
						|
######################################################################################
 | 
						|
######################################################################################
 | 
						|
 | 
						|
if [ $opt_exec_only -eq "0" ]; then
 | 
						|
  # clean up sql file
 | 
						|
  rm -f $sql_file
 | 
						|
 | 
						|
  # add sql to clean up database
 | 
						|
  add_sql "delete from pdu where _id>=$TABLE_SMS_START_ID;"
 | 
						|
  add_sql "delete from part where _id>=$TABLE_SMS_START_ID;"
 | 
						|
  add_sql "delete from addr where _id>=$TABLE_SMS_START_ID;"
 | 
						|
  add_sql "delete from sms where _id>=$TABLE_SMS_START_ID;"
 | 
						|
  add_sql "delete from threads where _id>=$TABLE_THREADS_START_ID;"
 | 
						|
  add_sql "delete from canonical_addresses where _id>=$TABLE_CANONICAL_ADDRESSES_START_ID;"
 | 
						|
 | 
						|
  for i in `seq 1 $num_of_threads`;
 | 
						|
  do
 | 
						|
    echo
 | 
						|
    echo "Creating thread $i ......"
 | 
						|
    echo
 | 
						|
 | 
						|
    # Get random phone number
 | 
						|
    value=$(random_value 1000)
 | 
						|
    middle=$(printf '%03d' $value)
 | 
						|
    value=$(random_value 10000)
 | 
						|
    last=$(printf '%04d' $value)
 | 
						|
    phone="+1$AREA_CODE$middle$last"
 | 
						|
    echo $phone
 | 
						|
    echo
 | 
						|
 | 
						|
    timestamp=$(( $START_TIMESTAMP_IN_SECONDS + 5 * $TIMESTAMP_INC_IN_SECONDS * $i ))
 | 
						|
 | 
						|
    # Generate threads
 | 
						|
    addr_id=$(( $TABLE_CANONICAL_ADDRESSES_START_ID + $i ))
 | 
						|
    add_sql "insert into canonical_addresses (_id,address) values ($addr_id,'$phone');"
 | 
						|
 | 
						|
    thread_id=$(( $TABLE_THREADS_START_ID + $i ))
 | 
						|
    add_sql "insert into threads (_id,date,message_count,recipient_ids,snippet,snippet_cs,read,type,error,has_attachment) values ($thread_id, $timestamp, $sms_per_thread, $addr_id, 'snippet', 0, 1, 0, 0, 0);"
 | 
						|
 | 
						|
    # Generate SMS
 | 
						|
    if [ $sms_per_thread -gt "0" ]; then
 | 
						|
      half_timestamp_inc=$(( 500 + ((($sms_per_thread + $mms_per_thread) * $TIMESTAMP_INC_IN_SECONDS) * 500 / $sms_per_thread) ))
 | 
						|
      for j in `seq 1 $sms_per_thread`;
 | 
						|
      do
 | 
						|
        message=$(gen_message)
 | 
						|
        date=$(( ( 1000 * $timestamp ) - $half_timestamp_inc * ( 2 * ($sms_per_thread - $j) + ( $i % 2 ) ) ))
 | 
						|
        message_id=$(( $TABLE_SMS_START_ID + $sms_per_thread * $i * 2 + (2 * $j) ))
 | 
						|
        message_type=$(( $j % 2 + 1 ))
 | 
						|
        add_sql "insert into sms (_id,thread_id,address,person,date,status,type,body,read,seen) values ($message_id, $thread_id, '$phone', '$phone', $date, -1, $message_type, '$message', 1, 1);"
 | 
						|
      done
 | 
						|
    fi
 | 
						|
 | 
						|
    # Generate MMS
 | 
						|
    if [ $mms_per_thread -gt "0" ]; then
 | 
						|
      half_timestamp_inc=$(( 1 + ((($sms_per_thread + $mms_per_thread) * $TIMESTAMP_INC_IN_SECONDS) / ( 2 * $mms_per_thread) ) ))
 | 
						|
      for j in `seq 1 $mms_per_thread`;
 | 
						|
      do
 | 
						|
        image_line=$(random_image)
 | 
						|
        image=`echo $image_line | awk '{ print $1 }'`
 | 
						|
        width=`echo $image_line | awk '{ print $2 }'`
 | 
						|
        height=`echo $image_line | awk '{ print $3 }'`
 | 
						|
        size=`echo $image_line | awk '{ print $4 }'`
 | 
						|
        date=$(( $timestamp - $half_timestamp_inc * ( 2 * ($mms_per_thread - $j) + ( ($i+1) % 2 ) ) ))
 | 
						|
        message_id=$(( $TABLE_SMS_START_ID + $sms_per_thread * $i * 2 + (2 * $j + 1) ))
 | 
						|
        message_type=$(( $j % 2 + 1 ))
 | 
						|
        if [ $message_type -eq '1' ]; then
 | 
						|
          m_type=132
 | 
						|
        else
 | 
						|
          m_type=128
 | 
						|
        fi
 | 
						|
        if [ $opt_for_gb -eq "0" ]; then
 | 
						|
          add_sql "insert into pdu (_id,thread_id,date,date_sent,msg_box,read,m_id,sub,sub_cs,ct_t,m_cls,m_type,v,m_size,pri,rr,tr_id,d_rpt,locked,seen,text_only) values ($message_id, $thread_id, $date, 0, $message_type, 1, 'hmma3p5s1a3m526@w.tmomail.net', 'no subject', 106, 'application/vnd.wap.multipart.related', 'personal', $m_type, 18, $size, 129, 129 , '$message_id', 129, 0, 1, 0);"
 | 
						|
        else
 | 
						|
          add_sql "insert into pdu (_id,thread_id,date,msg_box,read,m_id,sub,sub_cs,ct_t,m_cls,m_type,v,m_size,pri,rr,tr_id,d_rpt,locked,seen) values ($message_id, $thread_id, $date, $message_type, 1, 'hmma3p5s1a3m526@w.tmomail.net', 'no subject', 106, 'application/vnd.wap.multipart.related', 'personal', $m_type, 18, $size, 129, 129 , '$message_id', 129, 0, 1);"
 | 
						|
        fi
 | 
						|
        id_1=$(( $message_id ))
 | 
						|
        id_2=$(( $message_id + 1 ))
 | 
						|
        smil=$(printf "$SMIL" $height $width $height $width $image)
 | 
						|
        add_sql "insert into part (_id,mid,seq,ct,cid,cl,text) values ($id_1, $message_id, -1, 'application/smil', '<smil>', 'smil.xml', '$smil');"
 | 
						|
        image_no_suffix=${image%.*}
 | 
						|
        add_sql "insert into part (_id,mid,seq,ct,cid,cl,_data) values ($id_2, $message_id, 0, 'image/jpeg', '$image_no_suffix', '$image', '$PART_DIR/$image');"
 | 
						|
        if [ $message_type -eq '1' ]; then
 | 
						|
          add_sql "insert into addr (_id,msg_id,address,type,charset) values ($id_1, $message_id, '$phone', 137, 106);"
 | 
						|
          add_sql "insert into addr (_id,msg_id,address,type,charset) values ($id_2, $message_id, '$device_phone', 151, 106);"
 | 
						|
        else
 | 
						|
          add_sql "insert into addr (_id,msg_id,address,type,charset) values ($id_1, $message_id, 'insert-address-token', 137, 106);"
 | 
						|
          add_sql "insert into addr (_id,msg_id,address,type,charset) values ($id_2, $message_id, '$phone', 151, 106);"
 | 
						|
        fi
 | 
						|
      done
 | 
						|
    fi
 | 
						|
  done
 | 
						|
fi
 | 
						|
 | 
						|
# Push to device
 | 
						|
if [ $opt_sql_only -eq "0" ]; then
 | 
						|
  # make sure we have access
 | 
						|
  adb root
 | 
						|
 | 
						|
  # Push all local jpgs or gifs to device, being lazy here.
 | 
						|
  if [ $mms_per_thread -gt "0" ]; then
 | 
						|
    for file in `ls *.jpg *.gif`;
 | 
						|
    do
 | 
						|
      echo "adb push $file $PART_DIR/$file"
 | 
						|
      adb push $file $PART_DIR/$file
 | 
						|
    done
 | 
						|
  fi
 | 
						|
 | 
						|
  echo "adb push $sql_file /data/fillsms"
 | 
						|
  adb push $sql_file /data/fillsms
 | 
						|
  echo
 | 
						|
  adb_sql ".read /data/fillsms"
 | 
						|
  echo
 | 
						|
  adb_sql "select count(*) from canonical_addresses where _id>=$TABLE_CANONICAL_ADDRESSES_START_ID;"
 | 
						|
  echo
 | 
						|
  adb_sql "select count(*) from threads where _id>=$TABLE_THREADS_START_ID;"
 | 
						|
  echo
 | 
						|
  if [ $sms_per_thread -gt "0" ]; then
 | 
						|
    adb_sql "select count(*) from sms where _id>=$TABLE_SMS_START_ID;"
 | 
						|
    echo
 | 
						|
  fi
 | 
						|
  if [ $mms_per_thread -gt "0" ]; then
 | 
						|
    adb_sql "select count(*) from pdu where _id>=$TABLE_SMS_START_ID;"
 | 
						|
    echo
 | 
						|
    adb_sql "select count(*) from part where _id>=$TABLE_SMS_START_ID;"
 | 
						|
    echo
 | 
						|
    adb_sql "select count(*) from addr where _id>=$TABLE_SMS_START_ID;"
 | 
						|
    echo
 | 
						|
  fi
 | 
						|
fi
 |