Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
70 changes: 52 additions & 18 deletions .github/workflows/sonarqube.yml
Original file line number Diff line number Diff line change
Expand Up @@ -56,44 +56,72 @@ jobs:
# Create the target directory
mkdir -p build/intermediates/runtime_library_classes_dir/debug

# Find all directories containing class files
CLASS_DIRS=$(find build -name "*.class" -type f -exec dirname {} \; | sort -u)
# Find all directories containing class files with better patterns
CLASS_DIRS=$(find build -name "*.class" -type f -exec dirname {} \; | sort -u | grep -E "(javac|kotlin-classes|runtime_library)" | head -10)

if [ -z "$CLASS_DIRS" ]; then
echo "WARNING: No class files found in the build directory!"
echo "Searching in all build subdirectories..."
find build -name "*.class" -type f | head -20
else
echo "Found class files in the following directories:"
echo "$CLASS_DIRS"

# Copy classes from the first directory with classes
FIRST_CLASS_DIR=$(echo "$CLASS_DIRS" | head -1)
echo "Copying classes from $FIRST_CLASS_DIR to build/intermediates/runtime_library_classes_dir/debug"
cp -r $FIRST_CLASS_DIR/* build/intermediates/runtime_library_classes_dir/debug/ || echo "Failed to copy from $FIRST_CLASS_DIR"
# Copy classes from all relevant directories, not just the first one
for CLASS_DIR in $CLASS_DIRS; do
if [ -d "$CLASS_DIR" ] && [ "$(find "$CLASS_DIR" -name "*.class" | wc -l)" -gt 0 ]; then
echo "Copying classes from $CLASS_DIR"
cp -r "$CLASS_DIR"/* build/intermediates/runtime_library_classes_dir/debug/ 2>/dev/null || echo "Failed to copy from $CLASS_DIR"
fi
done

# Verify the target directory now has class files
CLASS_COUNT=$(find build/intermediates/runtime_library_classes_dir/debug -name "*.class" | wc -l)
echo "Target directory now contains $CLASS_COUNT class files"
fi

# Update sonar-project.properties with all found class directories as a fallback
echo "\n# Additional binary paths found during build" >> sonar-project.properties
echo "sonar.java.binaries=build/intermediates/runtime_library_classes_dir/debug,$CLASS_DIRS" >> sonar-project.properties
# Update sonar-project.properties with all found class directories
echo "" >> sonar-project.properties
echo "# Additional binary paths found during build" >> sonar-project.properties
if [ -n "$CLASS_DIRS" ]; then
# Convert newlines to commas for sonar.java.binaries
BINARY_PATHS=$(echo "$CLASS_DIRS" | tr '\n' ',' | sed 's/,$//')
echo "sonar.java.binaries=build/intermediates/runtime_library_classes_dir/debug,$BINARY_PATHS" >> sonar-project.properties
else
echo "sonar.java.binaries=build/intermediates/runtime_library_classes_dir/debug" >> sonar-project.properties
fi

echo "Checking for JaCoCo report files..."
find build -name "*.xml" | grep jacoco || echo "No XML files found"
find build -name "*.exec" | grep jacoco || echo "No exec files found"
find build -name "*.xml" | grep jacoco || echo "No JaCoCo XML files found"
find build -name "*.exec" | grep jacoco || echo "No JaCoCo exec files found"

echo "Contents of JaCoCo report directory:"
ls -la build/reports/jacoco/jacocoTestReport/ || echo "Directory not found"

echo "\nChecking test execution results:"
find build -name "TEST-*.xml" | xargs cat | grep -E 'tests|failures|errors|skipped' || echo "No test result files found"
echo ""
echo "Checking test execution results:"
TEST_RESULT_FILES=$(find build -name "TEST-*.xml" 2>/dev/null)
if [ -n "$TEST_RESULT_FILES" ]; then
echo "Found test result files:"
echo "$TEST_RESULT_FILES"
# Count total tests, failures, errors
TOTAL_TESTS=$(cat $TEST_RESULT_FILES | grep -o 'tests="[0-9]*"' | cut -d'"' -f2 | awk '{sum+=$1} END {print sum}')
TOTAL_FAILURES=$(cat $TEST_RESULT_FILES | grep -o 'failures="[0-9]*"' | cut -d'"' -f2 | awk '{sum+=$1} END {print sum}')
TOTAL_ERRORS=$(cat $TEST_RESULT_FILES | grep -o 'errors="[0-9]*"' | cut -d'"' -f2 | awk '{sum+=$1} END {print sum}')
echo "Test summary: $TOTAL_TESTS tests, $TOTAL_FAILURES failures, $TOTAL_ERRORS errors"
else
echo "No test result files found"
fi

echo "\nChecking JaCoCo report content:"
echo ""
echo "Checking JaCoCo report content:"
if [ -f build/reports/jacoco/jacocoTestReport/jacocoTestReport.xml ]; then
echo "Report file size: $(wc -c < build/reports/jacoco/jacocoTestReport/jacocoTestReport.xml) bytes"
echo "First 500 chars of report:"
head -c 500 build/reports/jacoco/jacocoTestReport/jacocoTestReport.xml
echo "\n\nCounting coverage elements:"
echo ""
echo ""
echo "Counting coverage elements:"
grep -c "<package" build/reports/jacoco/jacocoTestReport/jacocoTestReport.xml || echo "No packages found"
grep -c "<class" build/reports/jacoco/jacocoTestReport/jacocoTestReport.xml || echo "No classes found"
grep -c "<method" build/reports/jacoco/jacocoTestReport/jacocoTestReport.xml || echo "No methods found"
Expand All @@ -103,12 +131,18 @@ jobs:
echo "JaCoCo report file not found"
fi

echo "\nChecking binary directories specified in sonar-project.properties:"
echo ""
echo "Checking binary directories specified in sonar-project.properties:"
echo "build/intermediates/runtime_library_classes_dir/debug:"
ls -la build/intermediates/runtime_library_classes_dir/debug || echo "Directory not found"

echo "\nChecking all available class directories:"
find build -path "*/build/*" -name "*.class" | head -n 5 || echo "No class files found"
echo ""
echo "Checking all available class directories:"
find build -path "*/build/*" -name "*.class" | head -n 10 || echo "No class files found"

echo ""
echo "Final sonar-project.properties content:"
cat sonar-project.properties

- name: SonarCloud Scan
uses: SonarSource/sonarqube-scan-action@v5
Expand Down
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ apply from: 'spec.gradle'
apply from: 'jacoco.gradle'

ext {
splitVersion = '5.3.1'
splitVersion = '5.3.2-rc1'
jacocoVersion = '0.8.8'
}

Expand Down
65 changes: 55 additions & 10 deletions jacoco.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -28,34 +28,79 @@ tasks.register('jacocoTestReport', JacocoReport) {
}

def fileFilter = ['**/R.class', '**/R$*.class', '**/BuildConfig.*', '**/Manifest*.*', '**/*Test*.*', 'android/**/*.*']
def debugTree = fileTree(dir: "${buildDir}/intermediates/javac/debug/classes", excludes: fileFilter)

