Files
2026-07-13 13:02:50 +08:00

171 lines
7.3 KiB
C#

/*
* QUANTCONNECT.COM - Democratizing Finance, Empowering Individuals.
* Lean Algorithmic Trading Engine v2.0. Copyright 2014 QuantConnect Corporation.
*
* 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 NUnit.Framework;
using System.Collections.Generic;
using System;
using System.IO;
using System.Linq;
using QuantConnect.Api;
namespace QuantConnect.Tests.API
{
[TestFixture, Explicit("Requires configured api access and available backtest node to run on"), Parallelizable(ParallelScope.Fixtures)]
public class ObjectStoreTests : ApiTestBase
{
private const string _ciTestFolder = "/CI_TEST";
private const string _key = _ciTestFolder + "/Ricardo";
private readonly byte[] _data = new byte[3] { 1, 2, 3 };
private static readonly string[] _keysToSetUp = new[]
{
"/filename.zip",
"/mm_test.csv",
"/model",
"/trades_test.json",
"/profile_results.json",
"/CustomData/placeholder.txt",
"/log.txt",
"/l1_model.p",
"/latency_1_False.txt",
"/portfolio-targets2.csv",
"/Regressor",
"/example_data_2.zip"
};
[OneTimeSetUp]
public void SetUpObjectStoreFiles()
{
foreach (var key in _keysToSetUp)
{
var fullKey = _ciTestFolder + key;
if (!ApiClient.GetObjectStoreProperties(TestOrganization, fullKey).Success)
{
ApiClient.SetObjectStore(TestOrganization, fullKey, _data);
}
}
}
[TestCaseSource(nameof(GetObjectStoreWorksAsExpectedTestCases))]
public void GetObjectStoreWorksAsExpected(string testName, List<string> keys, bool isSuccessExpected)
{
var path = Directory.GetCurrentDirectory() + "/StoreObjectFolder/";
var result = ApiClient.GetObjectStore(TestOrganization, keys, path);
if (isSuccessExpected)
{
Assert.IsTrue(result);
DirectoryAssert.Exists(path);
Assert.IsTrue(keys.Where(x => File.Exists(path + x) || Directory.Exists(path + x)).Any()); // For some test cases, just one of the keys is present in the Object Store.
}
else
{
Assert.IsFalse(result);
}
}
[TestCase(_ciTestFolder + "/filename.zip", true)]
[TestCase(_ciTestFolder + "/orats_2024-02-32.json", false)]
[TestCase(_ciTestFolder + "/mrm8488", false)]
[TestCase(_ciTestFolder + "/mm_test.csv", true)]
[TestCase(_ciTestFolder + "/model", true)]
[TestCase(_ciTestFolder + "/trades_test.json", true)]
public void GetObjectStorePropertiesWorksAsExpected(string key, bool isSuccessExpected)
{
var result = ApiClient.GetObjectStoreProperties(TestOrganization, key);
var stringRepresentation = result.ToString();
Assert.IsTrue(ApiTestBase.IsValidJson(stringRepresentation));
if (isSuccessExpected)
{
Assert.IsTrue(result.Success);
}
else
{
Assert.IsFalse(result.Success);
}
}
[Test]
public void SetObjectStoreWorksAsExpected()
{
var result = ApiClient.DeleteObjectStore(TestOrganization, _key);
Assert.IsFalse(result.Success);
result = ApiClient.SetObjectStore(TestOrganization, _key, _data);
Assert.IsTrue(result.Success);
result = ApiClient.DeleteObjectStore(TestOrganization, _key);
Assert.IsTrue(result.Success);
}
[Test]
public void DeleteObjectStoreWorksAsExpected()
{
var result = ApiClient.SetObjectStore(TestOrganization, _key + "/test1.txt", _data);
var result2 = ApiClient.SetObjectStore(TestOrganization, _key + "/test2.txt", _data);
Assert.IsTrue(result.Success);
var objectsBefore = ApiClient.ListObjectStore(TestOrganization, _key);
var stringRepresentation = objectsBefore.ToString();
Assert.IsTrue(ApiTestBase.IsValidJson(stringRepresentation));
var numberOfObjectsBefore = objectsBefore.Objects.Count;
var totalSizeBefore = objectsBefore.Objects.Select(o => o.Size).Sum();
result = ApiClient.DeleteObjectStore(TestOrganization, _key + "/test1.txt");
Assert.IsTrue(result.Success);
ListObjectStoreResponse objectsAfter;
var time = DateTime.UtcNow;
do
{
objectsAfter = ApiClient.ListObjectStore(TestOrganization, _key);
} while (objectsAfter.Objects.Count == numberOfObjectsBefore && DateTime.UtcNow < time.AddMinutes(10));
var totalSizeAfter = objectsAfter.Objects.Select(o => o.Size).Sum();
Assert.IsTrue(totalSizeAfter < totalSizeBefore);
result = ApiClient.DeleteObjectStore(TestOrganization, _key);
Assert.IsTrue(result.Success);
}
[Test]
public void ListObjectStoreWorksAsExpected()
{
var path = "/";
var result = ApiClient.ListObjectStore(TestOrganization, path);
Assert.IsTrue(result.Success);
Assert.IsNotEmpty(result.Objects);
Assert.AreEqual(path, result.Path);
}
private static object[] GetObjectStoreWorksAsExpectedTestCases =
{
new object[] { "Two keys present", new List<string> { _ciTestFolder + "/trades_test.json", _ciTestFolder + "/profile_results.json" }, true},
new object[] { "No key is given", new List<string> {}, false},
new object[] { "One key is present and the other one not", new List<string> { _ciTestFolder + "/trades_test.json", _ciTestFolder + "/orats_2024-02-32.json" }, true},
new object[] { "The key is not present", new List<string> { _ciTestFolder + "/orats_2024-02-32.json" }, false},
new object[] { "The type of the object store file is directory", new List<string> { _ciTestFolder + "/CustomData" }, true},
new object[] { "The type of the object store file is text/plain", new List<string> { _ciTestFolder + "/log.txt" }, true},
new object[] { "The type of the object store file is application/octet-stream", new List<string> { _ciTestFolder + "/model" }, true},
new object[] { "The type of the object store file is P", new List<string> { _ciTestFolder + "/l1_model.p" }, true},
new object[] { "Heavy object store files", new List<string> {
_ciTestFolder + "/latency_1_False.txt",
_ciTestFolder + "/portfolio-targets2.csv",
_ciTestFolder + "/Regressor",
_ciTestFolder + "/example_data_2.zip"
}, true}
};
}
}