@@ -25,6 +25,12 @@ open System.Threading.Tasks
25
25
open Microsoft.Build .Evaluation
26
26
open Ionide.ProjInfo .ProjectLoader
27
27
28
+ module Exception =
29
+ open System.Runtime .ExceptionServices
30
+
31
+ let inline reraiseAny ( e : exn ) =
32
+ ExceptionDispatchInfo.Capture( e) .Throw()
33
+
28
34
let RepoDir =
29
35
(__ SOURCE_ DIRECTORY__
30
36
/ " .."
@@ -1469,50 +1475,51 @@ let testWithEnv name (data: TestAssetProjInfo2) f test =
1469
1475
test
1470
1476
name
1471
1477
( fun () ->
1478
+ task {
1479
+ let logger = Log.create ( sprintf " Test '%s '" name)
1480
+ let fs = FileUtils logger
1472
1481
1473
- let logger = Log.create ( sprintf " Test ' %s ' " name )
1474
- let fs = FileUtils logger
1482
+ let testDir = inDir fs data.ProjDir
1483
+ copyDirFromAssets fs data.ProjDir testDir
1475
1484
1476
- let testDir = inDir fs data.ProjDir
1477
- copyDirFromAssets fs data.ProjDir testDir
1485
+ let entrypoints =
1486
+ data.EntryPoints
1487
+ |> Seq.map ( fun x ->
1488
+ testDir
1489
+ / x
1490
+ )
1478
1491
1479
- let entrypoints =
1480
- data.EntryPoints
1481
- |> Seq.map ( fun x ->
1482
- testDir
1483
- / x
1492
+ entrypoints
1493
+ |> Seq.iter ( fun x ->
1494
+ dotnet fs [
1495
+ " restore"
1496
+ x
1497
+ ]
1498
+ |> checkExitCodeZero
1484
1499
)
1485
1500
1486
- entrypoints
1487
- |> Seq.iter ( fun x ->
1488
- dotnet fs [
1489
- " restore"
1490
- x
1491
- ]
1492
- |> checkExitCodeZero
1493
- )
1494
-
1495
- let binlog = new FileInfo( Path.Combine( testDir, $" {name}.binlog" ))
1496
- use blc = new Binlogs( binlog)
1501
+ let binlog = new FileInfo( Path.Combine( testDir, $" {name}.binlog" ))
1502
+ use blc = new Binlogs( binlog)
1497
1503
1498
- let env = {
1499
- Logger = logger
1500
- FS = fs
1501
- Binlog = blc
1502
- Data = data
1503
- Entrypoints = entrypoints
1504
- }
1504
+ let env = {
1505
+ Logger = logger
1506
+ FS = fs
1507
+ Binlog = blc
1508
+ Data = data
1509
+ Entrypoints = entrypoints
1510
+ }
1505
1511
1506
- try
1507
- f env
1508
- with e ->
1512
+ try
1513
+ do ! f env
1514
+ with e ->
1509
1515
1510
- logger.error (
1511
- Message.eventX " binlog path {binlog}"
1512
- >> Message.setField " binlog" binlog.FullName
1513
- )
1516
+ logger.error (
1517
+ Message.eventX " binlog path {binlog}"
1518
+ >> Message.setField " binlog" binlog.FullName
1519
+ )
1514
1520
1515
- reraise ()
1521
+ Exception.reraiseAny e
1522
+ }
1516
1523
)
1517
1524
1518
1525
let projectCollection () =
@@ -1531,119 +1538,124 @@ type IWorkspaceLoader2 =
1531
1538
1532
1539
1533
1540
let buildManagerSessionTests toolsPath =
1534
- testSequenced
1535
- <| ftestList " buildManagerSessionTests" [
1536
- testCase
1541
+ ftestList " buildManagerSessionTests" [
1542
+ testCaseTask
1537
1543
|> testWithEnv
1538
1544
" loader2-solution-with-2-projects"
1539
1545
`` loader2-solution-with-2-projects ``
1540
1546
( fun env ->
1547
+ task {
1541
1548
1542
- let path =
1543
- env.Entrypoints
1544
- |> Seq.map ProjectGraphEntryPoint
1549
+ let path =
1550
+ env.Entrypoints
1551
+ |> Seq.map ProjectGraphEntryPoint
1545
1552
1546
- let loggers = env.Binlog.Loggers
1553
+ let loggers = env.Binlog.Loggers
1547
1554
1548
- // Evaluation
1549
- use pc = projectCollection ()
1550
- let graph = ProjectLoader2.EvaluateAsGraphDesignTime( path, pc)
1555
+ // Evaluation
1556
+ use pc = projectCollection ()
1557
+ let graph = ProjectLoader2.EvaluateAsGraphDesignTime( path, pc)
1551
1558
1552
- // Execution
1553
- let bp = BuildParameters( Loggers = loggers)
1559
+ // Execution
1560
+ let bp = BuildParameters( Loggers = loggers)
1554
1561
1555
- let bm = new BuildManagerSession( buildParameters = bp)
1562
+ let bm = new BuildManagerSession( buildParameters = bp)
1556
1563
1557
- let result =
1558
- ProjectLoader2.Execution( bm, graph)
1559
- |> Task.RunSynchronously
1564
+ let result =
1565
+ ProjectLoader2.Execution( bm, graph)
1566
+ |> Task.RunSynchronously
1560
1567
1561
- // Parse
1562
- let projectsAfterBuild =
1563
- ProjectLoader2.Parse result
1564
- |> Seq.choose (
1565
- function
1566
- | Ok( Ok( LoadedProjectInfo.StandardProjectInfo x)) -> Some x
1567
- | _ -> None
1568
- )
1568
+ // Parse
1569
+ let projectsAfterBuild =
1570
+ ProjectLoader2.Parse result
1571
+ |> Seq.choose (
1572
+ function
1573
+ | Ok( Ok( LoadedProjectInfo.StandardProjectInfo x)) -> Some x
1574
+ | _ -> None
1575
+ )
1569
1576
1570
- env.Data.Expects projectsAfterBuild
1577
+ env.Data.Expects projectsAfterBuild
1578
+ }
1571
1579
)
1572
1580
1573
- testCase
1581
+ testCaseTask
1574
1582
|> testWithEnv
1575
1583
" Concurrency - new graph every time"
1576
- `` loader2-solution-with-2-projects ``
1584
+ `` loader2-concurrent ``
1577
1585
( fun env ->
1578
- let path =
1579
- env.Entrypoints
1580
- |> Seq.map ProjectGraphEntryPoint
1581
-
1582
- use pc = projectCollection ()
1583
-
1584
- let bp = BuildParameters( Loggers = env.Binlog.Loggers)
1585
-
1586
- let bm = new BuildManagerSession( buildParameters = bp)
1587
-
1588
- let work =
1589
- async {
1590
- // Evaluation
1591
- let graph = ProjectLoader2.EvaluateAsGraph( path, pc)
1592
- let! ct = Async.CancellationToken
1593
-
1594
- // Execution
1595
- return !
1596
- ProjectLoader2.Execution( bm, graph, ct = ct)
1597
- |> Async.AwaitTask
1598
- }
1599
-
1600
- // Should be throttled so concurrent builds won't fail
1601
- let result =
1602
- Async.Parallel [
1603
- work
1604
- work
1605
- work
1606
- work
1607
- ]
1586
+ task {
1587
+ let path =
1588
+ env.Entrypoints
1589
+ |> Seq.map ProjectGraphEntryPoint
1590
+
1591
+ use pc = projectCollection ()
1608
1592
1609
- |> Async.RunSynchronously
1593
+ let bp = BuildParameters ( Loggers = env.Binlog.Loggers )
1610
1594
1611
- ( )
1595
+ let bm = new BuildManagerSession ( buildParameters = bp )
1612
1596
1597
+ let work =
1598
+ async {
1599
+ // Evaluation
1600
+ let graph = ProjectLoader2.EvaluateAsGraph( path, pc)
1601
+ let! ct = Async.CancellationToken
1602
+
1603
+ // Execution
1604
+ return !
1605
+ ProjectLoader2.Execution( bm, graph, ct = ct)
1606
+ |> Async.AwaitTask
1607
+ }
1608
+
1609
+ // Should be throttled so concurrent builds won't fail
1610
+ let result =
1611
+ Async.Parallel [
1612
+ work
1613
+ work
1614
+ work
1615
+ work
1616
+ ]
1617
+
1618
+ |> Async.RunSynchronously
1619
+
1620
+ ()
1621
+
1622
+ }
1613
1623
)
1614
1624
1615
1625
1616
- testCase
1626
+ testCaseTask
1617
1627
|> testWithEnv
1618
1628
" Cancellable"
1619
1629
`` loader2-cancel-slow ``
1620
1630
( fun env ->
1621
- let path =
1622
- env.Entrypoints
1623
- |> Seq.map ProjectGraphEntryPoint
1631
+ task {
1632
+ let path =
1633
+ env.Entrypoints
1634
+ |> Seq.map ProjectGraphEntryPoint
1624
1635
1625
1636
1626
- // Evaluation
1627
- use pc = projectCollection ()
1637
+ // Evaluation
1638
+ use pc = projectCollection ()
1628
1639
1629
- let graph = ProjectLoader2.EvaluateAsGraph( path, pc)
1640
+ let graph = ProjectLoader2.EvaluateAsGraph( path, pc)
1630
1641
1631
- // Execution
1632
- let bp = BuildParameters( Loggers = env.Binlog.Loggers)
1633
- let bm = new BuildManagerSession( buildParameters = bp)
1642
+ // Execution
1643
+ let bp = BuildParameters( Loggers = env.Binlog.Loggers)
1644
+ let bm = new BuildManagerSession( buildParameters = bp)
1634
1645
1635
- try
1636
- use cts = new CancellationTokenSource()
1637
- cts.CancelAfter( TimeSpan.FromSeconds( 1. ))
1646
+ try
1647
+ use cts = new CancellationTokenSource()
1648
+ cts.CancelAfter( TimeSpan.FromSeconds( 1. ))
1638
1649
1639
- let build = ProjectLoader2.Execution( bm, graph, ct = cts.Token)
1650
+ let build = ProjectLoader2.Execution( bm, graph, ct = cts.Token)
1640
1651
1641
- Task.RunSynchronously build
1642
- |> ignore
1643
- with
1644
- | :? OperationCanceledException -> ()
1645
- | e -> reraise ()
1652
+ Task.RunSynchronously build
1653
+ |> ignore
1654
+ with
1655
+ | :? OperationCanceledException -> ()
1656
+ | e -> Exception.reraiseAny e
1646
1657
1658
+ }
1647
1659
)
1648
1660
]
1649
1661
0 commit comments