"недопустимый адрес памяти или разыменование нулевого указателя", выполняемые модульные тесты захвата? - PullRequest
0 голосов
/ 07 октября 2019

Я заинтересован в запуске модульных тестов для пакета https://github.com/cavaliercoder/grab в Go 1.13. Хотя моя GO111MODULE среда обычно on, я загрузил пакет в свой GOPATH, используя следующую команду:

env GO111MODULE=off go get -u -d github.com/cavaliercoder/grab

В каталоге grab resuting я запустил go mod init, который выдает следующее go.mod:

module github.com/cavaliercoder/grab

go 1.13

Теперь, если я пытаюсь запустить go test, я получаю следующую ошибку:

> go test
panic: runtime error: invalid memory address or nil pointer dereference [recovered]
    panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x10 pc=0x12cc70d]

goroutine 1556 [running]:
testing.tRunner.func1(0xc00010ea00)
    /usr/local/Cellar/go/1.13/libexec/src/testing/testing.go:874 +0x3a3
panic(0x132ba20, 0x1629ed0)
    /usr/local/Cellar/go/1.13/libexec/src/runtime/panic.go:679 +0x1b2
github.com/cavaliercoder/grab.guessFilename(0xc00052aed0, 0xc0000aa008, 0x13951b5, 0x3, 0x139c440)
    /Users/kurt/go/src/github.com/cavaliercoder/grab/util.go:51 +0x2d
github.com/cavaliercoder/grab.TestURLFilenames.func2(0xc00010ea00)
    /Users/kurt/go/src/github.com/cavaliercoder/grab/util_test.go:54 +0x123
testing.tRunner(0xc00010ea00, 0x13afdf8)
    /usr/local/Cellar/go/1.13/libexec/src/testing/testing.go:909 +0xc9
created by testing.(*T).Run
    /usr/local/Cellar/go/1.13/libexec/src/testing/testing.go:960 +0x350
exit status 2
FAIL    github.com/cavaliercoder/grab   2.531s

Я посмотрелв тестовом файле-нарушителе util_test.go, но не смог найти в нем ничего плохого:

package grab

import (
    "fmt"
    "net/http"
    "net/url"
    "testing"
)

func TestURLFilenames(t *testing.T) {
    t.Run("Valid", func(t *testing.T) {
        expect := "filename"
        testCases := []string{
            "http://test.com/filename",
            "http://test.com/path/filename",
            "http://test.com/deep/path/filename",
            "http://test.com/filename?with=args",
            "http://test.com/filename#with-fragment",
            "http://test.com/filename?with=args&and#with-fragment",
        }

        for _, tc := range testCases {
            req, _ := http.NewRequest("GET", tc, nil)
            resp := &http.Response{
                Request: req,
            }
            actual, err := guessFilename(resp)
            if err != nil {
                t.Errorf("%v", err)
            }

            if actual != expect {
                t.Errorf("expected '%v', got '%v'", expect, actual)
            }
        }
    })

    t.Run("Invalid", func(t *testing.T) {
        testCases := []string{
            "http://test.com",
            "http://test.com/",
            "http://test.com/filename/",
            "http://test.com/filename/?with=args",
            "http://test.com/filename/#with-fragment",
            "http://test.com/filename\x00",
        }

        for _, tc := range testCases {
            req, _ := http.NewRequest("GET", tc, nil)
            resp := &http.Response{
                Request: req,
            }

            _, err := guessFilename(resp)
            if err != ErrNoFilename {
                t.Errorf("expected '%v', got '%v'", ErrNoFilename, err)
            }
        }
    })
}

Похоже, в сообщении об ошибке говорится, что req является нулевым указателем, но поскольку он определен с использованиемhttp.NewRequest() Не понимаю, как это может быть?

1 Ответ

2 голосов
/ 07 октября 2019

Добавить эту ошибку:

            req, err1 := http.NewRequest("GET", tc, nil)
            if err1 != nil {
                log.Println(err1.Error())
            }

Будет напечатано:

parse http://test.com/filename: net / url: недопустимый управляющий символ в URL

, что означает, что этот URL "http://test.com/filename\x00" недопустим.

Прокомментируйте эту строку, тогда она будет работать:

[p1gd0g@p1gd0g-pc grab]$ go test
PASS
ok      github.com/cavaliercoder/grab   2.586s
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...