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
2 changes: 1 addition & 1 deletion .github/workflows/deploy.yml
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,6 @@ jobs:
APP_IMAGE_TAG="${{ github.sha }}" docker compose pull app
# 기존 앱을 내리기 전에 후보 컨테이너의 사용자/마운트로 모델 접근을 검사한다.
APP_IMAGE_TAG="${{ github.sha }}" docker compose run --rm -T --no-deps --entrypoint sh app -s < check-hair-analysis-model.sh
APP_IMAGE_TAG="${{ github.sha }}" docker compose up -d --remove-orphans
APP_IMAGE_TAG="${{ github.sha }}" docker compose up -d --remove-orphans --wait --wait-timeout 120
docker image prune -f
EOF
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.heddy.adapter.out.ai;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import tools.jackson.core.JacksonException;
import tools.jackson.databind.ObjectMapper;
import com.heddy.domain.analysis.model.ConfidenceGrade;
import com.heddy.domain.analysis.model.HairAnalysisOutcome;
import com.heddy.domain.analysis.model.HairAnalysisPrediction;
Expand Down Expand Up @@ -366,7 +366,7 @@ private static String summary(
private String json(Map<String, Object> value) {
try {
return objectMapper.writeValueAsString(value);
} catch (JsonProcessingException exception) {
} catch (JacksonException exception) {
throw new IllegalStateException("분석 근거를 JSON으로 만들 수 없습니다", exception);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
import ai.onnxruntime.OrtEnvironment;
import ai.onnxruntime.OrtException;
import ai.onnxruntime.OrtSession;
import com.fasterxml.jackson.databind.ObjectMapper;
import tools.jackson.databind.ObjectMapper;
import com.heddy.domain.analysis.model.HairAnalysisOutcome;
import com.heddy.domain.analysis.port.out.HairAnalysisEnginePort;
import jakarta.annotation.PreDestroy;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package com.heddy.adapter.out.ai;

import ai.onnxruntime.OrtEnvironment;
import ai.onnxruntime.OrtSession;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir;
import org.springframework.boot.autoconfigure.AutoConfigurations;
import org.springframework.boot.jackson.autoconfigure.JacksonAutoConfiguration;
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
import tools.jackson.databind.ObjectMapper;

import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Set;

import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.*;

class HairAnalysisEnabledContextTest {
@TempDir Path directory;

@Test
void enabledEngineStartsWithBootsAutoConfiguredJacksonMapper() throws Exception {
Path model = Files.write(directory.resolve("model.onnx"), new byte[]{1});
OrtEnvironment environment = mock(OrtEnvironment.class);
OrtSession session = mock(OrtSession.class);
when(environment.createSession(anyString(), any(OrtSession.SessionOptions.class)))
.thenReturn(session);
when(session.getInputNames()).thenReturn(Set.of("pixel_values"));

// Only the native model is stubbed: Boot's real Jackson auto-configuration must wire the bean.
try (var nativeEnvironment = mockStatic(OrtEnvironment.class);
var options = mockConstruction(OrtSession.SessionOptions.class)) {
nativeEnvironment.when(OrtEnvironment::getEnvironment).thenReturn(environment);
new ApplicationContextRunner()
.withConfiguration(AutoConfigurations.of(JacksonAutoConfiguration.class))
.withUserConfiguration(OnnxFaceParsingHairAnalysisAdapter.class)
.withPropertyValues("app.ai.enabled=true", "app.ai.model-path=" + model,
"app.ai.model-version=context-test", "app.ai.input-size=320",
"app.ai.minimum-confidence-score=50")
.run(context -> {
assertThat(context).hasNotFailed();
assertThat(context).hasSingleBean(ObjectMapper.class);
assertThat(context).hasSingleBean(OnnxFaceParsingHairAnalysisAdapter.class);
assertThat(context.getBean(OnnxFaceParsingHairAnalysisAdapter.class).isReady()).isTrue();
});
}
verify(session).close();
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.heddy.adapter.out.ai;

import com.fasterxml.jackson.databind.ObjectMapper;
import tools.jackson.databind.ObjectMapper;
import com.heddy.domain.analysis.model.HairAnalysisOutcome;
import com.heddy.domain.analysis.model.MetricType;
import org.junit.jupiter.api.Test;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.heddy.adapter.out.ai;

import com.fasterxml.jackson.databind.ObjectMapper;
import tools.jackson.databind.ObjectMapper;
import com.heddy.domain.analysis.model.HairAnalysisOutcome;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable;
Expand Down
Loading