Skip to content

Commit 3f5b20b

Browse files
Merge pull request #16164 from nextcloud/fix/e-tag-comparasion
fix: eTag comparison
2 parents 2af5184 + dd3a64d commit 3f5b20b

File tree

4 files changed

+35
-43
lines changed

4 files changed

+35
-43
lines changed

app/src/androidTest/java/com/nextcloud/extensions/StringExtensionTests.kt

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
*/
77

88
package com.nextcloud.extensions
9-
import com.nextcloud.utils.extensions.isNotBlankAndEquals
9+
import com.nextcloud.utils.extensions.eTagChanged
1010
import junit.framework.TestCase.assertFalse
1111
import junit.framework.TestCase.assertTrue
1212
import org.junit.Test
@@ -17,160 +17,160 @@ class StringExtensionTests {
1717
fun testIsNotBlankAndEqualsWhenGivenBothStringsAreNull() {
1818
val str1: String? = null
1919
val str2: String? = null
20-
assertFalse(str1.isNotBlankAndEquals(str2))
20+
assertTrue(str1.eTagChanged(str2))
2121
}
2222

2323
@Test
2424
fun testIsNotBlankAndEqualsWhenGivenFirstStringIsNull() {
2525
val str1: String? = null
2626
val str2 = "hello"
27-
assertFalse(str1.isNotBlankAndEquals(str2))
27+
assertTrue(str1.eTagChanged(str2))
2828
}
2929

3030
@Test
3131
fun testIsNotBlankAndEqualsWhenGivenSecondStringIsNull() {
3232
val str1 = "hello"
3333
val str2: String? = null
34-
assertFalse(str1.isNotBlankAndEquals(str2))
34+
assertTrue(str1.eTagChanged(str2))
3535
}
3636

3737
@Test
3838
fun testIsNotBlankAndEqualsWhenGivenBothStringsAreEmpty() {
3939
val str1 = ""
4040
val str2 = ""
41-
assertFalse(str1.isNotBlankAndEquals(str2))
41+
assertTrue(str1.eTagChanged(str2))
4242
}
4343

4444
@Test
4545
fun testIsNotBlankAndEqualsWhenGivenFirstStringIsEmpty() {
4646
val str1 = ""
4747
val str2 = "hello"
48-
assertFalse(str1.isNotBlankAndEquals(str2))
48+
assertTrue(str1.eTagChanged(str2))
4949
}
5050

5151
@Test
5252
fun testIsNotBlankAndEqualsWhenGivenSecondStringIsEmpty() {
5353
val str1 = "hello"
5454
val str2 = ""
55-
assertFalse(str1.isNotBlankAndEquals(str2))
55+
assertTrue(str1.eTagChanged(str2))
5656
}
5757

5858
@Test
5959
fun testIsNotBlankAndEqualsWhenGivenBothStringsAreWhitespaceOnly() {
6060
val str1 = " "
6161
val str2 = " \t "
62-
assertFalse(str1.isNotBlankAndEquals(str2))
62+
assertTrue(str1.eTagChanged(str2))
6363
}
6464

6565
@Test
6666
fun testIsNotBlankAndEqualsWhenGivenFirstStringIsWhitespaceOnly() {
6767
val str1 = " "
6868
val str2 = "hello"
69-
assertFalse(str1.isNotBlankAndEquals(str2))
69+
assertTrue(str1.eTagChanged(str2))
7070
}
7171

7272
@Test
7373
fun testIsNotBlankAndEqualsWhenGivenSecondStringIsWhitespaceOnly() {
7474
val str1 = "hello"
7575
val str2 = " "
76-
assertFalse(str1.isNotBlankAndEquals(str2))
76+
assertTrue(str1.eTagChanged(str2))
7777
}
7878

7979
@Test
8080
fun testIsNotBlankAndEqualsWhenGivenStringsAreDifferentButBothValid() {
8181
val str1 = "hello"
8282
val str2 = "world"
83-
assertFalse(str1.isNotBlankAndEquals(str2))
83+
assertTrue(str1.eTagChanged(str2))
8484
}
8585

8686
@Test
8787
fun testIsNotBlankAndEqualsWhenGivenStringsHaveDifferentCase() {
8888
val str1 = "Hello"
8989
val str2 = "hello"
90-
assertTrue(str1.isNotBlankAndEquals(str2))
90+
assertFalse(str1.eTagChanged(str2))
9191
}
9292

9393
@Test
9494
fun testIsNotBlankAndEqualsWhenGivenMixedCaseStrings() {
9595
val str1 = "HeLLo WoRLd"
9696
val str2 = "hello world"
97-
assertTrue(str1.isNotBlankAndEquals(str2))
97+
assertFalse(str1.eTagChanged(str2))
9898
}
9999

100100
@Test
101101
fun testIsNotBlankAndEqualsWhenGivenUppercaseStrings() {
102102
val str1 = "HELLO"
103103
val str2 = "hello"
104-
assertTrue(str1.isNotBlankAndEquals(str2))
104+
assertFalse(str1.eTagChanged(str2))
105105
}
106106

107107
@Test
108108
fun testIsNotBlankAndEqualsWhenGivenBothStringsAreIdenticalAndValid() {
109109
val str1 = "hello"
110110
val str2 = "hello"
111-
assertTrue(str1.isNotBlankAndEquals(str2))
111+
assertFalse(str1.eTagChanged(str2))
112112
}
113113

114114
@Test
115115
fun testIsNotBlankAndEqualsWhenGivenBothStringsAreIdenticalWithSpaces() {
116116
val str1 = "hello world"
117117
val str2 = "hello world"
118-
assertTrue(str1.isNotBlankAndEquals(str2))
118+
assertFalse(str1.eTagChanged(str2))
119119
}
120120

121121
@Test
122122
fun testIsNotBlankAndEqualsWhenGivenBothStringsAreIdenticalSingleCharacter() {
123123
val str1 = "a"
124124
val str2 = "A"
125-
assertTrue(str1.isNotBlankAndEquals(str2))
125+
assertFalse(str1.eTagChanged(str2))
126126
}
127127

128128
@Test
129129
fun testIsNotBlankAndEqualsWhenGivenBothStringsAreIdenticalWithSpecialCharacters() {
130130
val str1 = "hello@world!123"
131131
val str2 = "HELLO@WORLD!123"
132-
assertTrue(str1.isNotBlankAndEquals(str2))
132+
assertFalse(str1.eTagChanged(str2))
133133
}
134134

135135
@Test
136136
fun testIsNotBlankAndEqualsWhenGivenOneHasLeadingWhitespaceAndOtherDoesNot() {
137137
val str1 = " hello"
138138
val str2 = "HELLO"
139-
assertFalse(str1.isNotBlankAndEquals(str2))
139+
assertTrue(str1.eTagChanged(str2))
140140
}
141141

142142
@Test
143143
fun testIsNotBlankAndEqualsWhenGivenOneHasTrailingWhitespaceAndOtherDoesNot() {
144144
val str1 = "hello"
145145
val str2 = "HELLO "
146-
assertFalse(str1.isNotBlankAndEquals(str2))
146+
assertTrue(str1.eTagChanged(str2))
147147
}
148148

149149
@Test
150150
fun testIsNotBlankAndEqualsWhenGivenBothHaveIdenticalWhitespacePaddingDifferentCase() {
151151
val str1 = " hello "
152152
val str2 = " HELLO "
153-
assertTrue(str1.isNotBlankAndEquals(str2))
153+
assertFalse(str1.eTagChanged(str2))
154154
}
155155

156156
@Test
157157
fun testIsNotBlankAndEqualsWhenGivenMixedWhitespaceCharacters() {
158158
val str1 = "\t"
159159
val str2 = "\n"
160-
assertFalse(str1.isNotBlankAndEquals(str2))
160+
assertTrue(str1.eTagChanged(str2))
161161
}
162162

163163
@Test
164164
fun testIsNotBlankAndEqualsWhenGivenOneIsNullAndOtherIsEmpty() {
165165
val str1: String? = null
166166
val str2 = ""
167-
assertFalse(str1.isNotBlankAndEquals(str2))
167+
assertTrue(str1.eTagChanged(str2))
168168
}
169169

170170
@Test
171171
fun testIsNotBlankAndEqualsWhenGivenOneIsNullAndOtherIsWhitespace() {
172172
val str1: String? = null
173173
val str2 = " "
174-
assertFalse(str1.isNotBlankAndEquals(str2))
174+
assertTrue(str1.eTagChanged(str2))
175175
}
176176
}

