- 投稿日:2020-08-18T23:02:38+09:00
Singletonパターン
Singletonパターン
インスタンスが1つしか存在しないことを保証するパターンのこと。
Singletonの役
Singletonの役は唯一のインスタンスを得るためのstaticメソッドを持つ。
このメソッドはいつも同じインスタンスを返す。package singleton; public class Singleton { private static Singleton singleton = new Singleton(); // コンストラクタをprivateにすることでクラス外からコンストラクタを呼び出すことを禁止する private Singleton() { System.out.println("インスタンスを生成しました"); } // インスタンスを返すstaticなメソッドを提供する public static Singleton getInstance() { return singleton; } }呼び出し元
package singleton; public class Main { public static void main(String[] args) { System.out.println("Start"); Singleton obj1 = Singleton.getInstance(); Singleton obj2 = Singleton.getInstance(); if (obj1 == obj2) { System.out.println("同じインスタンス"); } else { System.out.println("同じインスタンスではない"); } System.out.println("End"); } } // Start // インスタンスを生成しました // 同じインスタンス // Endサンプル
package singleton; public class TicketMaker { private static TicketMaker ticketMaker = new TicketMaker(); private int ticket = 1000; private TicketMaker() { } public static TicketMaker getInstance() { return ticketMaker; } // 複数のスレッドから呼び出せれた場合でも正しく動作するようsyncronizedを付与 public synchronized int getNextTiketNumber() { return ticket++; } }インスタンスの数が3つに限定されているクラス
package singleton; public class Triple { private static Triple[] triples = new Triple[] { new Triple(0), new Triple(1), new Triple(2), }; private int id; private Triple(int id) { System.out.println("The instance" + id + " is created"); this.id = id; } public static Triple getInstance(int id) { return triples[id]; } public String toString() { return "[Triple id = " + id + "]"; } }package singleton; public class Main { public static void main(String[] args) { System.out.println("Start"); for (int i = 0; i < 9; i++) { Triple triple = Triple.getInstance(i % 3); System.out.println(i + ":" + triple); } System.out.println("End"); } } // Start // The instance0 is created // The instance1 is created // The instance2 is created // 0:[Triple id = 0] // 1:[Triple id = 1] // 2:[Triple id = 2] // 3:[Triple id = 0] // 4:[Triple id = 1] // 5:[Triple id = 2] // 6:[Triple id = 0] // 7:[Triple id = 1] // 8:[Triple id = 2] // End
- 投稿日:2020-08-18T22:21:18+09:00
【Java】文字列の扱い(StringクラスとStringBuilderクラス編)
備忘録。
Stringクラス
String型のデータである文字列は、それ自身を書き換えることができません。また、String型は参照型であるため、初期化されたString型の変数に、異なる文字列を際代入すると、元の文字列が書き換えられるのではなく、新しい文字列が生成され、変数の参照先が切り替わります。
Stringクラスのメソッド
Sample.javaString s = "onigiri";
メソッド 説明 結果 charAt(2) 引数にある文字を返す。開始は0番目 i equals("onigiri") 引数の文字列と同じか比較し、boolean値で返す。 true intern() 文字列プールの中にある一意の文字列を返す onigiri indexOf('g') 引数の文字が最初に出現する位置を返す。開始は0番目 3 length() 文字列の数を返す 7 replace('i','Y') 第1引数の文字を、第2引数で指定した文字に置き換え、結果の文字列を返す onYgYrY substring(2) 引数で指定した位置から最後までの部分文字列を返す。開始は0番目 igiri Main.javapublic class Main { public static void main(String[] args){ String s = "onigiri"; System.out.println("charAt() : " + s.charAt(2)); // 出力結果「charAt() : i」 System.out.println("indexOf() : "+ s.indexOf('g')); // 出力結果「indexOf() : g」 System.out.println("length() : " + s.length()); // 出力結果「length() : 7」 System.out.println("replace() : " + s.replace('i','Y')); // 出力結果「onYgYrY」 System.out.println("substring() : " + s.substring(2)); // 出力結果「igiri」 } }StringBuilderクラス
StringBuilderクラスもStringクラスと同様、文字列を扱うクラスですが、変数に格納した文字列を変更することが可能です。Stringクラスとは異なり、一度生成した文字列に対して、文字を追加したり、置き換えたりすることができます。
Stringクラスのメソッド
Sample.javaStringBuilder sb = new StringBuilder("ShioMusubi");
メソッド 説明 結果 append("LUNCH") 引数で指定された文字列を現在の文字列に追加する ShioMusubiLUNCH insert(4,"UME") 引数で指定された文字列を、引数で指定された位置にある文字の前に挿入する。開始は0番目 ShioUMEMusubi delete(0,4) 第1引数から第2引数の位置の1つ前までの位置にある文字を削除する。開始は0番目 Musubi replace(4,sb.length(),"ONIGIRI") 第1引数から第2引数の位置の1つ前までの位置にある文字を、第3引数で指定された文字列に置き換える。開始は0番目 ShioONIGIRI substring(7) 引数で指定した位置から最後までの部分文字列を返す。開始は0番目 ubi Main.javapublic class Main { public static void main(String[] args){ StringBuilder sb1 = new StringBuilder("ShioMusubi"); System.out.println("append() : " + sb1.append("LUNCH")); // 出力結果「append() :ShioMusubiLUNCH」 StringBuilder sb2 = new StringBuilder("ShioMusubi"); System.out.println("insert() : "+ sb2.insert(4,"UME")); // 出力結果「insert() : ShioUMEMusubi」 StringBuilder sb3 = new StringBuilder("ShioMusubi"); System.out.println("delete() : "+ sb3.delete(4,"UME")); // 出力結果「delete() : Musubi」 StringBuilder sb4 = new StringBuilder("ShioMusubi"); System.out.println("replace() : " + sb4.replace(4,sb.length(),"ONIGIRI")); // 出力結果「ShioONIGIRI」 StringBuilder sb5 = new StringBuilder("ShioMusubi"); System.out.println("substring() : " + sb5.substring(7)); // 出力結果「ubi」 } }これがなかなか身につかなくて。不備あればご指摘いただきたく、覚えやすさがあればご教示いただきたく。
- 投稿日:2020-08-18T21:34:28+09:00
kotlinとjavaで関数を作りたい!
はじめに…
この記事は3個前の記事で書いた、
7日間毎日記事投稿の4日目
になってます
使うコードは下に貼りますが、このアプリの詳しい機能はその3個前の記事をご覧ください!
↓ここからが今回の記事の本題です↓
それぞれの言語で関数を作るには…
- javaの場合
修飾子 戻り値の型 関数名(引数, 引数, …) { 関数の内容 return 戻り値 }例)
※ 引数なし、戻り値なしの関数を定義しているWhoActivity.javaprivate void addMember() { // 78行目 EditText memberET = findViewById(R.id.member_et); ListView memberLV = findViewById(R.id.member_lv); memberL.add(memberET.getText().toString()); memberET.getEditableText().clear(); ArrayList<String> memberLR = (ArrayList<String>) memberL.clone(); Collections.reverse(memberLR); ArrayAdapter<String> adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, memberLR); memberLV.setAdapter(adapter); }
- kotlinの場合
fun 関数名(引数:型, 引数:型, …): 戻り値の型 { 関数の内容 return 戻り値 }例)
※ 引数なし、戻り値なしの関数を定義しているWhoActivity.ktfun addMember() { // 52行目 memberL.add(member_et.text.toString()) member_et?.text?.clear() var memverLR = ArrayList<String>(memberL) memverLR.reverse() var adapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, memverLR) member_lv.adapter = adapter }書き方は大きく違うが、関数定義時に必要な情報はほとんど変わらない。
最後に…
今回はjavaとkotlinで関数の定義をしました。
引数の種類・戻り値の種類によって様々な機能の関数を定義できるので、これからも多用できたらなと思います。明日も記事を投稿するので、引き続き温かく見守ってください。
- 投稿日:2020-08-18T19:49:51+09:00
Galasaを使ってみた
はじめに
Galasaというz/OSをベースとしたハイブリッド・クラウド・アプリケーションのためのテストフレームワークがオープンソースのプロジェクトとして提供されています。これはまだ提供されてから日が浅く(2019年の12月にV0.3.0リリース)、当記事執筆時点(2020年8月)でもV0.10.0というレベルでまだまだこれからという感じのモノなのですが、z/OSのアプリケーションをターゲットにしているというところが魅力的です。しかも、CICS TSの開発拠点でもあるIBM Hursley Lab(UK)で作られているというのが激アツです。ということで、このGalasaを使ってみた時のログです。
Galasa概要
Galasaはz/OSをベースとしたハイブリッド・クラウド・アプリケーションのためのテストフレームワークです。Eclipseのプラグインが提供されていますので、3270アプリやz/OSのバッチアプリなどのテストコードをEclipse上でJUnitライクにJavaで実装しテスト実行を行うことができます。
サンプルのテストコードが提供されていますが、それをチュートリアル的に動かすために、なんとEclipse上で動くホストアプリケーションのシミュレーターのようなものまで提供してくれています。なので、Windows上だけで(z/OSとかz/OSアプリを準備しなくても)、とりあえずこのフレームワーク使ったサンプルを試すことができます。素晴らしい!環境セットアップ
Windows10上に環境構築してみます。
Eclipseインストール
以下からEclipse IDE for Enterprise Java Developers (Eclipse IDE 2020‑06) のWindows 64bit版をダウンロードします。
Eclipse IDE 2020-06 R Packagesダウンロードされたzipファイル(eclipse-jee-2020-06-R-win32-x86_64.zip: 約400MB)を適当なディレクトリに解凍します。
Galasa Eclipse Pluginのインストール
参考: Installing the Galasa plug-in
Eclipseを起動し、Help - Install New Software を選択
Work withの欄にhttps://p2.galasa.dev/
を指定し、表示されたGalasaのフィーチャーを全て選択してNext
Eclipseのメインメニューに"Galasa"というメニューが追加されました!
SimBankセットアップ
Galasaには、SimBankというメインフレームアプリケーションをシミュレートするためのコンポーネント(サンプルのアプリ含む)が提供されています。これはSimPlatformと呼ばれるコンポーネントで動作するらしく、Eclipse上でCICSや3270アプリケーションをシミュレートすることができるようです。
サンプルのテストプロジェクトを実行するときのダミーのホストアプリケーションとして使えますので、まずはそれを動かしてみます。SimBank構成
Galasa - Setup Galasa Workspace を選択
ホームディレクトリ下に.galasaというディレクトリが作成され、そこにいくつかファイルが作成されました。全てファイルサイズが0 Byteなので中身はカラです。
C:\Users\TomohiroTaguchi\.galasa>dir ドライブ C のボリューム ラベルは Windows です ボリューム シリアル番号は 1866-E2FC です C:\Users\TomohiroTaguchi\.galasa のディレクトリ 2020/08/15 15:09 <DIR> . 2020/08/15 15:09 <DIR> .. 2020/08/15 15:09 0 bootstrap.properties 2020/08/15 15:09 0 cps.properties 2020/08/15 15:09 0 credentials.properties 2020/08/15 15:09 0 dss.properties 2020/08/15 15:09 0 overrides.properties 5 個のファイル 0 バイト 2 個のディレクトリ 253,723,049,984 バイトの空き領域overrides.propertiesを以下のように編集します。
overrides.propertieszos.dse.tag.SIMBANK.imageid=SIMBANK zos.dse.tag.SIMBANK.clusterid=SIMBANK simbank.dse.instance.name=SIMBANK simbank.instance.SIMBANK.zos.image=SIMBANK zos.image.SIMBANK.ipv4.hostname=127.0.0.1 zos.image.SIMBANK.telnet.port=2023 zos.image.SIMBANK.webnet.port=2080 zos.image.SIMBANK.telnet.tls=false zos.image.SIMBANK.credentials=SIMBANK zosmf.server.SIMBANK.images=SIMBANK zosmf.server.SIMBANK.hostname=127.0.0.1 zosmf.server.SIMBANK.port=2040 zosmf.server.SIMBANK.https=falsecredentials.propertiesを以下のように編集します。
credentials.propertiessecure.credentials.SIMBANK.username=IBMUSER secure.credentials.SIMBANK.password=SYS1SimBank稼働確認
SimBankはCICSの3270アプリをシミュレートするもののようです。まずテスト対象のアプリがどのように動くものなのかを確認してみます(実際のz/OSが無くてもEclipse上で動きます)。
EclipseのメニューからRun - Run Configurationsを選択
Galasa SimBankを右クリックしてNew Configurationを選択
Consoleに以下のメッセージが出力され、サンプルアプリが起動しました。
2023ポートでTN3270を受け付けるようなので、PCOMなどの3270エミュレーターからアクセスしてみます。
接続できました!
Userid/Passwordに、IBMUSER/SYS1を指定
BANKTESTというアプリが動いているようなので、PF1を選択
画面クリアして「BANK」というトランザクションを実行します。
メニューが表示されるので、Browse(PF1)を選択します
Account Numberに"123456789"を入力してEnter
Account Number "987654321"も確認してみます。
PF3でメニューに戻って、次はTransfer(PF4)を選択します。
Account "123456789" => "987654321"へ $1移動させます。
再度Browseしてみると一方は$1減って一方は$1増えてます。
操作した時のログはEclipseのConsoleに以下のように出力されています。
(アプリで出しているログかな? JOBLOG or SYSLOG出力っぽい?)F3を押していくとCICSのログオフまでされて最初の画面に戻ります。
SimBankのテスト
ここからが本題です。サンプルとして提供されるSimBankのテストを行ってみます。テスト用のプロジェクトもサンプルで提供されているのでそれを使います。
サンプルGalasaプロジェクト作成
Eclipseのメニューから File - New - Exampleを選択
SimBank example projectsを選択してNext
dev.galasa.simbank.managerを右クリック Run As - Maven installを選択
consoleに処理経過が出力されます。依存関係のあるファイルのダウンロードなどが走ります。 BUILD SUCCESSのメッセージが確認できればOKです。
dev.galasa.simbank.testsも同様にMaven install実行します。
これでサンプルのテストプロジェクトの作成は完了です。
src/main/javaのdev.galasa.simbank.tests以下にテスト用のコードがいくつか提供されていますので、これを実施していきます。
テスト開始するまえに、先に構成したSimBankを起動しておきます。
(Run - Run Configurations - SimBankを選択してRun)テスト(1) SimBankIVT
これは上でPCOMから3270ベースのCICSアプリケーション(BANK)を実行する部分をテストするためのコードです。3270端末操作をJavaのテストコードとして記述して実行することができます。
テストコード
SimBankIVT.java/* * Licensed Materials - Property of IBM * * (c) Copyright IBM Corp. 2019. */ package dev.galasa.simbank.tests; import static org.assertj.core.api.Assertions.assertThat; import java.io.IOException; import java.net.URISyntaxException; import dev.galasa.Test; import dev.galasa.artifact.BundleResources; import dev.galasa.artifact.IBundleResources; import dev.galasa.artifact.TestBundleResourceException; import dev.galasa.core.manager.CoreManager; import dev.galasa.core.manager.ICoreManager; import dev.galasa.http.HttpClient; import dev.galasa.http.HttpClientException; import dev.galasa.http.IHttpClient; import dev.galasa.zos.IZosImage; import dev.galasa.zos.ZosImage; import dev.galasa.zos.ZosManagerException; import dev.galasa.zos3270.FieldNotFoundException; import dev.galasa.zos3270.ITerminal; import dev.galasa.zos3270.KeyboardLockedException; import dev.galasa.zos3270.TerminalInterruptedException; import dev.galasa.zos3270.TextNotFoundException; import dev.galasa.zos3270.TimeoutException; import dev.galasa.zos3270.Zos3270Terminal; import dev.galasa.zos3270.spi.DatastreamException; import dev.galasa.zos3270.spi.NetworkException; @Test public class SimBankIVT { @ZosImage(imageTag = "SIMBANK") public IZosImage image; @Zos3270Terminal(imageTag = "SIMBANK") public ITerminal terminal; @BundleResources public IBundleResources resources; @HttpClient public IHttpClient client; @CoreManager public ICoreManager coreManager; @Test public void testNotNull() { // Check all objects loaded assertThat(terminal).isNotNull(); assertThat(resources).isNotNull(); assertThat(client).isNotNull(); } /** * Test which checks the initial balance of an account, uses the webservice to * credit the account, then checks the balance again. The test passes if the * final balance is equal to the old balance + the credited amount. * * @throws TestBundleResourceException * @throws URISyntaxException * @throws IOException * @throws HttpClientException * @throws ZosManagerException * @throws TextNotFoundException * @throws FieldNotFoundException * @throws NetworkException * @throws KeyboardLockedException * @throws TimeoutException * @throws DatastreamException * @throws InterruptedException */ @Test public void checkBankIsAvailable() throws TestBundleResourceException, URISyntaxException, IOException, HttpClientException, ZosManagerException, DatastreamException, TimeoutException, KeyboardLockedException, NetworkException, FieldNotFoundException, TextNotFoundException, TerminalInterruptedException { // Register the password to the confidential text filtering service coreManager.registerConfidentialText("SYS1", "IBMUSER password"); // Logon through the session manager terminal.waitForKeyboard().positionCursorToFieldContaining("Userid").tab().type("IBMUSER") .positionCursorToFieldContaining("Password").tab().type("SYS1").enter().waitForKeyboard(); // Assert that the session manager has a bank session available assertThat(terminal.retrieveScreen()).containsOnlyOnce("SIMPLATFORM MAIN MENU"); assertThat(terminal.retrieveScreen()).containsOnlyOnce("BANKTEST"); // Open banking application terminal.pf1().waitForKeyboard().clear().waitForKeyboard(); terminal.type("bank").enter().waitForKeyboard(); // Assert that the bank menu is showing assertThat(terminal.retrieveScreen()).containsOnlyOnce("Options Description PFKey "); assertThat(terminal.retrieveScreen()).containsOnlyOnce("BROWSE Browse Accounts PF1"); assertThat(terminal.retrieveScreen()).containsOnlyOnce("TRANSF Transfer Money PF4"); } }このテストコードを実際に動かしてみます。
EclipseのメニューからRun - Run Configurationsを選択
左側のメニューからGalasaを右クリックしてNew Configurationを選択
名前を適当に付けて、Project: dev.galasa.simbank.tests, TestClass:SimBankIVTを選択し、Apply, Run
Consoleに以下のような結果が表示されます。
テスト結果
18/08/2020 17:25:55.704 DEBUG dev.galasa.boot.Launcher.processCommandLine - Supplied command line arguments: --bootstrap file:///C:/Users/TomohiroTaguchi/.galasa/bootstrap.properties --overrides file:///C:/Users/TOMOHI~1/AppData/Local/Temp/galasa_eclipse_cache_8879301005844695930/galasaoverrides1461489270957804148.properties --localmaven file:/C:/Users/TomohiroTaguchi/.m2/repository/ --remotemaven https://repo.maven.apache.org/maven2/ --obr file:/C:/y/workspace/workspace_eclipse-jee-2020-06-R-galasa/.metadata/.plugins/dev.galasa.eclipse/workspace.obr --obr mvn:dev.galasa/dev.galasa.uber.obr/LATEST/obr --test dev.galasa.simbank.tests/dev.galasa.simbank.tests.SimBankIVT 18/08/2020 17:25:55.724 DEBUG dev.galasa.boot.Launcher.launch - OBR Repository Files: [file:/C:/y/workspace/workspace_eclipse-jee-2020-06-R-galasa/.metadata/.plugins/dev.galasa.eclipse/workspace.obr, mvn:dev.galasa/dev.galasa.uber.obr/LATEST/obr] 18/08/2020 17:25:55.725 DEBUG dev.galasa.boot.Launcher.launch - Launching Framework... 18/08/2020 17:25:55.725 DEBUG dev.galasa.boot.Launcher.buildFramework - Launching Framework... 18/08/2020 17:25:55.725 DEBUG dev.galasa.boot.felix.FelixFramework.buildFramework - Building Felix Framework... 18/08/2020 17:25:55.808 DEBUG dev.galasa.boot.felix.FelixFramework.buildFramework - Initializing Felix Framework 18/08/2020 17:25:55.930 DEBUG dev.galasa.boot.felix.FelixFramework.buildFramework - Starting Felix Framework 18/08/2020 17:25:55.931 DEBUG dev.galasa.boot.felix.FelixFramework.buildFramework - Felix Framework started 18/08/2020 17:25:55.932 DEBUG dev.galasa.boot.felix.FelixFramework.buildFramework - Installing required OSGi bundles 18/08/2020 17:25:57.299 DEBUG d.g.f.m.r.i.GalasaMavenUrlHandlerService - Attempting to download https://repo.maven.apache.org/maven2/dev/galasa/dev.galasa.uber.obr/maven-metadata.xml 18/08/2020 17:25:59.132 DEBUG d.g.f.m.r.i.GalasaMavenUrlHandlerService - Version 'LATEST' resolved to 0.10.0 18/08/2020 17:25:59.134 DEBUG d.g.f.m.r.i.GalasaMavenUrlHandlerService - Checking https://repo.maven.apache.org/maven2 18/08/2020 17:25:59.134 DEBUG d.g.f.m.r.i.GalasaMavenUrlHandlerService - Attempting to download https://repo.maven.apache.org/maven2/dev/galasa/dev.galasa.uber.obr/0.10.0/dev.galasa.uber.obr-0.10.0.obr 18/08/2020 17:25:59.928 DEBUG dev.galasa.boot.felix.FelixFramework.buildFramework - installing Framework bundle 18/08/2020 17:26:00.116 DEBUG d.g.f.m.r.i.GalasaMavenUrlHandlerService - Checking https://repo.maven.apache.org/maven2 18/08/2020 17:26:00.116 DEBUG d.g.f.m.r.i.GalasaMavenUrlHandlerService - Attempting to download https://repo.maven.apache.org/maven2/org/apache/felix/org.apache.felix.http.servlet-api/1.1.2/org.apache.felix.http.servlet-api-1.1.2.jar 18/08/2020 17:26:00.305 DEBUG d.g.f.m.r.i.GalasaMavenUrlHandlerService - Checking https://repo.maven.apache.org/maven2 18/08/2020 17:26:00.305 DEBUG d.g.f.m.r.i.GalasaMavenUrlHandlerService - Attempting to download https://repo.maven.apache.org/maven2/org/apache/bcel/bcel/6.3/bcel-6.3.jar 18/08/2020 17:26:00.744 INFO d.g.f.Framework - Framework service activated 18/08/2020 17:26:00.745 INFO d.g.f.Framework - Framework version = 0.10.0 18/08/2020 17:26:00.751 INFO d.g.f.Framework - Framework build = Tue, 4 Aug 2020 22:57:46 +0900 18/08/2020 17:26:00.761 DEBUG dev.galasa.boot.Launcher.launch - Test Bundle: dev.galasa.simbank.tests 18/08/2020 17:26:00.761 DEBUG dev.galasa.boot.Launcher.launch - Test Class: dev.galasa.simbank.tests.SimBankIVT 18/08/2020 17:26:00.767 DEBUG dev.galasa.boot.felix.FelixFramework.runTest - Invoking runTest() 18/08/2020 17:26:00.768 INFO d.g.f.FrameworkInitialisation - Initialising the Galasa Framework 18/08/2020 17:26:00.770 DEBUG d.g.f.FrameworkInitialisation - Configuration Property Store is file:///C:/Users/TomohiroTaguchi/.galasa/cps.properties 18/08/2020 17:26:00.781 DEBUG d.g.f.FrameworkInitialisation - Selected CPS Service is dev.galasa.framework.internal.cps.FpfConfigurationPropertyStore 18/08/2020 17:26:00.782 DEBUG d.g.f.FrameworkInitialisation - Dynamic Status Store is file:///C:/Users/TomohiroTaguchi/.galasa/dss.properties 18/08/2020 17:26:00.801 INFO d.g.f.FrameworkInitialisation - Allocated Run Name U1 to this run 18/08/2020 17:26:00.803 DEBUG d.g.f.FrameworkInitialisation - Result Archive Stores are [file:///C:/Users/TomohiroTaguchi/.galasa/ras] 18/08/2020 17:26:00.827 DEBUG d.g.f.FrameworkInitialisation - Credentials Store is file:///C:/Users/TomohiroTaguchi/.galasa/credentials.properties 18/08/2020 17:26:00.834 INFO d.g.f.FrameworkInitialisation - Framework initialised 18/08/2020 17:26:00.964 DEBUG d.g.f.m.r.i.GalasaMavenUrlHandlerService - Checking https://repo.maven.apache.org/maven2 18/08/2020 17:26:00.965 DEBUG d.g.f.m.r.i.GalasaMavenUrlHandlerService - Attempting to download https://repo.maven.apache.org/maven2/dev/galasa/com.jcraft.jsch/0.1.55/com.jcraft.jsch-0.1.55.jar 18/08/2020 17:26:01.267 DEBUG d.g.f.m.r.i.GalasaMavenUrlHandlerService - Checking https://repo.maven.apache.org/maven2 18/08/2020 17:26:01.268 DEBUG d.g.f.m.r.i.GalasaMavenUrlHandlerService - Attempting to download https://repo.maven.apache.org/maven2/commons-lang/commons-lang/2.6/commons-lang-2.6.jar 18/08/2020 17:26:01.957 DEBUG d.g.f.m.r.i.GalasaMavenUrlHandlerService - Checking https://repo.maven.apache.org/maven2 18/08/2020 17:26:01.958 DEBUG d.g.f.m.r.i.GalasaMavenUrlHandlerService - Attempting to download https://repo.maven.apache.org/maven2/commons-collections/commons-collections/3.2.2/commons-collections-3.2.2.jar 18/08/2020 17:26:02.238 DEBUG d.g.f.m.r.i.GalasaMavenUrlHandlerService - Checking https://repo.maven.apache.org/maven2 18/08/2020 17:26:02.238 DEBUG d.g.f.m.r.i.GalasaMavenUrlHandlerService - Attempting to download https://repo.maven.apache.org/maven2/org/apache/felix/org.apache.felix.configadmin/1.9.16/org.apache.felix.configadmin-1.9.16.jar 18/08/2020 17:26:02.572 INFO d.g.f.TestRunner - Run test: dev.galasa.simbank.tests/dev.galasa.simbank.tests.SimBankIVT 18/08/2020 17:26:02.660 DEBUG d.g.f.m.r.i.GalasaMavenUrlHandlerService - Checking https://repo.maven.apache.org/maven2 18/08/2020 17:26:02.661 DEBUG d.g.f.m.r.i.GalasaMavenUrlHandlerService - Attempting to download https://repo.maven.apache.org/maven2/dev/galasa/dev.galasa.zosbatch.zosmf.manager/0.10.0/dev.galasa.zosbatch.zosmf.manager-0.10.0.jar 18/08/2020 17:26:03.074 DEBUG d.g.f.m.r.i.GalasaMavenUrlHandlerService - Checking https://repo.maven.apache.org/maven2 18/08/2020 17:26:03.074 DEBUG d.g.f.m.r.i.GalasaMavenUrlHandlerService - Attempting to download https://repo.maven.apache.org/maven2/dev/galasa/dev.galasa.zosmf.manager/0.10.0/dev.galasa.zosmf.manager-0.10.0.jar 18/08/2020 17:26:03.519 DEBUG d.g.f.m.r.i.GalasaMavenUrlHandlerService - Checking https://repo.maven.apache.org/maven2 18/08/2020 17:26:03.520 DEBUG d.g.f.m.r.i.GalasaMavenUrlHandlerService - Attempting to download https://repo.maven.apache.org/maven2/dev/galasa/dev.galasa.zosconsole.zosmf.manager/0.10.0/dev.galasa.zosconsole.zosmf.manager-0.10.0.jar 18/08/2020 17:26:03.838 DEBUG d.g.f.m.r.i.GalasaMavenUrlHandlerService - Checking https://repo.maven.apache.org/maven2 18/08/2020 17:26:03.839 DEBUG d.g.f.m.r.i.GalasaMavenUrlHandlerService - Attempting to download https://repo.maven.apache.org/maven2/dev/galasa/dev.galasa.zosfile.zosmf.manager/0.10.0/dev.galasa.zosfile.zosmf.manager-0.10.0.jar 18/08/2020 17:26:04.120 DEBUG d.g.f.m.r.i.GalasaMavenUrlHandlerService - Checking https://repo.maven.apache.org/maven2 18/08/2020 17:26:04.120 DEBUG d.g.f.m.r.i.GalasaMavenUrlHandlerService - Attempting to download https://repo.maven.apache.org/maven2/dev/galasa/dev.galasa.zostsocommand.ssh.manager/0.10.0/dev.galasa.zostsocommand.ssh.manager-0.10.0.jar 18/08/2020 17:26:04.422 DEBUG d.g.f.m.r.i.GalasaMavenUrlHandlerService - Checking https://repo.maven.apache.org/maven2 18/08/2020 17:26:04.423 DEBUG d.g.f.m.r.i.GalasaMavenUrlHandlerService - Attempting to download https://repo.maven.apache.org/maven2/dev/galasa/dev.galasa.zosunixcommand.ssh.manager/0.10.0/dev.galasa.zosunixcommand.ssh.manager-0.10.0.jar 18/08/2020 17:26:04.685 DEBUG d.g.f.TestRunManagers - The following Managers are active:- 18/08/2020 17:26:04.685 DEBUG d.g.f.TestRunManagers - dev.galasa.core.manager.internal.CoreManager 18/08/2020 17:26:04.685 DEBUG d.g.f.TestRunManagers - dev.galasa.zos.internal.ZosManagerImpl 18/08/2020 17:26:04.686 DEBUG d.g.f.TestRunManagers - dev.galasa.ipnetwork.internal.IpNetworkManagerImpl 18/08/2020 17:26:04.686 DEBUG d.g.f.TestRunManagers - dev.galasa.zos3270.internal.Zos3270ManagerImpl 18/08/2020 17:26:04.686 DEBUG d.g.f.TestRunManagers - dev.galasa.http.internal.HttpManagerImpl 18/08/2020 17:26:04.686 DEBUG d.g.f.TestRunManagers - dev.galasa.artifact.internal.ArtifactManagerImpl 18/08/2020 17:26:04.687 DEBUG d.g.f.TestRunManagers - The following Managers are sorted in provisioning order:- 18/08/2020 17:26:04.687 DEBUG d.g.f.TestRunManagers - dev.galasa.core.manager.internal.CoreManager 18/08/2020 17:26:04.687 DEBUG d.g.f.TestRunManagers - dev.galasa.zos.internal.ZosManagerImpl 18/08/2020 17:26:04.687 DEBUG d.g.f.TestRunManagers - dev.galasa.ipnetwork.internal.IpNetworkManagerImpl 18/08/2020 17:26:04.687 DEBUG d.g.f.TestRunManagers - dev.galasa.zos3270.internal.Zos3270ManagerImpl 18/08/2020 17:26:04.688 DEBUG d.g.f.TestRunManagers - dev.galasa.http.internal.HttpManagerImpl 18/08/2020 17:26:04.688 DEBUG d.g.f.TestRunManagers - dev.galasa.artifact.internal.ArtifactManagerImpl 18/08/2020 17:26:04.719 INFO d.g.f.TestRunner - Starting Provision Generate phase 18/08/2020 17:26:04.722 INFO d.g.z.i.ZosManagerImpl - zOS DSE Image SIMBANK selected for zosTag 'SIMBANK' 18/08/2020 17:26:05.022 INFO d.g.z.i.Zos3270ManagerImpl - Generated a terminal for zOS Image tagged SIMBANK 18/08/2020 17:26:05.036 INFO d.g.f.TestRunner - Starting Provision Build phase 18/08/2020 17:26:05.037 INFO d.g.f.TestRunner - Starting Provision Start phase 18/08/2020 17:26:05.037 INFO d.g.z.i.Zos3270ManagerImpl - Connecting zOS3270 Terminals 18/08/2020 17:26:05.060 INFO d.g.f.TestRunner - Running the test class 18/08/2020 17:26:05.060 INFO d.g.f.TestClassWrapper - Starting ----------------------- **************************************************************************************************** ----------------------- *** Start of test class dev.galasa.simbank.tests.SimBankIVT ----------------------- **************************************************************************************************** 18/08/2020 17:26:05.061 INFO d.g.f.GenericMethodWrapper - Starting ----------------------- **************************************************************************************************** ----------------------- *** Start of test method dev.galasa.simbank.tests.SimBankIVT#testNotNull,type=Test ----------------------- **************************************************************************************************** 18/08/2020 17:26:05.096 INFO d.g.f.GenericMethodWrapper - Ending ----------------------- **************************************************************************************************** ----------------------- *** Passed - Test method dev.galasa.simbank.tests.SimBankIVT#testNotNull,type=Test ----------------------- **************************************************************************************************** 18/08/2020 17:26:05.097 INFO d.g.f.GenericMethodWrapper - Starting ----------------------- **************************************************************************************************** ----------------------- *** Start of test method dev.galasa.simbank.tests.SimBankIVT#checkBankIsAvailable,type=Test ----------------------- **************************************************************************************************** 18/08/2020 17:26:05.098 INFO d.g.f.i.c.FrameworkConfidentialTextService - Confidential text registered as '*1**', with comment IBMUSER password 18/08/2020 17:26:05.317 DEBUG d.g.z.s.Zos3270TerminalImpl - RECEIVED update to 3270 terminal term1, updateId=term1-1 =| TERM0001 SIMPLATFORM LOGON SCREEN 17:26:05| =| -------------------------------------------------------------------------------| =| | =| | =| *******\ ******\ ****\ ****\ | =| *********\ ******\ *****\ *****\ | =| **\\\\\**\ \**\\\ **\ **\ **\\**\ | =| **\ **\ **\ **\**\\ **\ | =| *********\ **\ **\ ***\\ **\ | =| *********\ **\ **\ *\\ **\ | =| \\\\\\**\ **\ **\ \ **\ | =| **\ **\ **\ **\ | =| *********\ ******\ **\ **\ | =| *******\\ ******\ **\ **\ | =| \\\\\\\ \\\\\\ \\ \\ | =| | =| | =| P L A T F O R M | =| | =| | =| -------------------------------------------------------------------------------| =| Userid ===> Password ===> | ^| ^ =| | =| | 18/08/2020 17:26:05.340 DEBUG d.g.z.s.Zos3270TerminalImpl - SENDING, ENTER to 3270 terminal term1, updateId=term1-2 =| TERM0001 SIMPLATFORM LOGON SCREEN 17:26:05| =| -------------------------------------------------------------------------------| =| | =| | =| *******\ ******\ ****\ ****\ | =| *********\ ******\ *****\ *****\ | =| **\\\\\**\ \**\\\ **\ **\ **\\**\ | =| **\ **\ **\ **\**\\ **\ | =| *********\ **\ **\ ***\\ **\ | =| *********\ **\ **\ *\\ **\ | =| \\\\\\**\ **\ **\ \ **\ | =| **\ **\ **\ **\ | =| *********\ ******\ **\ **\ | =| *******\\ ******\ **\ **\ | =| \\\\\\\ \\\\\\ \\ \\ | =| | =| | =| P L A T F O R M | =| | =| | =| -------------------------------------------------------------------------------| =| Userid ===> IBMUSER Password ===> *1** | ^| ^ =| | =| | 18/08/2020 17:26:05.361 DEBUG d.g.z.s.Zos3270TerminalImpl - RECEIVED update to 3270 terminal term1, updateId=term1-3 =| TERM0001 SIMPLATFORM MAIN MENU 17:26:05| =| -------------------------------------------------------------------------------| =| | =| Application PKey Status | =| ----------- ---- ------------------------------------------------- | =| | =| BANKTEST PF1 UP | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| -------------------------------------------------------------------------------| =| Application ===> | ^| ^ =| | =| | 18/08/2020 17:26:05.377 DEBUG d.g.z.s.Zos3270TerminalImpl - SENDING, PF1 to 3270 terminal term1, updateId=term1-4 =| TERM0001 SIMPLATFORM MAIN MENU 17:26:05| =| -------------------------------------------------------------------------------| =| | =| Application PKey Status | =| ----------- ---- ------------------------------------------------- | =| | =| BANKTEST PF1 UP | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| -------------------------------------------------------------------------------| =| Application ===> | ^| ^ =| | =| | 18/08/2020 17:26:05.396 DEBUG d.g.z.s.Zos3270TerminalImpl - RECEIVED update to 3270 terminal term1, updateId=term1-5 =| DFHZC2312 *** WELCOME TO CICS *** 17:26:05 | ^|^ =| | =| | =| | =| | =| | =| ******\ ******\ ******\ ******\(R) | =| ********\ ******\ ********\ ********\ | =| **\\\\**\ **\\\ **\\\\**\ **\\\\**\ | =| **\ \\ **\ **\ \\ **\ \\ | =| **\ **\ **\ *******\ | =| **\ **\ **\ *******\ | =| **\ **\ **\ \\\\**\ | =| **\ **\ **\ **\ **\ **\ **\ | =| ********\ ******\ ********\ ********\ | =| ******\\ ******\ ******\\ ******\\ | =| \\\\\\ \\\\\\ \\\\\\ \\\\\\ | =| | =| | =| | =| | =| | =| | =| | 18/08/2020 17:26:05.412 DEBUG d.g.z.s.Zos3270TerminalImpl - SENDING, CLEAR to 3270 terminal term1, updateId=term1-6 =| | ^|^ =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | 18/08/2020 17:26:05.608 DEBUG d.g.z.s.Zos3270TerminalImpl - RECEIVED update to 3270 terminal term1, updateId=term1-7 =| | ^|^ =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | 18/08/2020 17:26:05.619 DEBUG d.g.z.s.Zos3270TerminalImpl - SENDING, ENTER to 3270 terminal term1, updateId=term1-8 =|bank | ^| ^ =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | 18/08/2020 17:26:05.640 DEBUG d.g.z.s.Zos3270TerminalImpl - RECEIVED update to 3270 terminal term1, updateId=term1-9 =| CONNECTED SIMBANK MAIN MENU 17:26:05| =| -------------------------------------------------------------------------------| =| ===> | ^| ^ =| | =| Options Description PFKey | =| ------- --------------------------------------------------------------- | =| BROWSE Browse Accounts PF1 | =| TRANSF Transfer Money PF4 | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | 18/08/2020 17:26:05.642 INFO d.g.f.GenericMethodWrapper - Ending ----------------------- **************************************************************************************************** ----------------------- *** Passed - Test method dev.galasa.simbank.tests.SimBankIVT#checkBankIsAvailable,type=Test ----------------------- **************************************************************************************************** 18/08/2020 17:26:05.642 INFO d.g.f.TestClassWrapper - Ending ----------------------- **************************************************************************************************** ----------------------- *** Passed - Test class dev.galasa.simbank.tests.SimBankIVT ----------------------- **************************************************************************************************** 18/08/2020 17:26:05.644 INFO d.g.f.TestRunner - Starting Provision Stop phase 18/08/2020 17:26:05.659 INFO d.g.f.TestRunner - Starting Provision Discard phase 18/08/2020 17:26:06.088 DEBUG dev.galasa.boot.felix.FelixFramework.stopFramework - Stopping Felix framework 18/08/2020 17:26:06.107 INFO d.g.f.Framework - Framework service deactivated 18/08/2020 17:26:06.121 DEBUG dev.galasa.boot.felix.FelixFramework.stopFramework - Felix framework stopped 18/08/2020 17:26:06.121 INFO dev.galasa.boot.Launcher.launch - Boot complete3270端末でのテストをテストコードで実行できました!
テスト(2) BasicAccountCreditTest
これはCICS Webサービスとして実装されている(と思われる)"特定の口座の金額をアップデートする"ためのロジックをテストするものです。
テスト対象はWebサービス呼び出しですが、前後の金額情報を取得するのに3270画面のフローを入れています。
つまり、テストコードは以下のような流れとなっています。
1.3270アプリを呼び出して更新前の値を取得
2.Webサービス呼び出しで更新処理(特定口座にある特定の金額を振り込み)
3.3270アプリを呼び出して更新後の値を取得
4.更新前後の値をチェック参考までに... テスト対象のロジックはWebサービス呼び出しなので、例えば以下のように汎用的なツール(ChromeのTarend API Tester)でもSOAPリクエストの動作確認ができます。
テストコード
BasicAccountCreditTest/* * Licensed Materials - Property of IBM * * (c) Copyright IBM Corp. 2019. */ package dev.galasa.simbank.tests; import static org.assertj.core.api.Assertions.assertThat; import java.io.IOException; import java.math.BigDecimal; import java.net.URI; import java.net.URISyntaxException; import java.util.HashMap; import dev.galasa.Test; import dev.galasa.artifact.BundleResources; import dev.galasa.artifact.IBundleResources; import dev.galasa.artifact.TestBundleResourceException; import dev.galasa.core.manager.CoreManager; import dev.galasa.core.manager.ICoreManager; import dev.galasa.http.HttpClient; import dev.galasa.http.HttpClientException; import dev.galasa.http.IHttpClient; import dev.galasa.simbank.manager.ISimBank; import dev.galasa.simbank.manager.SimBank; import dev.galasa.zos.IZosImage; import dev.galasa.zos.ZosImage; import dev.galasa.zos.ZosManagerException; import dev.galasa.zos3270.FieldNotFoundException; import dev.galasa.zos3270.ITerminal; import dev.galasa.zos3270.KeyboardLockedException; import dev.galasa.zos3270.TerminalInterruptedException; import dev.galasa.zos3270.TextNotFoundException; import dev.galasa.zos3270.TimeoutException; import dev.galasa.zos3270.Zos3270Terminal; import dev.galasa.zos3270.spi.DatastreamException; import dev.galasa.zos3270.spi.NetworkException; @Test public class BasicAccountCreditTest { @SimBank public ISimBank simBank; @ZosImage(imageTag = "SIMBANK") public IZosImage image; @Zos3270Terminal(imageTag = "SIMBANK") public ITerminal terminal; @BundleResources public IBundleResources resources; @CoreManager public ICoreManager coreManager; @HttpClient public IHttpClient client; /** * Test which checks the initial balance of an account, uses the webservice to * credit the account, then checks the balance again. The test passes if the * final balance is equal to the old balance + the credited amount. * * @throws TestBundleResourceException * @throws URISyntaxException * @throws IOException * @throws HttpClientException * @throws ZosManagerException * @throws TextNotFoundException * @throws FieldNotFoundException * @throws NetworkException * @throws KeyboardLockedException * @throws TimeoutException * @throws DatastreamException * @throws InterruptedException */ @Test public void updateAccountWebServiceTest() throws TestBundleResourceException, URISyntaxException, IOException, HttpClientException, ZosManagerException, DatastreamException, TimeoutException, KeyboardLockedException, NetworkException, FieldNotFoundException, TextNotFoundException, TerminalInterruptedException { // Register the password to the confidential text filtering service coreManager.registerConfidentialText("SYS1", "IBMUSER password"); // Initial actions to get into banking application terminal.waitForKeyboard().positionCursorToFieldContaining("Userid").tab().type("IBMUSER") .positionCursorToFieldContaining("Password").tab().type("SYS1").enter().waitForKeyboard() // Open banking application .pf1().waitForKeyboard().clear().waitForKeyboard().type("bank").enter().waitForKeyboard(); // Obtain the initial balance BigDecimal userBalance = getBalance("123456789"); // Set the amount be credited and call web service BigDecimal amount = BigDecimal.valueOf(500.50); HashMap<String, Object> parameters = new HashMap<String, Object>(); parameters.put("ACCOUNT_NUMBER", "123456789"); parameters.put("AMOUNT", amount.toString()); // Load sample request with the given parameters String textContent = resources.retrieveSkeletonFileAsString("/resources/skeletons/testSkel.skel", parameters); // Invoke the web request client.setURI(new URI("http://" + this.simBank.getHost() + ":" + this.simBank.getWebnetPort())); client.postText("updateAccount", textContent); // Obtain the final balance BigDecimal newUserBalance = getBalance("123456789"); // Assert that the correct amount has been credited to the account assertThat(newUserBalance).isEqualTo(userBalance.add(amount)); } /** * Navigate through the banking application and extract the balance of a given * account * * @param accountNum - Account Number of the account being queried * @return Balance of the account being queried * @throws TextNotFoundException * @throws FieldNotFoundException * @throws NetworkException * @throws KeyboardLockedException * @throws TimeoutException * @throws DatastreamException * @throws InterruptedException */ private BigDecimal getBalance(String accountNum) throws DatastreamException, TimeoutException, KeyboardLockedException, NetworkException, FieldNotFoundException, TextNotFoundException, TerminalInterruptedException { BigDecimal amount = BigDecimal.ZERO; // Open account menu and enter account number terminal.pf1().waitForKeyboard().positionCursorToFieldContaining("Account Number").tab().type(accountNum) .enter().waitForKeyboard(); // Retrieve balance from screen amount = new BigDecimal(terminal.retrieveFieldTextAfterFieldWithString("Balance").trim()); // Return to bank menu terminal.pf3().waitForKeyboard(); return amount; } }このコードの中では、Webサービス呼び出しの際のSOAPメッセージの組み立てとして、以下のようなSkeltonを用意していて、そこに含まれている変数を置き換えるということをやっています。その辺の仕組みもGalasaフレームワークで提供されているようです。
testSkel.skel<soapenv:Envelope xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/'> <soapenv:Body> <ns1:UPDACCTOperation xmlns:ns1='http://www.UPDACCT.STCUSTN2.Request.com'> <ns1:update_account_record> <ns1:account_key> <ns1:sort_code>00-00-00</ns1:sort_code> <ns1:account_number>++ACCOUNT_NUMBER++</ns1:account_number> </ns1:account_key> <ns1:account_change>++AMOUNT++</ns1:account_change> </ns1:update_account_record></ns1:UPDACCTOperation> </soapenv:Body> </soapenv:Envelope>実行するには、先の例と同様にRun Configurationから dev.galasa.simbank.testsのBasicAccountCreditTestをTestClassに指定して実行します。
テスト結果
18/08/2020 18:40:07.096 DEBUG dev.galasa.boot.Launcher.processCommandLine - Supplied command line arguments: --bootstrap file:///C:/Users/TomohiroTaguchi/.galasa/bootstrap.properties --overrides file:///C:/Users/TOMOHI~1/AppData/Local/Temp/galasa_eclipse_cache_8879301005844695930/galasaoverrides1146231306188016707.properties --localmaven file:/C:/Users/TomohiroTaguchi/.m2/repository/ --remotemaven https://repo.maven.apache.org/maven2/ --obr file:/C:/y/workspace/workspace_eclipse-jee-2020-06-R-galasa/.metadata/.plugins/dev.galasa.eclipse/workspace.obr --obr mvn:dev.galasa/dev.galasa.uber.obr/LATEST/obr --test dev.galasa.simbank.tests/dev.galasa.simbank.tests.BasicAccountCreditTest 18/08/2020 18:40:07.118 DEBUG dev.galasa.boot.Launcher.launch - OBR Repository Files: [file:/C:/y/workspace/workspace_eclipse-jee-2020-06-R-galasa/.metadata/.plugins/dev.galasa.eclipse/workspace.obr, mvn:dev.galasa/dev.galasa.uber.obr/LATEST/obr] 18/08/2020 18:40:07.119 DEBUG dev.galasa.boot.Launcher.launch - Launching Framework... 18/08/2020 18:40:07.119 DEBUG dev.galasa.boot.Launcher.buildFramework - Launching Framework... 18/08/2020 18:40:07.119 DEBUG dev.galasa.boot.felix.FelixFramework.buildFramework - Building Felix Framework... 18/08/2020 18:40:07.292 DEBUG dev.galasa.boot.felix.FelixFramework.buildFramework - Initializing Felix Framework 18/08/2020 18:40:07.412 DEBUG dev.galasa.boot.felix.FelixFramework.buildFramework - Starting Felix Framework 18/08/2020 18:40:07.413 DEBUG dev.galasa.boot.felix.FelixFramework.buildFramework - Felix Framework started 18/08/2020 18:40:07.413 DEBUG dev.galasa.boot.felix.FelixFramework.buildFramework - Installing required OSGi bundles 18/08/2020 18:40:08.778 DEBUG d.g.f.m.r.i.GalasaMavenUrlHandlerService - Attempting to download https://repo.maven.apache.org/maven2/dev/galasa/dev.galasa.uber.obr/maven-metadata.xml 18/08/2020 18:40:10.634 DEBUG d.g.f.m.r.i.GalasaMavenUrlHandlerService - Version 'LATEST' resolved to 0.10.0 18/08/2020 18:40:10.684 DEBUG dev.galasa.boot.felix.FelixFramework.buildFramework - installing Framework bundle 18/08/2020 18:40:11.095 INFO d.g.f.Framework - Framework service activated 18/08/2020 18:40:11.095 INFO d.g.f.Framework - Framework version = 0.10.0 18/08/2020 18:40:11.102 INFO d.g.f.Framework - Framework build = Tue, 4 Aug 2020 22:57:46 +0900 18/08/2020 18:40:11.117 DEBUG dev.galasa.boot.Launcher.launch - Test Bundle: dev.galasa.simbank.tests 18/08/2020 18:40:11.117 DEBUG dev.galasa.boot.Launcher.launch - Test Class: dev.galasa.simbank.tests.BasicAccountCreditTest 18/08/2020 18:40:11.124 DEBUG dev.galasa.boot.felix.FelixFramework.runTest - Invoking runTest() 18/08/2020 18:40:11.125 INFO d.g.f.FrameworkInitialisation - Initialising the Galasa Framework 18/08/2020 18:40:11.127 DEBUG d.g.f.FrameworkInitialisation - Configuration Property Store is file:///C:/Users/TomohiroTaguchi/.galasa/cps.properties 18/08/2020 18:40:11.138 DEBUG d.g.f.FrameworkInitialisation - Selected CPS Service is dev.galasa.framework.internal.cps.FpfConfigurationPropertyStore 18/08/2020 18:40:11.139 DEBUG d.g.f.FrameworkInitialisation - Dynamic Status Store is file:///C:/Users/TomohiroTaguchi/.galasa/dss.properties 18/08/2020 18:40:11.164 INFO d.g.f.FrameworkInitialisation - Allocated Run Name U10 to this run 18/08/2020 18:40:11.166 DEBUG d.g.f.FrameworkInitialisation - Result Archive Stores are [file:///C:/Users/TomohiroTaguchi/.galasa/ras/] 18/08/2020 18:40:11.190 DEBUG d.g.f.FrameworkInitialisation - Credentials Store is file:///C:/Users/TomohiroTaguchi/.galasa/credentials.properties 18/08/2020 18:40:11.197 INFO d.g.f.FrameworkInitialisation - Framework initialised 18/08/2020 18:40:12.662 INFO d.g.f.TestRunner - Run test: dev.galasa.simbank.tests/dev.galasa.simbank.tests.BasicAccountCreditTest 18/08/2020 18:40:13.758 DEBUG d.g.f.TestRunManagers - The following Managers are active:- 18/08/2020 18:40:13.759 DEBUG d.g.f.TestRunManagers - dev.galasa.core.manager.internal.CoreManager 18/08/2020 18:40:13.759 DEBUG d.g.f.TestRunManagers - dev.galasa.simbank.manager.internal.SimBankManagerImpl 18/08/2020 18:40:13.759 DEBUG d.g.f.TestRunManagers - dev.galasa.zos.internal.ZosManagerImpl 18/08/2020 18:40:13.760 DEBUG d.g.f.TestRunManagers - dev.galasa.ipnetwork.internal.IpNetworkManagerImpl 18/08/2020 18:40:13.760 DEBUG d.g.f.TestRunManagers - dev.galasa.zos3270.internal.Zos3270ManagerImpl 18/08/2020 18:40:13.760 DEBUG d.g.f.TestRunManagers - dev.galasa.http.internal.HttpManagerImpl 18/08/2020 18:40:13.760 DEBUG d.g.f.TestRunManagers - dev.galasa.artifact.internal.ArtifactManagerImpl 18/08/2020 18:40:13.761 DEBUG d.g.f.TestRunManagers - The following Managers are sorted in provisioning order:- 18/08/2020 18:40:13.761 DEBUG d.g.f.TestRunManagers - dev.galasa.core.manager.internal.CoreManager 18/08/2020 18:40:13.761 DEBUG d.g.f.TestRunManagers - dev.galasa.zos.internal.ZosManagerImpl 18/08/2020 18:40:13.761 DEBUG d.g.f.TestRunManagers - dev.galasa.zos3270.internal.Zos3270ManagerImpl 18/08/2020 18:40:13.762 DEBUG d.g.f.TestRunManagers - dev.galasa.ipnetwork.internal.IpNetworkManagerImpl 18/08/2020 18:40:13.762 DEBUG d.g.f.TestRunManagers - dev.galasa.http.internal.HttpManagerImpl 18/08/2020 18:40:13.762 DEBUG d.g.f.TestRunManagers - dev.galasa.simbank.manager.internal.SimBankManagerImpl 18/08/2020 18:40:13.762 DEBUG d.g.f.TestRunManagers - dev.galasa.artifact.internal.ArtifactManagerImpl 18/08/2020 18:40:13.949 INFO d.g.f.TestRunner - Starting Provision Generate phase 18/08/2020 18:40:13.952 INFO d.g.z.i.ZosManagerImpl - zOS DSE Image SIMBANK selected for zosTag 'SIMBANK' 18/08/2020 18:40:14.042 INFO d.g.z.i.Zos3270ManagerImpl - Generated a terminal for zOS Image tagged SIMBANK 18/08/2020 18:40:14.091 INFO d.g.f.i.c.FrameworkConfidentialTextService - Confidential text registered as '*1**', with comment IBMUSER password 18/08/2020 18:40:14.185 INFO d.g.s.m.i.SimBankManagerImpl - SimBank instance SIMBANK provisioned for this run 18/08/2020 18:40:14.190 INFO d.g.f.TestRunner - Starting Provision Build phase 18/08/2020 18:40:14.191 INFO d.g.f.TestRunner - Starting Provision Start phase 18/08/2020 18:40:14.192 INFO d.g.z.i.Zos3270ManagerImpl - Connecting zOS3270 Terminals 18/08/2020 18:40:14.479 DEBUG d.g.z.s.Zos3270TerminalImpl - RECEIVED update to 3270 terminal term1, updateId=term1-1 =| TERM0001 SIMPLATFORM LOGON SCREEN 18:40:14| =| -------------------------------------------------------------------------------| =| | =| | =| *******\ ******\ ****\ ****\ | =| *********\ ******\ *****\ *****\ | =| **\\\\\**\ \**\\\ **\ **\ **\\**\ | =| **\ **\ **\ **\**\\ **\ | =| *********\ **\ **\ ***\\ **\ | =| *********\ **\ **\ *\\ **\ | =| \\\\\\**\ **\ **\ \ **\ | =| **\ **\ **\ **\ | =| *********\ ******\ **\ **\ | =| *******\\ ******\ **\ **\ | =| \\\\\\\ \\\\\\ \\ \\ | =| | =| | =| P L A T F O R M | =| | =| | =| -------------------------------------------------------------------------------| =| Userid ===> Password ===> | ^| ^ =| | =| | 18/08/2020 18:40:14.479 DEBUG d.g.s.m.i.SimBankTerminalImpl - RECEIVED update to 3270 terminal simbank-ctrl, updateId=simbank-ctrl-1 =| TERM0001 SIMPLATFORM LOGON SCREEN 18:40:14| =| -------------------------------------------------------------------------------| =| | =| | =| *******\ ******\ ****\ ****\ | =| *********\ ******\ *****\ *****\ | =| **\\\\\**\ \**\\\ **\ **\ **\\**\ | =| **\ **\ **\ **\**\\ **\ | =| *********\ **\ **\ ***\\ **\ | =| *********\ **\ **\ *\\ **\ | =| \\\\\\**\ **\ **\ \ **\ | =| **\ **\ **\ **\ | =| *********\ ******\ **\ **\ | =| *******\\ ******\ **\ **\ | =| \\\\\\\ \\\\\\ \\ \\ | =| | =| | =| P L A T F O R M | =| | =| | =| -------------------------------------------------------------------------------| =| Userid ===> Password ===> | ^| ^ =| | =| | 18/08/2020 18:40:14.494 DEBUG d.g.s.m.i.SimBankTerminalImpl - SENDING, ENTER to 3270 terminal simbank-ctrl, updateId=simbank-ctrl-2 =| TERM0001 SIMPLATFORM LOGON SCREEN 18:40:14| =| -------------------------------------------------------------------------------| =| | =| | =| *******\ ******\ ****\ ****\ | =| *********\ ******\ *****\ *****\ | =| **\\\\\**\ \**\\\ **\ **\ **\\**\ | =| **\ **\ **\ **\**\\ **\ | =| *********\ **\ **\ ***\\ **\ | =| *********\ **\ **\ *\\ **\ | =| \\\\\\**\ **\ **\ \ **\ | =| **\ **\ **\ **\ | =| *********\ ******\ **\ **\ | =| *******\\ ******\ **\ **\ | =| \\\\\\\ \\\\\\ \\ \\ | =| | =| | =| P L A T F O R M | =| | =| | =| -------------------------------------------------------------------------------| =| Userid ===> IBMUSER Password ===> *1** | ^| ^ =| | =| | 18/08/2020 18:40:14.539 DEBUG d.g.s.m.i.SimBankTerminalImpl - RECEIVED update to 3270 terminal simbank-ctrl, updateId=simbank-ctrl-3 =| TERM0001 SIMPLATFORM MAIN MENU 18:40:14| =| -------------------------------------------------------------------------------| =| | =| Application PKey Status | =| ----------- ---- ------------------------------------------------- | =| | =| BANKTEST PF1 UP | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| -------------------------------------------------------------------------------| =| Application ===> | ^| ^ =| | =| | 18/08/2020 18:40:14.549 DEBUG d.g.s.m.i.SimBankTerminalImpl - SENDING, ENTER to 3270 terminal simbank-ctrl, updateId=simbank-ctrl-4 =| TERM0001 SIMPLATFORM MAIN MENU 18:40:14| =| -------------------------------------------------------------------------------| =| | =| Application PKey Status | =| ----------- ---- ------------------------------------------------- | =| | =| BANKTEST PF1 UP | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| -------------------------------------------------------------------------------| =| Application ===> BANKTEST | ^| ^ =| | =| | 18/08/2020 18:40:14.568 DEBUG d.g.s.m.i.SimBankTerminalImpl - RECEIVED update to 3270 terminal simbank-ctrl, updateId=simbank-ctrl-5 =| DFHZC2312 *** WELCOME TO CICS *** 18:40:14 | ^|^ =| | =| | =| | =| | =| | =| ******\ ******\ ******\ ******\(R) | =| ********\ ******\ ********\ ********\ | =| **\\\\**\ **\\\ **\\\\**\ **\\\\**\ | =| **\ \\ **\ **\ \\ **\ \\ | =| **\ **\ **\ *******\ | =| **\ **\ **\ *******\ | =| **\ **\ **\ \\\\**\ | =| **\ **\ **\ **\ **\ **\ **\ | =| ********\ ******\ ********\ ********\ | =| ******\\ ******\ ******\\ ******\\ | =| \\\\\\ \\\\\\ \\\\\\ \\\\\\ | =| | =| | =| | =| | =| | =| | =| | 18/08/2020 18:40:14.580 DEBUG d.g.s.m.i.SimBankTerminalImpl - SENDING, CLEAR to 3270 terminal simbank-ctrl, updateId=simbank-ctrl-6 =| | ^|^ =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | 18/08/2020 18:40:14.707 DEBUG d.g.s.m.i.SimBankTerminalImpl - RECEIVED update to 3270 terminal simbank-ctrl, updateId=simbank-ctrl-7 =| | ^|^ =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | 18/08/2020 18:40:14.716 DEBUG d.g.s.m.i.SimBankTerminalImpl - SENDING, ENTER to 3270 terminal simbank-ctrl, updateId=simbank-ctrl-8 =|bank | ^| ^ =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | 18/08/2020 18:40:14.731 DEBUG d.g.s.m.i.SimBankTerminalImpl - RECEIVED update to 3270 terminal simbank-ctrl, updateId=simbank-ctrl-9 =| CONNECTED SIMBANK MAIN MENU 18:40:14| =| -------------------------------------------------------------------------------| =| ===> | ^| ^ =| | =| Options Description PFKey | =| ------- --------------------------------------------------------------- | =| BROWSE Browse Accounts PF1 | =| TRANSF Transfer Money PF4 | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | 18/08/2020 18:40:14.732 INFO d.g.s.m.i.SimBankImpl - Connected to SimBank Terminal 18/08/2020 18:40:14.734 INFO d.g.f.TestRunner - Running the test class 18/08/2020 18:40:14.734 INFO d.g.f.TestClassWrapper - Starting ----------------------- **************************************************************************************************** ----------------------- *** Start of test class dev.galasa.simbank.tests.BasicAccountCreditTest ----------------------- **************************************************************************************************** 18/08/2020 18:40:14.734 INFO d.g.f.GenericMethodWrapper - Starting ----------------------- **************************************************************************************************** ----------------------- *** Start of test method dev.galasa.simbank.tests.BasicAccountCreditTest#updateAccountWebServiceTest,type=Test ----------------------- **************************************************************************************************** 18/08/2020 18:40:14.735 INFO d.g.f.i.c.FrameworkConfidentialTextService - Confidential text registered as '*2**', with comment IBMUSER password 18/08/2020 18:40:14.747 DEBUG d.g.z.s.Zos3270TerminalImpl - SENDING, ENTER to 3270 terminal term1, updateId=term1-2 =| TERM0001 SIMPLATFORM LOGON SCREEN 18:40:14| =| -------------------------------------------------------------------------------| =| | =| | =| *******\ ******\ ****\ ****\ | =| *********\ ******\ *****\ *****\ | =| **\\\\\**\ \**\\\ **\ **\ **\\**\ | =| **\ **\ **\ **\**\\ **\ | =| *********\ **\ **\ ***\\ **\ | =| *********\ **\ **\ *\\ **\ | =| \\\\\\**\ **\ **\ \ **\ | =| **\ **\ **\ **\ | =| *********\ ******\ **\ **\ | =| *******\\ ******\ **\ **\ | =| \\\\\\\ \\\\\\ \\ \\ | =| | =| | =| P L A T F O R M | =| | =| | =| -------------------------------------------------------------------------------| =| Userid ===> IBMUSER Password ===> *1** | ^| ^ =| | =| | 18/08/2020 18:40:14.763 DEBUG d.g.z.s.Zos3270TerminalImpl - RECEIVED update to 3270 terminal term1, updateId=term1-3 =| TERM0001 SIMPLATFORM MAIN MENU 18:40:14| =| -------------------------------------------------------------------------------| =| | =| Application PKey Status | =| ----------- ---- ------------------------------------------------- | =| | =| BANKTEST PF1 UP | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| -------------------------------------------------------------------------------| =| Application ===> | ^| ^ =| | =| | 18/08/2020 18:40:14.775 DEBUG d.g.z.s.Zos3270TerminalImpl - SENDING, PF1 to 3270 terminal term1, updateId=term1-4 =| TERM0001 SIMPLATFORM MAIN MENU 18:40:14| =| -------------------------------------------------------------------------------| =| | =| Application PKey Status | =| ----------- ---- ------------------------------------------------- | =| | =| BANKTEST PF1 UP | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| -------------------------------------------------------------------------------| =| Application ===> | ^| ^ =| | =| | 18/08/2020 18:40:14.792 DEBUG d.g.z.s.Zos3270TerminalImpl - RECEIVED update to 3270 terminal term1, updateId=term1-5 =| DFHZC2312 *** WELCOME TO CICS *** 18:40:14 | ^|^ =| | =| | =| | =| | =| | =| ******\ ******\ ******\ ******\(R) | =| ********\ ******\ ********\ ********\ | =| **\\\\**\ **\\\ **\\\\**\ **\\\\**\ | =| **\ \\ **\ **\ \\ **\ \\ | =| **\ **\ **\ *******\ | =| **\ **\ **\ *******\ | =| **\ **\ **\ \\\\**\ | =| **\ **\ **\ **\ **\ **\ **\ | =| ********\ ******\ ********\ ********\ | =| ******\\ ******\ ******\\ ******\\ | =| \\\\\\ \\\\\\ \\\\\\ \\\\\\ | =| | =| | =| | =| | =| | =| | =| | 18/08/2020 18:40:14.804 DEBUG d.g.z.s.Zos3270TerminalImpl - SENDING, CLEAR to 3270 terminal term1, updateId=term1-6 =| | ^|^ =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | 18/08/2020 18:40:14.948 DEBUG d.g.z.s.Zos3270TerminalImpl - RECEIVED update to 3270 terminal term1, updateId=term1-7 =| | ^|^ =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | 18/08/2020 18:40:14.957 DEBUG d.g.z.s.Zos3270TerminalImpl - SENDING, ENTER to 3270 terminal term1, updateId=term1-8 =|bank | ^| ^ =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | 18/08/2020 18:40:14.973 DEBUG d.g.z.s.Zos3270TerminalImpl - RECEIVED update to 3270 terminal term1, updateId=term1-9 =| CONNECTED SIMBANK MAIN MENU 18:40:14| =| -------------------------------------------------------------------------------| =| ===> | ^| ^ =| | =| Options Description PFKey | =| ------- --------------------------------------------------------------- | =| BROWSE Browse Accounts PF1 | =| TRANSF Transfer Money PF4 | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | 18/08/2020 18:40:14.992 DEBUG d.g.z.s.Zos3270TerminalImpl - SENDING, PF1 to 3270 terminal term1, updateId=term1-10 =| CONNECTED SIMBANK MAIN MENU 18:40:14| =| -------------------------------------------------------------------------------| =| ===> | ^| ^ =| | =| Options Description PFKey | =| ------- --------------------------------------------------------------- | =| BROWSE Browse Accounts PF1 | =| TRANSF Transfer Money PF4 | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | 18/08/2020 18:40:15.008 DEBUG d.g.z.s.Zos3270TerminalImpl - RECEIVED update to 3270 terminal term1, updateId=term1-11 =| CONNECTED SIMBANK ACCOUNT MENU 18:40:14| =| -------------------------------------------------------------------------------| =| ===> | =| | =| Account Number _________ | ^| ^ =| Sort Code | =| Balance | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | 18/08/2020 18:40:15.019 DEBUG d.g.z.s.Zos3270TerminalImpl - SENDING, ENTER to 3270 terminal term1, updateId=term1-12 =| CONNECTED SIMBANK ACCOUNT MENU 18:40:14| =| -------------------------------------------------------------------------------| =| ===> | =| | =| Account Number 123456789 | =| Sort Code | ^| ^ =| Balance | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | 18/08/2020 18:40:15.037 DEBUG d.g.z.s.Zos3270TerminalImpl - RECEIVED update to 3270 terminal term1, updateId=term1-13 =| CONNECTED SIMBANK ACCOUNT MENU 18:40:15| =| -------------------------------------------------------------------------------| =| ===> | =| | =| Account Number 123456789 | ^| ^ =| Sort Code 11-01-45 | =| Balance 5562.42 | =| | =| Account Found | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | 18/08/2020 18:40:15.048 DEBUG d.g.z.s.Zos3270TerminalImpl - SENDING, PF3 to 3270 terminal term1, updateId=term1-14 =| CONNECTED SIMBANK ACCOUNT MENU 18:40:15| =| -------------------------------------------------------------------------------| =| ===> | =| | =| Account Number 123456789 | ^| ^ =| Sort Code 11-01-45 | =| Balance 5562.42 | =| | =| Account Found | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | 18/08/2020 18:40:15.194 DEBUG d.g.z.s.Zos3270TerminalImpl - RECEIVED update to 3270 terminal term1, updateId=term1-15 =| CONNECTED SIMBANK MAIN MENU 18:40:15| =| -------------------------------------------------------------------------------| =| ===> | ^| ^ =| | =| Options Description PFKey | =| ------- --------------------------------------------------------------- | =| BROWSE Browse Accounts PF1 | =| TRANSF Transfer Money PF4 | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | 18/08/2020 18:40:15.195 DEBUG d.g.a.i.BundleResourcesImpl - Searching for artifact: resources/skeletons/testSkel.skel in bundle dev.galasa.simbank.tests 18/08/2020 18:40:15.474 DEBUG d.g.z.s.Zos3270TerminalImpl - SENDING, PF1 to 3270 terminal term1, updateId=term1-16 =| CONNECTED SIMBANK MAIN MENU 18:40:15| =| -------------------------------------------------------------------------------| =| ===> | ^| ^ =| | =| Options Description PFKey | =| ------- --------------------------------------------------------------- | =| BROWSE Browse Accounts PF1 | =| TRANSF Transfer Money PF4 | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | 18/08/2020 18:40:15.491 DEBUG d.g.z.s.Zos3270TerminalImpl - RECEIVED update to 3270 terminal term1, updateId=term1-17 =| CONNECTED SIMBANK ACCOUNT MENU 18:40:15| =| -------------------------------------------------------------------------------| =| ===> | =| | =| Account Number _________ | ^| ^ =| Sort Code | =| Balance | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | 18/08/2020 18:40:15.501 DEBUG d.g.z.s.Zos3270TerminalImpl - SENDING, ENTER to 3270 terminal term1, updateId=term1-18 =| CONNECTED SIMBANK ACCOUNT MENU 18:40:15| =| -------------------------------------------------------------------------------| =| ===> | =| | =| Account Number 123456789 | =| Sort Code | ^| ^ =| Balance | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | 18/08/2020 18:40:15.515 DEBUG d.g.z.s.Zos3270TerminalImpl - RECEIVED update to 3270 terminal term1, updateId=term1-19 =| CONNECTED SIMBANK ACCOUNT MENU 18:40:15| =| -------------------------------------------------------------------------------| =| ===> | =| | =| Account Number 123456789 | ^| ^ =| Sort Code 11-01-45 | =| Balance 6062.92 | =| | =| Account Found | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | 18/08/2020 18:40:15.535 DEBUG d.g.z.s.Zos3270TerminalImpl - SENDING, PF3 to 3270 terminal term1, updateId=term1-20 =| CONNECTED SIMBANK ACCOUNT MENU 18:40:15| =| -------------------------------------------------------------------------------| =| ===> | =| | =| Account Number 123456789 | ^| ^ =| Sort Code 11-01-45 | =| Balance 6062.92 | =| | =| Account Found | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | 18/08/2020 18:40:15.555 DEBUG d.g.z.s.Zos3270TerminalImpl - RECEIVED update to 3270 terminal term1, updateId=term1-21 =| CONNECTED SIMBANK MAIN MENU 18:40:15| =| -------------------------------------------------------------------------------| =| ===> | ^| ^ =| | =| Options Description PFKey | =| ------- --------------------------------------------------------------- | =| BROWSE Browse Accounts PF1 | =| TRANSF Transfer Money PF4 | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | =| | 18/08/2020 18:40:15.587 INFO d.g.f.GenericMethodWrapper - Ending ----------------------- **************************************************************************************************** ----------------------- *** Passed - Test method dev.galasa.simbank.tests.BasicAccountCreditTest#updateAccountWebServiceTest,type=Test ----------------------- **************************************************************************************************** 18/08/2020 18:40:15.588 INFO d.g.f.TestClassWrapper - Ending ----------------------- **************************************************************************************************** ----------------------- *** Passed - Test class dev.galasa.simbank.tests.BasicAccountCreditTest ----------------------- **************************************************************************************************** 18/08/2020 18:40:15.591 INFO d.g.f.TestRunner - Starting Provision Stop phase 18/08/2020 18:40:15.595 INFO d.g.f.TestRunner - Starting Provision Discard phase 18/08/2020 18:40:15.688 DEBUG dev.galasa.boot.felix.FelixFramework.stopFramework - Stopping Felix framework 18/08/2020 18:40:15.711 INFO d.g.f.Framework - Framework service deactivated 18/08/2020 18:40:15.725 DEBUG dev.galasa.boot.felix.FelixFramework.stopFramework - Felix framework stopped 18/08/2020 18:40:15.725 INFO dev.galasa.boot.Launcher.launch - Boot completeテスト失敗ケース
テストコードの最後のAssert部分を以下のように変更して、意図的にテスト失敗ケースを作ってみます。
BasicAccountCreditTest.java(抜粋)// Assert that the correct amount has been credited to the account //assertThat(newUserBalance).isEqualTo(userBalance.add(amount)); assertThat(newUserBalance).isEqualTo(userBalance);これを実行してみると、Consoleは以下のような出力結果となりました。
... 18/08/2020 18:45:00.737 INFO d.g.f.GenericMethodWrapper - Ending ----------------------- **************************************************************************************************** ----------------------- *** Failed - Test method dev.galasa.simbank.tests.BasicAccountCreditTest#updateAccountWebServiceTest,type=Test ----------------------- **************************************************************************************************** java.lang.AssertionError: Expecting: <6563.42> to be equal to: <6062.92> but was not. at dev.galasa.simbank.tests.BasicAccountCreditTest.updateAccountWebServiceTest(BasicAccountCreditTest.java:115) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at dev.galasa.framework.GenericMethodWrapper.invoke(GenericMethodWrapper.java:82) at dev.galasa.framework.TestMethodWrapper.invoke(TestMethodWrapper.java:56) at dev.galasa.framework.TestClassWrapper.runTestMethods(TestClassWrapper.java:182) at dev.galasa.framework.TestRunner.runTestClassWrapper(TestRunner.java:510) at dev.galasa.framework.TestRunner.runEnvironment(TestRunner.java:482) at dev.galasa.framework.TestRunner.createEnvironment(TestRunner.java:442) at dev.galasa.framework.TestRunner.generateEnvironment(TestRunner.java:415) at dev.galasa.framework.TestRunner.runTest(TestRunner.java:337) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at dev.galasa.boot.felix.FelixFramework.runTest(FelixFramework.java:220) at dev.galasa.boot.Launcher.launch(Launcher.java:152) at dev.galasa.boot.Launcher.main(Launcher.java:106) 18/08/2020 18:45:00.737 INFO d.g.f.TestClassWrapper - Ending ----------------------- **************************************************************************************************** ----------------------- *** Failed - Test class dev.galasa.simbank.tests.BasicAccountCreditTest ----------------------- **************************************************************************************************** 18/08/2020 18:45:00.739 INFO d.g.f.TestRunner - Starting Provision Stop phase 18/08/2020 18:45:00.741 INFO d.g.f.TestRunner - Starting Provision Discard phase 18/08/2020 18:45:01.144 DEBUG dev.galasa.boot.felix.FelixFramework.stopFramework - Stopping Felix framework 18/08/2020 18:45:01.161 INFO d.g.f.Framework - Framework service deactivated 18/08/2020 18:45:01.170 DEBUG dev.galasa.boot.felix.FelixFramework.stopFramework - Felix framework stopped 18/08/2020 18:45:01.170 INFO dev.galasa.boot.Launcher.launch - Boot completeテスト結果の管理
Galasa Resultというビューを表示させると、過去のテスト結果が確認できます。
(ビューを表示させた時に、"Framework not initialised"というメッセージが出力される場合は、EclipseのメニューからGalasa - Initialise Galasa Frameworkを選択してInitialiseしてみてください)
テストケースをダブルクリックすると、詳細が表示されます。ログも残っているのであとからテストの詳細を確認することも可能です。
おわりに
上で実行した2つの例では、3270端末エミュレーターでの操作、Webサービス呼び出しのテストコードをJavaで記述してテストできることが確認できました。その他にもサンプルで提供されているBatchAccoutsOpenTest.javaでは、バッチプログラムを実行用のJCLをテストするコードが含まれています。
これらのアプリケーション呼び出しに必要な各種機能は、"Manager"と呼ばれる機能で実装されているようです。Manager機能の一覧は以下に記載があります。
参考: Managers
CICS関連だとCECIトランザクション(CICS端末から実行するEXEC CICS APIのインタープリター)を実行するためのManagerが提供されており、CECI経由でEXEC CICS LINKを発行してサブプログラム単位でのテストコードを書けるようです。素晴らしい!!!
この一覧をみると、"Deep integration testing for z/OS powered hybrid cloud applications"とうたっているだけにz/OS関連だけでなくDocker,Kubernetes,Linuxなど多岐に亘ったManager機能が挙げられています。2020年8月時点ではまだリリースされているものは少なく、Beta版、Alpha版のコードばかりの状態ですが、これからの拡張に期待したいところです。
また、今後はこのフレームワークは既存の開発支援ツール(IBM Developer for z/OSなど)にも組み込まれていくんじゃないかなーという期待も膨らみますね。
- 投稿日:2020-08-18T18:08:43+09:00
JavaからSalesforceRESTAPIを叩く
はじめに
本記事はJavaからSalesforceのRESTAPIを叩くソースコードの備忘録です。
プロパティファイルなど省略している部分も多いので、このまま書いても動くわけではありません。とりあえず以下3点がわかれば良いと思っています。
1. JSON形式でリクエストを送信/受信する書き方
2. JSON形式でレスポンスを送信/受信する書き方
3. 配列型のJSONの作成方法リクエスト・レスポンスの形式
リクエスト
JSON{ "request" : [ [ "id" : "000", "name" : "sample0" ] [ "id" : "001", "name" : "sample1" ] ] }レスポンス
JSON{ "results" : [ [ "id" : "000", "name" : "sample0", "status" : "200" ] [ "id" : "001", "name" : "sample1", "status" : "200" ] ] }サンプルコード
Java側
ConnectApiLogic.javapublic class ConnectApiLogic { private static final String LOGIN_URL = PropertyUtil.getProperty("SF_LOGIN_URL"); private static final String GRANT_TYPE = PropertyUtil.getProperty("SF_GRANT_TYPE"); private static final String CLIENT_ID = PropertyUtil.getProperty("SF_CLIENT_ID"); private static final String CLIENT_SECRET = PropertyUtil.getProperty("SF_CLIENT_SECRET"); private static final String USERNAME = PropertyUtil.getProperty("SF_USERNAME"); private static final String PASSWORD_AND_SECURITY_TOKEN = PropertyUtil.getProperty("SF_PASSWORD_AND_SECURITY_TOKEN"); private static String url = PropertyUtil.getProperty("SF_RESTPASS") + PropertyUtil.getProperty("SF_UPDATE_USERMST"); RestTemplate restTemplate = new RestTemplate(); /** リストを与えてリクエスト結果を取得するメソッド */ public ResponseDTO getResults(List<RequestChildDTO> requestList) { // 認証トークン取得 ResponseEntity<ApiTokenResponseDto> apiTokenResponse = doPostAccess(CLIENT_ID, CLIENT_SECRET); String authToken = apiTokenResponse.getBody().getAccessToken(); if (authToken.isBlank()) { System.exit(1); } RequestParentDTO requestDTO = new RequestUserMstDTO(); requestDTO.request = requestList; // ヘッダ作成 MultiValueMap<String, String> headers = new LinkedMultiValueMap<String, String>(); headers.add("Authorization","Bearer "+authToken); headers.add("Content-Type", "application/json"); restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter()); HttpEntity<RequestParentDTO> request = new HttpEntity<RequestParentDTO>(requestDTO, headers); return restTemplate.postForObject(url, request, ResponseParentDTO.class); } /** アクセストークン取得メソッド */ private ResponseEntity<ApiTokenResponseDto> doPostAccess(String cliendId, String clientSecret) { MultiValueMap<String, String> request = new LinkedMultiValueMap<String, String>(); request.add("grant_type", GRANT_TYPE); request.add("client_id", cliendId); request.add("client_secret", clientSecret); request.add("username", USERNAME); request.add("password", PASSWORD_AND_SECURITY_TOKEN); RequestEntity requestEntity = null; ResponseEntity<ApiTokenResponseDto> response = null; try { requestEntity = RequestEntity.post(new URI(LOGIN_URL)).contentType(MediaType.APPLICATION_FORM_URLENCODED).body(request); response = restTemplate.exchange(requestEntity, ApiTokenResponseDto.class); } catch (URISyntaxException e) { e.printStackTrace(); return response; } catch (HttpClientErrorException e) { e.printStackTrace(); return response; } return response; } }RequestParentDTO.javapublic class RequestParentDTO { public List<RequestChildDTO> request; public RequestUserMstDTO(){ request = new ArrayList<>(); } }RequestChildDTO.javapublic class RequestChildDTO { public String id; public String name; }ResponseParentDTO.java@JsonInclude(JsonInclude.Include.NON_NULL) @JsonPropertyOrder({ "results" }) public class ResponseParentDTO { @JsonProperty("results") public List<ResponseChild> results = null; public ResponseDTO(){} }ResponseChild.java@JsonInclude(JsonInclude.Include.NON_NULL) @JsonPropertyOrder({ "id", "name", "status", }) public class ResponseChild { @JsonProperty("id") public String id; @JsonProperty("name") public String name; @JsonProperty("status") public String status; public Result(){} }Salesforce側
PostApi.cls@RestResource(urlMapping='/sample/*') global without sharing class PostApi { @HttpPost global static DT_ResponseParentDto doPost() { // パラメータ取得 RestRequest req = RestContext.request; List<InnerRequest> innnerRequestList = setRequest(req); // レスポンスを返却 return setResponse(innnerRequestList); } /** リクエストパラメータ取得メソッド */ private static List<InnerRequest> setRequest(RestRequest req) { Map<String, Object> requestParams = (Map<String, Object>) JSON.deserializeUntyped(req.requestBody.ToString()); List<Object> requestList = (List<Object>) requestParams.get('request'); List<InnerRequest> innerRequestList = new List<InnerRequest>(); for (Object obj : requestList) { Map<String, Object> params = (Map<String, Object>) obj; InnerRequest inner = new InnerRequest(); inner.id = (String) params.get('id'); inner.name = (String) params.get('name'); innerRequestList.add(inner); } return innerRequestList; } /** レスポンス作成メソッド */ private static DT_ResponseParentDto setResponse(List<InnerRequest> innnerRequestList) { DT_ResponseParentDto response = new DT_ResponseParentDto(); // 成功リストにステータスコードをセット if (innnerRequestList.size() > 0) { for (InnerRequest inner : innnerRequestList) { DT_ResponseChildDto child = new DT_ResponseChildDto(); child.id = inner.id; child.name = inner.name; child.status = "200"; response.results.add(child); } } return response; } /** リクエスト保管用内部クラス */ public class InnerRequest { public String id; public String name; } }DT_ResponseParentDto.clspublic class DT_ResponseParentDto{ public List<DT_ResponseChildDto> results; public DT_ResponseParentDto() { results = new List<DT_ResponseChildDto>(); } }DT_ResponseChildDto.clspublic class DT_ResponseChildDto{ public String id; public String name; public String status; }
- 投稿日:2020-08-18T16:31:04+09:00
Spring Boot + GradleでWebサイトを作ってみる(jdk1.8.x)
これは何?
JavaでWebサイトを作るのってどうやるの?という、最初の一歩で、成果物はHTMLページが1枚表示されるのみです。Webサーバを動作させブラウザに表示させることを目標とした記事です。
動作したら、修正を加えながら覚えていくと良いと思います。動作確認したシステム要件
2020年8月に以下の要件で動作確認を行っています。
- macOS 10.14.6
- Homebrew 2.4.12
- Gradle 6.6
- jdk1.8.x
- git
ここで利用するサンプルコードは GitHubにあります。
1. 手順:まずは動かしてみる
1.1. Projectのディレクトリを作成して移動する
Terminal$ mkdir -p helloworld; cd $_1.2. Gradle Projectを初期化する
Terminal$ gradle init
ここから対話形式で進むので以下のように選択する。
- Select type of project to generate >> 2: application
- Select implementation language >> 3: Java
- Select build script DSL >> 1: Groovy
- Select test framework >> 1: JUnit 4
- Project name (default: helloworld) >> helloworld
- Source package (default: ) >> helloworld
以上でGradle Projectの初期化が完了しました。
1.3. サンプルコードをCloneする
Terminal$ git clone https://github.com/ryoyakawai/java_gradle_springboot_helloworld.git
1.4. Webサーバを起動してみる
Terminal$ cd java_gradle_springboot_helloworld $ gradle bootRunエラーなく起動するとTerminalに以下が表示されるはずです。
Terminal> Task :bootRun . ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v2.2.0.RELEASE) 2020-08-18 15:47:55.672 INFO 64412 --- [ main] c.e.helloworld.HelloworldApplication : Starting HelloworldApplication on S1031198.local with PID 64412 (/..../java_gradle_springboot_helloworld/build/classes/java/main started by ryoya.kawai in /..../java_gradle_springboot_helloworld) 2020-08-18 15:47:55.674 INFO 64412 --- [ main] c.e.helloworld.HelloworldApplication : No active profile set, falling back to default profiles: default 2020-08-18 15:47:56.180 INFO 64412 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http) 2020-08-18 15:47:56.187 INFO 64412 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat] 2020-08-18 15:47:56.187 INFO 64412 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.27] 2020-08-18 15:47:56.228 INFO 64412 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext 2020-08-18 15:47:56.229 INFO 64412 --- [ main] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 527 ms 2020-08-18 15:47:56.323 INFO 64412 --- [ main] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' 2020-08-18 15:47:56.422 INFO 64412 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path '' 2020-08-18 15:47:56.424 INFO 64412 --- [ main] c.e.helloworld.HelloworldApplication : Started HelloworldApplication in 1.139 seconds (JVM running for 1.368) <=========----> 75% EXECUTING [10s] > :bootRunここでブラウザから動作の確認をします。
ブラウザで
http://localhost:8080
にアクセスすると以下が表示されればWebサーバとして正常動作しているということになります。
2. 内容の説明
2.1 ファイルについて
「1.3. サンプルコードをCloneする」でCloneした直後のファイル構成です。下図のファイル、ディレクトリの右側に説明が書いてある部分に「1.2. Gradle Projectを初期化する」実施後に手をいれました。
├── build.gradle (修正必須:Gradleの設定ファイル) ├── settings.gradle └── src ├── main │ ├── java │ │ └── helloworld (以下、修正必須:プログラムコード) │ │ ├── HelloworldApplication.java │ │ ├── HelloworldController.java │ │ ├── HelloworldErrorController.java │ │ └── HelloworldServletInitializer.java │ ├── resources │ │ ├── application.yml (修正必須) │ │ ├── static │ │ │ └── assets (以下は新規作成) │ │ │ └── sample-300x300.jpg │ │ └── templates │ │ ├── error.html (修正必須:HTML) │ │ └── helloworld.html (修正必須:HTML) │ └── webapp │ └── WEB-INF │ └── appengine-web.xml └── test └── java └── helloworld └── HelloworldApplicationTests.java (修正必須:テストファイル)2.2. それぞれのファイルの説明
build.gradle
: Buildの設定を書き込みます。必要に応じた修正が適宜必要です。settings.gradle
: エントリーポイントになるプロジェクト名を記述する。
src > main > java > helloworld
以下のファイル
HelloworldApplication.java
: SpringBootのフレームワークを使うことの宣言をしています。HelloworldController.java
: コントローラクラスです。主にどこのPathにアクセスしたら、何を表示するかを記述しています。HelloworldErrorController.java
: アプリケーションのエラーをハンドリングするクラスです。適宜修正が必要です。HelloworldServletInitializer.java
: WAR ファイルをデプロイして動作させる環境で必要な WebApplicationInitializer 実装クラス。(存在させていますがここでの動作では利用しておらず本来は不要です)
src > main > resources
以下のファイルこのディレクトリにHTMLファイルなどを配置します。
application.yml
: メッセージを定義しているYAMLファイルです。templates > error.html
: エラー時に表示するHTMLです。templates > helloworld.html
: 正常背動作時に表示するHTMLです。static > assets
: 画像はここに置くとよいでしょう。References
- Google App Engine (Java 8) + Spring Boot + Gradle で Hello World - Qiita
- かなり参考にさせていただいております。ありがとうございます。
- javaを使ってWebアプリを作るまでに結局なにが必要なのか。仕組みと学習に必要なものをザックリ説明 - Qiita
- フレームワーク(Spring Boot)までの説明です。
- 投稿日:2020-08-18T16:26:02+09:00
51歳(現52)からのプログラミング 備忘 VScodeでjarの追加 java.lang.ClassNotFoundException:com.mysql.cj.jdbc.Drive
VScodeでjavaしてると、たまにハマります。
今回は、DB(mysql)を扱うために、mysqlのjdbcを使いたかったのですが、java.long.ClassNotFoundException: com.mysql.cj.jdbc.Driverっていうエラーが止められなかった。
解決に丸1日(涙VScodeでは、外部jarファイルの導入は
①でjavaファイルを選択し
②のエクスプローラメニュー[ ... ]を選択して
③jdkが java8 なら -> [ java Dependencies ]
jdkが java11 なら -> [ java Project ]
にチェックを入れると
④のように [ JAVA PROJECTS ] か [ JAVA DEPANDENCIES ]
が表示されるので、それらのディレクトリを開いて
[ Referenced Libraries ]を表示させて
⑤の[ + ]をクリック!すると
利用したい外部ファイルを指定させるようにフォルダが開くので
目的のファイルを指定して終了!どうだ!時間かかったぞ!
- 投稿日:2020-08-18T16:26:02+09:00
51歳(現52)からのプログラミング 備忘 VScodeでjarの追加 Class.forName java.lang.ClassNotFoundException:com.mysql.cj.jdbc.Drive
VScodeでjavaしてると、たまにハマります。
今回は、DB(mysql)を扱うために、mysqlのjdbcを使いたかったのですが、java.long.ClassNotFoundException: com.mysql.cj.jdbc.Driverっていうエラーが止められなかった。
解決に丸1日(涙VScodeでは、外部jarファイルの導入は、[java Dependency Viewer]を使うので、VScodeの拡張機能で[Project Manager for java ]をインスツールしときます(jdk8ならインスツールバージョンは0.9.0とか古いのを使ってね)。
では下記備忘です!
①でjavaファイルを選択し
②のエクスプローラメニュー[ ... ]を選択して
③jdk8 なら -> [ java Dependencies ]
jdk11 なら -> [ java Project ]
にチェックを入れると
④のように [ JAVA PROJECTS ](jdk11) か [ JAVA DEPANDENCIES ](jdk8)
が表示されるので、それらのディレクトリを開いて
[ Referenced Libraries ]を表示させて
⑤の[ + ]をクリック!すると
利用したい外部ファイルを指定させるようにフォルダが開くので
目的のファイルを指定して終了!どうだ!時間かかったぞ!
- 投稿日:2020-08-18T14:20:03+09:00
Eclipseを使ったtwitter4Jの環境構築メモ
Twitter APIをJavaで動かしたいと思い、twitter4Jに出会いました。 ここに、環境構築やデバッグ時の操作についてメモを残します。 動作環境 - Windows10 - Java11 - Eclipse IDE - twitter4J 4.0.7 環境構築 何はともあれTwitter APIの登録を。https://developer.twitter.com/en Consumer API keys, Access token & access token secretを取得しておきましょう。 次に、twitter4Jのダウンロード。http://twitter4j.org/ja/index.html#download 適当なディレクトリに解凍しておきましょう。 Eclipseのインストール方法は省きます。 プロジェクト作成 Javaプロジェクトを作成します。ここでは、TestTwitter4Jという名前にしました。 JARの追加 プロジェクト作成後、このプロジェクトからtwitter4Jが見えるようにします。 プロジェクトを右クリック→Javaのビルド・パス→ライブラリーを選択します。 「クラスパス」を選択し、「外部JARの追加」から先ほどダウンロードしたtwitter4J-core-4.0.7.jarを追加します。 twitter4J-core-4.0.7.jarは、インストール先\twitter4j\libにあります。 ほかにもいろいろ.jarファイルが見えますが、coreだけで充分だそうです。(詳しくは公式サイトで) プロパティファイル twitter4j.propertiesにTwitter APIから取得したConsumer API keys, Access token & access token secretをそれぞれ書きます。 ひな形は、twitter4j\binにあるので参考に。 プロパティの設定についてはこちらを参照してください。 プロパティファイルは、プロジェクトフォルダに置いてください。 デバッグ あとは、普段通りデバッグすれば動きます。 twitter4Jのサンプルは、twitter4j-examplesにあるので参考に。 以下のサンプルを動かしてみます。 Twitterトレンドのロケーションを一覧表示するだけです。 Test.java import twitter4j.Location; import twitter4j.ResponseList; import twitter4j.Twitter; import twitter4j.TwitterException; import twitter4j.TwitterFactory; public class Test { public static void main(String[] args) { try { Twitter twitter = new TwitterFactory().getInstance(); ResponseList<Location> locations; locations = twitter.getAvailableTrends(); System.out.println("Showing available trends"); for (Location location : locations) { System.out.println(location.getName() + " (woeid:" + location.getWoeid() + ")"); } System.out.println("done."); System.exit(0); } catch (TwitterException te) { te.printStackTrace(); System.out.println("Failed to get trends: " + te.getMessage()); System.exit(-1); } } } 実行結果 以下のように表示されれば、問題ありません。 最後に こうして書き起こすと結構シンプルですね。 最初はよくわからないエラー吐かれたりして、対処法もわからず悩みました。 次はもっといろんなメソッド使ってみたい。
- 投稿日:2020-08-18T12:53:43+09:00
护网礼盒:哥斯拉Godzilla shell管理工具
护网期间,各大厂商的waf不断,在静态查杀、流量通信等方面对webshell进行拦截,众红队急需一款优秀的权限管理工具,冰蝎3.0的发布可能缓解了流量加密的困境,但是冰蝎3.0的bug众多,很多朋友甚至连不上冰蝎的shell,于是@BeichenDream决定公开他所开发的一款shell权限管理工具,名为“哥斯拉”。
简单使用方法
在哥斯拉安装之前,你需要安装jdk1.8的环境。双击Godzilla.jar打开,此时会在同目录下生成data.db数据库存放数据。首页长这样
点击 管理-添加 生成所需的webshell,哥斯拉支持jsp、php、aspx等多种载荷,java和c#的载荷原生实现AES加密,PHP使用亦或加密。生成时需要记住自己的生成配置用以链接时用。
以java的jsp为例,填写密码和密钥,生成jsp/jspx。本文以tomcat7来演示一些功能。将shell.jsp放入tomcat使用哥斯拉链接。点击目标-添加
选中shell右键选择进入即可进入shell管理界面。
简单使用介绍就到这里。
一些特性
为什么我放着冰蝎、蚁剑还有什么天蝎不用而要用你的哥斯拉?
- 哥斯拉全部类型的shell均过市面所有静态查杀
- 哥斯拉流量加密过市面全部流量waf
- 哥斯拉的自带的插件是冰蝎、蚁剑不能比拟的
静态免杀就不说了,工具放出来之后可能会免杀一段时间就不行了,当然随便改改就能继续过。重点是看流量加密和一些自带的插件。
流量加密
先来看流量加密,仍然以jsp为例,修改链接配置里的代理选项为http代理,让流量代理到Burp中。
执行dir命令的请求包
或许你说headers里的一些ua和Accept太扎眼了,别担心,这些可以自己配置。在shell编辑的请求配置中修改
并且在请求包的thisisleftData和thisisrightData可以修改为其他杂乱数据来进行干扰。到这里还不说一句哥斯拉天下第一?
插件模块
一些基本的模块比如:基本信息、文件管理、命令执行我这里就不再赘述了。
数据库管理
相信大家在使用蚁剑的时候没少碰到过连不上数据库的情况,我自己碰到过一个环境就是shell所在的tomcat container没有jdbc的jar包依赖导致连不上数据库,偏偏蚁剑没什么好办法。而在哥斯拉中就不必担心这个问题,在数据库管理中哥斯拉会先从容器中加载可用的jdbc,如果没有就通过内存加载jar驱动来链接数据库。
内存shell
内存shell模块实现了在tomcat中注册、卸载内存马
你可以直接注册一个哥斯拉的马或者冰蝎、菜刀的马,甚至是regeorg。
直接哥斯拉链接就行了。内存shell 无日志,会在tomcat重启后消失。
屏幕截图
点截图会自动保存预览,在windows上需要shell权限够大。
虚拟终端
这个功能其实是在本地监听端口,通过shell与服务器交互实现cmdshell。点击start之后执行
nc 127.0.0.1 4444
链接本地4444获取cmdshell。如果不使用nc链接的话会一直占用本地4444端口。用完请exit或点击stop。
JMeterpreter
不用说了 看图就会
ServletManage
JarLoader
用其加载jar包,主要用途就是加载jdbc。
JZip
打包全站的好助手。
ByPassOpenBasedir
BypassDisableFunctions
笔记
ShellCodeLoader
直接通过shell来加载shellcode,或者弹meterpreter
SafetyKatz
lemon
BadPotato
提权模块,源于 https://github.com/BeichenDream/BadPotato
SharpWeb
参考 https://github.com/djhohnstein/SharpWeb
SweetPotato
提权模块
其他选项
免责声明
- 程序仅限服务器管理使用,切勿用于非法用途,非法使用造成的一切后果由自己承担,与作者无关。
- 由于用户滥用造成的一切后果与作者无关。
- 使用本程序请自觉遵守当地法律法规,出现一切后果均与作者无关。
- 本程序及代码均不得用于商业用途,仅作学习交流,违者必究。
下载地址
https://github.com/BeichenDream/Godzilla/releases/tag/v1.00-godzilla
- 投稿日:2020-08-18T12:05:36+09:00
Javaメトリクスとは_メモ_20200818
メトリクス
1.メトリクスとは
便利なメトリクスたち
メトリクスとは、モデルを構成するクラスやメソッド、クラス間の関係、パッケージ間の関係などを、
複雑さや結合度、凝集度などの観点から測定し、数値として表すものです。ソフトウェア開発で用いられるメトリクスには、マイナーなものも含めると非常にたくさんの種類があります。
ただし、あまり高度なメトリクスを勉強しても実践の場でうまく使いこなすことは難しいです。
ですので本資料では便利な3つの指標、「LOC」「CC」「WMC」だけに絞って学習します。
たくさん覚えても使う機会がないと忘れてしまいますしね。メトリクス利用のメリットデメリット
<メリット>
コードの規模や複雑さ、凝集度(互いに関連する要素のコード内での散らばり具合)、
結合度(クラスやパッケージの独立性の高さ)などを専用のツールを使って計測し、
一定の目標を定めて改善していくことができる。
<デメリット>
たくさん存在するので覚えるのに時間がかかる
2.LOC
規模を大まかに把握できる LOC
LOC(Line of Code)は、その名の通りプログラムの行数を表します。
たとえば、中身が200行のプログラムの場合、LOCは200です。
ただし、空行やカッコだけの行など、プログラムの本質とは関係のない行をカウントしないなど、
いくつかの数え方があります。また、行数が多い場合は1000行単位で数えるKLOCを使うこともあります。
(80000行のプログラムは80KLOC)※今回資料では覚える必要はありません。LOCの特徴
コードの書き方や数え方によって容易に増減するメトリクスであるため厳密な運用には向きません。
あくまで規模を大まかなとらえるための道具と割りきって使いましょう。3.CC
メソッドの複雑さを示すCC
CC(Cyclomatic Complexity)はトーマス・マッケーブという人が開発したメトリクスで、
「マッケーブの循環的複雑度」とも言います。
CCはある特定のメソッドの中身がどれだけ複雑なのかを表す1以上の数値であり、
大きいほど複雑であることを示しています。具体的には、ifによる分岐やforによるループが多く使われるほど高い数値を示します。
あまりにも複雑なメソッドは、読みづらく、バグになりやすく、後々の修正も大変です。
開発中の各メソッドについて、CCが一定以上に抑えられているかチェックし、
あまりにCCが大きいものは修正したほうが良いこともあります。CCの特徴
高ければ高いほどバグが混入する確率も上がるので、修正をする際に使うこともあると
考えられます。4.WMC
クラス複雑度を示すWMC
WMC(Weighted Method Per Class)は、あるクラスに含まれる全メソッドのCCを合計した値であり、
クラスの複雑度を表します。
WMCが異常に大きい値を示しているクラスは、複数に分割できるかを考えたほうがよさそうです。WMCが大きい時の対応
・メソッドの機能を分割する
・構造を簡単にできるか検討する
WMCの特徴
CCを合計した値になるので、大きければ大きいほど自分が開発しているものが
複雑になりすぎているか、読みにくいかなどがわかる。※どうでもいい方は読み飛ばしてください
<筆者の所感>実際に開発現場で自分が製造を任された際にメトリクスも気を付けて製造しようと思った。
- 投稿日:2020-08-18T10:28:08+09:00
Hull Voronoi 3Dで何度もSingular input data errorが出る原因
Hull Voronoi 3Dについて
3DのVoronoi図を計算するプログラムで、原作はC#で記述されています。私が作ったProcessing(Java)バージョンもあります。Convex HullのfindInitialPoints内で頻繁にSingular input data errorが出るので原因を調べてみました。
https://github.com/Scrawk/Hull-Delaunay-Voronoi
https://github.com/Nekodigi/Hull-Voronoi-3D原因
そもそも、Singular input data errorは入力した点が、一致しているときに発生します。findInitialPointsには、各軸の座標が最小値、最大値の点に絞り込んで渡すのですが、複数の軸の最小値、最大値を兼ねている場合、稀に点が不足し、同じ点が選ばれてしまうという事態が起こります。
解決法
点が少ない場合は、Singular input data errorが起こりやすいですが、その分処理も軽いので、findInitialPointsに全ての点を渡すことで解決しています。