// Copyright (c) 2013 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.

#include "shill/cellular_operator_info.h"

#include <base/file_util.h>
#include <gtest/gtest.h>

#include "shill/glib.h"

using base::FilePath;
using std::map;
using std::string;
using std::vector;

namespace shill {

namespace {

const char kTestInfoFileContent[] =
    "#\n"
    "# Comments\n"
    "#\n"
    "serviceproviders:3.0\n"
    "country:us\n"
    "\n"
    "# TestProvider1\n"
    "provider:1,1,0,1\n"
    "identifier:provider1identifier\n"
    "name:,TestProvider1\n"
    "mccmnc:000001,0,000002,0\n"
    "sid:1,0,2,0,3,0\n"
    "olp:POST,https://testurl,imei=${imei}&iccid=${iccid}\n"
    "apn:2,testprovider1apn,,\n"
    "name:en,Test Provider 1\n"
    "name:de,Testmobilfunkanbieter 1\n"
    "\n"
    "# TestProvider2\n"
    "provider:1,2,1,0\n"
    "identifier:provider2identifier\n"
    "name:,TestProviderTwo\n"
    "name:,TestProvider2\n"
    "mccmnc:100001,1,100002,0\n"
    "sid:4,0,5,1\n"
    "olp:,https://testurl2,\n"
    "olp:,https://testurl3,\n"
    "apn:1,testprovider2apn,,\n"
    "name:,Test Provider 2\n"
    "apn:1,testprovider2apn2,testusername,testpassword\n"
    "name:tr,Test Operatoru 2\n";

}  // namespace

class CellularOperatorInfoTest : public testing::Test {
 public:
  CellularOperatorInfoTest() {}

 protected:
  void SetUp() {
    ASSERT_TRUE(file_util::CreateTemporaryFile(&info_file_path_));
    ASSERT_EQ(arraysize(kTestInfoFileContent),
              file_util::WriteFile(info_file_path_, kTestInfoFileContent,
                                   arraysize(kTestInfoFileContent)));
  }

  void TruncateFile() {
    FILE *file = file_util::OpenFile(info_file_path_, "rw");
    file_util::TruncateFile(file);
    file_util::CloseFile(file);
  }

  void WriteToFile(const char *content) {
    ASSERT_EQ(strlen(content),
              file_util::WriteFile(info_file_path_, content, strlen(content)));
  }

  void TruncateAndWriteToFile(const char *content) {
    TruncateFile();
    WriteToFile(content);
  }

  void TearDown() {
    ASSERT_TRUE(file_util::Delete(info_file_path_, false));
  }

