main_test.go 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. package main
  2. import (
  3. "bufio"
  4. "fmt"
  5. "net"
  6. "testing"
  7. )
  8. func TestAutomaticLoginWaitsForSuccessAndPreservesBufferedData(t *testing.T) {
  9. for _, accepted := range []bool{true, false} {
  10. t.Run(fmt.Sprint(accepted), func(t *testing.T) {
  11. client, server := net.Pipe()
  12. defer client.Close()
  13. defer server.Close()
  14. done := make(chan error, 1)
  15. go func() {
  16. r := bufio.NewReader(server)
  17. fmt.Fprint(server, "DebTik login: ")
  18. user, err := r.ReadString('\n')
  19. if err != nil {
  20. done <- err
  21. return
  22. }
  23. fmt.Fprint(server, "Password: ")
  24. password, err := r.ReadString('\n')
  25. if err != nil {
  26. done <- err
  27. return
  28. }
  29. if user != "admin\n" || password != "test-password\n" {
  30. done <- fmt.Errorf("wrong credentials sent")
  31. return
  32. }
  33. if accepted {
  34. _, err = fmt.Fprint(server, "Welcome\n[admin@router] > buffered")
  35. } else {
  36. _, err = fmt.Fprint(server, "Login failed: invalid credentials\n")
  37. }
  38. done <- err
  39. }()
  40. r := bufio.NewReader(client)
  41. err := autoLogin(client, r, "admin", "test-password")
  42. if (err == nil) != accepted {
  43. t.Fatalf("accepted=%v err=%v", accepted, err)
  44. }
  45. if accepted {
  46. buffered := make([]byte, 8)
  47. if _, err := r.Read(buffered); err != nil || string(buffered) != "buffered" {
  48. t.Fatal("buffered data was lost")
  49. }
  50. }
  51. if err := <-done; err != nil {
  52. t.Fatal(err)
  53. }
  54. })
  55. }
  56. }