// Make sure to include all source directories
sourceDirectories.from = files(['src/main/java'])
// Updated to handle multiple possible class directory locations
def classDirectoriesFiles = []

// Include all class files except excluded ones
classDirectories.from = files([debugTree])
// Try multiple possible class directory locations for different AGP versions
def possibleClassDirs = [
"${buildDir}/intermediates/javac/debug/classes",
"${buildDir}/intermediates/javac/debug/compileDebugJavaWithJavac/classes",
"${buildDir}/intermediates/runtime_library_classes_dir/debug",
"${buildDir}/tmp/kotlin-classes/debug"
]

// Include execution data files
possibleClassDirs.each { dirPath ->
def classDir = fileTree(dir: dirPath, excludes: fileFilter)
if (classDir.files.size() > 0) {
classDirectoriesFiles.add(classDir)
}
}

// Include all source directories (Java and Kotlin)
sourceDirectories.from = files([
'src/main/java',
'src/main/kotlin'
])

// Include all found class files
classDirectories.from = files(classDirectoriesFiles)

// Include execution data files from multiple possible locations
executionData.from(fileTree(dir: "$buildDir", includes: [
'jacoco/testDebugUnitTest.exec',
'outputs/unit_test_code_coverage/debugUnitTest/testDebugUnitTest.exec'
'outputs/unit_test_code_coverage/debugUnitTest/testDebugUnitTest.exec',
'jacoco/*.exec',
'outputs/**/**.exec'
]))

