Skip to content

Commit 364b223

Browse files
author
Jimmy Byrd
committed
Add Tests infrastructur project
1 parent e8c84d5 commit 364b223

File tree

11 files changed

+141
-82
lines changed

11 files changed

+141
-82
lines changed

.paket/Paket.Restore.targets

Lines changed: 45 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,11 @@
55
<!-- make MSBuild track this file for incremental builds. -->
66
<!-- ref https://blogs.msdn.microsoft.com/msbuild/2005/09/26/how-to-ensure-changes-to-a-custom-target-file-prompt-a-rebuild/ -->
77
<MSBuildAllProjects>$(MSBuildAllProjects);$(MSBuildThisFileFullPath)</MSBuildAllProjects>
8+
9+
<DetectedMSBuildVersion>$(MSBuildVersion)</DetectedMSBuildVersion>
10+
<DetectedMSBuildVersion Condition="$(MSBuildVersion) == ''">15.0.0</DetectedMSBuildVersion>
11+
<MSBuildSupportsHashing>false</MSBuildSupportsHashing>
12+
<MSBuildSupportsHashing Condition=" '$(DetectedMSBuildVersion)' &gt; '15.8.0' ">true</MSBuildSupportsHashing>
813
<!-- Mark that this target file has been loaded. -->
914
<IsPaketRestoreTargetsFileLoaded>true</IsPaketRestoreTargetsFileLoaded>
1015
<PaketToolsPath>$(MSBuildThisFileDirectory)</PaketToolsPath>
@@ -73,37 +78,47 @@
7378
<MSBuild Projects="$(PaketToolsPath)paket.bootstrapper.proj" Targets="Restore" />
7479
</Target>
7580

81+
<!-- Official workaround for https://docs.microsoft.com/en-us/visualstudio/msbuild/getfilehash-task?view=vs-2019 -->
82+
<UsingTask TaskName="Microsoft.Build.Tasks.GetFileHash" AssemblyName="Microsoft.Build.Tasks.Core, Version=15.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" Condition=" '$(MSBuildSupportsHashing)' == 'true' And '$(DetectedMSBuildVersion)' &lt; '16.0.360' " />
83+
<UsingTask TaskName="Microsoft.Build.Tasks.VerifyFileHash" AssemblyName="Microsoft.Build.Tasks.Core, Version=15.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" Condition=" '$(MSBuildSupportsHashing)' == 'true' And '$(DetectedMSBuildVersion)' &lt; '16.0.360' " />
7684
<Target Name="PaketRestore" Condition="'$(PaketRestoreDisabled)' != 'True'" BeforeTargets="_GenerateDotnetCliToolReferenceSpecs;_GenerateProjectRestoreGraphPerFramework;_GenerateRestoreGraphWalkPerFramework;CollectPackageReferences" DependsOnTargets="PaketBootstrapping">
7785

78-
<!-- Step 1 Check if lockfile is properly restored -->
86+
<!-- Step 1 Check if lockfile is properly restored (if the hash of the lockfile and the cache-file match) -->
7987
<PropertyGroup>
8088
<PaketRestoreRequired>true</PaketRestoreRequired>
8189
<NoWarn>$(NoWarn);NU1603;NU1604;NU1605;NU1608</NoWarn>
90+
<CacheFilesExist>false</CacheFilesExist>
91+
<CacheFilesExist Condition=" Exists('$(PaketRestoreCacheFile)') And Exists('$(PaketLockFilePath)') ">true</CacheFilesExist>
8292
</PropertyGroup>
8393

