monitoring/api/MonitoringTest/MonitoringTest.cs (161 lines of code) (raw):
// Copyright(c) 2017 Google Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License"); you may not
// use this file except in compliance with the License. You may obtain a copy of
// the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations under
// the License.
using Grpc.Core;
using System;
using System.Linq;
using Xunit;
namespace GoogleCloudSamples
{
public class TestFixture : IDisposable
{
private const string TimeSeriesQuotaError = "One or more TimeSeries could not be written:" +
" One or more points were written more frequently than the maximum sampling period configured for the metric.";
private static bool IsTimeSeriesQuotaError(Exception ex) =>
ex is RpcException rpcEx
&& rpcEx.StatusCode == StatusCode.InvalidArgument
&& rpcEx.Status.Detail.Contains(TimeSeriesQuotaError);
public static RetryRobot TimeSeriesQuota { get; } = new RetryRobot
{
ShouldRetry = ex => IsTimeSeriesQuotaError(ex)
|| (ex is AggregateException aggEx && aggEx.InnerExceptions.Any(innerEx => IsTimeSeriesQuotaError(innerEx))),
FirstRetryDelayMs = 10_000,
MaxTryCount = 10
};
public string ProjectId { get; private set; }
= Environment.GetEnvironmentVariable("GOOGLE_PROJECT_ID");
public TestFixture()
{
WriteOutput = TimeSeriesQuota.Eventually(() => CloudMonitoring.Run("write", ProjectId));
}
public CommandLineRunner CloudMonitoring { get; private set; }
= new CommandLineRunner()
{
VoidMain = Monitoring.Main,
Command = "Monitoring"
};
public ConsoleOutput WriteOutput { get; private set; }
public void Dispose()
{
}
}
// <summary>
/// Runs the sample app's methods and tests the outputs
// </summary>
public class CommonTests : IClassFixture<TestFixture>
{
private readonly string _projectId;
readonly CommandLineRunner _cloudMonitoring;
private readonly TestFixture _fixture;
public CommonTests(TestFixture fixture)
{
_projectId = fixture.ProjectId;
_cloudMonitoring = fixture.CloudMonitoring;
_fixture = fixture;
}
protected ConsoleOutput Run(params string[] args)
{
return _cloudMonitoring.Run(args);
}
[Fact]
public void TestListMetricDescriptors()
{
string testMetricName = "compute.googleapis.com/instance/cpu/utilization";
var output = _cloudMonitoring.Run("list", _projectId);
Assert.Equal(0, output.ExitCode);
Assert.Contains(testMetricName, output.Stdout);
}
[Fact]
public void TestCreateCustomMetric()
{
var output = _cloudMonitoring.Run("create", _projectId);
Assert.Equal(0, output.ExitCode);
Assert.Contains("metricKind", output.Stdout);
}
[Fact]
public void TestGetMetricDescriptor()
{
_cloudMonitoring.Run("create", _projectId);
var output = _cloudMonitoring.Run("get", _projectId,
"custom.googleapis.com/stores/daily_sales");
Assert.Equal(0, output.ExitCode);
Assert.Contains("metricKind", output.Stdout);
}
[Fact]
public void TestWriteTimeSeriesData()
{
Assert.Equal(0, _fixture.WriteOutput.ExitCode);
Assert.Contains("Pittsburgh", _fixture.WriteOutput.Stdout);
}
[Fact]
public void TestListMonitoredResourceDescriptors()
{
string testResourceName = $"projects/{_projectId}/monitoredResourceDescriptors/";
var output = _cloudMonitoring.Run("listResources", _projectId);
Assert.Equal(0, output.ExitCode);
Assert.Contains(testResourceName, output.Stdout);
}
[Fact]
public void TestGetMonitoredResourceDescriptor()
{
string testResourceDisplayName = "Produced API";
var output = _cloudMonitoring.Run("getResource", _projectId, "api");
Assert.Equal(0, output.ExitCode);
Assert.Contains(testResourceDisplayName, output.Stdout);
}
[Fact]
public void TestReadTimeSeriesData()
{
var output = _cloudMonitoring.Run("read", _projectId,
"custom.googleapis.com/stores/daily_sales");
Assert.Equal(0, output.ExitCode);
Assert.Contains("123.45", output.Stdout);
}
[Fact]
public void TestReadTimeSeriesDataFields()
{
var output = _cloudMonitoring.Run("readFields", _projectId,
"custom.googleapis.com/stores/daily_sales");
Assert.Equal(0, output.ExitCode);
Assert.DoesNotContain("123.45", output.Stdout);
Assert.Contains("Pittsburgh", output.Stdout);
}
[Fact]
public void TestReadTimeSeriesDataAggregated()
{
var output = _cloudMonitoring.Run("readAggregate", _projectId);
Assert.Equal(0, output.ExitCode);
Assert.Contains("Now:", output.Stdout);
Assert.Contains("10 min ago:", output.Stdout);
}
[Fact]
public void TestReadTimeSeriesDataReduced()
{
var output = _cloudMonitoring.Run("readReduce", _projectId);
Assert.Equal(0, output.ExitCode);
Assert.Contains("Last 10 min:", output.Stdout);
Assert.Contains("Last 10-20 min ago:", output.Stdout);
}
[Fact]
public void TestDeleteMetricDescriptor()
{
string randomNameSuffix = TestUtil.RandomName();
string metricType = "custom.googleapis.com/stores/daily_sales" + randomNameSuffix;
// Create Metric Descriptor.
var output = _cloudMonitoring.Run("create", _projectId, metricType);
// Confirm Metric Descriptor is created.
Assert.Equal(0, output.ExitCode);
// Get Metric Descriptor.
var outputFromGet = _cloudMonitoring.Run("get", _projectId, metricType);
Assert.Equal(0, outputFromGet.ExitCode);
// Delete Metric Descriptor.
var outputFromDelete = _cloudMonitoring.Run("delete", _projectId, metricType);
Assert.Equal(0, outputFromDelete.ExitCode);
}
}
public class QuickStartTests
{
readonly CommandLineRunner _quickStart = new CommandLineRunner()
{
VoidMain = QuickStart.Main,
Command = "dotnet run"
};
[Fact]
public void TestRun()
{
var output = TestFixture.TimeSeriesQuota.Eventually(() => _quickStart.Run());
Assert.Equal(0, output.ExitCode);
}
}
}