  GLib glib_;
  FilePath info_file_path_;
  CellularOperatorInfo info_;
};

TEST_F(CellularOperatorInfoTest, ParseSuccess) {
  EXPECT_TRUE(info_.Load(info_file_path_));
  EXPECT_EQ(2, info_.operators().size());

  const CellularOperatorInfo::CellularOperator *provider = info_.operators()[0];
  EXPECT_FALSE(provider->is_primary());
  EXPECT_TRUE(provider->requires_roaming());
  EXPECT_EQ("us", provider->country());
  EXPECT_EQ("provider1identifier", provider->identifier());
  EXPECT_EQ(1, provider->name_list().size());
  EXPECT_TRUE(provider->name_list()[0].language.empty());
  EXPECT_EQ("TestProvider1", provider->name_list()[0].name);
  EXPECT_EQ(2, provider->mccmnc_list().size());
  EXPECT_EQ("000001", provider->mccmnc_list()[0]);
  EXPECT_EQ("000002", provider->mccmnc_list()[1]);
  EXPECT_EQ(3, provider->sid_list().size());
  EXPECT_EQ("1", provider->sid_list()[0]);
  EXPECT_EQ("2", provider->sid_list()[1]);
  EXPECT_EQ("3", provider->sid_list()[2]);
  EXPECT_EQ(1, provider->olp_list().size());
  EXPECT_EQ("https://testurl", provider->olp_list()[0]->GetURL());
  EXPECT_EQ("POST", provider->olp_list()[0]->GetMethod());
  EXPECT_EQ("imei=${imei}&iccid=${iccid}",
            provider->olp_list()[0]->GetPostData());
  EXPECT_EQ(1, provider->apn_list().size());
  EXPECT_EQ("testprovider1apn", provider->apn_list()[0]->apn);
  EXPECT_TRUE(provider->apn_list()[0]->username.empty());
  EXPECT_TRUE(provider->apn_list()[0]->password.empty());
  EXPECT_EQ(2, provider->apn_list()[0]->name_list.size());
  EXPECT_EQ("en", provider->apn_list()[0]->name_list[0].language);
  EXPECT_EQ("Test Provider 1", provider->apn_list()[0]->name_list[0].name);
  EXPECT_EQ("de", provider->apn_list()[0]->name_list[1].language);
  EXPECT_EQ("Testmobilfunkanbieter 1",
            provider->apn_list()[0]->name_list[1].name);

  const CellularOperatorInfo::CellularOperator *provider2 =
      info_.operators()[1];
  EXPECT_TRUE(provider2->is_primary());
  EXPECT_FALSE(provider2->requires_roaming());
  EXPECT_EQ("us", provider2->country());
  EXPECT_EQ("provider2identifier", provider2->identifier());
  EXPECT_EQ(2, provider2->name_list().size());
  EXPECT_TRUE(provider2->name_list()[0].language.empty());
  EXPECT_EQ("TestProviderTwo", provider2->name_list()[0].name);
  EXPECT_TRUE(provider2->name_list()[1].language.empty());
  EXPECT_EQ("TestProvider2", provider2->name_list()[1].name);
  EXPECT_EQ(2, provider2->mccmnc_list().size());
  EXPECT_EQ("100001", provider2->mccmnc_list()[0]);
  EXPECT_EQ("100002", provider2->mccmnc_list()[1]);
  EXPECT_EQ(2, provider2->sid_list().size());
  EXPECT_EQ("4", provider2->sid_list()[0]);
  EXPECT_EQ("5", provider2->sid_list()[1]);
  EXPECT_EQ(2, provider2->olp_list().size());
  EXPECT_EQ("https://testurl2", provider2->olp_list()[0]->GetURL());
  EXPECT_TRUE(provider2->olp_list()[0]->GetMethod().empty());
  EXPECT_TRUE(provider2->olp_list()[0]->GetPostData().empty());
  EXPECT_EQ("https://testurl3", provider2->olp_list()[1]->GetURL());
  EXPECT_TRUE(provider2->olp_list()[1]->GetMethod().empty());
  EXPECT_TRUE(provider2->olp_list()[1]->GetPostData().empty());
  EXPECT_EQ(2, provider2->apn_list().size());
  EXPECT_EQ("testprovider2apn", provider2->apn_list()[0]->apn);
  EXPECT_TRUE(provider2->apn_list()[0]->username.empty());
  EXPECT_TRUE(provider2->apn_list()[0]->password.empty());
  EXPECT_EQ(1, provider2->apn_list()[0]->name_list.size());
  EXPECT_TRUE(provider2->apn_list()[0]->name_list[0].language.empty());
  EXPECT_EQ("Test Provider 2",
            provider2->apn_list()[0]->name_list[0].name);
  EXPECT_EQ("testprovider2apn2", provider2->apn_list()[1]->apn);
  EXPECT_EQ("testusername", provider2->apn_list()[1]->username);
  EXPECT_EQ("testpassword", provider2->apn_list()[1]->password);
  EXPECT_EQ(1, provider2->apn_list()[1]->name_list.size());
  EXPECT_EQ("tr", provider2->apn_list()[1]->name_list[0].language);
  EXPECT_EQ("Test Operatoru 2",
            provider2->apn_list()[1]->name_list[0].name);
}

TEST_F(CellularOperatorInfoTest, GetCellularOperatorByMCCMNC) {
  EXPECT_TRUE(info_.Load(info_file_path_));

  EXPECT_FALSE(info_.GetCellularOperatorByMCCMNC("1"));
  EXPECT_FALSE(info_.GetCellularOperatorByMCCMNC("000003"));
  EXPECT_FALSE(info_.GetCellularOperatorByMCCMNC("bananas"));
  EXPECT_FALSE(info_.GetCellularOperatorByMCCMNC("abcd"));

  const CellularOperatorInfo::CellularOperator *provider = NULL;
  EXPECT_TRUE((provider = info_.GetCellularOperatorByMCCMNC("000001")));
  EXPECT_EQ(info_.operators()[0], provider);
  EXPECT_TRUE((provider = info_.GetCellularOperatorByMCCMNC("100001")));
  EXPECT_EQ(info_.operators()[1], provider);
  EXPECT_TRUE((provider = info_.GetCellularOperatorByMCCMNC("000002")));
  EXPECT_EQ(info_.operators()[0], provider);
  EXPECT_TRUE((provider = info_.GetCellularOperatorByMCCMNC("100002")));
  EXPECT_EQ(info_.operators()[1], provider);
}

TEST_F(CellularOperatorInfoTest, GetCellularOperatorBySID) {
  EXPECT_TRUE(info_.Load(info_file_path_));

  EXPECT_FALSE(info_.GetCellularOperatorBySID("000001"));
  EXPECT_FALSE(info_.GetCellularOperatorBySID("000002"));
  EXPECT_FALSE(info_.GetCellularOperatorBySID("100001"));
  EXPECT_FALSE(info_.GetCellularOperatorBySID("100002"));
  EXPECT_FALSE(info_.GetCellularOperatorBySID("banana"));

  const CellularOperatorInfo::CellularOperator *provider = NULL;
  EXPECT_TRUE((provider = info_.GetCellularOperatorBySID("1")));
  EXPECT_EQ(info_.operators()[0], provider);
  EXPECT_TRUE((provider = info_.GetCellularOperatorBySID("4")));
  EXPECT_EQ(info_.operators()[1], provider);
  EXPECT_TRUE((provider = info_.GetCellularOperatorBySID("2")));
  EXPECT_EQ(info_.operators()[0], provider);
  EXPECT_TRUE((provider = info_.GetCellularOperatorBySID("5")));
  EXPECT_EQ(info_.operators()[1], provider);
  EXPECT_TRUE((provider = info_.GetCellularOperatorBySID("3")));
  EXPECT_EQ(info_.operators()[0], provider);
}

TEST_F(CellularOperatorInfoTest, GetCellularOperators) {
  EXPECT_TRUE(info_.Load(info_file_path_));

  const vector<const CellularOperatorInfo::CellularOperator *> *list = NULL;
  EXPECT_FALSE(info_.GetCellularOperators("banana"));
  EXPECT_FALSE(info_.GetCellularOperators("TestProvider2"));

  EXPECT_TRUE((list = info_.GetCellularOperators("TestProvider1")));
  EXPECT_EQ(1, list->size());
  EXPECT_EQ("testprovider1apn", (*list)[0]->apn_list()[0]->apn);

  EXPECT_FALSE(info_.GetCellularOperators("TestProvider2"));

  EXPECT_TRUE((list = info_.GetCellularOperators("TestProviderTwo")));
  EXPECT_EQ(1, list->size());
  EXPECT_EQ("testprovider2apn", (*list)[0]->apn_list()[0]->apn);
}

TEST_F(CellularOperatorInfoTest, GetOLPByMCCMNC) {
  EXPECT_TRUE(info_.Load(info_file_path_));

  const CellularService::OLP *olp = NULL;
  EXPECT_TRUE((olp = info_.GetOLPByMCCMNC("000001")));
  EXPECT_EQ("https://testurl", olp->GetURL());
  EXPECT_EQ("POST", olp->GetMethod());
  EXPECT_EQ("imei=${imei}&iccid=${iccid}", olp->GetPostData());

  EXPECT_TRUE((olp = info_.GetOLPByMCCMNC("000002")));
  EXPECT_EQ("https://testurl", olp->GetURL());
  EXPECT_EQ("POST", olp->GetMethod());
  EXPECT_EQ("imei=${imei}&iccid=${iccid}", olp->GetPostData());

  EXPECT_TRUE((olp = info_.GetOLPByMCCMNC("100001")));
  EXPECT_EQ("https://testurl3", olp->GetURL());
  EXPECT_TRUE(olp->GetMethod().empty());
  EXPECT_TRUE(olp->GetPostData().empty());

  EXPECT_TRUE((olp = info_.GetOLPByMCCMNC("100002")));
  EXPECT_EQ("https://testurl2", olp->GetURL());
  EXPECT_TRUE(olp->GetMethod().empty());
  EXPECT_TRUE(olp->GetPostData().empty());

  EXPECT_FALSE(info_.GetOLPByMCCMNC("000003"));
  EXPECT_FALSE(info_.GetOLPByMCCMNC("000004"));
}

TEST_F(CellularOperatorInfoTest, GetOLPBySID) {
  EXPECT_TRUE(info_.Load(info_file_path_));

  const CellularService::OLP *olp = NULL;
  EXPECT_TRUE((olp = info_.GetOLPBySID("1")));
  EXPECT_EQ("https://testurl", olp->GetURL());
  EXPECT_EQ("POST", olp->GetMethod());
  EXPECT_EQ("imei=${imei}&iccid=${iccid}", olp->GetPostData());

  EXPECT_TRUE((olp = info_.GetOLPBySID("2")));
  EXPECT_EQ("https://testurl", olp->GetURL());
  EXPECT_EQ("POST", olp->GetMethod());
  EXPECT_EQ("imei=${imei}&iccid=${iccid}", olp->GetPostData());

  EXPECT_TRUE((olp = info_.GetOLPBySID("3")));
  EXPECT_EQ("https://testurl", olp->GetURL());
  EXPECT_EQ("POST", olp->GetMethod());
  EXPECT_EQ("imei=${imei}&iccid=${iccid}", olp->GetPostData());

  EXPECT_TRUE((olp = info_.GetOLPBySID("4")));
  EXPECT_EQ("https://testurl2", olp->GetURL());
  EXPECT_TRUE(olp->GetMethod().empty());
  EXPECT_TRUE(olp->GetPostData().empty());

  EXPECT_TRUE((olp = info_.GetOLPBySID("5")));
  EXPECT_EQ("https://testurl3", olp->GetURL());
  EXPECT_TRUE(olp->GetMethod().empty());
  EXPECT_TRUE(olp->GetPostData().empty());

  EXPECT_FALSE(info_.GetOLPBySID("6"));
  EXPECT_FALSE(info_.GetOLPBySID("7"));
}

TEST_F(CellularOperatorInfoTest, BadServiceProvidersLine) {
  TruncateFile();

  // Invalid first line.
  TruncateAndWriteToFile(
      "# Bla bla bla\n"
      "# Blabbidy boo\n"
      "serviceproviders:2.3\n");
  EXPECT_FALSE(info_.Load(info_file_path_));

  // Valid first line
  TruncateAndWriteToFile(
      "# Bla bla bla\n"
      "# Blabbidy boo\n"
      "serviceproviders:3.0\n");
  EXPECT_TRUE(info_.Load(info_file_path_));
}

TEST_F(CellularOperatorInfoTest, HandleProvider) {
  // Invalid provider entry
  TruncateAndWriteToFile(
      "serviceproviders:3.0\n"
      "# Invalid provider entry\n"
      "provider:0,0,0\n");
  EXPECT_FALSE(info_.Load(info_file_path_));
  EXPECT_TRUE(info_.operators().empty());

  TruncateAndWriteToFile(
      "serviceproviders:3.0\n"
      "# Invalid provider entry\n"
      "provider:1,1,0,1\n");
  EXPECT_TRUE(info_.Load(info_file_path_));
  EXPECT_EQ(1, info_.operators().size());
  EXPECT_FALSE(info_.operators()[0]->is_primary());
  EXPECT_TRUE(info_.operators()[0]->requires_roaming());
  EXPECT_TRUE(info_.operators()[0]->country().empty());

  TruncateAndWriteToFile(
      "serviceproviders:3.0\n"
      "# Invalid provider entry\n"
      "country:us\n"
      "provider:1,1,1,0\n");
  EXPECT_TRUE(info_.Load(info_file_path_));
  EXPECT_EQ(1, info_.operators().size());
  EXPECT_TRUE(info_.operators()[0]->is_primary());
  EXPECT_FALSE(info_.operators()[0]->requires_roaming());
  EXPECT_EQ("us", info_.operators()[0]->country());
}

TEST_F(CellularOperatorInfoTest, HandleMCCMNC) {
  TruncateAndWriteToFile(
      "serviceproviders:3.0\n"
      "# MCCMNC entry without a provider.\n"
      "mccmnc:1,1\n");
  EXPECT_FALSE(info_.Load(info_file_path_));

  TruncateAndWriteToFile(
      "serviceproviders:3.0\n"
      "# Empty MCCMNC entry.\n"
      "provider:1,1,0,1\n"
      "mccmnc:\n");
  EXPECT_FALSE(info_.Load(info_file_path_));
  EXPECT_TRUE(info_.operators().empty());

  TruncateAndWriteToFile(
      "serviceproviders:3.0\n"
      "# MCCMNC entry has odd number of values.\n"
      "provider:1,1,0,1\n"
      "mccmnc:000001,0,000002\n");

  EXPECT_FALSE(info_.Load(info_file_path_));
  EXPECT_TRUE(info_.operators().empty());

  TruncateAndWriteToFile(
      "serviceproviders:3.0\n"
      "# MCCMNC entry in this one is good.\n"
      "provider:1,1,0,1\n"
      "mccmnc:000001,0,000002,3\n");

  EXPECT_TRUE(info_.Load(info_file_path_));
  EXPECT_EQ(1, info_.operators().size());
  EXPECT_EQ(2, info_.operators()[0]->mccmnc_list().size());
  EXPECT_EQ("000001", info_.operators()[0]->mccmnc_list()[0]);
  EXPECT_EQ("000002", info_.operators()[0]->mccmnc_list()[1]);
  EXPECT_EQ(info_.operators()[0], info_.GetCellularOperatorByMCCMNC("000001"));
  EXPECT_EQ(info_.operators()[0], info_.GetCellularOperatorByMCCMNC("000002"));
  EXPECT_EQ(NULL, info_.GetCellularOperatorByMCCMNC("000003"));
}

TEST_F(CellularOperatorInfoTest, HandleName) {
  TruncateAndWriteToFile(
      "serviceproviders:3.0\n"
      "# No provider entry\n"
      "name:,\n");
  EXPECT_FALSE(info_.Load(info_file_path_));
  EXPECT_TRUE(info_.operators().empty());

  TruncateAndWriteToFile(
      "serviceproviders:3.0\n"
      "provider:1,1,0,0\n"
      "# Name has incorrect number of fields.\n"
      "name:,,\n");
  EXPECT_FALSE(info_.Load(info_file_path_));
  EXPECT_TRUE(info_.operators().empty());

  TruncateAndWriteToFile(
      "serviceproviders:3.0\n"
      "provider:1,1,0,0\n"
      "# Name is valid.\n"
      "name:en,Test Name\n");
  EXPECT_TRUE(info_.Load(info_file_path_));
  EXPECT_EQ(1, info_.operators().size());
  EXPECT_EQ(1, info_.operators()[0]->name_list().size());
  EXPECT_EQ("en", info_.operators()[0]->name_list()[0].language);
  EXPECT_EQ("Test Name", info_.operators()[0]->name_list()[0].name);

  TruncateAndWriteToFile(
      "serviceproviders:3.0\n"
      "provider:1,1,0,0\n"
      "# More than one valid names.\n"
      "name:en,Test Name\n"
      "name:,Other Name\n"
      "name:de,\n");
  EXPECT_TRUE(info_.Load(info_file_path_));
  EXPECT_EQ(1, info_.operators().size());
  EXPECT_EQ(3, info_.operators()[0]->name_list().size());
  EXPECT_EQ("en", info_.operators()[0]->name_list()[0].language);
  EXPECT_EQ("Test Name", info_.operators()[0]->name_list()[0].name);
  EXPECT_TRUE(info_.operators()[0]->name_list()[1].language.empty());
  EXPECT_EQ("Other Name", info_.operators()[0]->name_list()[1].name);
  EXPECT_EQ("de", info_.operators()[0]->name_list()[2].language);
  EXPECT_TRUE(info_.operators()[0]->name_list()[2].name.empty());
}

TEST_F(CellularOperatorInfoTest, HandleAPN) {
  TruncateAndWriteToFile(
      "serviceproviders:3.0\n"
      "# No provider\n"
      "apn:,,,\n");
  EXPECT_FALSE(info_.Load(info_file_path_));
  EXPECT_TRUE(info_.operators().empty());

  TruncateAndWriteToFile(
      "serviceproviders:3.0\n"
      "provider:1,0,0,0\n"
      "# Badly formed apn line.\n"
      "apn:,\n");
  EXPECT_FALSE(info_.Load(info_file_path_));
  EXPECT_TRUE(info_.operators().empty());

  TruncateAndWriteToFile(
      "serviceproviders:3.0\n"
      "provider:1,0,0,0\n"
      "apn:0,testapn,testusername,testpassword\n");
  EXPECT_TRUE(info_.Load(info_file_path_));
  EXPECT_EQ(1, info_.operators().size());
  EXPECT_EQ(1, info_.operators()[0]->apn_list().size());
  EXPECT_EQ("testapn", info_.operators()[0]->apn_list()[0]->apn);
  EXPECT_EQ("testusername", info_.operators()[0]->apn_list()[0]->username);
  EXPECT_EQ("testpassword", info_.operators()[0]->apn_list()[0]->password);

  TruncateAndWriteToFile(
      "serviceproviders:3.0\n"
      "provider:1,0,0,0\n"
      "apn:0,apn1,user1,password1\n"
      "apn:2,apn2,user2,password2\n"
      "name:en,Apn Name\n"
      "name:de,Apn Name2\n");
  EXPECT_TRUE(info_.Load(info_file_path_));
  EXPECT_EQ(1, info_.operators().size());
  EXPECT_EQ(2, info_.operators()[0]->apn_list().size());
  EXPECT_EQ("apn1", info_.operators()[0]->apn_list()[0]->apn);
  EXPECT_EQ("user1", info_.operators()[0]->apn_list()[0]->username);
  EXPECT_EQ("password1", info_.operators()[0]->apn_list()[0]->password);
  EXPECT_EQ("apn2", info_.operators()[0]->apn_list()[1]->apn);
  EXPECT_EQ("user2", info_.operators()[0]->apn_list()[1]->username);
  EXPECT_EQ("password2", info_.operators()[0]->apn_list()[1]->password);

  EXPECT_TRUE(info_.operators()[0]->apn_list()[0]->name_list.empty());
  EXPECT_EQ(2, info_.operators()[0]->apn_list()[1]->name_list.size());
  EXPECT_EQ("en",
            info_.operators()[0]->apn_list()[1]->name_list[0].language);
  EXPECT_EQ("Apn Name",
            info_.operators()[0]->apn_list()[1]->name_list[0].name);
  EXPECT_EQ("de",
            info_.operators()[0]->apn_list()[1]->name_list[1].language);
  EXPECT_EQ("Apn Name2",
            info_.operators()[0]->apn_list()[1]->name_list[1].name);
}

TEST_F(CellularOperatorInfoTest, HandleSID) {
  TruncateAndWriteToFile(
      "serviceproviders:3.0\n"
      "# SID entry without a provider.\n"
      "sid:1,1\n");
  EXPECT_FALSE(info_.Load(info_file_path_));

  TruncateAndWriteToFile(
      "serviceproviders:3.0\n"
      "# Empty SID entry.\n"
      "provider:1,1,0,1\n"
      "sid:\n");
  EXPECT_FALSE(info_.Load(info_file_path_));
  EXPECT_TRUE(info_.operators().empty());

  TruncateAndWriteToFile(
      "serviceproviders:3.0\n"
      "# SID entry has odd number of values.\n"
      "provider:1,1,0,1\n"
      "sid:1,0,2\n");

  EXPECT_FALSE(info_.Load(info_file_path_));
  EXPECT_TRUE(info_.operators().empty());

  TruncateAndWriteToFile(
      "serviceproviders:3.0\n"
      "# SID entry in this one is good.\n"
      "provider:1,1,0,1\n"
      "sid:1,0,2,3\n");

  EXPECT_TRUE(info_.Load(info_file_path_));
  EXPECT_EQ(1, info_.operators().size());
  EXPECT_EQ(2, info_.operators()[0]->sid_list().size());
  EXPECT_EQ("1", info_.operators()[0]->sid_list()[0]);
  EXPECT_EQ("2", info_.operators()[0]->sid_list()[1]);
  EXPECT_EQ(info_.operators()[0], info_.GetCellularOperatorBySID("1"));
  EXPECT_EQ(info_.operators()[0], info_.GetCellularOperatorBySID("2"));
  EXPECT_EQ(NULL, info_.GetCellularOperatorBySID("3"));
}

TEST_F(CellularOperatorInfoTest, HandleIdentifier) {
  TruncateAndWriteToFile(
      "serviceproviders:3.0\n"
      "# No provider entry.\n"
      "identifier:test-id\n");
  EXPECT_FALSE(info_.Load(info_file_path_));
  EXPECT_TRUE(info_.operators().empty());

  TruncateAndWriteToFile(
      "serviceproviders:3.0\n"
      "provider:1,1,0,0\n"
      "identifier:test-id\n");
  EXPECT_TRUE(info_.Load(info_file_path_));
  EXPECT_EQ(1, info_.operators().size());
  EXPECT_EQ("test-id", info_.operators()[0]->identifier());
}

TEST_F(CellularOperatorInfoTest, HandleActivationCode) {
  TruncateAndWriteToFile(
      "serviceproviders:3.0\n"
      "# No provider entry.\n"
      "activation-code:test-code\n");
  EXPECT_FALSE(info_.Load(info_file_path_));
  EXPECT_TRUE(info_.operators().empty());

  TruncateAndWriteToFile(
      "serviceproviders:3.0\n"
      "provider:1,1,0,0\n"
      "activation-code:test-code\n");
  EXPECT_TRUE(info_.Load(info_file_path_));
  EXPECT_EQ(1, info_.operators().size());
  EXPECT_EQ("test-code", info_.operators()[0]->activation_code());
}

TEST_F(CellularOperatorInfoTest, HandleOLP) {
  TruncateAndWriteToFile(
      "serviceproviders:3.0\n"
      "# No provider entry.\n"
      "olp:,,\n");
  EXPECT_FALSE(info_.Load(info_file_path_));
  EXPECT_TRUE(info_.operators().empty());

  TruncateAndWriteToFile(
      "serviceproviders:3.0\n"
      "provider:1,1,0,0\n"
      "# Badly formed APN\n"
      "olp:,\n");
  EXPECT_FALSE(info_.Load(info_file_path_));
  EXPECT_TRUE(info_.operators().empty());

  TruncateAndWriteToFile(
      "serviceproviders:3.0\n"
      "provider:1,1,0,0\n"
      "# Badly formed APN\n"
      "olp:,,\n");
  EXPECT_TRUE(info_.Load(info_file_path_));
  EXPECT_EQ(1, info_.operators().size());
  EXPECT_EQ(1, info_.operators()[0]->olp_list().size());
  EXPECT_TRUE(info_.operators()[0]->olp_list()[0]->GetURL().empty());
  EXPECT_TRUE(info_.operators()[0]->olp_list()[0]->GetMethod().empty());
  EXPECT_TRUE(info_.operators()[0]->olp_list()[0]->GetPostData().empty());

  TruncateAndWriteToFile(
      "serviceproviders:3.0\n"
      "provider:1,1,0,0\n"
      "# Badly formed APN\n"
      "olp:a,b,c\n"
      "olp:d,e,f\n");
  EXPECT_TRUE(info_.Load(info_file_path_));
  EXPECT_EQ(1, info_.operators().size());
  EXPECT_EQ(2, info_.operators()[0]->olp_list().size());
  EXPECT_EQ("a", info_.operators()[0]->olp_list()[0]->GetMethod());
  EXPECT_EQ("b", info_.operators()[0]->olp_list()[0]->GetURL());
  EXPECT_EQ("c", info_.operators()[0]->olp_list()[0]->GetPostData());
  EXPECT_EQ("d", info_.operators()[0]->olp_list()[1]->GetMethod());
  EXPECT_EQ("e", info_.operators()[0]->olp_list()[1]->GetURL());
  EXPECT_EQ("f", info_.operators()[0]->olp_list()[1]->GetPostData());
}

}  // namespace shill