outputs.upToDateWhen { false }

doFirst {
// Log a warning if no execution data files exist
// Enhanced logging for debugging
logger.lifecycle("=== JaCoCo Report Generation ===")

// Log source directories
logger.lifecycle("Source directories:")
sourceDirectories.files.each { dir ->
if (dir.exists()) {
logger.lifecycle(" - Found: $dir")
} else {
logger.lifecycle(" - Missing: $dir")
}
}

// Log class directories
logger.lifecycle("Class directories:")
classDirectories.files.each { dir ->
logger.lifecycle(" - $dir (${dir.exists() ? 'exists' : 'missing'})")
}

// Log execution data files
def execFiles = executionData.files
logger.lifecycle("Execution data files:")
if (execFiles.isEmpty() || !execFiles.any { it.exists() }) {
logger.warn("JaCoCo will not generate coverage report because no execution data files were found")
logger.warn(" - No execution data files found - coverage report will be empty")
} else {
execFiles.each { file ->
if (file.exists()) {
logger.lifecycle("Found JaCoCo execution data file: $file")
logger.lifecycle(" - Found: $file (${file.length()} bytes)")
} else {
logger.lifecycle(" - Missing: $file")
}
}
}
logger.lifecycle("================================")
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package io.split.android.client.storage.db;

import android.database.Cursor;
import android.os.Process;

import androidx.annotation.NonNull;

Expand All @@ -23,12 +22,6 @@ public SplitQueryDaoImpl(SplitRoomDatabase mDatabase) {
this.mDatabase = mDatabase;
// Start prefilling the map in a background thread
mInitializationThread = new Thread(() -> {
try {
android.os.Process.setThreadPriority(Process.THREAD_PRIORITY_URGENT_AUDIO);
} catch (Exception ignore) {
// Ignore
}

Map<String, SplitEntity> result = loadSplitsMap();

synchronized (mLock) {
Expand Down Expand Up @@ -107,14 +100,15 @@ public void invalidate() {
* This contains the actual loading logic separated from the caching/synchronization.
*/
private Map<String, SplitEntity> loadSplitsMap() {
final String sql = "SELECT name, body FROM splits";
Cursor cursor = null;
try {
final String sql = "SELECT name, body FROM splits";

Cursor cursor = mDatabase.query(sql, null);
cursor = mDatabase.query(sql, null);

final int ESTIMATED_CAPACITY = 2000;
Map<String, SplitEntity> result = new HashMap<>(ESTIMATED_CAPACITY);

final int ESTIMATED_CAPACITY = 2000;
Map<String, SplitEntity> result = new HashMap<>(ESTIMATED_CAPACITY);

try {
final int nameIndex = getColumnIndexOrThrow(cursor, "name");
final int bodyIndex = getColumnIndexOrThrow(cursor, "body");

Expand Down Expand Up @@ -147,12 +141,20 @@ private Map<String, SplitEntity> loadSplitsMap() {
entity.setBody(bodies[i]);
result.put(names[i], entity);
}

return result;
} catch (Exception e) {
Logger.e("Error executing loadSplitsMap query: " + e.getLocalizedMessage());
} finally {
cursor.close();
try {
if (cursor != null) {
cursor.close();
}
} catch (Exception ignored) {
// ignore
}
}

return result;
return new HashMap<>();
}
}
Loading
Loading