84-
<!-- Because ReadAllText is slow on osx/linux, try to find shasum and awk -->
85-
<PropertyGroup>
86-
<PaketRestoreCachedHasher Condition="'$(OS)' != 'Windows_NT' And '$(PaketRestoreCachedHasher)' == '' And Exists('/usr/bin/shasum') And Exists('/usr/bin/awk')">/usr/bin/shasum "$(PaketRestoreCacheFile)" | /usr/bin/awk '{ print $1 }'</PaketRestoreCachedHasher>
87-
<PaketRestoreLockFileHasher Condition="'$(OS)' != 'Windows_NT' And '$(PaketRestoreLockFileHash)' == '' And Exists('/usr/bin/shasum') And Exists('/usr/bin/awk')">/usr/bin/shasum "$(PaketLockFilePath)" | /usr/bin/awk '{ print $1 }'</PaketRestoreLockFileHasher>
94+
<!-- Read the hash of the lockfile -->
95+
<GetFileHash Condition=" '$(MSBuildSupportsHashing)' == 'true' And '$(CacheFilesExist)' == 'true' " Files="$(PaketLockFilePath)" Algorithm="SHA256" HashEncoding="hex" >
96+
<Output TaskParameter="Hash" PropertyName="PaketRestoreLockFileHash" />
97+
</GetFileHash>
98+
<!-- Read the hash of the cache, which is json, but a very simple key value object -->
99+
<PropertyGroup Condition=" '$(MSBuildSupportsHashing)' == 'true' And '$(CacheFilesExist)' == 'true' ">
100+
<PaketRestoreCachedContents>$([System.IO.File]::ReadAllText('$(PaketRestoreCacheFile)'))</PaketRestoreCachedContents>
101+
</PropertyGroup>
102+
<ItemGroup Condition=" '$(MSBuildSupportsHashing)' == 'true' And '$(CacheFilesExist)' == 'true' ">
103+
<!-- Parse our simple 'paket.restore.cached' json ...-->
104+
<PaketRestoreCachedSplitObject Include="$([System.Text.RegularExpressions.Regex]::Split(`$(PaketRestoreCachedContents)`, `{|}|,`))"></PaketRestoreCachedSplitObject>
105+
<!-- Keep Key, Value ItemGroup-->
106+
<PaketRestoreCachedKeyValue Include="@(PaketRestoreCachedSplitObject)"
107+
Condition=" $([System.Text.RegularExpressions.Regex]::Split(`%(Identity)`, `&quot;: &quot;`).Length) &gt; 1 ">
108+
<Key>$([System.Text.RegularExpressions.Regex]::Split(`%(Identity)`, `": "`)[0].Replace(`"`, ``).Replace(` `, ``))</Key>
109+
<Value>$([System.Text.RegularExpressions.Regex]::Split(`%(Identity)`, `": "`)[1].Replace(`"`, ``).Replace(` `, ``))</Value>
110+
</PaketRestoreCachedKeyValue>
111+
</ItemGroup>
112+
<PropertyGroup Condition=" '$(MSBuildSupportsHashing)' == 'true' And '$(CacheFilesExist)' == 'true' ">
113+
<!-- Retrieve the hashes we are interested in -->
114+
<PackagesDownloadedHash Condition=" '%(PaketRestoreCachedKeyValue.Key)' == 'packagesDownloadedHash' ">%(PaketRestoreCachedKeyValue.Value)</PackagesDownloadedHash>
115+
<ProjectsRestoredHash Condition=" '%(PaketRestoreCachedKeyValue.Key)' == 'projectsRestoredHash' ">%(PaketRestoreCachedKeyValue.Value)</ProjectsRestoredHash>
88116
</PropertyGroup>
89117

