arblant
firefox-vpn-client / core / internal / routing / apps_test.go
apps_test.go70 lines · 2.1 KB
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
package routing

import (
	"context"
	"net/http"
	"net/http/httptest"
	"os"
	"path/filepath"
	"strings"
	"testing"
	"time"
)

// rewriteTo sends every request to srv: the list URL never reaches GitHub.
type rewriteTo struct{ srv *httptest.Server }

func (r rewriteTo) RoundTrip(req *http.Request) (*http.Response, error) {
	u := *req.URL
	u.Scheme, u.Host = "http", strings.TrimPrefix(r.srv.URL, "http://")
	out := req.Clone(req.Context())
	out.URL, out.Host = &u, u.Host
	return http.DefaultTransport.RoundTrip(out)
}

func TestAppListDownloadKeepsPackageNames(t *testing.T) {
	var asked string
	srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		asked = r.URL.Path
		_, _ = w.Write([]byte("cab.snapp.passenger\n# a comment\n\ncom.digikala\nnot a package\n"))
	}))
	defer srv.Close()
	dir := t.TempDir()
	if !AppListDue(dir, "ir", time.Hour) {
		t.Fatal("a missing list is due")
	}
	client := &http.Client{Transport: rewriteTo{srv}}
	if err := DownloadAppList(context.Background(), client, dir, "ir"); err != nil {
		t.Fatal(err)
	}
	if asked != "/hiddify/Android-GFW-Apps/master/direct_ir" {
		t.Fatalf("asked for %q", asked)
	}
	got := ReadAppList(dir, "ir")
	if strings.Join(got, ",") != "cab.snapp.passenger,com.digikala" {
		t.Fatalf("apps %v", got)
	}
	if AppListDue(dir, "ir", time.Hour) {
		t.Fatal("a fresh list is not due")
	}
}

func TestAppListRefusesAPageWithoutPackages(t *testing.T) {
	srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		_, _ = w.Write([]byte("<html>rate limited</html>"))
	}))
	defer srv.Close()
	dir := t.TempDir()
	if err := DownloadAppList(context.Background(), &http.Client{Transport: rewriteTo{srv}}, dir, "ir"); err == nil {
		t.Fatal("a page without package names must not replace the list")
	}
	if _, err := os.Stat(filepath.Join(dir, AppListFile("ir"))); err == nil {
		t.Fatal("nothing must be written")
	}
}

func TestRegionsWithoutAppList(t *testing.T) {
	if HasAppList("tr") || AppListDue(t.TempDir(), "tr", time.Hour) || ReadAppList(t.TempDir(), "tr") != nil {
		t.Fatal("tr has no app list")
	}
}