app/src/main/java/com/nextcloud/utils/extensions/StringExtensions.kt

Lines changed: 9 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -25,23 +25,15 @@ fun String.removeFileExtension(): String {
2525
}
2626
}
2727

28-
/**
29-
* Checks if two nullable strings are both valid (non-null, non-empty, non-blank) and equal.
30-
*
31-
* It returns `true` only when both strings meet all the following criteria:
32-
* - Neither string is null
33-
* - Neither string is empty ("")
34-
* - Neither string contains only whitespace characters (spaces, tabs, newlines, etc.)
35-
* - Both strings are equal ignoring case differences
36-
*
37-
* @param other The other nullable string to compare with this string
38-
* @return `true` if both strings are valid and equal ignoring case differences, `false` otherwise
39-
*/
40-
fun String?.isNotBlankAndEquals(other: String?): Boolean = this != null &&
41-
other != null &&
42-
this.isNotBlank() &&
43-
other.isNotBlank() &&
44-
this.equals(other, ignoreCase = true)
28+
@Suppress("ComplexCondition")
29+
fun String?.eTagChanged(eTagOnServer: String?): Boolean {
30+
if (this == null || this.isEmpty() || eTagOnServer == null || eTagOnServer.isEmpty()) {
31+
// provided eTags are empty or null can't compare treat as eTag changed
32+
return true
33+
}
34+
35+
return !this.equals(eTagOnServer, ignoreCase = true)
36+
}
4537

4638
fun String.truncateWithEllipsis(limit: Int) = take(limit) + if (length > limit) StringConstants.THREE_DOT else ""
4739

app/src/main/java/com/owncloud/android/datamodel/OCFile.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -796,7 +796,7 @@ public String getEtagOnServer() {
796796
}
797797

798798
public boolean isEtagChanged() {
799-
return !StringExtensionsKt.isNotBlankAndEquals(getEtag(), getEtagOnServer());
799+
return StringExtensionsKt.eTagChanged(getEtag(), getEtagOnServer());
800800
}
801801

802802
public boolean isSharedViaLink() {

app/src/main/java/com/owncloud/android/operations/RefreshFolderOperation.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -419,7 +419,7 @@ private RemoteOperationResult checkForChanges(OwnCloudClient client) {
419419
String remoteFolderETag = remoteFile.getEtag();
420420
if (remoteFolderETag != null) {
421421
String localFolderEtag = mLocalFolder.getEtag();
422-
mRemoteFolderChanged = !StringExtensionsKt.isNotBlankAndEquals(remoteFolderETag, localFolderEtag);
422+
mRemoteFolderChanged = StringExtensionsKt.eTagChanged(remoteFolderETag, localFolderEtag);
423423
Log_OC.d(
424424
TAG,
425425
"📂 eTag check\n" +

0 commit comments

Comments
 (0)