90-
<!-- If shasum and awk exist get the hashes -->
91-
<Exec StandardOutputImportance="Low" Condition=" '$(PaketRestoreCachedHasher)' != '' " Command="$(PaketRestoreCachedHasher)" ConsoleToMSBuild='true'>
92-
<Output TaskParameter="ConsoleOutput" PropertyName="PaketRestoreCachedHash" />
93-
</Exec>
94-
<Exec StandardOutputImportance="Low" Condition=" '$(PaketRestoreLockFileHasher)' != '' " Command="$(PaketRestoreLockFileHasher)" ConsoleToMSBuild='true'>
95-
<Output TaskParameter="ConsoleOutput" PropertyName="PaketRestoreLockFileHash" />
96-
</Exec>
97-
98-
<!-- Debug whats going on -->
99-
<Message Importance="low" Text="calling paket restore with targetframework=$(TargetFramework) targetframeworks=$(TargetFrameworks)" />
100-
101-
<PropertyGroup Condition="Exists('$(PaketRestoreCacheFile)') ">
102-
<!-- if no hash has been done yet fall back to just reading in the files and comparing them -->
103-
<PaketRestoreCachedHash Condition=" '$(PaketRestoreCachedHash)' == '' ">$([System.IO.File]::ReadAllText('$(PaketRestoreCacheFile)'))</PaketRestoreCachedHash>
104-
<PaketRestoreLockFileHash Condition=" '$(PaketRestoreLockFileHash)' == '' ">$([System.IO.File]::ReadAllText('$(PaketLockFilePath)'))</PaketRestoreLockFileHash>
118+
<PropertyGroup Condition=" '$(MSBuildSupportsHashing)' == 'true' And '$(CacheFilesExist)' == 'true' ">
119+
<!-- If the restire file doesn't exist we need to restore, otherwise only if hashes don't match -->
105120
<PaketRestoreRequired>true</PaketRestoreRequired>
106-
<PaketRestoreRequired Condition=" '$(PaketRestoreLockFileHash)' == '$(PaketRestoreCachedHash)' ">false</PaketRestoreRequired>
121+
<PaketRestoreRequired Condition=" '$(PaketRestoreLockFileHash)' == '$(ProjectsRestoredHash)' ">false</PaketRestoreRequired>
107122
<PaketRestoreRequired Condition=" '$(PaketRestoreLockFileHash)' == '' ">true</PaketRestoreRequired>
108123
</PropertyGroup>
109124

@@ -116,7 +131,10 @@
116131
</PropertyGroup>
117132

118133
<!-- Do a global restore if required -->
134+
<Warning Text="This version of MSBuild (we assume '$(DetectedMSBuildVersion)' or older) doesn't support GetFileHash, so paket fast restore is disabled." Condition=" '$(MSBuildSupportsHashing)' != 'true' " />
135+
<Error Text="Stop build because of PAKET_ERROR_ON_MSBUILD_EXEC and we always call the bootstrapper" Condition=" '$(PAKET_ERROR_ON_MSBUILD_EXEC)' == 'true' AND '$(PaketBootstrapperStyle)' == 'classic' AND Exists('$(PaketBootStrapperExePath)') AND !(Exists('$(PaketExePath)'))" />
119136
<Exec Command='$(PaketBootStrapperCommand)' Condition=" '$(PaketBootstrapperStyle)' == 'classic' AND Exists('$(PaketBootStrapperExePath)') AND !(Exists('$(PaketExePath)'))" ContinueOnError="false" />
137+
<Error Text="Stop build because of PAKET_ERROR_ON_MSBUILD_EXEC and we need a full restore (hashes don't match)" Condition=" '$(PAKET_ERROR_ON_MSBUILD_EXEC)' == 'true' AND '$(PaketRestoreRequired)' == 'true' AND '$(PaketDisableGlobalRestore)' != 'true'" />
120138
<Exec Command='$(PaketCommand) restore' Condition=" '$(PaketRestoreRequired)' == 'true' AND '$(PaketDisableGlobalRestore)' != 'true' " ContinueOnError="false" />
121139

