weaviate
98 строк · 2.7 Кб
1// _ _
2// __ _____ __ ___ ___ __ _| |_ ___
3// \ \ /\ / / _ \/ _` \ \ / / |/ _` | __/ _ \
4// \ V V / __/ (_| |\ V /| | (_| | || __/
5// \_/\_/ \___|\__,_| \_/ |_|\__,_|\__\___|
6//
7// Copyright © 2016 - 2024 Weaviate B.V. All rights reserved.
8//
9// CONTACT: hello@weaviate.io
10//
11
12package clients
13
14import (
15"context"
16"net/http"
17"net/http/httptest"
18"testing"
19"time"
20
21"github.com/sirupsen/logrus"
22"github.com/sirupsen/logrus/hooks/test"
23"github.com/stretchr/testify/assert"
24"github.com/stretchr/testify/require"
25)
26
27func TestWaitForStartup(t *testing.T) {
28t.Run("when the server is immediately ready", func(t *testing.T) {
29server := httptest.NewServer(&testReadyHandler{t: t})
30defer server.Close()
31c := New(server.URL, 0, nullLogger())
32err := c.WaitForStartup(context.Background(), 50*time.Millisecond)
33
34assert.Nil(t, err)
35})
36
37t.Run("when the server is down", func(t *testing.T) {
38c := New("http://nothing-running-at-this-url", 0, nullLogger())
39ctx, cancel := context.WithTimeout(context.Background(), 200*time.Millisecond)
40defer cancel()
41err := c.WaitForStartup(ctx, 150*time.Millisecond)
42
43require.NotNil(t, err, nullLogger())
44assert.Contains(t, err.Error(), "expired before remote was ready")
45})
46
47t.Run("when the server is alive, but not ready", func(t *testing.T) {
48server := httptest.NewServer(&testReadyHandler{
49t: t,
50readyTime: time.Now().Add(1 * time.Minute),
51})
52c := New(server.URL, 0, nullLogger())
53defer server.Close()
54ctx, cancel := context.WithTimeout(context.Background(), 200*time.Millisecond)
55defer cancel()
56err := c.WaitForStartup(ctx, 50*time.Millisecond)
57
58require.NotNil(t, err)
59assert.Contains(t, err.Error(), "expired before remote was ready")
60})
61
62t.Run("when the server is initially not ready, but then becomes ready",
63func(t *testing.T) {
64server := httptest.NewServer(&testReadyHandler{
65t: t,
66readyTime: time.Now().Add(100 * time.Millisecond),
67})
68c := New(server.URL, 0, nullLogger())
69defer server.Close()
70ctx, cancel := context.WithTimeout(context.Background(), 200*time.Millisecond)
71defer cancel()
72err := c.WaitForStartup(ctx, 50*time.Millisecond)
73
74require.Nil(t, err)
75})
76}
77
78type testReadyHandler struct {
79t *testing.T
80// the test handler will report as not ready before the time has passed
81readyTime time.Time
82}
83
84func (f *testReadyHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
85assert.Equal(f.t, "/.well-known/ready", r.URL.String())
86assert.Equal(f.t, http.MethodGet, r.Method)
87
88if time.Since(f.readyTime) < 0 {
89w.WriteHeader(http.StatusServiceUnavailable)
90}
91
92w.WriteHeader(http.StatusNoContent)
93}
94
95func nullLogger() logrus.FieldLogger {
96l, _ := test.NewNullLogger()
97return l
98}
99