// Copyright 2021 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package misc

import (
	"net/http"
	"testing"

	"golang.org/x/tools/internal/lsp/command"
	"golang.org/x/tools/internal/lsp/protocol"

	. "golang.org/x/tools/internal/lsp/regtest"
)

func TestStartDebugging(t *testing.T) {
	WithOptions(
		Modes(Forwarded),
	).Run(t, "", func(t *testing.T, env *Env) {
		args, err := command.MarshalArgs(command.DebuggingArgs{})
		if err != nil {
			t.Fatal(err)
		}
		params := &protocol.ExecuteCommandParams{
			Command:   command.StartDebugging.ID(),
			Arguments: args,
		}
		var result command.DebuggingResult
		env.ExecuteCommand(params, &result)
		if got, want := len(result.URLs), 2; got != want {
			t.Fatalf("got %d urls, want %d; urls: %#v", got, want, result.URLs)
		}
		for i, u := range result.URLs {
			resp, err := http.Get(u)
			if err != nil {
				t.Errorf("getting url #%d (%q): %v", i, u, err)
				continue
			}
			defer resp.Body.Close()
			if got, want := resp.StatusCode, http.StatusOK; got != want {
				t.Errorf("debug server #%d returned HTTP %d, want %d", i, got, want)
			}
		}
	})
}