122140
<!-- Step 2 Detect project specific changes -->
@@ -126,7 +144,7 @@
126144
<MyTargetFrameworks Condition="'$(TargetFrameworks)' != '' AND '$(TargetFramework)' == '' " Include="$(TargetFrameworks)"></MyTargetFrameworks>
127145
<PaketResolvedFilePaths Include="@(MyTargetFrameworks -> '$(PaketIntermediateOutputPath)\$(MSBuildProjectFile).%(Identity).paket.resolved')"></PaketResolvedFilePaths>
128146
</ItemGroup>
129-
<Message Importance="low" Text="MyTargetFrameworks=@(MyTargetFrameworks) PaketResolvedFilePaths=@(PaketResolvedFilePaths)" />
147+
130148
<PropertyGroup>
131149
<PaketReferencesCachedFilePath>$(PaketIntermediateOutputPath)\$(MSBuildProjectFile).paket.references.cached</PaketReferencesCachedFilePath>
132150
<!-- MyProject.fsproj.paket.references has the highest precedence -->
@@ -163,6 +181,7 @@
163181

164182
<!-- Step 3 Restore project specific stuff if required -->
165183
<Message Condition=" '$(PaketRestoreRequired)' == 'true' " Importance="low" Text="Detected a change ('$(PaketRestoreRequiredReason)') in the project file '$(MSBuildProjectFullPath)', calling paket restore" />
184+
<Error Text="Stop build because of PAKET_ERROR_ON_MSBUILD_EXEC and we detected a change ('$(PaketRestoreRequiredReason)') in the project file '$(MSBuildProjectFullPath)'" Condition=" '$(PAKET_ERROR_ON_MSBUILD_EXEC)' == 'true' AND '$(PaketRestoreRequired)' == 'true' " />
166185
<Exec Command='$(PaketCommand) restore --project "$(MSBuildProjectFullPath)" --output-path "$(PaketIntermediateOutputPath)" --target-framework "$(TargetFrameworks)"' Condition=" '$(PaketRestoreRequired)' == 'true' AND '$(TargetFramework)' == '' " ContinueOnError="false" />
167186
<Exec Command='$(PaketCommand) restore --project "$(MSBuildProjectFullPath)" --output-path "$(PaketIntermediateOutputPath)" --target-framework "$(TargetFramework)"' Condition=" '$(PaketRestoreRequired)' == 'true' AND '$(TargetFramework)' != '' " ContinueOnError="false" />
168187

@@ -224,8 +243,6 @@
224243
<Target Name="PaketDisableDirectPack" AfterTargets="_IntermediatePack" BeforeTargets="GenerateNuspec" Condition="('$(IsPackable)' == '' Or '$(IsPackable)' == 'true') And Exists('$(PaketIntermediateOutputPath)/$(MSBuildProjectFile).references')" >
225244
<PropertyGroup>
226245
<ContinuePackingAfterGeneratingNuspec>false</ContinuePackingAfterGeneratingNuspec>
227-
<DetectedMSBuildVersion>$(MSBuildVersion)</DetectedMSBuildVersion>
228-
<DetectedMSBuildVersion Condition="$(MSBuildVersion) == ''">15.8.0</DetectedMSBuildVersion>
229246
</PropertyGroup>
230247
</Target>
231248

@@ -252,10 +269,12 @@
252269
</PropertyGroup>
253270

254271
<ItemGroup>
255-
<_NuspecFiles Include="$(AdjustedNuspecOutputPath)\*.$(PackageVersion).nuspec"/>
272+
<_NuspecFiles Include="$(AdjustedNuspecOutputPath)\*.$(PackageVersion.Split(`+`)[0]).nuspec"/>
256273
</ItemGroup>
257274

258-
<Exec Command='$(PaketCommand) fix-nuspecs files "@(_NuspecFiles)" project-file "$(PaketProjectFile)" ' Condition="@(_NuspecFiles) != ''" />
275+
<Error Text="Error Because of PAKET_ERROR_ON_MSBUILD_EXEC (not calling fix-nuspecs)" Condition=" '$(PAKET_ERROR_ON_MSBUILD_EXEC)' == 'true' " />
276+
<Exec Condition="@(_NuspecFiles) != ''" Command='$(PaketCommand) fix-nuspecs files "@(_NuspecFiles)" project-file "$(PaketProjectFile)" ' />
277+
<Error Condition="@(_NuspecFiles) == ''" Text='Could not find nuspec files in "$(AdjustedNuspecOutputPath)" (Version: "$(PackageVersion)"), therefore we cannot call "paket fix-nuspecs" and have to error out!' />
259278

