blob: e1cd7bfa3b9420171808298ee0ab56b6850845e7 [file] [log] [blame]
/*
* Copyright (c) 2011 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 <glib.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include "mobile_provider.h"
const char *testfile = "/tmp/providers_test_data";
typedef struct {
const char *filename;
struct mobile_provider_db *provider_db;
} TestFixture;
static char *test_db =
"serviceproviders:2.0\n"
"country:at\n"
"provider:1,2,0,0\n"
"name:,A1/Telekom Austria\n"
"networks:23201\n"
"apn:1,a1.net,ppp@a1plus.at,ppp\n"
"name:,A1 Breitband\n"
"apn:1,aon.data,,ppp\n"
"name:,aon (Flex, Breitband-Duo, BusinessFlex)\n"
"provider:1,3,0,0\n"
"name:,T-Mobile\n"
"networks:23203\n"
"apn:1,gprswap,t-mobile,tm\n"
"name:,WAP\n"
"apn:1,gprsinternet,t-mobile,tm\n"
"name:,Internet\n"
"apn:1,business.gprsinternet,t-mobile,tm\n"
"name:,Business Internet\n"
"country:ca\n"
"provider:1,1,0,0\n"
"name:,Vidéotron\n"
"networks:302500,302510\n"
"apn:1,ihvm.videotron,,\n"
"name:,IHVM\n"
"country:gb\n"
"provider:1,1,0,0\n"
"name:,T-Mobile (Great Britain)\n"
"networks:23430\n"
"apn:0,general.t-mobile.uk,User,mms\n"
"provider:1,1,0,0\n"
"name:,3\n"
"networks:23499\n"
"apn:0,three.uk,,\n"
"country:ie\n"
"provider:2,1,0,1\n"
"name:,Cubic\n"
"name:,CUBIC\n"
"networks:\n"
"apn:0,mtoom.com,mtoom,mtoom\n"
"country:ir\n"
"provider:1,1,0,0\n"
"name:,همراه اول\n"
"networks:43211\n"
"apn:0,mcinet,,\n"
"provider:1,1,0,0\n"
"name:,ایرانسل\n"
"networks:43235\n"
"apn:0,mtnirancell,,\n"
"country:py\n"
"provider:1,2,0,0\n"
"name:,Tigo\n"
"networks:74404\n"
"apn:1,internet.tigo.py,,\n"
"name:,Internet\n"
"apn:2,broadband.tigo.py,tigo,tigo\n"
"name:,Broadband\n"
"name:es,Banda Ancha Móvil\n"
"country:ru\n"
"provider:2,1,0,0\n"
"name:,BaikalWestCom\n"
"name:ru,БайкалВестКом\n"
"networks:25012\n"
"apn:0,inet.bwc.ru,bwc,bwc\n"
"country:us\n"
"provider:1,1,0,0\n"
"name:,3\n"
"networks:31099\n"
"apn:0,three.com,,\n"
"provider:1,4,0,0\n"
"name:,AT&T\n"
"networks:310038,310090,310150,310410,310560,310680\n"
"apn:0,Broadband,,\n"
"apn:1,wap.cingular,,\n"
"name:,MEdia Net\n"
"apn:1,isp.cingular,,\n"
"name:,Data Connect\n"
"apn:1,ISP.CINGULAR,ISPDA@CINGULARGPRS.COM,CINGULAR1\n"
"name:,Data Connect (Accelerated)\n"
"provider:1,4,1,0\n"
"name:,T-Mobile\n"
"networks:310160,310200,310210,310220,310230,310240,310250,310260,310270,"
"310310,310490,31058,310660,310800\n"
"apn:1,epc.tmobile.com,,\n"
"name:,Internet/WebConnect\n"
"apn:1,wap.voicestream.com,,\n"
"name:,Web2Go/t-zones\n"
"apn:1,internet2.voicestream.com,,\n"
"name:,Internet (old)\n"
"apn:1,internet3.voicestream.com,,\n"
"name:,Internet with VPN (old)\n"
"provider:1,1,0,0\n"
"name:,T-Mobile MVNO\n"
"networks:310160,310200,310210,310220,310230,310240,310250,310260,310270,"
"310310,310490,31058,310660,310800\n"
"apn:1,mvno.tmobile.com,,\n"
"name:,MVNO Internet/WebConnect\n"
;
static char *test_db_ambiguous =
"serviceproviders:2.0\n"
"country:gb\n"
"provider:1,1,0,0\n"
"name:,T-Mobile (Great Britain)\n"
"networks:23430\n"
"apn:0,general.t-mobile.uk,User,mms\n"
"provider:1,1,0,0\n"
"name:,3\n"
"networks:23499\n"
"apn:0,three.uk,,\n"
"country:ie\n"
"provider:2,1,0,1\n"
"name:,Cubic\n"
"name:,CUBIC\n"
"networks:\n"
"apn:0,mtoom.com,mtoom,mtoom\n"
"country:ir\n"
"provider:1,1,0,0\n"
"name:,همراه اول\n"
"networks:43211\n"
"apn:0,mcinet,,\n"
"provider:1,1,0,0\n"
"name:,ایرانسل\n"
"networks:43235\n"
"apn:0,mtnirancell,,\n"
"country:py\n"
"provider:2,1,0,1\n"
"name:,Cubic\n"
"name:,CUBIC\n"
"networks:\n"
"apn:0,moot.com,moot,moot\n"
"provider:1,2,0,0\n"
"name:,Tigo\n"
"networks:74404\n"
"apn:1,internet.tigo.py,,\n"
"name:,Internet\n"
"apn:2,broadband.tigo.py,tigo,tigo\n"
"name:,Broadband\n"
"name:es,Banda Ancha Móvil\n"
"country:ru\n"
"provider:2,1,0,0\n"
"name:,BaikalWestCom\n"
"name:ru,БайкалВестКом\n"
"networks:25012\n"
"apn:0,inet.bwc.ru,bwc,bwc\n"
;
void setup_data(const char *file, const char *test_data)
{
gboolean success = g_file_set_contents(file, test_data, -1, NULL);
g_assert(success == TRUE);
}
void test_fixture_setup(TestFixture *fixture, gconstpointer test_data)
{
g_assert(fixture->provider_db == NULL);
if (fixture->filename == NULL) {
setup_data(testfile, test_data);
fixture->filename = testfile;
}
fixture->provider_db = mobile_provider_open_db(testfile);
g_assert(fixture->provider_db != NULL);
}
void test_fixture_teardown(TestFixture *fixture, gconstpointer test_data)
{
g_assert(fixture->provider_db != NULL);
mobile_provider_close_db(fixture->provider_db);
fixture->provider_db = NULL;
}
void test_lookup_by_name(TestFixture *fixture, gconstpointer test_data)
{
struct mobile_provider *provider;
provider = mobile_provider_lookup_by_name(fixture->provider_db, "AT&T");
g_assert(provider != NULL);
g_assert_cmpint(provider->num_names, ==, 1);
g_assert_cmpstr(provider->names[0]->name, ==, "AT&T");
g_assert_cmpstr(provider->country, ==, "us");
g_assert_cmpint(provider->num_apns, ==, 4);
g_assert_cmpint(provider->requires_roaming, ==, 0);
g_assert_cmpint(g_strv_length(provider->networks), ==, 6);
g_assert_cmpstr(provider->networks[2], ==, "310150");
g_assert_cmpstr(provider->apns[3]->value, ==, "ISP.CINGULAR");
g_assert_cmpstr(provider->apns[3]->username, ==, "ISPDA@CINGULARGPRS.COM");
g_assert_cmpstr(provider->apns[3]->password, ==, "CINGULAR1");
}
void test_lookup_by_mvno(TestFixture *fixture, gconstpointer test_data)
{
struct mobile_provider *provider;
provider = mobile_provider_lookup_by_name(fixture->provider_db,
"T-Mobile MVNO");
g_assert(provider != NULL);
g_assert_cmpint(provider->primary, ==, 0);
g_assert_cmpint(provider->num_names, ==, 1);
g_assert_cmpstr(provider->names[0]->name, ==, "T-Mobile MVNO");
g_assert_cmpstr(provider->country, ==, "us");
g_assert_cmpint(provider->num_apns, ==, 1);
g_assert_cmpint(g_strv_length(provider->networks), ==, 14);
g_assert_cmpstr(provider->apns[0]->value, ==, "mvno.tmobile.com");
g_assert(provider->apns[0]->username == NULL);
g_assert(provider->apns[0]->password == NULL);
}
void test_lookup_by_network(TestFixture *fixture, gconstpointer test_data)
{
struct mobile_provider *provider;
provider = mobile_provider_lookup_by_network(fixture->provider_db, "31026");
g_assert(provider != NULL);
g_assert_cmpint(provider->primary, ==, 1);
g_assert_cmpint(provider->num_names, ==, 1);
g_assert_cmpstr(provider->names[0]->name, ==, "T-Mobile");
g_assert_cmpstr(provider->country, ==, "us");
g_assert_cmpint(provider->num_apns, ==, 4);
g_assert_cmpint(provider->requires_roaming, ==, 0);
g_assert_cmpint(g_strv_length(provider->networks), ==, 14);
g_assert_cmpstr(provider->apns[0]->value, ==, "epc.tmobile.com");
g_assert_cmpstr(provider->apns[1]->value, ==, "wap.voicestream.com");
g_assert(provider->apns[0]->username == NULL);
g_assert(provider->apns[1]->password == NULL);
}
void test_other_network_id(TestFixture *fixture, gconstpointer test_data)
{
struct mobile_provider *provider;
struct mobile_provider *provider1;
provider = mobile_provider_lookup_by_network(fixture->provider_db, "310260");
g_assert(provider != NULL);
provider1 = mobile_provider_lookup_by_network(fixture->provider_db, "310210");
g_assert(provider1 == provider);
}
void test_normalize_network_id(TestFixture *fixture, gconstpointer test_data)
{
struct mobile_provider *provider;
struct mobile_provider *provider1;
provider = mobile_provider_lookup_by_network(fixture->provider_db, "31058");
g_assert(provider != NULL);
provider1 = mobile_provider_lookup_by_network(fixture->provider_db, "310580");
g_assert(provider1 == provider);
}
void test_no_network_id(TestFixture *fixture, gconstpointer test_data)
{
struct mobile_provider *provider;
/* In the following, the network ID argument will be ignored */
provider = mobile_provider_lookup_best_match(fixture->provider_db,
"Cubic", "11111");
g_assert(provider != NULL);
g_assert(provider->next == NULL);
g_assert_cmpstr(provider->country, ==, "ie");
g_assert_cmpint(provider->num_names, ==, 2);
g_assert_cmpint(provider->num_apns, ==, 1);
g_assert_cmpint(provider->requires_roaming, ==, 1);
}
void test_no_network_id_ambiguous(TestFixture *fixture,
gconstpointer test_data)
{
struct mobile_provider *provider;
/* In the following, the network ID argument will be ignored */
provider = mobile_provider_lookup_best_match(fixture->provider_db,
"Cubic", "11111");
g_assert(provider == NULL);
}
void test_multi_country(TestFixture *fixture, gconstpointer test_data)
{
struct mobile_provider *provider;
provider = mobile_provider_lookup_by_name(fixture->provider_db, "T-Mobile");
g_assert(provider != NULL);
g_assert_cmpstr(provider->country, ==, "at");
g_assert(provider->next != NULL);
g_assert_cmpstr(provider->next->country, ==, "gb");
g_assert(provider->next->next != NULL);
g_assert_cmpstr(provider->next->next->country, ==, "us");
}
void test_non_ascii_names(TestFixture *fixture, gconstpointer test_data)
{
struct mobile_provider *provider;
provider = mobile_provider_lookup_by_name(fixture->provider_db, "Vidéotron");
g_assert(provider != NULL);
g_assert_cmpint(provider->num_names, ==, 1);
g_assert_cmpstr(provider->names[0]->name, ==, "Vidéotron");
g_assert_cmpstr(provider->country, ==, "ca");
provider = mobile_provider_lookup_by_name(fixture->provider_db,
"همراه اول");
g_assert(provider != NULL);
g_assert_cmpint(provider->num_names, ==, 1);
g_assert_cmpstr(provider->names[0]->name, ==, "همراه اول");
g_assert_cmpstr(provider->country, ==, "ir");
}
void test_multi_provider_names(TestFixture *fixture, gconstpointer test_data)
{
struct mobile_provider *provider;
provider = mobile_provider_lookup_by_name(fixture->provider_db,
"BaikalWestCom");
g_assert(provider != NULL);
g_assert_cmpstr(provider->country, ==, "ru");
g_assert_cmpint(provider->num_names, ==, 2);
g_assert_cmpstr(provider->names[0]->name, ==, "BaikalWestCom");
g_assert(provider->names[0]->lang == NULL);
g_assert_cmpstr(provider->names[1]->name, ==, "БайкалВестКом");
g_assert(provider->names[1]->lang != NULL);
g_assert_cmpstr(provider->names[1]->lang, ==, "ru");
provider = mobile_provider_lookup_by_name(fixture->provider_db,
"БайкалВестКом");
g_assert(provider != NULL);
g_assert_cmpstr(provider->country, ==, "ru");
g_assert_cmpint(provider->num_names, ==, 2);
g_assert_cmpstr(provider->names[0]->name, ==, "BaikalWestCom");
}
void test_multi_apn_names(TestFixture *fixture, gconstpointer test_data)
{
struct mobile_provider *provider;
provider = mobile_provider_lookup_by_name(fixture->provider_db, "Tigo");
g_assert(provider != NULL);
g_assert_cmpstr(provider->country, ==, "py");
g_assert_cmpint(provider->num_names, ==, 1);
g_assert_cmpstr(provider->names[0]->name, ==, "Tigo");
g_assert(provider->names[0]->lang == NULL);
g_assert_cmpint(provider->num_apns, ==, 2);
g_assert_cmpint(provider->apns[0]->num_names, ==, 1);
g_assert_cmpstr(provider->apns[0]->value, ==, "internet.tigo.py");
g_assert_cmpstr(provider->apns[0]->names[0]->name, ==, "Internet");
g_assert(provider->apns[0]->names[0]->lang == NULL);
g_assert_cmpint(provider->apns[1]->num_names, ==, 2);
g_assert_cmpstr(provider->apns[1]->value, ==, "broadband.tigo.py");
g_assert_cmpstr(provider->apns[1]->names[0]->name, ==, "Broadband");
g_assert(provider->apns[1]->names[0]->lang == NULL);
g_assert_cmpstr(provider->apns[1]->names[1]->name, ==, "Banda Ancha Móvil");
g_assert(provider->apns[1]->names[1]->lang != NULL);
g_assert_cmpstr(provider->apns[1]->names[1]->lang, ==, "es");
}
void test_name_with_commas(TestFixture *fixture, gconstpointer test_data)
{
struct mobile_provider *provider;
provider = mobile_provider_lookup_by_network(fixture->provider_db, "23201");
g_assert(provider != NULL);
g_assert_cmpint(provider->num_names, ==, 1);
g_assert_cmpstr(provider->names[0]->name, ==, "A1/Telekom Austria");
g_assert_cmpint(provider->num_apns, ==, 2);
g_assert_cmpint(provider->apns[1]->num_names, ==, 1);
g_assert_cmpstr(provider->apns[1]->names[0]->name, ==,
"aon (Flex, Breitband-Duo, BusinessFlex)");
}
void test_bad_provider_name(TestFixture *fixture, gconstpointer test_data)
{
struct mobile_provider *provider;
provider = mobile_provider_lookup_by_name(fixture->provider_db,
"NOSUCHPROVIDER");
g_assert(provider == NULL);
}
void test_bad_network_id(TestFixture *fixture, gconstpointer test_data)
{
struct mobile_provider *provider;
provider = mobile_provider_lookup_by_network(fixture->provider_db,
"000000");
g_assert(provider == NULL);
}
void test_lookup_best_match(TestFixture *fixture, gconstpointer test_data)
{
struct mobile_provider *provider;
/* Make sure we find the one in the US */
provider = mobile_provider_lookup_best_match(fixture->provider_db, "3",
"31099");
g_assert_cmpint(provider->num_apns, ==, 1);
g_assert_cmpstr(provider->apns[0]->value, ==, "three.com");
/* Make sure we find the one in the UK */
provider = mobile_provider_lookup_best_match(fixture->provider_db, "3",
"23499");
g_assert_cmpint(provider->num_apns, ==, 1);
g_assert_cmpstr(provider->apns[0]->value, ==, "three.uk");
/* Make sure we find the one in the UK even with a different MNC */
provider = mobile_provider_lookup_best_match(fixture->provider_db, "3",
"234878");
g_assert_cmpint(provider->num_apns, ==, 1);
g_assert_cmpstr(provider->apns[0]->value, ==, "three.uk");
}
int main(int argc, char *argv[])
{
int result;
g_test_init(&argc, &argv, NULL);
#define ADD_TEST(name, data) \
g_test_add("/flimflam/providerdb/" #name, TestFixture, data, \
test_fixture_setup, test_##name, test_fixture_teardown)
ADD_TEST(lookup_by_name, test_db);
ADD_TEST(lookup_by_network, test_db);
ADD_TEST(lookup_by_mvno, test_db);
ADD_TEST(other_network_id, test_db);
ADD_TEST(normalize_network_id, test_db);
ADD_TEST(no_network_id, test_db);
ADD_TEST(no_network_id_ambiguous, test_db_ambiguous);
ADD_TEST(multi_country, test_db);
ADD_TEST(non_ascii_names, test_db);
ADD_TEST(multi_provider_names, test_db);
ADD_TEST(multi_apn_names, test_db);
ADD_TEST(name_with_commas, test_db);
ADD_TEST(bad_provider_name, test_db);
ADD_TEST(bad_network_id, test_db);
ADD_TEST(lookup_best_match, test_db);
result = g_test_run();
unlink(testfile);
return result;
}