Skip to content

Commit 8ceb05a

Browse files
Adding null check to fix the issue with input/output binding for the sdk type scenario (#9139)
* Bug fix by adding null check when no expression
1 parent 16313b9 commit 8ceb05a

File tree

2 files changed

+61
-1
lines changed

2 files changed

+61
-1
lines changed

src/WebJobs.Script/Description/Workers/WorkerFunctionDescriptorProvider.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,11 +129,16 @@ internal bool BindingAttributeContainsExpression(IEnumerable<FunctionBinding> bi
129129
{
130130
return attribute.GetType()
131131
.GetProperties(BindingFlags.Instance | BindingFlags.Public)
132-
.Any(prop => prop.PropertyType == typeof(string) && _expressionRegex.IsMatch((string)prop.GetValue(attribute)));
132+
.Any(prop => prop.PropertyType == typeof(string) && IsMatch((string)prop.GetValue(attribute)));
133133
}
134134
}
135135

136136
return false;
137137
}
138+
139+
private bool IsMatch(string value)
140+
{
141+
return string.IsNullOrEmpty(value) ? false : _expressionRegex.IsMatch(value);
142+
}
138143
}
139144
}

test/WebJobs.Script.Tests/Description/Worker/WorkerFunctionDescriptorProviderTests.cs

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,39 @@ public void BindingAttributeContainsExpression__InputBinding_FindsRegexMatch_Ret
8484
Assert.True(result);
8585
}
8686

87+
[Fact]
88+
public void BindingAttributeContainsExpression__InputBinding_EmptyConnection_FindsRegexMatch_ReturnsTrue()
89+
{
90+
var inputBindingJObject = JObject.Parse("{\"name\":\"myBlob\",\"direction\":\"In\",\"type\":\"blob\",\"blobPath\":\"input-container//{id}.txt\",\"connection\":\"\",\"properties\":{\"supportsDeferredBinding\":true}}");
91+
FunctionBinding inputBinding = TestHelpers.CreateBindingFromHost(_host, inputBindingJObject);
92+
IEnumerable<FunctionBinding> bindings = new List<FunctionBinding>() { inputBinding };
93+
94+
bool result = _provider.BindingAttributeContainsExpression(bindings);
95+
Assert.True(result);
96+
}
97+
98+
[Fact]
99+
public void BindingAttributeContainsExpression__InputBinding_EmptyConnection_NoRegex_FindsRegexMatch_ReturnsFalse()
100+
{
101+
var inputBindingJObject = JObject.Parse("{\"name\":\"myBlob\",\"direction\":\"In\",\"type\":\"blob\",\"blobPath\":\"input-container//file.txt\",\"connection\":\"\",\"properties\":{\"supportsDeferredBinding\":true}}");
102+
FunctionBinding inputBinding = TestHelpers.CreateBindingFromHost(_host, inputBindingJObject);
103+
IEnumerable<FunctionBinding> bindings = new List<FunctionBinding>() { inputBinding };
104+
105+
bool result = _provider.BindingAttributeContainsExpression(bindings);
106+
Assert.False(result);
107+
}
108+
109+
[Fact]
110+
public void BindingAttributeContainsExpression__InputBinding_EmptyFields_FindsRegexMatch_ReturnsFalse()
111+
{
112+
var inputBindingJObject = JObject.Parse("{\"name\":\"myBlob\",\"direction\":\"In\",\"type\":\"blob\",\"blobPath\":\"\",\"connection\":\"\",\"properties\":{\"supportsDeferredBinding\":true}}");
113+
FunctionBinding inputBinding = TestHelpers.CreateBindingFromHost(_host, inputBindingJObject);
114+
IEnumerable<FunctionBinding> bindings = new List<FunctionBinding>() { inputBinding };
115+
116+
bool result = _provider.BindingAttributeContainsExpression(bindings);
117+
Assert.False(result);
118+
}
119+
87120
[Fact]
88121
public void BindingAttributeContainsExpression_OutputBinding_FindsRegexMatch_ReturnsTrue()
89122
{
@@ -95,6 +128,28 @@ public void BindingAttributeContainsExpression_OutputBinding_FindsRegexMatch_Ret
95128
Assert.True(result);
96129
}
97130

131+
[Fact]
132+
public void BindingAttributeContainsExpression_OutputBinding_EmptyConnection_FindsRegexMatch_ReturnsTrue()
133+
{
134+
var outputBindingJObject = JObject.Parse("{\"name\":\"$return\",\"direction\":\"Out\",\"type\":\"blob\",\"blobPath\":\"output-container//{name}-output.txt\",\"connection\":\"\",\"properties\":{}}");
135+
FunctionBinding outputBinding = TestHelpers.CreateBindingFromHost(_host, outputBindingJObject);
136+
IEnumerable<FunctionBinding> bindings = new List<FunctionBinding>() { outputBinding };
137+
138+
bool result = _provider.BindingAttributeContainsExpression(bindings);
139+
Assert.True(result);
140+
}
141+
142+
[Fact]
143+
public void BindingAttributeContainsExpression_OutputBinding_EmptyFields_FindsRegexMatch_ReturnsFalse()
144+
{
145+
var outputBindingJObject = JObject.Parse("{\"name\":\"$return\",\"direction\":\"Out\",\"type\":\"blob\",\"blobPath\":\"\",\"connection\":\"\",\"properties\":{}}");
146+
FunctionBinding outputBinding = TestHelpers.CreateBindingFromHost(_host, outputBindingJObject);
147+
IEnumerable<FunctionBinding> bindings = new List<FunctionBinding>() { outputBinding };
148+
149+
bool result = _provider.BindingAttributeContainsExpression(bindings);
150+
Assert.False(result);
151+
}
152+
98153
[Fact]
99154
public void BindingAttributeContainsExpression_DoesNotFindRegexMatch_ReturnsFalse()
100155
{

0 commit comments

Comments
 (0)