260279
<ConvertToAbsolutePath Condition="@(_NuspecFiles) != ''" Paths="@(_NuspecFiles)">
261280
<Output TaskParameter="AbsolutePaths" PropertyName="NuspecFileAbsolutePath" />

FSharp.Control.Redis.Streams.sln

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "FSharp.Control.Redis.Stream
2323
EndProject
2424
Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "FSharp.Control.Redis.Streams.Tests", "tests\FSharp.Control.Redis.Streams.Tests\FSharp.Control.Redis.Streams.Tests.fsproj", "{E26FC657-5C34-4737-8BC3-EC9C3386655A}"
2525
EndProject
26+
Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "FSharp.Control.Redis.Streams.Infrastructure.Tests", "tests\FSharp.Control.Redis.Streams.Infrastructure.Tests\FSharp.Control.Redis.Streams.Infrastructure.Tests.fsproj", "{E4E4F1ED-A7DD-43B0-B21B-7884485DE1E0}"
27+
EndProject
2628
Global
2729
GlobalSection(SolutionConfigurationPlatforms) = preSolution
2830
Debug|Any CPU = Debug|Any CPU
@@ -132,6 +134,18 @@ Global
132134
{E26FC657-5C34-4737-8BC3-EC9C3386655A}.Release|x64.Build.0 = Release|Any CPU
133135
{E26FC657-5C34-4737-8BC3-EC9C3386655A}.Release|x86.ActiveCfg = Release|Any CPU
134136
{E26FC657-5C34-4737-8BC3-EC9C3386655A}.Release|x86.Build.0 = Release|Any CPU
137+
{E4E4F1ED-A7DD-43B0-B21B-7884485DE1E0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
138+
{E4E4F1ED-A7DD-43B0-B21B-7884485DE1E0}.Debug|Any CPU.Build.0 = Debug|Any CPU
139+
{E4E4F1ED-A7DD-43B0-B21B-7884485DE1E0}.Debug|x64.ActiveCfg = Debug|Any CPU
140+
{E4E4F1ED-A7DD-43B0-B21B-7884485DE1E0}.Debug|x64.Build.0 = Debug|Any CPU
141+
{E4E4F1ED-A7DD-43B0-B21B-7884485DE1E0}.Debug|x86.ActiveCfg = Debug|Any CPU
142+
{E4E4F1ED-A7DD-43B0-B21B-7884485DE1E0}.Debug|x86.Build.0 = Debug|Any CPU
143+
{E4E4F1ED-A7DD-43B0-B21B-7884485DE1E0}.Release|Any CPU.ActiveCfg = Release|Any CPU
144+
{E4E4F1ED-A7DD-43B0-B21B-7884485DE1E0}.Release|Any CPU.Build.0 = Release|Any CPU
145+
{E4E4F1ED-A7DD-43B0-B21B-7884485DE1E0}.Release|x64.ActiveCfg = Release|Any CPU
146+
{E4E4F1ED-A7DD-43B0-B21B-7884485DE1E0}.Release|x64.Build.0 = Release|Any CPU
147+
{E4E4F1ED-A7DD-43B0-B21B-7884485DE1E0}.Release|x86.ActiveCfg = Release|Any CPU
148+
{E4E4F1ED-A7DD-43B0-B21B-7884485DE1E0}.Release|x86.Build.0 = Release|Any CPU
135149
EndGlobalSection
136150
GlobalSection(NestedProjects) = preSolution
137151
{5D30E174-2538-47AC-8443-318C8C5DC2C9} = {C397A34C-84F1-49E7-AEBC-2F9F2B196216}
@@ -142,5 +156,6 @@ Global
142156
{F260F85B-FAC8-484F-AD86-88808E271F9B} = {C397A34C-84F1-49E7-AEBC-2F9F2B196216}
143157
{B1FE2B5B-2AFD-43E9-ACBF-997DE13CFF43} = {ACBEE43C-7A88-4FB1-9B06-DB064D22B29F}
144158
{E26FC657-5C34-4737-8BC3-EC9C3386655A} = {ACBEE43C-7A88-4FB1-9B06-DB064D22B29F}
159+
{E4E4F1ED-A7DD-43B0-B21B-7884485DE1E0} = {ACBEE43C-7A88-4FB1-9B06-DB064D22B29F}
145160
EndGlobalSection
146161
EndGlobal

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ Currently Supported:
1515
MacOS/Linux | Windows
1616
--- | ---
1717
[![Travis Badge](https://travis-ci.org/TheAngryByrd/FSharp.Control.Redis.Streams.svg?branch=master)](https://travis-ci.org/TheAngryByrd/FSharp.Control.Redis.Streams) | No Redis 5.0 Support On Windows
18-
[![Build History](https://buildstats.info/travisci/chart/TheAngryByrd/FSharp.Control.Redis.Streams)](https://travis-ci.org/TheAngryByrd/FSharp.Control.Redis.Streams/builds) |
18+
[![Build History](https://buildstats.info/travisci/chart/TheAngryByrd/FSharp.Control.Redis.Streams)](https://travis-ci.org/TheAngryByrd/FSharp.Control.Redis.Streams/builds) | No Redis 5.0 Support On Windows
1919

2020

2121
## Nuget

tests/FSharp.Control.Redis.Streams.Akka.Tests/FSharp.Control.Redis.Streams.Akka.Tests.fsproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
</ItemGroup>
1212
<ItemGroup>
1313
<ProjectReference Include="../../src/FSharp.Control.Redis.Streams.Akka/FSharp.Control.Redis.Streams.Akka.fsproj" />
14+
<ProjectReference Include="../FSharp.Control.Redis.Streams.Infrastructure.Tests/FSharp.Control.Redis.Streams.Infrastructure.Tests.fsproj" />
1415
</ItemGroup>
1516
<!-- <Import Project="..\..\fsc.props" /> -->
1617
<Import Project="..\..\netfx.props" />

tests/FSharp.Control.Redis.Streams.Hopac.Tests/FSharp.Control.Redis.Streams.Hopac.Tests.fsproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
</ItemGroup>
1212
<ItemGroup>
1313
<ProjectReference Include="../../src/FSharp.Control.Redis.Streams.Hopac/FSharp.Control.Redis.Streams.Hopac.fsproj" />
14+
<ProjectReference Include="../FSharp.Control.Redis.Streams.Infrastructure.Tests/FSharp.Control.Redis.Streams.Infrastructure.Tests.fsproj" />
1415
</ItemGroup>
1516
<!-- <Import Project="..\..\fsc.props" /> -->
1617
<Import Project="..\..\netfx.props" />

tests/FSharp.Control.Redis.Streams.Hopac.Tests/Tests.fs

Lines changed: 1 addition & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -7,59 +7,7 @@ open Hopac
77
open FSharp.Control.Redis.Streams
88
open FSharp.Control.Redis.Streams.Core
99
open FSharp.Control.Redis.Streams.Hopac
10-
11-
let getUniqueKey (keyType : string) (key : string) =
12-
let suffix = Guid.NewGuid().ToString()
13-
sprintf "%s:%s:%s" keyType key suffix
14-
|> RedisKey.op_Implicit
15-
16-
let getUniqueStreamKey (key : string) =
17-
getUniqueKey "stream" key
18-
19-
// No way to delete a stream, so setting the max size to 1. It's close enough for now.
20-
let disposableStream (db : IDatabase) (streamName : RedisKey) = {
21-
new IDisposable with
22-
member x.Dispose () = db.StreamTrim(streamName,1) |> ignore
23-
}
24-
25-
let ranStr n : string =
26-
let r = Random()
27-
String(Array.init n (fun _ -> char (r.Next(97,123))))
28-
29-
let generateData count size =
30-
[1..count]
31-
|> List.map(fun i ->
32-
let data = ranStr size
33-
[|
34-
NameValueEntry (RedisValue.op_Implicit "Field1", RedisValue.op_Implicit data)
35-
|]
36-
)
37-
38-
let generateDataForStreamSeq (db : IDatabase) (streamName) (count) size = job {
39-
let data = generateData count size
40-
let! keys =
41-
data
42-
|> Seq.map(fun values -> job{
43-
let! id = db.StreamAddAsync(streamName, values)
44-
return (id, values)
45-
})
46-
|> Job.seqCollect
47-
return keys
48-
}
49-
50-
let generateDataForStreamCon (db : IDatabase) (streamName) (count) size = job {
51-
let data = generateData count size
52-
let! keys =
53-
data
54-
|> Seq.map(fun values -> job{
55-
let! id = db.StreamAddAsync(streamName, values)
56-
return (id, values)
57-
})
58-
|> Job.conCollect
59-
|> Job.map (Seq.sortBy(fun (id,_) -> id)) // To guarentee order matches inserted
60-
return keys
61-
}
62-
10+
open FSharp.Control.Redis.Streams.Infrastructure.Tests
6311

6412

6513

@@ -68,7 +16,6 @@ let rval (s : string) = RedisValue.op_Implicit s
6816
let nve name value = NameValueEntry(rval name, rval value)
6917

7018

71-
7219
let failDueToTimeout message (ts : TimeSpan) =
7320
failtestf "%s. Expected task to complete but failed after timeout of %f ms" message ts.TotalMilliseconds
7421

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
namespace FSharp.Control.Redis.Streams.Infrastructure.Tests
2+
open StackExchange.Redis
3+
open System
4+
open Hopac
5+
6+
[<AutoOpen>]
7+
module Foo =
8+
let getUniqueKey (keyType : string) (key : string) =
9+
let suffix = Guid.NewGuid().ToString()
10+
sprintf "%s:%s:%s" keyType key suffix
11+
|> RedisKey.op_Implicit
12+
13+
let getUniqueStreamKey (key : string) =
14+
getUniqueKey "stream" key
15+
16+
// No way to delete a stream, so setting the max size to 1. It's close enough for now.
17+
let disposableStream (db : IDatabase) (streamName : RedisKey) = {
18+
new IDisposable with
19+
member x.Dispose () = db.StreamTrim(streamName,1) |> ignore
20+
}
21+
22+
let ranStr n : string =
23+
let r = Random()
24+
String(Array.init n (fun _ -> char (r.Next(97,123))))
25+
26+
let generateData count size =
27+
[1..count]
28+
|> List.map(fun i ->
29+
let data = ranStr size
30+
[|
31+
NameValueEntry (RedisValue.op_Implicit "Field1", RedisValue.op_Implicit data)
32+
|]
33+
)
34+
35+
let generateDataForStreamSeq (db : IDatabase) (streamName) (count) size = job {
36+
let data = generateData count size
37+
let! keys =
38+
data
39+
|> Seq.map(fun values -> job{
40+
let! id = db.StreamAddAsync(streamName, values)
41+
return (id, values)
42+
})
43+
|> Job.seqCollect
44+
return keys
45+
}
46+
47+
let generateDataForStreamCon (db : IDatabase) (streamName) (count) size = job {
48+
let data = generateData count size
49+
let! keys =
50+
data
51+
|> Seq.map(fun values -> job{
52+
let! id = db.StreamAddAsync(streamName, values)
53+
return (id, values)
54+
})
55+
|> Job.conCollect
56+
|> Job.map (Seq.sortBy(fun (id,_) -> id)) // To guarentee order matches inserted
57+
return keys
58+
}

0 commit comments

Comments
 (0)