Browse Source

Fix locking.

pull/971/head
Sebastian 4 years ago
parent
commit
cba2d32013
  1. 52
      backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/ScriptExecutionContext.cs
  2. 1
      backend/src/Squidex.Domain.Apps.Entities/Assets/Queries/AssetQueryService.cs
  3. 1
      backend/src/Squidex.Domain.Apps.Entities/Contents/Queries/ContentQueryService.cs
  4. 2
      backend/src/Squidex.Domain.Apps.Entities/Schemas/Indexes/SchemasIndex.cs
  5. 1
      backend/src/Squidex.Domain.Apps.Entities/Teams/Indexes/TeamsIndex.cs
  6. 1
      backend/src/Squidex/Areas/Api/Controllers/Contents/Models/AllContentsByPostDto.cs
  7. 1
      backend/src/Squidex/Config/Domain/ContentsServices.cs
  8. 1
      backend/src/Squidex/Config/Web/WebServices.cs
  9. 42
      backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/Scripting/JintScriptEngineTests.cs
  10. 1
      backend/tests/Squidex.Domain.Apps.Entities.Tests/TestHelpers/Mocks.cs
  11. 54
      frontend/src/app/framework/angular/pipes/highlight.pipe.spec.ts

52
backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/ScriptExecutionContext.cs

@ -86,23 +86,21 @@ public sealed class ScriptExecutionContext<T> : ScriptExecutionContext, ISchedul
return; return;
} }
slimLock.EnterWriteLock(); lock (Engine)
try
{ {
TryStart(); try
{
TryStart();
Engine.ResetConstraints(); Engine.ResetConstraints();
action(); action();
TryComplete(default!); TryComplete(default!);
} }
catch (Exception ex) catch (Exception ex)
{ {
TryFail(ex); TryFail(ex);
} }
finally
{
slimLock.ExitWriteLock();
} }
} }
@ -113,23 +111,21 @@ public sealed class ScriptExecutionContext<T> : ScriptExecutionContext, ISchedul
return; return;
} }
slimLock.EnterWriteLock(); lock (Engine)
try
{ {
TryStart(); try
{
TryStart();
Engine.ResetConstraints(); Engine.ResetConstraints();
action(argument); action(argument);
TryComplete(default!); TryComplete(default!);
} }
catch (Exception ex) catch (Exception ex)
{ {
TryFail(ex); TryFail(ex);
} }
finally
{
slimLock.ExitWriteLock();
} }
} }

1
backend/src/Squidex.Domain.Apps.Entities/Assets/Queries/AssetQueryService.cs

@ -8,7 +8,6 @@
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
using Squidex.Domain.Apps.Entities.Assets.Repositories; using Squidex.Domain.Apps.Entities.Assets.Repositories;
using Squidex.Infrastructure; using Squidex.Infrastructure;
using System.Diagnostics;
namespace Squidex.Domain.Apps.Entities.Assets.Queries; namespace Squidex.Domain.Apps.Entities.Assets.Queries;

1
backend/src/Squidex.Domain.Apps.Entities/Contents/Queries/ContentQueryService.cs

@ -5,7 +5,6 @@
// All rights reserved. Licensed under the MIT license. // All rights reserved. Licensed under the MIT license.
// ========================================================================== // ==========================================================================
using System.Diagnostics;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
using Squidex.Domain.Apps.Entities.Contents.Repositories; using Squidex.Domain.Apps.Entities.Contents.Repositories;
using Squidex.Domain.Apps.Entities.Schemas; using Squidex.Domain.Apps.Entities.Schemas;

2
backend/src/Squidex.Domain.Apps.Entities/Schemas/Indexes/SchemasIndex.cs

@ -13,8 +13,6 @@ using Squidex.Infrastructure.Commands;
using Squidex.Infrastructure.States; using Squidex.Infrastructure.States;
using Squidex.Infrastructure.Translations; using Squidex.Infrastructure.Translations;
using Squidex.Infrastructure.Validation; using Squidex.Infrastructure.Validation;
using System.Diagnostics;
using System.Xml.Linq;
namespace Squidex.Domain.Apps.Entities.Schemas.Indexes; namespace Squidex.Domain.Apps.Entities.Schemas.Indexes;

1
backend/src/Squidex.Domain.Apps.Entities/Teams/Indexes/TeamsIndex.cs

@ -7,7 +7,6 @@
using Squidex.Domain.Apps.Entities.Teams.Repositories; using Squidex.Domain.Apps.Entities.Teams.Repositories;
using Squidex.Infrastructure; using Squidex.Infrastructure;
using System.Diagnostics;
namespace Squidex.Domain.Apps.Entities.Teams.Indexes; namespace Squidex.Domain.Apps.Entities.Teams.Indexes;

1
backend/src/Squidex/Areas/Api/Controllers/Contents/Models/AllContentsByPostDto.cs

@ -10,7 +10,6 @@ using System.Text.Json.Serialization;
using NodaTime; using NodaTime;
using Squidex.Domain.Apps.Entities; using Squidex.Domain.Apps.Entities;
using Squidex.Infrastructure; using Squidex.Infrastructure;
using Squidex.Infrastructure.Queries;
using Squidex.Infrastructure.Translations; using Squidex.Infrastructure.Translations;
using Squidex.Infrastructure.Validation; using Squidex.Infrastructure.Validation;

1
backend/src/Squidex/Config/Domain/ContentsServices.cs

