(t *testing.T)
| 1882 | } |
| 1883 | |
| 1884 | func TestAIBridgeRateLimiting(t *testing.T) { |
| 1885 | t.Parallel() |
| 1886 | |
| 1887 | dv := coderdtest.DeploymentValues(t) |
| 1888 | dv.AI.BridgeConfig.Enabled = serpent.Bool(true) |
| 1889 | // Set a low rate limit for testing. |
| 1890 | dv.AI.BridgeConfig.RateLimit = 2 |
| 1891 | |
| 1892 | client, closer, api, _ := coderdenttest.NewWithAPI(t, &coderdenttest.Options{ |
| 1893 | Options: &coderdtest.Options{ |
| 1894 | DeploymentValues: dv, |
| 1895 | }, |
| 1896 | LicenseOptions: &coderdenttest.LicenseOptions{ |
| 1897 | Features: license.Features{ |
| 1898 | codersdk.FeatureAIBridge: 1, |
| 1899 | }, |
| 1900 | }, |
| 1901 | }) |
| 1902 | t.Cleanup(func() { |
| 1903 | _ = closer.Close() |
| 1904 | }) |
| 1905 | |
| 1906 | // Register a simple test handler. |
| 1907 | testHandler := http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) { |
| 1908 | rw.WriteHeader(http.StatusOK) |
| 1909 | }) |
| 1910 | api.AGPL.RegisterInMemoryAIBridgedHTTPHandler(testHandler) |
| 1911 | |
| 1912 | ctx := testutil.Context(t, testutil.WaitLong) |
| 1913 | httpClient := &http.Client{} |
| 1914 | url := client.URL.String() + "/api/v2/aibridge/test" |
| 1915 | |
| 1916 | // Make requests up to the limit - should succeed. |
| 1917 | for range 2 { |
| 1918 | req, err := http.NewRequestWithContext(ctx, http.MethodPost, url, nil) |
| 1919 | require.NoError(t, err) |
| 1920 | req.Header.Set(codersdk.SessionTokenHeader, client.SessionToken()) |
| 1921 | |
| 1922 | resp, err := httpClient.Do(req) |
| 1923 | require.NoError(t, err) |
| 1924 | _ = resp.Body.Close() |
| 1925 | require.Equal(t, http.StatusOK, resp.StatusCode) |
| 1926 | } |
| 1927 | |
| 1928 | // Next request should be rate limited. |
| 1929 | req, err := http.NewRequestWithContext(ctx, http.MethodPost, url, nil) |
| 1930 | require.NoError(t, err) |
| 1931 | req.Header.Set(codersdk.SessionTokenHeader, client.SessionToken()) |
| 1932 | |
| 1933 | resp, err := httpClient.Do(req) |
| 1934 | require.NoError(t, err) |
| 1935 | defer resp.Body.Close() |
| 1936 | require.Equal(t, http.StatusTooManyRequests, resp.StatusCode) |
| 1937 | require.NotEmpty(t, resp.Header.Get("Retry-After")) |
| 1938 | } |
| 1939 | |
| 1940 | func TestAIBridgeConcurrencyLimiting(t *testing.T) { |
| 1941 | t.Parallel() |
nothing calls this directly
no test coverage detected