// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// Unit tests for SMS message creation

#include <base/logging.h>

#include <gflags/gflags.h>
#include <gtest/gtest.h>

#include "sms_message.h"

// TODO(ers) Add more negative test cases

namespace cromo {
namespace {

TEST(CreateSmsMessage, SimpleMessage) {
  static const uint8_t kPdu[] = {
    0x07,       // length of SMSC info
    0x91,       // type of address of SMSC (E.164)
    0x21, 0x43, 0x65, 0x87, 0x09, 0xf1,  // SMSC address
    0x04,       // SMS-DELIVER
    0x0b,       // sender address length
    0x91,       // type of sender address
    0x81, 0x00, 0x55, 0x15, 0x12, 0xf2,  // sender address
    0x00,       // TP-PID protocol identifier
    0x00,       // TP-DCS data coding scheme
    0x11, 0x10, 0x10, 0x21, 0x43, 0x65, 0x00,  // TP-SCTS timestamp
    0x0a,       // TTP-UDL user data length
    // TP-UD user data:
    0xe8, 0x32, 0x9b, 0xfd, 0x46, 0x97, 0xd9, 0xec, 0x37
  };
  SmsMessageFragment* frag = SmsMessageFragment::CreateFragment(kPdu,
                                                                sizeof(kPdu),
                                                                1);

  ASSERT_TRUE(NULL != frag);
  EXPECT_EQ("+12345678901", frag->smsc_address());
  EXPECT_EQ("+18005551212", frag->sender_address());
  EXPECT_EQ("110101123456+00", frag->timestamp());
  EXPECT_EQ("hellohello", frag->text());
  EXPECT_EQ(1, frag->index());
  EXPECT_EQ(1, frag->part_count());
  EXPECT_EQ(1, frag->part_sequence());

  SmsMessage* sms = new SmsMessage(frag);
  ASSERT_TRUE(NULL != sms);
  EXPECT_EQ("+12345678901", sms->smsc_address());
  EXPECT_EQ("+18005551212", sms->sender_address());
  EXPECT_EQ("110101123456+00", sms->timestamp());
  EXPECT_EQ("hellohello", sms->GetMessageText());
  EXPECT_EQ(1, sms->index());
  EXPECT_TRUE(sms->IsComplete());
}

TEST(CreateSmsMessage, ExtendedChars) {
  static const uint8_t kPdu[] = {
    0x07,       // length of SMSC info
    0x91,       // type of address of SMSC (E.164)
    0x21, 0x04, 0x44, 0x29, 0x61, 0xf4,  // SMSC address
    0x04,       // SMS-DELIVER
    0x0b,       // sender address length
    0x91,       // type of sender address
    0x61, 0x71, 0x95, 0x72, 0x91, 0xf8,  // sender address
    0x00,       // TP-PID protocol identifier
    0x00,       // TP-DCS data coding scheme
    0x11, 0x20, 0x82, 0x11, 0x05, 0x05, 0x0a,  // TP-SCTS timestamp

    0x6a,       // TTP-UDL user data length
    // TP-UD user data:
    0xc8, 0xb2, 0xbc, 0x7c, 0x9a, 0x83, 0xc2,
    0x20, 0xf6, 0xdb, 0x7d, 0x2e, 0xcb, 0x41, 0xed,
    0xf2, 0x7c, 0x1e, 0x3e, 0x97, 0x41, 0x1b, 0xde,
    0x06, 0x75, 0x4f, 0xd3, 0xd1, 0xa0, 0xf9, 0xbb,
    0x5d, 0x06, 0x95, 0xf1, 0xf4, 0xb2, 0x9b, 0x5c,
    0x26, 0x83, 0xc6, 0xe8, 0xb0, 0x3c, 0x3c, 0xa6,
    0x97, 0xe5, 0xf3, 0x4d, 0x6a, 0xe3, 0x03, 0xd1,
    0xd1, 0xf2, 0xf7, 0xdd, 0x0d, 0x4a, 0xbb, 0x59,
    0xa0, 0x79, 0x7d, 0x8c, 0x06, 0x85, 0xe7, 0xa0,
    0x00, 0x28, 0xec, 0x26, 0x83, 0x2a, 0x96, 0x0b,
    0x28, 0xec, 0x26, 0x83, 0xbe, 0x60, 0x50, 0x78,
    0x0e, 0xba, 0x97, 0xd9, 0x6c, 0x17
  };

  SmsMessageFragment* sms = SmsMessageFragment::CreateFragment(kPdu,
                                                               sizeof(kPdu),
                                                               1);
  ASSERT_TRUE(NULL != sms);
  EXPECT_EQ("+12404492164", sms->smsc_address());
  EXPECT_EQ("+16175927198", sms->sender_address());
  EXPECT_EQ("110228115050-05", sms->timestamp());
  EXPECT_EQ("Here's a longer message [{with some extended characters}] "
            "thrown in, such as £ and ΩΠΨ and §¿ as well.", sms->text());
  EXPECT_EQ(1, sms->index());
  EXPECT_EQ(1, sms->part_count());
}

TEST(CreateSmsMessage, AlphaSenderAndUcs2Text) {
  static const uint8_t kPdu[] = {
    0x07, 0x91, 0x97, 0x30, 0x07, 0x11, 0x11, 0xf1,
    0x04, 0x14, 0xd0, 0x49, 0x37, 0xbd, 0x2c, 0x77,
    0x97, 0xe9, 0xd3, 0xe6, 0x14, 0x00, 0x08, 0x11,
    0x30, 0x92, 0x91, 0x02, 0x40, 0x61, 0x08, 0x04,
    0x42, 0x04, 0x35, 0x04, 0x41, 0x04, 0x42
  };

  SmsMessageFragment* sms = SmsMessageFragment::CreateFragment(kPdu,
                                                               sizeof(kPdu),
                                                               1);
  ASSERT_TRUE(NULL != sms);
  EXPECT_EQ("+79037011111", sms->smsc_address());
  EXPECT_EQ("InternetSMS", sms->sender_address());
  EXPECT_EQ("110329192004+04", sms->timestamp());
  EXPECT_EQ("тест", sms->text());
  EXPECT_EQ(1, sms->index());
  EXPECT_EQ(1, sms->part_count());
}

TEST(CreateSmsMessage, NonzeroPid) {
  // pid is nonzero (00 -> ff)
  static const uint8_t kPdu[] = {
    0x07,       // length of SMSC info
    0x91,       // type of address of SMSC (E.164)
    0x21, 0x43, 0x65, 0x87, 0x09, 0xf1,  // SMSC address
    0x04,       // SMS-DELIVER
    0x0b,       // sender address length
    0x91,       // type of sender address
    0x81, 0x00, 0x55, 0x15, 0x12, 0xf2,  // sender address
    0xff,       // TP-PID protocol identifier
    0x00,       // TP-DCS data coding scheme
    0x11, 0x10, 0x10, 0x21, 0x43, 0x65, 0x00,  // TP-SCTS timestamp
    0x0a,       // TTP-UDL user data length
    // TP-UD user data:
    0xe8, 0x32, 0x9b, 0xfd, 0x46, 0x97, 0xd9, 0xec, 0x37
  };

  SmsMessageFragment* sms = SmsMessageFragment::CreateFragment(kPdu,
                                                               sizeof(kPdu),
                                                               1);
  ASSERT_TRUE(NULL != sms);
  EXPECT_EQ("+12345678901", sms->smsc_address());
  EXPECT_EQ("+18005551212", sms->sender_address());
  EXPECT_EQ("110101123456+00", sms->timestamp());
  EXPECT_EQ("hellohello", sms->text());
  EXPECT_EQ(1, sms->index());
  EXPECT_EQ(1, sms->part_count());
}

TEST(CreateSmsMessage, MoreMessagesBitClear) {
  // TP-MMS is clear (04 -> 00)
  static const uint8_t kPdu[] = {
    0x07,       // length of SMSC info
    0x91,       // type of address of SMSC (E.164)
    0x21, 0x43, 0x65, 0x87, 0x09, 0xf1,  // SMSC address
    0x00,       // SMS-DELIVER (TP-MMS is clear)
    0x0b,       // sender address length
    0x91,       // type of sender address
    0x81, 0x00, 0x55, 0x15, 0x12, 0xf2,  // sender address
    0xff,       // TP-PID protocol identifier
    0x00,       // TP-DCS data coding scheme
    0x11, 0x10, 0x10, 0x21, 0x43, 0x65, 0x00,  // TP-SCTS timestamp
    0x0a,       // TTP-UDL user data length
    // TP-UD user data:
    0xe8, 0x32, 0x9b, 0xfd, 0x46, 0x97, 0xd9, 0xec, 0x37
  };

  SmsMessageFragment* sms = SmsMessageFragment::CreateFragment(kPdu,
                                                               sizeof(kPdu),
                                                               1);
  ASSERT_TRUE(NULL != sms);
  EXPECT_EQ("+12345678901", sms->smsc_address());
  EXPECT_EQ("+18005551212", sms->sender_address());
  EXPECT_EQ("110101123456+00", sms->timestamp());
  EXPECT_EQ("hellohello", sms->text());
  EXPECT_EQ(1, sms->index());
  EXPECT_EQ(1, sms->part_count());
}

TEST(CreateSmsMessage, TimeZoneOffsetGreaterThanTen) {
  static const uint8_t kPdu[] = {
    0x07,       // length of SMSC info
    0x91,       // type of address of SMSC (E.164)
    0x21, 0x43, 0x65, 0x87, 0x09, 0xf1,  // SMSC address
    0x04,       // SMS-DELIVER
    0x0b,       // sender address length
    0x91,       // type of sender address
    0x81, 0x00, 0x55, 0x15, 0x12, 0xf2,  // sender address
    0x00,       // TP-PID protocol identifier
    0x00,       // TP-DCS data coding scheme
    0x11, 0x10, 0x10, 0x21, 0x43, 0x65, 0x21,  // TP-SCTS timestamp
    0x0a,       // TTP-UDL user data length
    // TP-UD user data:
    0xe8, 0x32, 0x9b, 0xfd, 0x46, 0x97, 0xd9, 0xec, 0x37
  };
  SmsMessageFragment* sms = SmsMessageFragment::CreateFragment(kPdu,
                                                               sizeof(kPdu),
                                                               1);
  ASSERT_TRUE(NULL != sms);
  EXPECT_EQ("+12345678901", sms->smsc_address());
  EXPECT_EQ("+18005551212", sms->sender_address());
  EXPECT_EQ("110101123456+03", sms->timestamp());
  EXPECT_EQ("hellohello", sms->text());
  EXPECT_EQ(1, sms->index());
  EXPECT_EQ(1, sms->part_count());
}

TEST(CreateSmsMessage, NegativeTimeZoneOffset) {
  static const uint8_t kPdu[] = {
    0x07,       // length of SMSC info
    0x91,       // type of address of SMSC (E.164)
    0x21, 0x43, 0x65, 0x87, 0x09, 0xf1,  // SMSC address
    0x04,       // SMS-DELIVER
    0x0b,       // sender address length
    0x91,       // type of sender address
    0x81, 0x00, 0x55, 0x15, 0x12, 0xf2,  // sender address
    0x00,       // TP-PID protocol identifier
    0x00,       // TP-DCS data coding scheme
    0x11, 0x10, 0x10, 0x21, 0x43, 0x65, 0x29,  // TP-SCTS timestamp
    0x0a,       // TTP-UDL user data length
    // TP-UD user data:
    0xe8, 0x32, 0x9b, 0xfd, 0x46, 0x97, 0xd9, 0xec, 0x37
  };
  SmsMessageFragment* sms = SmsMessageFragment::CreateFragment(kPdu,
                                                               sizeof(kPdu),
                                                               1);
  ASSERT_TRUE(NULL != sms);
  EXPECT_EQ("+12345678901", sms->smsc_address());
  EXPECT_EQ("+18005551212", sms->sender_address());
  EXPECT_EQ("110101123456-03", sms->timestamp());
  EXPECT_EQ("hellohello", sms->text());
  EXPECT_EQ(1, sms->index());
  EXPECT_EQ(1, sms->part_count());
}

TEST(CreateSmsMessage, NationalSenderNumber) {
  // number is natl (91 -> 81)
  static const uint8_t kPdu[] = {
    0x07, 0x91, 0x21, 0x43, 0x65, 0x87, 0x09, 0xf1,
    0x04, 0x0b, 0x81, 0x81, 0x00, 0x55, 0x15, 0x12,
    0xf2, 0x00, 0x00, 0x11, 0x10, 0x10, 0x21, 0x43,
    0x65, 0x00, 0x0a, 0xe8, 0x32, 0x9b, 0xfd, 0x46,
    0x97, 0xd9, 0xec, 0x37
  };

  SmsMessageFragment* sms = SmsMessageFragment::CreateFragment(kPdu,
                                                               sizeof(kPdu),
                                                               1);
  ASSERT_TRUE(NULL != sms);
  EXPECT_EQ("+12345678901", sms->smsc_address());
  EXPECT_EQ("18005551212", sms->sender_address());  // no plus
  EXPECT_EQ("110101123456+00", sms->timestamp());
  EXPECT_EQ("hellohello", sms->text());
  EXPECT_EQ(1, sms->index());
  EXPECT_EQ(1, sms->part_count());
}

#define CC(x) static_cast<char>(x)
static const char kExpected8bitData[] = {
  CC(0xe8), CC(0x32), CC(0x9b), CC(0xfd), CC(0x46),
  CC(0x97), CC(0xd9), CC(0xec), CC(0x37), CC(0xde),
  CC('\0')
};
#undef CC

TEST(CreateSmsMessage, 8BitData) {
  static const uint8_t kPdu[] = {
    0x07, 0x91, 0x21, 0x43, 0x65, 0x87, 0x09, 0xf1,
    0x04, 0x0b, 0x91, 0x81, 0x00, 0x55, 0x15, 0x12,
    0xf2, 0x00, 0x04, 0x11, 0x10, 0x10, 0x21, 0x43,
    0x65, 0x00, 0x0a, 0xe8, 0x32, 0x9b, 0xfd, 0x46,
    0x97, 0xd9, 0xec, 0x37, 0xde
  };

  SmsMessageFragment* sms = SmsMessageFragment::CreateFragment(kPdu,
                                                               sizeof(kPdu),
                                                               1);
  ASSERT_TRUE(NULL != sms);
  EXPECT_EQ("+12345678901", sms->smsc_address());
  EXPECT_EQ("+18005551212", sms->sender_address());
  EXPECT_EQ("110101123456+00", sms->timestamp());
  EXPECT_EQ(kExpected8bitData, sms->text());
  EXPECT_EQ(1, sms->index());
  EXPECT_EQ(1, sms->part_count());
}

TEST(CreateSmsMessage, InsufficientUserData) {
  static const uint8_t kPdu[] = {
    0x07,       // length of SMSC info
    0x91,       // type of address of SMSC (E.164)
    0x21, 0x43, 0x65, 0x87, 0x09, 0xf1,  // SMSC address
    0x04,       // SMS-DELIVER
    0x0b,       // sender address length
    0x91,       // type of sender address
    0x81, 0x00, 0x55, 0x15, 0x12, 0xf2,  // sender address
    0x00,       // TP-PID protocol identifier
    0x00,       // TP-DCS data coding scheme
    0x11, 0x10, 0x10, 0x21, 0x43, 0x65, 0x00,  // TP-SCTS timestamp
    0x0b,       // TTP-UDL user data length (too large)
    // TP-UD user data:
    0xe8, 0x32, 0x9b, 0xfd, 0x46, 0x97, 0xd9, 0xec, 0x37
  };

  SmsMessageFragment* sms = SmsMessageFragment::CreateFragment(kPdu,
                                                               sizeof(kPdu),
                                                               1);
  EXPECT_TRUE(NULL == sms);
}

TEST(CreateSmsMessage, GroupFDataCodingScheme) {
  static const uint8_t kPdu[] = {
    0x07,        // length of SMSC info
    0x91,        // type of address of SMSC (E.164)
    0x33, 0x06, 0x09, 0x10, 0x93, 0xF0,  // SMSC address (+33 60 90 01 39 0)
    0x04,        // SMS-DELIVER
    0x04,        // address length
    0x85,        // type of address
    0x81, 0x00,  // sender address (1800)
    0x00,        // TP-PID protocol identifier
    0xF1,        // TP-DCS data coding scheme
    0x11, 0x60, 0x42, 0x31, 0x80, 0x51, 0x80,   // timestamp 11-06-24 13:08:51
    0xA0,        // TP-UDL user data length (160)
    // Content:
    0x49,
    0xB7, 0xF9, 0x0D, 0x9A, 0x1A, 0xA5, 0xA0, 0x16,
    0x68, 0xF8, 0x76, 0x9B, 0xD3, 0xE4, 0xB2, 0x9B,
    0x9E, 0x2E, 0xB3, 0x59, 0xA0, 0x3F, 0xC8, 0x5D,
    0x06, 0xA9, 0xC3, 0xED, 0x70, 0x7A, 0x0E, 0xA2,
    0xCB, 0xC3, 0xEE, 0x79, 0xBB, 0x4C, 0xA7, 0xCB,
    0xCB, 0xA0, 0x56, 0x43, 0x61, 0x7D, 0xA7, 0xC7,
    0x69, 0x90, 0xFD, 0x4D, 0x97, 0x97, 0x41, 0xEE,
    0x77, 0xDD, 0x5E, 0x0E, 0xD7, 0x41, 0xED, 0x37,
    0x1D, 0x44, 0x2E, 0x83, 0xE0, 0xE1, 0xF9, 0xBC,
    0x0C, 0xD2, 0x81, 0xE6, 0x77, 0xD9, 0xB8, 0x4C,
    0x06, 0xC1, 0xDF, 0x75, 0x39, 0xE8, 0x5C, 0x90,
    0x97, 0xE5, 0x20, 0xFB, 0x9B, 0x2E, 0x2F, 0x83,
    0xC6, 0xEF, 0x36, 0x9C, 0x5E, 0x06, 0x4D, 0x8D,
    0x52, 0xD0, 0xBC, 0x2E, 0x07, 0xDD, 0xEF, 0x77,
    0xD7, 0xDC, 0x2C, 0x77, 0x99, 0xE5, 0xA0, 0x77,
    0x1D, 0x04, 0x0F, 0xCB, 0x41, 0xF4, 0x02, 0xBB,
    0x00, 0x47, 0xBF, 0xDD, 0x65, 0x50, 0xB8, 0x0E,
    0xCA, 0xD9, 0x66
  };

  SmsMessageFragment* sms = SmsMessageFragment::CreateFragment(kPdu,
                                                               sizeof(kPdu),
                                                               1);
  ASSERT_TRUE(NULL != sms);
  EXPECT_EQ("+33609001390", sms->smsc_address());
  EXPECT_EQ("1800", sms->sender_address());
  EXPECT_EQ("110624130815+02", sms->timestamp());
  EXPECT_EQ("Info SFR - Confidentiel, à ne jamais transmettre -\r\n"
            "Voici votre nouveau mot de passe : sw2ced pour gérer "
            "votre compte SFR sur www.sfr.fr ou par téléphone au 963",
            sms->text());
  EXPECT_EQ(1, sms->index());
  EXPECT_EQ(1, sms->part_count());
}

TEST(CreateSmsMessage, GroupF8BitDataCodingScheme) {
  static const uint8_t kPdu[] = {
    0x07, 0x91, 0x21, 0x43, 0x65, 0x87, 0x09, 0xf1,
    0x04, 0x0b, 0x91, 0x81, 0x00, 0x55, 0x15, 0x12,
    0xf2, 0x00, 0xf4, 0x11, 0x10, 0x10, 0x21, 0x43,
    0x65, 0x00, 0x0a, 0xe8, 0x32, 0x9b, 0xfd, 0x46,
    0x97, 0xd9, 0xec, 0x37, 0xde
  };

  SmsMessageFragment* sms = SmsMessageFragment::CreateFragment(kPdu,
                                                               sizeof(kPdu),
                                                               1);
  ASSERT_TRUE(NULL != sms);
  EXPECT_EQ("+12345678901", sms->smsc_address());
  EXPECT_EQ("+18005551212", sms->sender_address());
  EXPECT_EQ("110101123456+00", sms->timestamp());
  EXPECT_EQ(kExpected8bitData, sms->text());
  EXPECT_EQ(1, sms->index());
  EXPECT_EQ(1, sms->part_count());
}

TEST(CreateSmsMessage, ReservedCodingScheme) {
  static const uint8_t kPdu[] = {
    0x07,       // length of SMSC info
    0x91,       // type of address of SMSC (E.164)
    0x21, 0x43, 0x65, 0x87, 0x09, 0xf1,  // SMSC address
    0x04,       // SMS-DELIVER
    0x0b,       // sender address length
    0x91,       // type of sender address
    0x81, 0x00, 0x55, 0x15, 0x12, 0xf2,  // sender address
    0x00,       // TP-PID protocol identifier
    0x0c,       // TP-DCS data coding scheme (reserved value)
    0x11, 0x10, 0x10, 0x21, 0x43, 0x65, 0x00,  // TP-SCTS timestamp
    0x0a,       // TTP-UDL user data length
    // TP-UD user data:
    0xe8, 0x32, 0x9b, 0xfd, 0x46, 0x97, 0xd9, 0xec, 0x37
  };
  SmsMessageFragment* sms = SmsMessageFragment::CreateFragment(kPdu,
                                                               sizeof(kPdu),
                                                               1);

  ASSERT_TRUE(NULL != sms);
  EXPECT_EQ("+12345678901", sms->smsc_address());
  EXPECT_EQ("+18005551212", sms->sender_address());
  EXPECT_EQ("110101123456+00", sms->timestamp());
  EXPECT_EQ("hellohello", sms->text());
  EXPECT_EQ(1, sms->index());
  EXPECT_EQ(1, sms->part_count());
}

TEST(CreateSmsMessage, UserDataHeaderWithFillBits) {
  static const uint8_t kPdu[] = {
    0x07,       // length of SMSC info
    0x91,       // type of address of SMSC (E.164)
    0x21, 0x43, 0x65, 0x87, 0x09, 0xf1,  // SMSC address
    0x44,       // SMS-DELIVER (with TP-UDHI)
    0x0b,       // sender address length
    0x91,       // type of sender address
    0x81, 0x00, 0x55, 0x15, 0x12, 0xf2,  // sender address
    0x00,       // TP-PID protocol identifier
    0x00,       // TP-DCS data coding scheme
    0x11, 0x10, 0x10, 0x21, 0x43, 0x65, 0x00,  // TP-SCTS timestamp
    0x0f,       // TTP-UDL user data length
    // user data header:
    0x3,        // user data header length
    // a single user data header information element
    0x0, 0x1, 0x2,
    // TP-UD user data (first byte has 3 fill bits):
    0x40, 0x97, 0xd9, 0xec, 0x37, 0xba, 0xcc, 0x66, 0xbf, 0x01
  };
  SmsMessageFragment* sms = SmsMessageFragment::CreateFragment(kPdu,
                                                               sizeof(kPdu),
                                                               1);

  ASSERT_TRUE(NULL != sms);
  EXPECT_EQ("+12345678901", sms->smsc_address());
  EXPECT_EQ("+18005551212", sms->sender_address());
  EXPECT_EQ("110101123456+00", sms->timestamp());
  EXPECT_EQ("hellohello", sms->text());
  EXPECT_EQ(1, sms->index());
  EXPECT_EQ(1, sms->part_count());
}

TEST(CreateSmsMessage, UserDataHeaderNoFillBits) {
  static const uint8_t kPdu[] = {
    0x07,       // length of SMSC info
    0x91,       // type of address of SMSC (E.164)
    0x13, 0x56, 0x13, 0x13, 0x13, 0xf6,
    0x40,         // SMS-DELIVER with TP-UDHI + TP-MMI
    0x04,         // sender address length
    0x85,         // type of sender address
    0x01, 0x20,   // sender address
    0x39,         // TP-PID
    0x00,         // TP-DCS
    0x11, 0x60, 0x92, 0x32, 0x23, 0x91, 0x80,     // TP-SCTS
    0xa0,         // TP-UDL (160 septets)
    0x06,         // user data header length
    0x08,         // info element ID
    0x04,         // info element data length
    0x00, 0x10, 0x02, 0x01,  // info element data
    // content:
    0xd7, 0x32,
    0x7b, 0xfd, 0x6e, 0xb3, 0x40, 0xe2, 0x32, 0x1b,
    0xf4, 0x6e, 0x83, 0xea, 0x77, 0x90, 0xf5, 0x9d,
    0x1e, 0x97, 0xdb, 0xe1, 0x34, 0x1b, 0x44, 0x2f,
    0x83, 0xc4, 0x65, 0x76, 0x3d, 0x3d, 0xa7, 0x97,
    0xe5, 0x65, 0x37, 0xc8, 0x1d, 0x0e, 0xcb, 0x41,
    0xab, 0x59, 0xcc, 0x16, 0x93, 0xc1, 0x60, 0x31,
    0xd9, 0x6c, 0x06, 0x42, 0x41, 0xe5, 0x65, 0x68,
    0x38, 0xaf, 0x03, 0xa9, 0x62, 0x30, 0x98, 0x2a,
    0x26, 0x9b, 0xcd, 0x46, 0x29, 0x17, 0xc8, 0xfa,
    0x4e, 0x8f, 0xcb, 0xed, 0x70, 0x9a, 0x0d, 0x7a,
    0xbb, 0xe9, 0xf6, 0xb0, 0xfb, 0x5c, 0x76, 0x83,
    0xd2, 0x73, 0x50, 0x98, 0x4d, 0x4f, 0xab, 0xc9,
    0xa0, 0xb3, 0x3c, 0x4c, 0x4f, 0xcf, 0x5d, 0x20,
    0xeb, 0xfb, 0x2d, 0x07, 0x9d, 0xcb, 0x62, 0x79,
    0x3d, 0xbd, 0x06, 0xd9, 0xc3, 0x6e, 0x50, 0xfb,
    0x2d, 0x4e, 0x97, 0xd9, 0xa0, 0xb4, 0x9b, 0x5e,
    0x96, 0xbb, 0xcb
  };
  SmsMessageFragment* frag = SmsMessageFragment::CreateFragment(kPdu,
                                                                sizeof(kPdu),
                                                                1);

  ASSERT_TRUE(NULL != frag);
  EXPECT_EQ("+31653131316", frag->smsc_address());
  EXPECT_EQ("1002", frag->sender_address());
  EXPECT_EQ("110629233219+02", frag->timestamp());
  EXPECT_EQ("Welkom, bel om uw Voicemail te beluisteren naar +31612001233"
            " (PrePay: *100*1233#). Voicemail ontvangen is altijd gratis."
            " Voor gebruik van mobiel interne", frag->text());
  EXPECT_EQ(1, frag->index());
  EXPECT_EQ(0x0010, frag->part_reference());
  EXPECT_EQ(2, frag->part_count());
  EXPECT_EQ(1, frag->part_sequence());

  SmsMessage* sms = new SmsMessage(frag);
  EXPECT_EQ("+31653131316", sms->smsc_address());
  EXPECT_EQ("1002", sms->sender_address());
  EXPECT_EQ("110629233219+02", sms->timestamp());
  EXPECT_EQ("Welkom, bel om uw Voicemail te beluisteren naar +31612001233"
            " (PrePay: *100*1233#). Voicemail ontvangen is altijd gratis."
            " Voor gebruik van mobiel interne", sms->GetMessageText());
  EXPECT_FALSE(sms->IsComplete());
  EXPECT_EQ(0x0010, sms->part_reference());
}

TEST(CreateSmsMessage, TwoPart) {
  static const uint8_t kPdu1[] = {
    0x07, 0x91, 0x41, 0x40, 0x54, 0x05, 0x10, 0xf0,
    0x44, 0x0b, 0x91, 0x61, 0x71, 0x05, 0x64, 0x29,
    0xf5, 0x00, 0x00, 0x11, 0x01, 0x52, 0x41, 0x04,
    0x41, 0x8a, 0xa0, 0x05, 0x00, 0x03, 0x9c, 0x02,
    0x01, 0xa8, 0xe8, 0xf4, 0x1c, 0x94, 0x9e, 0x83,
    0xc2, 0x20, 0x7a, 0x79, 0x4e, 0x77, 0x29, 0x82,
    0xa0, 0x3b, 0x3a, 0x4c, 0xff, 0x81, 0x82, 0x20,
    0x7a, 0x79, 0x4e, 0x77, 0x81, 0xa8, 0xe8, 0xf4,
    0x1c, 0x94, 0x9e, 0x83, 0xde, 0x6e, 0x76, 0x1e,
    0x14, 0x06, 0xd1, 0xcb, 0x73, 0xba, 0x4b, 0x01,
    0xa2, 0xa2, 0xd3, 0x73, 0x50, 0x7a, 0x0e, 0x0a,
    0x83, 0xe8, 0xe5, 0x39, 0xdd, 0xa5, 0x08, 0x82,
    0xee, 0xe8, 0x30, 0xfd, 0x07, 0x0a, 0x82, 0xe8,
    0xe5, 0x39, 0xdd, 0x05, 0xa2, 0xa2, 0xd3, 0x73,
    0x50, 0x7a, 0x0e, 0x7a, 0xbb, 0xd9, 0x79, 0x50,
    0x18, 0x44, 0x2f, 0xcf, 0xe9, 0x2e, 0x05, 0x88,
    0x8a, 0x4e, 0xcf, 0x41, 0xe9, 0x39, 0x28, 0x0c,
    0xa2, 0x97, 0xe7, 0x74, 0x97, 0x22, 0x08, 0xba,
    0xa3, 0xc3, 0xf4, 0x1f, 0x28, 0x08, 0xa2, 0x97,
    0xe7, 0x74, 0x17, 0x88, 0x8a, 0x4e, 0xcf, 0x41,
    0xe9, 0x39, 0xe8, 0xed, 0x66, 0xe7, 0x41
  };

  static const uint8_t kPdu2[] = {
    0x07, 0x91, 0x41, 0x40, 0x54, 0x05, 0x10, 0xf1,
    0x44, 0x0b, 0x91, 0x61, 0x71, 0x05, 0x64, 0x29,
    0xf5, 0x00, 0x00, 0x11, 0x01, 0x52, 0x41, 0x04,
    0x51, 0x8a, 0x1d, 0x05, 0x00, 0x03, 0x9c, 0x02,
    0x02, 0xc2, 0x20, 0x7a, 0x79, 0x4e, 0x77, 0x81,
    0xa6, 0xe5, 0xf1, 0xdb, 0x4d, 0x06, 0xb5, 0xcb,
    0xf3, 0x79, 0xf8, 0x5c, 0x06,
  };

  SmsMessageFragment* frag1 = SmsMessageFragment::CreateFragment(kPdu1,
                                                                 sizeof(kPdu1),
                                                                 1);

  ASSERT_TRUE(NULL != frag1);
  EXPECT_EQ("+14044550010", frag1->smsc_address());
  EXPECT_EQ("+16175046925", frag1->sender_address());
  EXPECT_EQ("111025144014-07", frag1->timestamp());
  const char frag1_text[] =
      "This is a test.\n"
      "A what? A test. This is only a test.\n"
      " This is a test.\n"
      "A what? A test. This is only a test.\n"
      " This is a test.\n"
      "A what? A test. This is only ";
  EXPECT_EQ(frag1_text, frag1->text());
  EXPECT_EQ(1, frag1->index());
  EXPECT_EQ(156, frag1->part_reference());
  EXPECT_EQ(2, frag1->part_count());
  EXPECT_EQ(1, frag1->part_sequence());

  SmsMessageFragment* frag2 = SmsMessageFragment::CreateFragment(kPdu2,
                                                                 sizeof(kPdu2),
                                                                 2);
  ASSERT_TRUE(NULL != frag2);
  EXPECT_EQ("+14044550011", frag2->smsc_address());
  EXPECT_EQ("+16175046925", frag2->sender_address());
  EXPECT_EQ("111025144015-07", frag2->timestamp());
  EXPECT_EQ("a test. Second message", frag2->text());
  EXPECT_EQ(2, frag2->index());
  EXPECT_EQ(156, frag2->part_reference());
  EXPECT_EQ(2, frag2->part_count());
  EXPECT_EQ(2, frag2->part_sequence());

  SmsMessage* sms = new SmsMessage(frag1);

  ASSERT_TRUE(NULL != sms);
  EXPECT_FALSE(sms->IsComplete());

  sms->AddFragment(frag2);
  EXPECT_EQ("+14044550010", sms->smsc_address());
  EXPECT_EQ("+16175046925", sms->sender_address());
  EXPECT_EQ("111025144014-07", sms->timestamp());
  const char sms_text[] =
      "This is a test.\n"
      "A what? A test. This is only a test.\n"
      " This is a test.\n"
      "A what? A test. This is only a test.\n"
      " This is a test.\n"
      "A what? A test. This is only a test. Second message";
  EXPECT_EQ(sms_text, sms->GetMessageText());
  EXPECT_EQ(1, sms->index());
  EXPECT_EQ(156, sms->part_reference());
  EXPECT_TRUE(sms->IsComplete());

  SmsMessage* sms2 = new SmsMessage(frag2);
  ASSERT_TRUE(NULL != sms2);
  EXPECT_FALSE(sms2->IsComplete());

  sms2->AddFragment(frag1);
  EXPECT_EQ("+14044550011", sms2->smsc_address());
  EXPECT_EQ("+16175046925", sms2->sender_address());
  EXPECT_EQ("111025144015-07", sms2->timestamp());
  EXPECT_EQ(sms_text, sms2->GetMessageText());
  EXPECT_EQ(2, sms2->index());
  EXPECT_EQ(156, sms2->part_reference());
  EXPECT_TRUE(sms2->IsComplete());
}


TEST(CreateSmsMessage, NonIntlSMSC) {
  static const uint8_t kPdu[] = {
    0x03,        // length of SMSC info
    0x80,        // type of address of SMSC (unknown)
    0x98, 0x06,  // SMSC address
    0x04,        // SMS-DELIVER
    0x04,        // sender address length
    0x80,        // type of sender address (unknown)
    0x98, 0x06,  // sender address
    0x00,        // TP-PID protocol identifier
    0xf0,        // TP-DCS data coding scheme
    0x21, 0x20, 0x11, 0x12, 0x74, 0x12, 0x00,  // TP-SCTS timestamp
    0x0a,        // TP-UDL user data length
    // TP-UD user data:
    0xe8, 0x32, 0x9b, 0xfd, 0x46, 0x97, 0xd9, 0xec, 0x37
  };

  SmsMessageFragment* sms = SmsMessageFragment::CreateFragment(kPdu,
                                                               sizeof(kPdu),
                                                               1);
  ASSERT_TRUE(NULL != sms);
  EXPECT_EQ("8960", sms->smsc_address());
  EXPECT_EQ("8960", sms->sender_address());
  EXPECT_EQ("120211214721+00", sms->timestamp());
  EXPECT_EQ("hellohello", sms->text());
  EXPECT_EQ(1, sms->index());
  EXPECT_EQ(1, sms->part_count());
}

}  // namespace
}  // namespace cromo

int main(int argc, char* argv[]) {
  testing::InitGoogleTest(&argc, argv);
  google::ParseCommandLineFlags(&argc, &argv, true);

  return RUN_ALL_TESTS();
}
