瀏覽代碼

Improve psinet test coverage

- Additional test cases to ensure JSON data is
  successfully loaded and to exercise each data
  access case

- Removed unused Sponsor fields and
  PageViewRegex and MobileHomePage structs
Rod Hynes 6 年之前
父節點
當前提交
80a42580fa
共有 2 個文件被更改,包括 172 次插入20 次删除
  1. 5 20
      psiphon/server/psinet/psinet.go
  2. 167 0
      psiphon/server/psinet/psinet_test.go

+ 5 - 20
psiphon/server/psinet/psinet.go

@@ -59,15 +59,10 @@ type DiscoveryServer struct {
 }
 
 type Sponsor struct {
-	Banner              string
+	ID                  string                `json:"id"`
 	HomePages           map[string][]HomePage `json:"home_pages"`
-	HttpsRequestRegexes []HttpsRequestRegex   `json:"https_request_regexes"`
-	Id                  string                `json:"id"`
 	MobileHomePages     map[string][]HomePage `json:"mobile_home_pages"`
-	Name                string                `json:"name"`
-	PageViewRegexes     []PageViewRegex       `json:"page_view_regexes"`
-	WebsiteBanner       string                `json:"website_banner"`
-	WebsiteBannerLink   string                `json:"website_banner_link"`
+	HttpsRequestRegexes []HttpsRequestRegex   `json:"https_request_regexes"`
 }
 
 type ClientVersion struct {
@@ -76,7 +71,7 @@ type ClientVersion struct {
 
 type HomePage struct {
 	Region string `json:"region"`
-	Url    string `json:"url"`
+	URL    string `json:"url"`
 }
 
 type HttpsRequestRegex struct {
@@ -84,16 +79,6 @@ type HttpsRequestRegex struct {
 	Replace string `json:"replace"`
 }
 
-type MobileHomePage struct {
-	Region string `json:"region"`
-	Url    string `json:"url"`
-}
-
-type PageViewRegex struct {
-	Regex   string `json:"regex"`
-	Replace string `json:"replace"`
-}
-
 // NewDatabase initializes a Database, calling Reload on the specified
 // filename.
 func NewDatabase(filename string) (*Database, error) {
@@ -177,7 +162,7 @@ func (db *Database) GetHomepages(sponsorID, clientRegion string, isMobilePlatfor
 	homePagesByRegion, ok := homePages[clientRegion]
 	if ok {
 		for _, homePage := range homePagesByRegion {
-			sponsorHomePages = append(sponsorHomePages, strings.Replace(homePage.Url, "client_region=XX", "client_region="+clientRegion, 1))
+			sponsorHomePages = append(sponsorHomePages, strings.Replace(homePage.URL, "client_region=XX", "client_region="+clientRegion, 1))
 		}
 	}
 
@@ -187,7 +172,7 @@ func (db *Database) GetHomepages(sponsorID, clientRegion string, isMobilePlatfor
 		if ok {
 			for _, homePage := range defaultHomePages {
 				// client_region query parameter substitution
-				sponsorHomePages = append(sponsorHomePages, strings.Replace(homePage.Url, "client_region=XX", "client_region="+clientRegion, 1))
+				sponsorHomePages = append(sponsorHomePages, strings.Replace(homePage.URL, "client_region=XX", "client_region="+clientRegion, 1))
 			}
 		}
 	}

+ 167 - 0
psiphon/server/psinet/psinet_test.go

@@ -20,11 +20,178 @@
 package psinet
 
 import (
+	"fmt"
+	"io/ioutil"
+	"os"
+	"path/filepath"
 	"strconv"
 	"testing"
 	"time"
 )
 
+func TestDatabase(t *testing.T) {
+
+	testDataDirName, err := ioutil.TempDir("", "psinet-test")
+	if err != nil {
+		t.Fatalf("TempDir failed: %s\n", err)
+	}
+	defer os.RemoveAll(testDataDirName)
+
+	databaseJSON := `
+    {
+        "sponsors" : {
+            "SPONSOR-ID" : {
+                "id" : "SPONSOR-ID",
+                "home_pages" : {
+                    "CLIENT-REGION" : [{
+                        "region" : "CLIENT-REGION",
+                        "url" : "HOME-PAGE-URL?client_region=XX"
+                     }],
+                    "None" : [{
+                        "region" : "None",
+                        "url" : "DEFAULT-HOME-PAGE-URL?client_region=XX"
+                     }]
+                },
+                "mobile_home_pages": {
+                    "CLIENT-REGION" : [{
+                        "region" : "CLIENT-REGION",
+                        "url" : "MOBILE-HOME-PAGE-URL?client_region=XX"
+                     }],
+                    "None" : [{
+                        "region" : "None",
+                        "url" : "DEFAULT-MOBILE-HOME-PAGE-URL?client_region=XX"
+                     }]
+                },
+                "https_request_regexes" : [{
+                    "regex" : "REGEX-VALUE",
+                    "replace" : "REPLACE-VALUE"
+                }]
+            }
+        },
+
+        "client_versions" : {
+            "CLIENT-PLATFORM" : [
+                {"version" : "1"},
+                {"version" : "2"}
+            ]
+        },
+
+        "default_sponsor_id" : "SPONSOR-ID",
+
+        "valid_server_entry_tags" : {
+            "SERVER-ENTRY-TAG" : true
+        },
+
+        "discovery_servers" : [
+            {"discovery_date_range" : ["1900-01-01T00:00:00Z", "2000-01-01T00:00:00Z"], "encoded_server_entry" : "0"},
+            {"discovery_date_range" : ["1900-01-01T00:00:00Z", "2000-01-01T00:00:00Z"], "encoded_server_entry" : "0"},
+            {"discovery_date_range" : ["1900-01-01T00:00:00Z", "2000-01-01T00:00:00Z"], "encoded_server_entry" : "0"},
+            {"discovery_date_range" : ["1900-01-01T00:00:00Z", "2000-01-01T00:00:00Z"], "encoded_server_entry" : "0"},
+            {"discovery_date_range" : ["2000-01-01T00:00:00Z", "2100-01-01T00:00:00Z"], "encoded_server_entry" : "1"},
+            {"discovery_date_range" : ["2000-01-01T00:00:00Z", "2100-01-01T00:00:00Z"], "encoded_server_entry" : "1"},
+            {"discovery_date_range" : ["2000-01-01T00:00:00Z", "2100-01-01T00:00:00Z"], "encoded_server_entry" : "1"},
+            {"discovery_date_range" : ["2000-01-01T00:00:00Z", "2100-01-01T00:00:00Z"], "encoded_server_entry" : "1"}
+        ]
+    }`
+
+	filename := filepath.Join(testDataDirName, "psinet.json")
+
+	err = ioutil.WriteFile(filename, []byte(databaseJSON), 0600)
+	if err != nil {
+		t.Fatalf("WriteFile failed: %s", err)
+	}
+
+	db, err := NewDatabase(filename)
+	if err != nil {
+		t.Fatalf("NewDatabase failed: %s", err)
+	}
+
+	homePageTestCases := []struct {
+		sponsorID    string
+		clientRegion string
+		isMobile     bool
+		expectedURL  string
+	}{
+		{"SPONSOR-ID", "CLIENT-REGION", false, "HOME-PAGE-URL?client_region=CLIENT-REGION"},
+		{"SPONSOR-ID", "UNCONFIGURED-CLIENT-REGION", false, "DEFAULT-HOME-PAGE-URL?client_region=UNCONFIGURED-CLIENT-REGION"},
+		{"SPONSOR-ID", "CLIENT-REGION", true, "MOBILE-HOME-PAGE-URL?client_region=CLIENT-REGION"},
+		{"SPONSOR-ID", "UNCONFIGURED-CLIENT-REGION", true, "DEFAULT-MOBILE-HOME-PAGE-URL?client_region=UNCONFIGURED-CLIENT-REGION"},
+		{"UNCONFIGURED-SPONSOR-ID", "CLIENT-REGION", false, "HOME-PAGE-URL?client_region=CLIENT-REGION"},
+		{"UNCONFIGURED-SPONSOR-ID", "UNCONFIGURED-CLIENT-REGION", false, "DEFAULT-HOME-PAGE-URL?client_region=UNCONFIGURED-CLIENT-REGION"},
+		{"UNCONFIGURED-SPONSOR-ID", "CLIENT-REGION", true, "MOBILE-HOME-PAGE-URL?client_region=CLIENT-REGION"},
+		{"UNCONFIGURED-SPONSOR-ID", "UNCONFIGURED-CLIENT-REGION", true, "DEFAULT-MOBILE-HOME-PAGE-URL?client_region=UNCONFIGURED-CLIENT-REGION"},
+	}
+
+	for _, testCase := range homePageTestCases {
+		t.Run(fmt.Sprintf("%+v", testCase), func(t *testing.T) {
+			homepages := db.GetHomepages(testCase.sponsorID, testCase.clientRegion, testCase.isMobile)
+			if len(homepages) != 1 || homepages[0] != testCase.expectedURL {
+				t.Fatalf("unexpected home page: %+v", homepages)
+			}
+		})
+	}
+
+	versionTestCases := []struct {
+		currentClientVersion         string
+		clientPlatform               string
+		expectedUpgradeClientVersion string
+	}{
+		{"0", "CLIENT-PLATFORM", "2"},
+		{"1", "CLIENT-PLATFORM", "2"},
+		{"2", "CLIENT-PLATFORM", ""},
+		{"3", "CLIENT-PLATFORM", ""},
+		{"2", "UNCONFIGURED-CLIENT-PLATFORM", ""},
+	}
+
+	for _, testCase := range versionTestCases {
+		t.Run(fmt.Sprintf("%+v", testCase), func(t *testing.T) {
+			upgradeVersion := db.GetUpgradeClientVersion(testCase.currentClientVersion, testCase.clientPlatform)
+			if upgradeVersion != testCase.expectedUpgradeClientVersion {
+				t.Fatalf("unexpected upgrade version: %s", upgradeVersion)
+			}
+		})
+	}
+
+	httpsRegexTestCases := []struct {
+		sponsorID            string
+		expectedRegexValue   string
+		expectedReplaceValue string
+	}{
+		{"SPONSOR-ID", "REGEX-VALUE", "REPLACE-VALUE"},
+		{"UNCONFIGURED-SPONSOR-ID", "REGEX-VALUE", "REPLACE-VALUE"},
+	}
+
+	for _, testCase := range httpsRegexTestCases {
+		t.Run(fmt.Sprintf("%+v", testCase), func(t *testing.T) {
+			regexes := db.GetHttpsRequestRegexes(testCase.sponsorID)
+			var regexValue, replaceValue string
+			ok := false
+			if len(regexes) == 1 && len(regexes[0]) == 2 {
+				regexValue, ok = regexes[0]["regex"]
+				replaceValue, ok = regexes[0]["replace"]
+			}
+			if !ok || regexValue != testCase.expectedRegexValue || replaceValue != testCase.expectedReplaceValue {
+				t.Fatalf("unexpected regexes: %+v", regexes)
+			}
+		})
+	}
+
+	for i := 0; i < 1000; i++ {
+		encodedServerEntries := db.DiscoverServers(i)
+		if len(encodedServerEntries) != 1 || encodedServerEntries[0] != "1" {
+			t.Fatalf("unexpected discovery server list: %+v", encodedServerEntries)
+		}
+	}
+
+	if !db.IsValidServerEntryTag("SERVER-ENTRY-TAG") {
+		t.Fatalf("unexpected invalid server entry tag")
+	}
+
+	if db.IsValidServerEntryTag("INVALID-SERVER-ENTRY-TAG") {
+		t.Fatalf("unexpected valid server entry tag")
+	}
+}
+
 func TestDiscoveryBuckets(t *testing.T) {
 
 	checkBuckets := func(buckets [][]*DiscoveryServer, expectedServerEntries [][]int) {