@ -17,7 +17,6 @@ using Squidex.Domain.Apps.Entities.Contents.Validation;
using Squidex.Domain.Apps.Entities.History; using Squidex.Domain.Apps.Entities.History;
using Squidex.Domain.Apps.Entities.Search; using Squidex.Domain.Apps.Entities.Search;
using Squidex.Infrastructure.EventSourcing; using Squidex.Infrastructure.EventSourcing;
using Squidex.Web.GraphQL;
namespace Squidex.Config.Domain; namespace Squidex.Config.Domain;

1
backend/src/Squidex/Config/Web/WebServices.cs

@ -17,7 +17,6 @@ using Squidex.Config.Domain;
using Squidex.Domain.Apps.Core.Contents; using Squidex.Domain.Apps.Core.Contents;
using Squidex.Domain.Apps.Entities; using Squidex.Domain.Apps.Entities;
using Squidex.Domain.Apps.Entities.Contents.GraphQL; using Squidex.Domain.Apps.Entities.Contents.GraphQL;
using Squidex.Domain.Apps.Entities.Contents.Queries;
using Squidex.Infrastructure.Caching; using Squidex.Infrastructure.Caching;
using Squidex.Infrastructure.Json.Objects; using Squidex.Infrastructure.Json.Objects;
using Squidex.Pipeline.Plugins; using Squidex.Pipeline.Plugins;

42
backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/Scripting/JintScriptEngineTests.cs

@ -7,7 +7,6 @@
using System.Net; using System.Net;
using System.Security.Claims; using System.Security.Claims;
using Jint.Native;
using Microsoft.Extensions.Caching.Memory; using Microsoft.Extensions.Caching.Memory;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
using Squidex.Domain.Apps.Core.Contents; using Squidex.Domain.Apps.Core.Contents;
@ -77,6 +76,15 @@ public class JintScriptEngineTests : IClassFixture<TranslationsFixture>
scheduler.Run(callback); scheduler.Run(callback);
}); });
})); }));
context.Engine.SetValue("setSyncTimeout", new Delay(callback =>
{
context.Schedule((scheduler, ct) =>
{
scheduler.Run(callback);
return Task.CompletedTask;
});
}));
} }
} }
@ -628,7 +636,7 @@ public class JintScriptEngineTests : IClassFixture<TranslationsFixture>
["value"] = 13 ["value"] = 13
}; };
const string script1 = @" const string script = @"
var x = ctx.value; var x = ctx.value;
for (var i = 0; i < 100; i++) { for (var i = 0; i < 100; i++) {
setTimeout(function () { setTimeout(function () {
@ -638,7 +646,35 @@ public class JintScriptEngineTests : IClassFixture<TranslationsFixture>
} }
"; ";
await sut.ExecuteAsync(vars, script1, new ScriptOptions { AsContext = true }); await sut.ExecuteAsync(vars, script, new ScriptOptions { AsContext = true });
Assert.Equal(113.0, vars["shared"]);
}
}
[Fact]
public async Task Should_not_run_nested_callbacks_in_parallel()
{
for (var i = 0; i < 10; i++)
{
var vars = new DataScriptVars
{
["value"] = 13
};
const string script = @"
var x = ctx.value;
for (var i = 0; i < 100; i++) {
setSyncTimeout(function () {
setSyncTimeout(function () {
x++;
ctx.shared = x;
});
});
}
";
await sut.ExecuteAsync(vars, script, new ScriptOptions { AsContext = true });
Assert.Equal(113.0, vars["shared"]); Assert.Equal(113.0, vars["shared"]);
} }

1
backend/tests/Squidex.Domain.Apps.Entities.Tests/TestHelpers/Mocks.cs

@ -6,7 +6,6 @@
// ========================================================================== // ==========================================================================
using System.Security.Claims; using System.Security.Claims;
using Squidex.Domain.Apps.Core;
using Squidex.Domain.Apps.Core.Apps; using Squidex.Domain.Apps.Core.Apps;
using Squidex.Domain.Apps.Core.Schemas; using Squidex.Domain.Apps.Core.Schemas;
using Squidex.Domain.Apps.Entities.Apps; using Squidex.Domain.Apps.Entities.Apps;

54
frontend/src/app/framework/angular/pipes/highlight.pipe.spec.ts

@ -0,0 +1,54 @@
/*
* Squidex Headless CMS
*
* @license
* Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved.
*/
import { HighlightPipe } from './highlight.pipe';
describe('Hightlight', () => {
const pipe = new HighlightPipe();
[null, undefined, ''].forEach(search => {
it('should not highlight if no search passed', () => {
const input = 'Hello World';
const result = pipe.transform(input, search);
expect(result).toEqual(input);
});
});
it('should encode html if no search specified', () => {
const input = '<h1>Hello World</h1>';
const result = pipe.transform(input, null);
expect(result).toEqual('&lt;h1&gt;Hello World&lt;/h1&gt;');
});
it('should highlight with search string', () => {
const input = 'Hello World';
const result = pipe.transform(input, 'ello');
expect(result).toEqual('H<b>ello</b> World');
});
it('should highlight with search regex', () => {
const input = 'Hello World';
const result = pipe.transform(input, new RegExp('ello', 'i'));
expect(result).toEqual('H<b>ello</b> World');
});
it('should encode html if search specified', () => {
const input = '<h1>Hello World</h1>';
const result = pipe.transform(input, 'ello');
expect(result).toEqual('&lt;h1&gt;H<b>ello</b> World&lt;/h1&gt;');
});
});
Loading…
Cancel
Save