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